一篇带给你Kubernetes 实用技巧

开发 前端
使用 Kubernetes,就一定会使用 Kubectl 命令,默认安装好 Kubectl 命令不支持自动补全参数。下面配置 Kubectl 命令参数自动补全方法。

[[358889]]

 一、kubectl 命令参数自动补全

使用 Kubernetes,就一定会使用 Kubectl 命令,默认安装好 Kubectl 命令不支持自动补全参数。下面配置 Kubectl 命令参数自动补全方法:

Linux 上,比如 Centos

  1. $ yum install -y bash-completion 
  2. $ source /usr/share/bash-completion/bash_completion 
  3. $ source <(kubectl completion bash) 
  4. $ echo "source <(kubectl completion bash)" >> ~/.bashrc 

MAC 上

  1. $ brew install bash-completion 
  2. $ source $(brew --prefix)/etc/bash_completion 
  3. $ source <(kubectl completion zsh) 
  4. $ echo 'source <(kubectl completion zsh)' >> ~/.zshrc 

Kubectl 常用操作 [1]

1、如何查找非 running 状态的 Pod 呢?

  1. $ kubectl get pods -A --field-selector=status.phase!=Running | grep -v Complete 

2、如何查找 running 状态的 Pod 呢?

  1. $ kubectl get pods -A --field-selector=status.phase=Running | grep -v Complete 

3、获取节点列表,其中包含运行在每个节点上的 Pod 数量?

  1. $ kubectl get po -o json --all-namespaces |    jq '.items | group_by(.spec.nodeName) | map({"nodeName": .[0].spec.nodeName, "count": length}) | sort_by(.count)' 
  2.  
  3.   { 
  4.     "nodeName""service1"
  5.     "count": 6 
  6.   }, 
  7.   { 
  8.     "nodeName""service3"
  9.     "count": 13 
  10.   } 

4、使用 kubectl top 获取 Pod 列表并根据其消耗的 CPU 或 内存进行排序

  1. # 获取 cpu 
  2. $ kubectl top pods -A | sort --reverse --key 3 --numeric 
  3.  
  4. # 获取 memory 
  5. $ kubectl top pods -A | sort --reverse --key 4 --numeric 

二、添加Namespace默认CPU和内存限制

有时候 Pod 没有做资源限制,会因为个别 Pod 使用量超出,影响整个宿主机应用。下面给出一个具体例子,可以根据实际情况来调整相关参数。

  1. apiVersion: "v1" 
  2. kind: "LimitRange" 
  3. metadata: 
  4.   name"resource-limits" 
  5.   namespace: default 
  6. spec: 
  7.   limits: 
  8.     - type: "Pod" 
  9.       max
  10.         cpu: "4" 
  11.         memory: "4Gi" 
  12.       min
  13.         cpu: "100m" 
  14.         memory: "100Mi" 
  15.     - type: "Container" 
  16.       max
  17.         cpu: "4" 
  18.         memory: "4Gi" 
  19.       min
  20.         cpu: "100m" 
  21.         memory: "100Mi" 
  22.       default
  23.         cpu: "500m" 
  24.         memory: "500Mi" 
  25.       defaultRequest: 
  26.         cpu: "100m" 
  27.         memory: "100Mi" 
  28.       maxLimitRequestRatio: 
  29.         cpu: "60" 

三、利用 Kubelet 给 Node 预留资源

  1. evictionHard: 
  2.   imagefs.available: 15% 
  3.   memory.available: 1G 
  4.   nodefs.available: 10% 
  5.   nodefs.inodesFree: 5% 

四、利用 Kubernetes RBAC 划分好权限

多个团队部署应用到一个kubernetes集群时,情况就可能变得很复杂。切记不要把管理员权限开放给每个人。个人建议是,根据命名空间来区分隔离每个团队,然后使用RBAC策略只允许各自团队访问各自的命名空间。

如果我们把管理员权限开放给每个人,那么在pod级上进行读取、创建和删除访问时,可能让人抓狂,因为误操作的情况会经常发生。为此,应该只允许管理员有权访问,从而将管理集群和部署集群的人员权限区分开。

五、充分利用 PodDisruptionBudget 控制器

如何保证在 kubernetes 集群中的应用程序总能正常运行?

答案:是使用 PodDisruptionBudget 控制器。

在进行 kubectl drain 操作时,kubernetes 会根据 PodDisruptionBudget 控制器判断应用Pod集群数量,进而保证在业务不中断或业务SLA不降级的情况下进行应用Pod销毁。PDB(PodDisruptionBudget)应该放在每个拥有一个以上实例的deployment上。我们可以使用简单yaml为集群创建PDB,并使用标签选择器确定PDB应该作用在哪些带有标签的资源上。

  • 注意:PDB只考虑主动中断,硬件故障之类的情况不在PDB考虑范围内。

例子:

  1. apiVersion: policy/v1beta1 
  2. kind: PodDisruptionBudget 
  3. metadata: 
  4.   name: zk-pdb 
  5. spec: 
  6.   minAvailable: 2 
  7.   selector: 
  8.     matchLabels: 
  9.       app: zookeeper 

六、使用探针来检测应用的状态

Kubernetes 支持配置探针。kubelet 使用探针来确定Pod中应用程序是否健康。K8S 提供了两种类型来实现这一功能,Readiness 探针和 Liveiness 探针。

  • Readiness:探针用于确定容器何时准备好接收流量。
  • Liveiness:探针用于确定容器是否健康,如果不健康根据策略判断是否重新部署一个新的容器来替换。

例子:

  1. readinessProbe: 
  2.   tcpSocket: 
  3.     port: 8080 
  4.   initialDelaySeconds: 5 
  5.   periodSeconds: 10 
  6. livenessProbe: 
  7.   tcpSocket: 
  8.     port: 8080 
  9.   initialDelaySeconds: 15 
  10.   periodSeconds: 20 

参考链接

  • [1] https://mp.weixin.qq.com/s/fJpSlVOywrgIhejsWSvhbw
  • [2] https://zhuanlan.zhihu.com/p/81666500

 

 

责任编辑:姜华 来源: YP小站
相关推荐

2023-03-29 07:45:58

VS编辑区编程工具

2021-09-13 07:46:06

Kubectl Kubernetes 工具

2021-07-12 06:11:14

SkyWalking 仪表板UI篇

2021-04-08 11:00:56

CountDownLaJava进阶开发

2021-01-28 08:55:48

Elasticsear数据库数据存储

2021-06-21 14:36:46

Vite 前端工程化工具

2022-04-29 14:38:49

class文件结构分析

2021-04-14 14:16:58

HttpHttp协议网络协议

2021-03-12 09:21:31

MySQL数据库逻辑架构

2021-04-01 10:51:55

MySQL锁机制数据库

2022-02-17 08:53:38

ElasticSea集群部署

2022-03-22 09:09:17

HookReact前端

2021-07-21 09:48:20

etcd-wal模块解析数据库

2024-06-13 08:34:48

2021-05-08 08:36:40

ObjectString前端

2022-02-25 15:50:05

OpenHarmonToggle组件鸿蒙

2021-10-28 08:51:53

GPIO软件框架 Linux

2021-07-08 07:30:13

Webpack 前端Tree shakin

2023-03-13 09:31:04

2021-04-14 07:55:45

Swift 协议Protocol
点赞
收藏

51CTO技术栈公众号