由 kubeadm 產生的 Kubernetes 叢集會將叢集的設定值以 ConfigMap 的形式儲存在 kube-system 這個 namespace 底下,可以使用以下指令觀察到:
1 | tux@kubeadm-m1:~$ kubectl get -n kube-system configmap |
叢集的設定值就是存在 kubeadm-config 這個 ConfigMap 中,接下來以更新 etcd 的命令列參數為範例,演示更新的步驟。
輸出目前的設定檔
可以使用以下指令去輸出設定檔:
kubectl get -n kube-system configmap kubeadm-config -o jsonpath={.data.ClusterConfiguration} > config.yaml
不使用
-o yaml的原因是kubeadm只吃完整 ConfigMap 中的 data > ClusterConfiguration 的內容
設定檔應該會長的類似這樣:
1 | apiServer: {} |
修改設定
可以看到大部分核心元件的設定都會放在這邊,在這邊找到 etcd 的區塊加上下方整個 extraArgs: 的部分,目的是更新 etcd metrics server 監聽的位置
1 | etcd: |
套用設定
sudo kubeadm init phase upload-config kubeadm --config ./config.yamlsudo kubeadm init phase etcd local --config ./config.yaml
使用這兩個命令就會套用更新內容了,第一個命令會先把更新套用在 ConfigMap 中的設定值,然後第二個命令更新存在 /etc/kubernetes/manifests/ 中的 etcd.yaml 檔案。
比較常見的情況,如果只使用 kubectl edit configmap 會沒更新到本地 /etc/kubernetes/manifests/etcd.yaml 的設定;而如果直接更新 /etc/kubernetes/manifests/etcd.yaml 又會沒有更新到 ConfigMap,而導致之後更新叢集元件參數不如預期的情況。
而使用這些命令需要注意: 存在 /etc/kubernetes/manifests/ 中的 static Pods 設定更新,只會套用在當前使用這個命令的節點,而 etcd 設定只會在 Control Plane 節點上,所以在多個 Control Plane 節點的情況下,需要在每個 Control Plane 節點都使用一次。
最後筆者這邊是示範更新 etcd 參數的情況,如果是更新其他元件需要去看一下 kubeadm 有哪些 init phase 或是 upgrade phasee 可用,然後決定適合的 phase 去執行,可以參考: