使用 kubeadm API 自定義元件
本頁面介紹如何自定義 kubeadm 部署的元件。對於控制平面元件,你可以在 `ClusterConfiguration` 結構中使用標誌或按節點使用補丁。對於 kubelet 和 kube-proxy,你可以分別使用 `KubeletConfiguration` 和 `KubeProxyConfiguration`。
所有這些選項都可以透過 kubeadm 配置 API 實現。有關配置中每個欄位的更多詳細資訊,請參閱我們的 API 參考頁面。
注意
目前不支援自定義 kubeadm 的 CoreDNS 部署。你必須手動修補 `kube-system/coredns` ConfigMap,然後重新建立 CoreDNS Pod。或者,你可以跳過預設的 CoreDNS 部署並部署自己的變體。有關更多詳細資訊,請參閱使用 kubeadm 進行初始化階段。注意
要重新配置已建立的叢集,請參閱重新配置 kubeadm 叢集。使用 `ClusterConfiguration` 中的標誌自定義控制平面
kubeadm `ClusterConfiguration` 物件提供了一種方式,讓使用者可以覆蓋傳遞給控制平面元件(如 APIServer、ControllerManager、Scheduler 和 Etcd)的預設標誌。元件使用以下結構定義:
apiServercontrollerManagerscheduleretcd
這些結構包含一個通用的 `extraArgs` 欄位,該欄位由 `name` / `value` 對組成。要覆蓋控制平面元件的標誌:
- 向配置中新增適當的 `extraArgs`。
- 將標誌新增到 `extraArgs` 欄位。
- 執行 `kubeadm init` 並使用 `--config <你的配置 YAML>`。
注意
你可以透過執行 `kubeadm config print init-defaults` 並將輸出儲存到你選擇的檔案中來生成具有預設值的 `ClusterConfiguration` 物件。注意
`ClusterConfiguration` 物件目前在 kubeadm 叢集中是全域性的。這意味著你新增的任何標誌都將應用於不同節點上同一組件的所有例項。要在不同節點上為每個元件應用單獨的配置,你可以使用補丁。注意
目前不支援重複的標誌(鍵)或多次傳遞相同的標誌 `--foo`。要解決這個問題,你必須使用補丁。APIServer 標誌
有關詳細資訊,請參閱 kube-apiserver 參考文件。
示例用法
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
apiServer:
extraArgs:
- name: "enable-admission-plugins"
value: "AlwaysPullImages,DefaultStorageClass"
- name: "audit-log-path"
value: "/home/johndoe/audit.log"
ControllerManager 標誌
有關詳細資訊,請參閱 kube-controller-manager 參考文件。
示例用法
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
controllerManager:
extraArgs:
- name: "cluster-signing-key-file"
value: "/home/johndoe/keys/ca.key"
- name: "deployment-controller-sync-period"
value: "50"
Scheduler 標誌
有關詳細資訊,請參閱 kube-scheduler 參考文件。
示例用法
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.16.0
scheduler:
extraArgs:
- name: "config"
value: "/etc/kubernetes/scheduler-config.yaml"
extraVolumes:
- name: schedulerconfig
hostPath: /home/johndoe/schedconfig.yaml
mountPath: /etc/kubernetes/scheduler-config.yaml
readOnly: true
pathType: "File"
Etcd 標誌
有關詳細資訊,請參閱 etcd 伺服器文件。
示例用法
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
etcd:
local:
extraArgs:
- name: "election-timeout"
value: 1000
使用補丁進行自定義
Kubernetes v1.22 [beta]Kubeadm 允許你在單個節點上將包含補丁檔案的目錄傳遞給 `InitConfiguration` 和 `JoinConfiguration`。這些補丁可以用作元件配置寫入磁碟之前的最後一步自定義。
你可以透過 `kubeadm init --config <你的配置 YAML>` 將此檔案傳遞給 `kubeadm init`。
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
patches:
directory: /home/user/somedir
注意
對於 `kubeadm init`,你可以傳遞一個包含 `ClusterConfiguration` 和 `InitConfiguration` 的檔案,它們之間用 `---` 分隔。你可以透過 `kubeadm join --config <你的配置 YAML>` 將此檔案傳遞給 `kubeadm join`。
apiVersion: kubeadm.k8s.io/v1beta4
kind: JoinConfiguration
patches:
directory: /home/user/somedir
目錄中必須包含名為 `target[suffix][+patchtype].extension` 的檔案。例如,`kube-apiserver0+merge.yaml` 或 `etcd.json`。
- `target` 可以是 `kube-apiserver`、`kube-controller-manager`、`kube-scheduler`、`etcd` 和 `kubeletconfiguration` 之一。
- `suffix` 是一個可選字串,可用於按字母數字順序確定首先應用哪些補丁。
- `patchtype` 可以是 `strategic`、`merge` 或 `json` 之一,並且這些必須與 kubectl 支援的補丁格式匹配。預設的 `patchtype` 是 `strategic`。
- `extension` 必須是 `json` 或 `yaml`。
注意
如果你使用 `kubeadm upgrade` 升級 kubeadm 節點,則必須再次提供相同的補丁,以便在升級後保留自定義。為此,你可以使用 `--patches` 標誌,該標誌必須指向同一目錄。`kubeadm upgrade` 目前不支援可用於相同目的的配置 API 結構。自定義 kubelet
要自定義 kubelet,你可以在同一配置檔案中,在 `ClusterConfiguration` 或 `InitConfiguration` 旁邊新增一個 `KubeletConfiguration`,用 `---` 分隔。然後,此檔案可以傳遞給 `kubeadm init`,kubeadm 將把相同的基本 `KubeletConfiguration` 應用到叢集中的所有節點。
要在基本 `KubeletConfiguration` 上應用特定於例項的配置,你可以使用 `kubeletconfiguration` 補丁目標。
或者,你可以透過在 `InitConfiguration` 和 `JoinConfiguration` 都支援的 `nodeRegistration.kubeletExtraArgs` 欄位中傳遞 kubelet 標誌作為覆蓋。有些 kubelet 標誌已棄用,因此在使用它們之前,請在 kubelet 參考文件中檢查它們的狀態。
有關其他詳細資訊,請參閱 使用 kubeadm 配置叢集中的每個 kubelet
自定義 kube-proxy
要自定義 kube-proxy,你可以將 `KubeProxyConfiguration` 傳遞給 `kubeadm init`,它位於 `ClusterConfiguration` 或 `InitConfiguration` 旁邊,用 `---` 分隔。
有關更多詳細資訊,你可以導航到我們的 API 參考頁面。