Kubernetes 實用技巧

一、kubectl 命令參數自動補全

使用 Kubernetes,就一定會使用 Kubectl 命令,默認安裝好 Kubectl 命令不支持自動補全參數。下面配置 Kubectl 命令參數自動補全方法:

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 狀態的 Pod 呢?

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

2、如何查找 running 狀態的 Pod 呢?

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

3、獲取節點列表,其中包含運行在每個節點上的 Pod 數量?

$ 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 列表並根據其消耗的 CPU 或 內存進行排序

# 獲取 cpu
$ kubectl top pods -A | sort --reverse --key 3 --numeric

# 獲取 memory
$ kubectl top pods -A | sort --reverse --key 4 --numeric

二、添加Namespace默認CPU和內存限制

有時候 Pod 沒有做資源限制,會因爲個別 Pod 使用量超出,影響整個宿主機應用。下面給出一個具體例子,可以根據實際情況來調整相關參數。

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 預留資源

evictionHard:
  imagefs.available: 15%
  memory.available: 1G
  nodefs.available: 10%
  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考慮範圍內。

例子:

apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
  name: zk-pdb
spec:
  minAvailable: 2
  selector:
    matchLabels:
      app: zookeeper

六、使用探針來檢測應用的狀態

Kubernetes 支持配置探針。kubelet 使用探針來確定Pod中應用程序是否健康。K8S 提供了兩種類型來實現這一功能,Readiness 探針和 Liveiness 探針。

  • Readiness:探針用於確定容器何時準備好接收流量。
  • Liveiness:探針用於確定容器是否健康,如果不健康根據策略判斷是否重新部署一個新的容器來替換。

例子:

    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

熱門文章推薦

最後

  • 後臺回覆 【 列表】,可獲取本公衆號所有文章列表
  • 歡迎您加我微信【 ypxiaozhan01 】,拉您進技術羣,一起交流學習
  • 歡迎您關注【 YP小站 】,學習互聯網最流行的技術,做個專業的技術人

  【文章讓您有收穫,👇  或者 在看 支持我吧】

本文分享自微信公衆號 - YP小站(ypxiaozhan)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章