簡單來說,先想像 Nodes 是人,Pods 是蚊子。Pods 被部署到 Nodes 上就是蚊子在叮人類。
從這個場景來看,Taints 就是防蚊液,目的是阻止蚊子叮咬人類,也就是防止 Pods 被部署到有 Taints 的 Nodes 上。Tolerations 就是蚊子對於防蚊液的抗體,只要有符合該防蚊液的抗體,就可以叮這個人類,也就是可以 Deploy 到這些 Nodes 上。
為什麼突然開始討論這個 Kubernetes 的概念呢?
昨天有提到為了將 Nginx-Ingress Pod 部署到 Control-Plane Node 上,我將該 Node 的 Taints 給刪除,並且為 Nginx-Ingress 的 Deployment 設置 NodeSelector。
透過這些手段來將 Nginx-Ingress Pod 準確的部署到 Control-Plane Node 上,但是是否可以將這些流程整合到我們的部署流程中呢?
由於過去幾天都是透過指令來安裝 GitLab,就算是帶入 Values,也是使用官方提供的範例。我們為了要能夠一鍵達成目的,就必須要來調整我們的 Values 值。
參考 GitLab 官方的 values.yaml 檔,可以發現 nginx-ingress 區塊其實完全沒有 nodeSelector
和 tolerations
相關的設定。
到這一步我開始懷疑人生,難道要寫腳本來自動調整?應該不用這樣吧?
Helm Chart 其實就是先設立一堆 templates
的 Yaml 檔,再根據不同的 Values 值來自動化產生並部署所需的 Kubernetes Components。
所以如果想要調整 nodeSelector
和 tolerations
的話,或許 templates
的 Yaml 中會存在線索。
幸運的是從官方的 templates 中,找到了關鍵的線索。
{{- if .Values.controller.nodeSelector }}
nodeSelector: {{ toYaml .Values.controller.nodeSelector | nindent 8 }}
{{- else if include "gitlab.nodeSelector" . }}
{{- include "gitlab.nodeSelector" . | nindent 6 }}
{{- end }}
{{- if .Values.controller.tolerations }}
tolerations: {{ toYaml .Values.controller.tolerations | nindent 8 }}
{{- end }}
從這段我們可以得知,只要在 controller 的下一層定義 nodeSelector 和 tolerations 就可以在 Deployment 建立時,自動地帶入想要的設定。
我決定在官方的 examples 中修改 value-base.yaml
,在 nginx-ingress 區塊新增目標的設定,最後也成功將 Nginx-Ingress Pod 自動部署到 Control-Plane Node 上。
nginx-ingress:
controller:
replicaCount: 1
minAavailable: 1
service:
type: NodePort
nodePorts:
# gitlab-shell port value below must match the KinD config file:
# nodes[0].extraPortMappings[1].containerPort
gitlab-shell: 32022
nodeSelector:
"kubernetes.io/hostname": "local-dev-control-plane"
tolerations:
- key: "node-role.kubernetes.io/control-plane"
effect: "NoSchedule"