---
# System prepended metadata

title: Kubeadm 如何永久套用 components 參數
tags: [K8S]

---

# Kubeadm 如何永久套用 components 參數


## 更新  ClusterConfiguration

`ClusterConfiguration` 的欄位是存在 configmap 中，可使用以下指令修改：

```
$ kubectl edit cm -n kube-system kubeadm-config
```

## 在 control plane nodes 上的更新

在 `ClusterConfiguration` 的欄位中包含了 control plane 元件的修改

* `extraArgs` ：要帶入 control plane 元件的參數， requires updating the list of flags passed to a component container
* `extraVolumes` - requires updating the volume mounts for a component container
* `SANs` - requires writing new certificates with updated Subject Alternative Names

## 手動新增 `enable-admission-plugins=NodeRestriction,PodNodeSelector` 參數

* apiserver 新增 `enable-admission-plugins=NodeRestriction,PodNodeSelector` 參數
```
$ kubectl edit cm -n kube-system kubeadm-config
......
apiVersion: v1
data:
  ClusterConfiguration: |
    apiServer:
      extraArgs:
        - name: enable-admission-plugins
          value: "NodeRestriction,PodNodeSelector"
......
```

![image](https://hackmd.io/_uploads/rJrs2Qzrgg.png)

* 將 configmap 匯出後，使用 kubeadm 套用到 static pod
```
$ kubectl get cm -n kube-system kubeadm-config  -o jsonpath={.data.ClusterConfiguration} > config.yaml
```



* 套用設定到 apiserver static pod
```
$ sudo kubeadm init phase control-plane apiserver --config ./config.yaml
```

## 檢查 apiserver 是否套用
* 確認 apiserver static pod yaml 已套用
```
$ sudo cat /etc/kubernetes/manifests/kube-apiserver.yaml |grep enable-admission-plugins
    - --enable-admission-plugins=NodeRestriction,PodNodeSelector
```
* 重啟 kubelet 服務
```
$ sudo systemctl restart kubelet.service
```
* 確認 apiserver 已套用
```
$ ps aux|grep kube-apiserver
root      436924 10.1  3.5 1656612 428676 ?      Ssl  11:58   0:20 kube-apiserver --advertise-address=10.10.7.36 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/etc/kubernetes/pki/ca.crt --enable-admission-plugins=NodeRestriction,PodNodeSelector
```


## 修改 controller-manager 參數
* `controller-manager` 新增 `Asia/Taipei` 時區參數
```
$ kubectl edit cm -n kube-system kubeadm-config
......
    controllerManager:
      extraArgs:
 .......
      extraVolumes:
      - name: tz-config
        hostPath: /etc/localtime
        mountPath: /etc/localtime
        readOnly: true
```

* 將 configmap 匯出後，使用 kubeadm 套用到 static pod
```
$ kubectl get cm -n kube-system kubeadm-config  -o jsonpath={.data.ClusterConfiguration} > config.yaml
```



* 套用設定到 controller-manager static pod
```
$ sudo kubeadm init phase control-plane controller-manager --config ./config.yaml
```

## 修改 etcd 參數


```
$ sudo kubeadm init phase etcd local --config ./config.yaml
```


### 如果是 3 台 master 的架構就需要把 config.yaml 丟到每一台 master 上然後執行 kubeadm 套用


## 參考
https://ithelp.ithome.com.tw/m/articles/10357962