一篇帶給你Kubernetes 實用技巧
一、kubectl 命令參數(shù)自動補(bǔ)全
使用 Kubernetes,就一定會使用 Kubectl 命令,默認(rèn)安裝好 Kubectl 命令不支持自動補(bǔ)全參數(shù)。下面配置 Kubectl 命令參數(shù)自動補(bǔ)全方法:
Linux 上,比如 Centos
- $ yum install -y bash-completion
- $ source /usr/share/bash-completion/bash_completion
- $ source <(kubectl completion bash)
- $ echo "source <(kubectl completion bash)" >> ~/.bashrc
MAC 上
- $ brew install bash-completion
- $ source $(brew --prefix)/etc/bash_completion
- $ source <(kubectl completion zsh)
- $ echo 'source <(kubectl completion zsh)' >> ~/.zshrc
Kubectl 常用操作 [1]
1、如何查找非 running 狀態(tài)的 Pod 呢?
- $ kubectl get pods -A --field-selector=status.phase!=Running | grep -v Complete
2、如何查找 running 狀態(tài)的 Pod 呢?
- $ kubectl get pods -A --field-selector=status.phase=Running | grep -v Complete
3、獲取節(jié)點列表,其中包含運行在每個節(jié)點上的 Pod 數(shù)量?
- $ kubectl get po -o json --all-namespaces | jq '.items | group_by(.spec.nodeName) | map({"nodeName": .[0].spec.nodeName, "count": length}) | sort_by(.count)'
- [
- {
- "nodeName": "service1",
- "count": 6
- },
- {
- "nodeName": "service3",
- "count": 13
- }
- ]
4、使用 kubectl top 獲取 Pod 列表并根據(jù)其消耗的 CPU 或 內(nèi)存進(jìn)行排序
- # 獲取 cpu
- $ kubectl top pods -A | sort --reverse --key 3 --numeric
- # 獲取 memory
- $ kubectl top pods -A | sort --reverse --key 4 --numeric
二、添加Namespace默認(rèn)CPU和內(nèi)存限制
有時候 Pod 沒有做資源限制,會因為個別 Pod 使用量超出,影響整個宿主機(jī)應(yīng)用。下面給出一個具體例子,可以根據(jù)實際情況來調(diào)整相關(guān)參數(shù)。
- apiVersion: "v1"
- kind: "LimitRange"
- metadata:
- name: "resource-limits"
- namespace: default
- spec:
- limits:
- - type: "Pod"
- max:
- cpu: "4"
- memory: "4Gi"
- min:
- cpu: "100m"
- memory: "100Mi"
- - type: "Container"
- max:
- cpu: "4"
- memory: "4Gi"
- min:
- cpu: "100m"
- memory: "100Mi"
- default:
- cpu: "500m"
- memory: "500Mi"
- defaultRequest:
- cpu: "100m"
- memory: "100Mi"
- maxLimitRequestRatio:
- cpu: "60"
三、利用 Kubelet 給 Node 預(yù)留資源
- evictionHard:
- imagefs.available: 15%
- memory.available: 1G
- nodefs.available: 10%
- nodefs.inodesFree: 5%
四、利用 Kubernetes RBAC 劃分好權(quán)限
多個團(tuán)隊部署應(yīng)用到一個kubernetes集群時,情況就可能變得很復(fù)雜。切記不要把管理員權(quán)限開放給每個人。個人建議是,根據(jù)命名空間來區(qū)分隔離每個團(tuán)隊,然后使用RBAC策略只允許各自團(tuán)隊訪問各自的命名空間。
如果我們把管理員權(quán)限開放給每個人,那么在pod級上進(jìn)行讀取、創(chuàng)建和刪除訪問時,可能讓人抓狂,因為誤操作的情況會經(jīng)常發(fā)生。為此,應(yīng)該只允許管理員有權(quán)訪問,從而將管理集群和部署集群的人員權(quán)限區(qū)分開。
五、充分利用 PodDisruptionBudget 控制器
如何保證在 kubernetes 集群中的應(yīng)用程序總能正常運行?
答案:是使用 PodDisruptionBudget 控制器。
在進(jìn)行 kubectl drain 操作時,kubernetes 會根據(jù) PodDisruptionBudget 控制器判斷應(yīng)用Pod集群數(shù)量,進(jìn)而保證在業(yè)務(wù)不中斷或業(yè)務(wù)SLA不降級的情況下進(jìn)行應(yīng)用Pod銷毀。PDB(PodDisruptionBudget)應(yīng)該放在每個擁有一個以上實例的deployment上。我們可以使用簡單yaml為集群創(chuàng)建PDB,并使用標(biāo)簽選擇器確定PDB應(yīng)該作用在哪些帶有標(biāo)簽的資源上。
- 注意:PDB只考慮主動中斷,硬件故障之類的情況不在PDB考慮范圍內(nèi)。
例子:
- apiVersion: policy/v1beta1
- kind: PodDisruptionBudget
- metadata:
- name: zk-pdb
- spec:
- minAvailable: 2
- selector:
- matchLabels:
- app: zookeeper
六、使用探針來檢測應(yīng)用的狀態(tài)
Kubernetes 支持配置探針。kubelet 使用探針來確定Pod中應(yīng)用程序是否健康。K8S 提供了兩種類型來實現(xiàn)這一功能,Readiness 探針和 Liveiness 探針。
- Readiness:探針用于確定容器何時準(zhǔn)備好接收流量。
- Liveiness:探針用于確定容器是否健康,如果不健康根據(jù)策略判斷是否重新部署一個新的容器來替換。
例子:
- readinessProbe:
- tcpSocket:
- port: 8080
- initialDelaySeconds: 5
- periodSeconds: 10
- livenessProbe:
- tcpSocket:
- port: 8080
- initialDelaySeconds: 15
- periodSeconds: 20
參考鏈接
- [1] https://mp.weixin.qq.com/s/fJpSlVOywrgIhejsWSvhbw
- [2] https://zhuanlan.zhihu.com/p/81666500