使用 kubeadm 在叢集中配置每個 kubelet

功能狀態: Kubernetes v1.11 [穩定]

kubeadm CLI 工具的生命週期與 kubelet 解耦,kubelet 是一個在 Kubernetes 叢集中每個節點上執行的守護進程。kubeadm CLI 工具在 Kubernetes 初始化或升級時由使用者執行,而 kubelet 始終在背景中執行。

由於 kubelet 是一個守護進程,因此需要由某種初始化系統或服務管理器來維護。當使用 DEB 或 RPM 安裝 kubelet 時,systemd 會配置為管理 kubelet。您可以使用不同的服務管理器,但您需要手動配置它。

某些 kubelet 配置詳細資訊需要在叢集中涉及的所有 kubelet 之間保持一致,而其他配置方面需要根據每個 kubelet 進行設定,以適應給定機器的不同特性(例如作業系統、儲存和網路)。您可以手動管理 kubelet 的配置,但 kubeadm 現在提供了 KubeletConfiguration API 類型,用於集中管理您的 kubelet 配置

Kubelet 配置模式

以下章節描述了 kubelet 配置的模式,這些模式透過使用 kubeadm 簡化,而不是手動管理每個節點的 kubelet 配置。

將叢集層級配置傳播到每個 kubelet

您可以為 kubelet 提供預設值,供 kubeadm initkubeadm join 命令使用。有趣的範例包括使用不同的容器執行期或設定服務使用的預設子網路。

如果您希望您的服務使用子網路 10.96.0.0/12 作為服務的預設值,您可以將 --service-cidr 參數傳遞給 kubeadm

kubeadm init --service-cidr 10.96.0.0/12

服務的虛擬 IP 現在從此子網路分配。您還需要使用 --cluster-dns 標誌設定 kubelet 使用的 DNS 位址。此設定需要對於叢集中每個管理器和節點上的每個 kubelet 都是相同的。kubelet 提供了一個版本化、結構化的 API 物件,可以配置 kubelet 中的大多數參數,並將此配置推送至叢集中每個執行中的 kubelet。此物件稱為 KubeletConfigurationKubeletConfiguration 允許使用者指定標誌,例如叢集 DNS IP 位址,表示為 camelCased 鍵的值列表,如下列範例所示

apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
clusterDNS:
- 10.96.0.10

有關 KubeletConfiguration 的更多詳細資訊,請參閱此章節

提供執行個體特定的配置詳細資訊

由於硬體、作業系統、網路或其他主機特定參數的差異,某些主機需要特定的 kubelet 配置。以下列表提供了一些範例。

  • DNS 解析檔案的路徑,由 --resolv-conf kubelet 配置標誌指定,可能因作業系統而異,或取決於您是否正在使用 systemd-resolved。如果此路徑錯誤,DNS 解析將在配置不正確的節點上失敗。

  • 除非您正在使用雲端提供者,否則 Node API 物件 .metadata.name 預設設定為機器的hostname。如果您需要指定與機器 hostname 不同的節點名稱,您可以使用 --hostname-override 標誌覆寫預設行為。

  • 目前,kubelet 無法自動偵測容器執行期使用的 cgroup 驅動程式,但 --cgroup-driver 的值必須與容器執行期使用的 cgroup 驅動程式相符,以確保 kubelet 的健康狀態。

  • 若要指定容器執行期,您必須使用 --container-runtime-endpoint=<path> 標誌設定其端點。

應用此類執行個體特定配置的建議方法是使用 KubeletConfiguration 補丁

使用 kubeadm 配置 kubelet

如果自訂 KubeletConfiguration API 物件與組態檔一起傳遞(例如 kubeadm ... --config some-config-file.yaml),則可以配置 kubeadm 將啟動的 kubelet。

透過呼叫 kubeadm config print init-defaults --component-configs KubeletConfiguration,您可以查看此結構的所有預設值。

也可以在基本 KubeletConfiguration 上套用執行個體特定的補丁。請參閱自訂 kubelet 以取得更多詳細資訊。

使用 kubeadm init 時的工作流程

當您呼叫 kubeadm init 時,kubelet 配置會序列化到磁碟上的 /var/lib/kubelet/config.yaml,並上傳到叢集 kube-system 命名空間中的 kubelet-config ConfigMap。kubelet 組態檔也會寫入 /etc/kubernetes/kubelet.conf,其中包含叢集中所有 kubelet 的基準叢集範圍配置。此組態檔指向用戶端憑證,允許 kubelet 與 API 伺服器通訊。這解決了將叢集層級配置傳播到每個 kubelet 的需求。

為了處理第二種模式,即提供執行個體特定的配置詳細資訊,kubeadm 會將環境檔案寫入 /var/lib/kubelet/kubeadm-flags.env,其中包含啟動 kubelet 時要傳遞的標誌列表。這些標誌在檔案中以如下形式呈現

KUBELET_KUBEADM_ARGS="--flag1=value1 --flag2=value2 ..."

除了啟動 kubelet 時使用的標誌外,該檔案還包含動態參數,例如 cgroup 驅動程式以及是否使用不同的容器執行期 socket (--cri-socket)。

在將這兩個檔案序列化到磁碟後,如果您正在使用 systemd,kubeadm 會嘗試執行以下兩個命令

systemctl daemon-reload && systemctl restart kubelet

如果重新載入和重新啟動成功,則正常的 kubeadm init 工作流程會繼續。

使用 kubeadm join 時的工作流程

當您執行 kubeadm join 時,kubeadm 會使用 Bootstrap Token 憑證來執行 TLS 啟動程序,此程序會取得下載 kubelet-config ConfigMap 所需的憑證,並將其寫入至 /var/lib/kubelet/config.yaml。動態環境檔案的產生方式與 kubeadm init 完全相同。

接下來,kubeadm 執行以下兩個指令,將新的組態載入到 kubelet 中

systemctl daemon-reload && systemctl restart kubelet

在 kubelet 載入新的組態後,kubeadm 會寫入 /etc/kubernetes/bootstrap-kubelet.conf KubeConfig 檔案,其中包含 CA 憑證和 Bootstrap Token。這些憑證和 Token 會被 kubelet 用於執行 TLS 啟動程序並取得獨特的憑證,該憑證會儲存在 /etc/kubernetes/kubelet.conf 中。

/etc/kubernetes/kubelet.conf 檔案被寫入時,kubelet 便已完成執行 TLS 啟動程序。Kubeadm 會在 TLS 啟動程序完成後刪除 /etc/kubernetes/bootstrap-kubelet.conf 檔案。

kubelet 的 systemd 附加設定檔

kubeadm 隨附 systemd 應如何執行 kubelet 的組態。請注意,kubeadm CLI 指令永遠不會更動此附加設定檔。

此組態檔由 kubeadm 套件安裝,並寫入至 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf,並由 systemd 使用。它擴充了基本的 kubelet.service

如果您想要進一步覆寫,您可以建立目錄 /etc/systemd/system/kubelet.service.d/ (不是 /usr/lib/systemd/system/kubelet.service.d/),並將您自己的客製化設定放入該目錄中的檔案。例如,您可以新增一個新的本地檔案 /etc/systemd/system/kubelet.service.d/local-overrides.conf,以覆寫由 kubeadm 設定的單元設定。

以下是您可能會在 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf 中找到的內容

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
# This is a file that "kubeadm init" and "kubeadm join" generate at runtime, populating
# the KUBELET_KUBEADM_ARGS variable dynamically
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
# This is a file that the user can use for overrides of the kubelet args as a last resort. Preferably,
# the user should use the .NodeRegistration.KubeletExtraArgs object in the configuration files instead.
# KUBELET_EXTRA_ARGS should be sourced from this file.
EnvironmentFile=-/etc/default/kubelet
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS

此檔案指定 kubeadm 為 kubelet 管理的所有檔案的預設位置。

  • 用於 TLS 啟動程序的 KubeConfig 檔案是 /etc/kubernetes/bootstrap-kubelet.conf,但僅在 /etc/kubernetes/kubelet.conf 不存在時才會使用。
  • 具有獨特 kubelet 身分識別的 KubeConfig 檔案是 /etc/kubernetes/kubelet.conf
  • 包含 kubelet 的 ComponentConfig 的檔案是 /var/lib/kubelet/config.yaml
  • 包含 KUBELET_KUBEADM_ARGS 的動態環境檔案來源於 /var/lib/kubelet/kubeadm-flags.env
  • 可以包含使用者指定旗標覆寫 (使用 KUBELET_EXTRA_ARGS) 的檔案來源於 /etc/default/kubelet (適用於 DEB),或 /etc/sysconfig/kubelet (適用於 RPM)。KUBELET_EXTRA_ARGS 在旗標鏈中位於最後,並且在設定衝突時具有最高優先權。

Kubernetes 二進位檔案和套件內容

隨 Kubernetes 版本發行的 DEB 和 RPM 套件如下:

套件名稱描述
kubeadm安裝 /usr/bin/kubeadm CLI 工具和 kubelet 的 kubelet 附加設定檔
kubelet安裝 /usr/bin/kubelet 二進位檔案。
kubectl安裝 /usr/bin/kubectl 二進位檔案。
cri-toolscri-tools git 儲存庫 安裝 /usr/bin/crictl 二進位檔案。
kubernetes-cniplugins git 儲存庫 安裝 /opt/cni/bin 二進位檔案。
上次修改時間:2024 年 3 月 12 日下午 8:18 PST:修正 kubelet systemd 組態檔的路徑 (6b2e5dfac6)