Pages - Menu

2021年9月6日 星期一

[GKE]Kubernetes的節點選擇與污染

前言

最近碰到的問題,起因是單台的對外連線數過大,導致程式發生問題,無法再連線到外部網路。


正文

在 GCP網路對外的方式裡面有提到,對外連線時,如果是私有叢集會使用Cloud NAT,
本次的情形,是因為再該節點內,某一個deploy疑似將連線數吃滿,最近想通了,應該是節點數量的問題。

nodeSelector

所以要將某一個服務,獨立掛在單一的節點池上面。
最簡單的用法是 nodeSelector,在 spec.template.spec 的下一層。

app : websocket 這個是label 在建立nodepool時,一併建立的(fig.1)。
也可在建立nodepool後,在手動新增label。當然也可以直接指定google賦予的label。



(fig.1)

  查詢label
  kubectl get nodes --show-label
  新增label
  kubectl label node <node name> <label>=<value>

ref.

Kubernetes 分派 Pod 到指定節點

deploy的範例

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployabc
spec:
  replicas: 10
  template:
    spec:
      .......
      nodeSelector:
        app: websocket

ref.
將 Pod 部署到特定節點池
將 Pod 分配給節點

節點污點

剛上面有提到,deploy可以指定pod到特定的節點,但是當前面的節點滿了後,其他的deploy還是有可能會到特定的節點上。
k8s可以設定節點為 污點(Taint),使此污染的節點,只能接受有容忍度的pod。

污點的設定不能事後更新,所以要在一開始建立時就設定好。請注意(fig.2)的Taint。
另外建議統一由GKE的節點污點,從控制台建立或使用指令建立。
否則當node自動新增時,該節點並不會產生 Taits
設定時,要指定 key 與 value 以及 效果。



(fig.2)

效果有以下三種:

- NoSchedule:不能容忍此污點的 Pod 不會被調度到節點上;現有 Pod 不會從節點中逐出。
- PreferNoSchedule:Kubernetes 會避免將不能容忍此污點的 Pod 安排到節點上。
- NoExecute:如果 Pod 已在節點上運行,則會將該 Pod 從節點中逐出;如果尚未在節點上運行,則不會將其安排到節點上。

ref.用節點污點控制調度

之後在deploy上面建立容忍(toleration)污點, 在 spec.template.spec 的下一層
其中 key 與 value 為自訂,效果請參考上面選擇。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployabc
spec:
  replicas: 10
  template:
    spec:
      .......
    tolerations:
    - key: "visible"
      operator: "Equal"
      value: "private"
      effect: "NoExecute"
      tolerationSeconds: 3600

謝謝收看,如有疑問,請在下面留言


補充,如果是舊的節點集區,在GKE上面,可以改使用這個label去選擇。

cloud.google.com/gke-nodepool: <節點池的名稱>

ref.
污點和容忍度
k8s進階篇(四):Affinity and Anti-Affinity、Taints and Tolerations

沒有留言:

張貼留言