使用 kubeadm 配置叢集中的每個 kubelet
Kubernetes v1.11 [stable]kubeadm CLI 工具的生命週期與 kubelet 解耦。kubelet 是在 Kubernetes 叢集中每個節點上執行的守護程序。kubeadm CLI 工具在 Kubernetes 初始化或升級時由使用者執行,而 kubelet 始終在後臺執行。
由於 kubelet 是一個守護程序,它需要由某種 init 系統或服務管理器來維護。當使用 DEB 或 RPM 包安裝 kubelet 時,systemd 被配置為管理 kubelet。你可以使用不同的服務管理器,但需要手動配置。
一些 kubelet 配置細節需要叢集中所有 kubelet 保持一致,而其他配置方面需要針對每個 kubelet 進行設定,以適應給定機器的不同特性(例如作業系統、儲存和網路)。你可以手動管理 kubelet 的配置,但 kubeadm 現在提供了一個 KubeletConfiguration API 型別,用於集中管理你的 kubelet 配置。
Kubelet 配置模式
以下各節描述了使用 kubeadm 簡化 kubelet 配置的模式,而不是手動管理每個節點的 kubelet 配置。
將叢集級配置傳播到每個 kubelet
你可以為 kubelet 提供 kubeadm init 和 kubeadm 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。此物件稱為 KubeletConfiguration。KubeletConfiguration 允許使用者指定諸如叢集 DNS IP 地址之類的標誌,這些地址表示為駝峰式鍵的值列表,如下例所示
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
clusterDNS:
- 10.96.0.10
有關 KubeletConfiguration 的更多詳細資訊,請參閱此節。
提供例項特定的配置細節
由於硬體、作業系統、網路或其他主機特定引數的差異,某些主機需要特定的 kubelet 配置。以下列表提供了一些示例。
由
--resolv-confkubelet 配置標誌指定的 DNS 解析檔案路徑可能因作業系統而異,或者取決於你是否使用systemd-resolved。如果此路徑錯誤,則配置不正確的 kubelet 所在的節點上的 DNS 解析將失敗。Node API 物件
.metadata.name預設設定為機器的主機名,除非你使用雲提供商。如果你需要指定與機器主機名不同的節點名稱,可以使用--hostname-override標誌來覆蓋預設行為。目前,kubelet 無法自動檢測容器執行時使用的 cgroup 驅動,但
--cgroup-driver的值必須與容器執行時使用的 cgroup 驅動匹配,以確保 kubelet 的健康。要指定容器執行時,你必須使用
--container-runtime-endpoint=<path>標誌設定其端點。
應用此類例項特定配置的推薦方法是使用 KubeletConfiguration 補丁。
使用 kubeadm 配置 kubelet
如果使用配置檔案(例如 kubeadm ... --config some-config-file.yaml)傳遞自定義的 KubeletConfiguration API 物件,則可以配置 kubeadm 將啟動的 kubelet。
透過呼叫 kubeadm config print init-defaults --component-configs KubeletConfiguration,你可以檢視此結構的所有預設值。
還可以對基本 KubeletConfiguration 應用例項特定的補丁。有關更多詳細資訊,請參閱 自定義 kubelet。
使用 kubeadm init 的工作流程
當你呼叫 kubeadm init 時,kubelet 配置將被封送(marshalled)到磁碟上的 /var/lib/kubelet/config.yaml,並上傳到叢集 kube-system 名稱空間中的 kubelet-config ConfigMap。此外,kubeadm 工具會檢測節點上的 CRI socket,並將其詳細資訊(包括 socket 路徑)寫入本地配置 /var/lib/kubelet/instance-config.yaml。kubelet 配置檔案也會寫入 /etc/kubernetes/kubelet.conf,其中包含叢集中所有 kubelet 的基線叢集範圍配置。此配置檔案指向允許 kubelet 與 API 伺服器通訊的客戶端證書。這解決了需要將叢集級配置傳播到每個 kubelet 的問題。
為了解決提供例項特定配置細節的第二個模式,kubeadm 將一個環境檔案寫入 /var/lib/kubelet/kubeadm-flags.env,其中包含啟動 kubelet 時要傳遞給 kubelet 的標誌列表。這些標誌在檔案中顯示如下
KUBELET_KUBEADM_ARGS="--flag1=value1 --flag2=value2 ..."
除了啟動 kubelet 時使用的標誌外,該檔案還包含動態引數,例如 cgroup 驅動程式。
將這兩個檔案封送(marshalled)到磁碟後,如果你正在使用 systemd,kubeadm 將嘗試執行以下兩個命令
systemctl daemon-reload && systemctl restart kubelet
如果重新載入和重啟成功,正常的 kubeadm init 工作流程將繼續。
使用 kubeadm join 的工作流程
當你執行 kubeadm join 時,kubeadm 使用引導令牌憑據執行 TLS 引導,該引導獲取下載 kubelet-config ConfigMap 所需的憑據,並將其寫入 /var/lib/kubelet/config.yaml。此外,kubeadm 工具會檢測節點上的 CRI socket,並將其詳細資訊(包括 socket 路徑)寫入本地配置 /var/lib/kubelet/instance-config.yaml。動態環境檔案的生成方式與 kubeadm init 完全相同。
接下來,kubeadm 執行以下兩個命令將新配置載入到 kubelet 中
systemctl daemon-reload && systemctl restart kubelet
在 kubelet 載入新配置後,kubeadm 會寫入 /etc/kubernetes/bootstrap-kubelet.conf KubeConfig 檔案,其中包含 CA 證書和引導令牌。kubelet 使用這些檔案執行 TLS 引導並獲取唯一的憑據,該憑據儲存在 /etc/kubernetes/kubelet.conf 中。
當 /etc/kubernetes/kubelet.conf 檔案寫入後,kubelet 已完成執行 TLS 引導。kubeadm 在完成 TLS 引導後刪除 /etc/kubernetes/bootstrap-kubelet.conf 檔案。
用於 systemd 的 kubelet drop-in 檔案
kubeadm 提供了 systemd 執行 kubelet 的配置。請注意,kubeadm CLI 命令從不觸及此 drop-in 檔案。
此由 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 元件配置的檔案是
/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 drop-in 檔案。 |
kubelet | 安裝 /usr/bin/kubelet 二進位制檔案。 |
kubectl | 安裝 /usr/bin/kubectl 二進位制檔案。 |
cri-tools | 從 cri-tools Git 倉庫 安裝 /usr/bin/crictl 二進位制檔案。 |
kubernetes-cni | 從 plugins Git 倉庫 安裝 /opt/cni/bin 二進位制檔案。 |