kubeadm init

此指令會初始化 Kubernetes 控制平面節點。

執行此指令以設定 Kubernetes 控制平面

概要

執行此指令以設定 Kubernetes 控制平面

「init」指令執行以下階段

preflight                     Run pre-flight checks
certs                         Certificate generation
  /ca                           Generate the self-signed Kubernetes CA to provision identities for other Kubernetes components
  /apiserver                    Generate the certificate for serving the Kubernetes API
  /apiserver-kubelet-client     Generate the certificate for the API server to connect to kubelet
  /front-proxy-ca               Generate the self-signed CA to provision identities for front proxy
  /front-proxy-client           Generate the certificate for the front proxy client
  /etcd-ca                      Generate the self-signed CA to provision identities for etcd
  /etcd-server                  Generate the certificate for serving etcd
  /etcd-peer                    Generate the certificate for etcd nodes to communicate with each other
  /etcd-healthcheck-client      Generate the certificate for liveness probes to healthcheck etcd
  /apiserver-etcd-client        Generate the certificate the apiserver uses to access etcd
  /sa                           Generate a private key for signing service account tokens along with its public key
kubeconfig                    Generate all kubeconfig files necessary to establish the control plane and the admin kubeconfig file
  /admin                        Generate a kubeconfig file for the admin to use and for kubeadm itself
  /super-admin                  Generate a kubeconfig file for the super-admin
  /kubelet                      Generate a kubeconfig file for the kubelet to use *only* for cluster bootstrapping purposes
  /controller-manager           Generate a kubeconfig file for the controller manager to use
  /scheduler                    Generate a kubeconfig file for the scheduler to use
etcd                          Generate static Pod manifest file for local etcd
  /local                        Generate the static Pod manifest file for a local, single-node local etcd instance
control-plane                 Generate all static Pod manifest files necessary to establish the control plane
  /apiserver                    Generates the kube-apiserver static Pod manifest
  /controller-manager           Generates the kube-controller-manager static Pod manifest
  /scheduler                    Generates the kube-scheduler static Pod manifest
kubelet-start                 Write kubelet settings and (re)start the kubelet
upload-config                 Upload the kubeadm and kubelet configuration to a ConfigMap
  /kubeadm                      Upload the kubeadm ClusterConfiguration to a ConfigMap
  /kubelet                      Upload the kubelet component config to a ConfigMap
upload-certs                  Upload certificates to kubeadm-certs
mark-control-plane            Mark a node as a control-plane
bootstrap-token               Generates bootstrap tokens used to join a node to a cluster
kubelet-finalize              Updates settings relevant to the kubelet after TLS bootstrap
  /enable-client-cert-rotation  Enable kubelet client certificate rotation
addon                         Install required addons for passing conformance tests
  /coredns                      Install the CoreDNS addon to a Kubernetes cluster
  /kube-proxy                   Install the kube-proxy addon to a Kubernetes cluster
show-join-command             Show the join command for control-plane and worker node
kubeadm init [flags]

選項

--apiserver-advertise-address 字串

API 伺服器將宣告其正在接聽的 IP 位址。如果未設定,將使用預設網路介面。

--apiserver-bind-port int32     預設值:6443

API 伺服器要繫結的埠。

--apiserver-cert-extra-sans 字串

用於 API 伺服器服務憑證的可選額外主體別名 (SAN)。可以是 IP 位址和 DNS 名稱。

--cert-dir 字串     預設值:"/etc/kubernetes/pki"

儲存和存放憑證的路徑。

--certificate-key 字串

用於加密 kubeadm-certs Secret 中控制平面憑證的金鑰。憑證金鑰是一個十六進位編碼字串,它是大小為 32 位元組的 AES 金鑰。

--config 字串

kubeadm 組態檔的路徑。

--control-plane-endpoint 字串

指定控制平面的穩定 IP 位址或 DNS 名稱。

--cri-socket 字串

要連接的 CRI Socket 路徑。如果為空,kubeadm 將嘗試自動偵測此值;只有在您安裝了多個 CRI 或具有非標準 CRI Socket 時才使用此選項。

--dry-run

不要套用任何變更;僅輸出將會執行的操作。

--feature-gates 字串

一組 key=value 配對,用於描述各種功能的功能閘道。選項為
ControlPlaneKubeletLocalMode=true|false (ALPHA - 預設值=false)
EtcdLearnerMode=true|false (預設值=true)
PublicKeysECDSA=true|false (已棄用 - 預設值=false)
RootlessControlPlane=true|false (ALPHA - 預設值=false)
WaitForAllControlPlaneComponents=true|false (ALPHA - 預設值=false)

-h, --help

init 的說明

--ignore-preflight-errors 字串

將其錯誤顯示為警告的檢查清單。範例:'IsPrivilegedUser,Swap'。值 'all' 會忽略所有檢查的錯誤。

--image-repository 字串     預設值:"registry.k8s.io"

選擇容器登錄檔以從中提取控制平面映像檔

--kubernetes-version 字串     預設值:"stable-1"

為控制平面選擇特定的 Kubernetes 版本。

--node-name 字串

指定節點名稱。

--patches 字串

包含名為 "target[suffix][+patchtype].extension" 檔案的目錄路徑。例如,"kube-apiserver0+merge.yaml" 或僅 "etcd.json"。"target" 可以是 "kube-apiserver"、"kube-controller-manager"、"kube-scheduler"、"etcd"、"kubeletconfiguration"、"corednsdeployment" 之一。"patchtype" 可以是 "strategic"、"merge" 或 "json" 之一,它們與 kubectl 支援的修補程式格式相符。預設的 "patchtype" 為 "strategic"。"extension" 必須是 "json" 或 "yaml"。"suffix" 是一個可選的字串,可用於決定哪些修補程式以字母數字順序優先套用。

--pod-network-cidr string

指定 Pod 網路的 IP 位址範圍。如果設定此項,控制平面將自動為每個節點分配 CIDR。

--service-cidr string     預設值:"10.96.0.0/12"

使用替代的 IP 位址範圍作為服務 VIP。

--service-dns-domain string     預設值:"cluster.local"

使用服務的替代網域,例如 "myorg.internal"。

--skip-certificate-key-print

不要印出用於加密控制平面憑證的金鑰。

--skip-phases strings

要略過的階段列表

--skip-token-print

略過印出 'kubeadm init' 產生的預設引導啟動權杖。

--token string

用於在節點和控制平面節點之間建立雙向信任的權杖。格式為 [a-z0-9]{6}.[a-z0-9]{16} - 例如 abcdef.0123456789abcdef

--token-ttl duration     預設值:24h0m0s

權杖自動刪除前的持續時間 (例如 1s、2m、3h)。如果設定為 '0',權杖將永不過期

--upload-certs

將控制平面憑證上傳到 kubeadm-certs Secret。

從父命令繼承的選項

--rootfs string

指向 '真實' 主機根檔案系統的路徑。這將使 kubeadm chroot 到提供的路徑中。

初始化工作流程

kubeadm init 透過執行以下步驟來引導啟動 Kubernetes 控制平面節點

  1. 執行一系列預檢以在進行變更之前驗證系統狀態。某些檢查只會觸發警告,其他檢查則被視為錯誤,並且會退出 kubeadm,直到問題被修正,或者使用者指定 --ignore-preflight-errors=<list-of-errors>

  2. 產生自我簽署的 CA,以設定叢集中每個元件的身分。使用者可以透過將自己的 CA 憑證和/或金鑰放入透過 --cert-dir (預設為 /etc/kubernetes/pki) 配置的憑證目錄中來提供。API 伺服器憑證將針對任何 --apiserver-cert-extra-sans 引數具有額外的 SAN 條目,必要時會轉換為小寫。

  3. /etc/kubernetes/ 中為 kubelet、controller-manager 和 scheduler 寫入 kubeconfig 檔案,以連接到 API 伺服器,每個檔案都有自己的身分。此外,還寫入了額外的 kubeconfig 檔案,用於作為管理實體的 kubeadm (admin.conf) 以及可以繞過 RBAC 的超級管理員使用者 (super-admin.conf)。

  4. 為 API 伺服器、controller-manager 和 scheduler 產生靜態 Pod 清單。如果未提供外部 etcd,則會為 etcd 產生額外的靜態 Pod 清單。

    靜態 Pod 清單會寫入到 /etc/kubernetes/manifests;kubelet 監控此目錄以在啟動時建立 Pod。

    一旦控制平面 Pod 啟動並執行,kubeadm init 序列就可以繼續。

  5. 將標籤和污點套用到控制平面節點,以便不會在那裡執行額外的工作負載。

  6. 產生額外節點可用於向未來控制平面註冊自己的權杖。或者,使用者可以透過 --token 提供權杖,如 kubeadm token 文件中所述。

  7. 進行所有必要的配置,以允許節點透過 Bootstrap TokensTLS Bootstrap 機制加入

    • 寫入 ConfigMap,以提供加入所需的所有資訊,並設定相關的 RBAC 存取規則。

    • 讓 Bootstrap Tokens 存取 CSR 簽署 API。

    • 為新的 CSR 請求配置自動批准。

    有關其他資訊,請參閱 kubeadm join

  8. 透過 API 伺服器安裝 DNS 伺服器 (CoreDNS) 和 kube-proxy 附加元件。在 Kubernetes 1.11 及更高版本中,CoreDNS 是預設的 DNS 伺服器。請注意,即使已部署 DNS 伺服器,在安裝 CNI 之前,它也不會被排程。

將初始化階段與 kubeadm 一起使用

kubeadm 允許您使用 kubeadm init phase 命令分階段建立控制平面節點。

要查看階段和子階段的排序列表,您可以呼叫 kubeadm init --help。該列表將位於說明畫面的頂部,每個階段旁邊都會有說明。請注意,透過呼叫 kubeadm init,所有階段和子階段都將按照此確切順序執行。

某些階段具有獨特的標誌,因此如果您想查看可用選項的列表,請新增 --help,例如

sudo kubeadm init phase control-plane controller-manager --help

您也可以使用 --help 來查看特定父階段的子階段列表

sudo kubeadm init phase control-plane --help

kubeadm init 還公開了一個名為 --skip-phases 的標誌,可用於略過某些階段。該標誌接受階段名稱列表,名稱可以從上面的排序列表中取得。

範例

sudo kubeadm init phase control-plane all --config=configfile.yaml
sudo kubeadm init phase etcd local --config=configfile.yaml
# you can now modify the control plane and etcd manifest files
sudo kubeadm init --skip-phases=control-plane,etcd --config=configfile.yaml

此範例將根據 configfile.yaml 中的配置,將控制平面和 etcd 的清單檔案寫入到 /etc/kubernetes/manifests 中。這允許您修改檔案,然後使用 --skip-phases 略過這些階段。透過呼叫最後一個命令,您將使用自訂的清單檔案建立控制平面節點。

功能狀態: Kubernetes v1.22 [beta]

或者,您可以使用 InitConfiguration 下的 skipPhases 欄位。

將 kubeadm init 與組態檔一起使用

可以使用組態檔而不是命令列標誌來配置 kubeadm init,並且某些更進階的功能可能僅作為組態檔選項提供。此檔案使用 --config 標誌傳遞,並且必須包含 ClusterConfiguration 結構,以及可選的更多以 ---\n 分隔的結構。在某些情況下,可能不允許將 --config 與其他標誌混合使用。

可以使用 kubeadm config print 命令印出預設組態。

如果您的組態未使用最新版本,**建議**您使用 kubeadm config migrate 命令進行遷移。

有關組態的欄位和使用方式的更多資訊,您可以導覽至我們的 API 參考頁面

將 kubeadm init 與功能閘道一起使用

kubeadm 支援一組 kubeadm 特有的功能閘道,並且只能在使用 kubeadm init 建立叢集期間套用。這些功能可以控制叢集的行為。功能閘道會在功能升級到 GA 後移除。

要傳遞功能閘道,您可以對 kubeadm init 使用 --feature-gates 標誌,或者在您使用 --config 傳遞 組態檔 時,將項目新增到 featureGates 欄位中。

不支援直接將 核心 Kubernetes 元件的功能閘道 傳遞給 kubeadm。相反地,可以透過 使用 kubeadm API 自訂元件 來傳遞它們。

功能閘道列表

kubeadm 功能閘道
功能預設值AlphaBetaGA
ControlPlaneKubeletLocalModefalse1.31--
EtcdLearnerModetrue1.271.291.32
NodeLocalCRISocketfalse1.32--
WaitForAllControlPlaneComponentsfalse1.30--

功能閘道說明

ControlPlaneKubeletLocalMode
啟用此功能閘道後,當加入新的控制平面節點時,kubeadm 將配置 kubelet 連接到本機 kube-apiserver。這確保在滾動升級期間不會違反版本偏差策略。
EtcdLearnerMode
啟用此功能閘道後,當加入新的控制平面節點時,新的 etcd 成員將建立為學習者,並且僅在 etcd 資料完全對齊後才會升級為投票成員。
NodeLocalCRISocket
啟用此功能閘道後,kubeadm 將從檔案 /var/lib/kubelet/instance-config.yaml 讀取/寫入每個節點的 CRI socket,而不是從節點物件上的註釋 kubeadm.alpha.kubernetes.io/cri-socket 讀取/寫入。新的檔案會作為實例配置修補程式套用,在套用任何其他使用者管理的修補程式之前 (當使用 --patches 標誌時)。它包含來自 KubeletConfiguration 檔案格式 的單一欄位 containerRuntimeEndpoint。如果在升級期間啟用功能閘道,但檔案 /var/lib/kubelet/instance-config.yaml 尚不存在,kubeadm 將嘗試從檔案 /var/lib/kubelet/kubeadm-flags.env 讀取 CRI socket 值。
WaitForAllControlPlaneComponents
啟用此功能閘道後,kubeadm 將等待控制平面節點上的所有控制平面元件 (kube-apiserver、kube-controller-manager、kube-scheduler) 在其 /livez/healthz 端點上報告狀態 200。這些檢查在 https://ADDRESS:PORT/ENDPOINT 上執行。
  • PORT 取自元件的 --secure-port
  • ADDRESS 對於 kube-apiserver 是 --advertise-address,對於 kube-controller-manager 和 kube-scheduler 是 --bind-address
  • ENDPOINT 僅對 kube-controller-manager 為 /healthz,直到它也支援 /livez 為止。

如果您在 kubeadm 組態中指定自訂的 ADDRESSPORT,它們將會被採用。在未啟用功能閘道的情況下,kubeadm 將僅等待控制平面節點上的 kube-apiserver 準備就緒。等待過程在主機上的 kubelet 由 kubeadm 啟動後立即開始。建議您啟用此功能閘道,以觀察在 kubeadm initkubeadm join 命令執行期間所有控制平面元件的就緒狀態。

已棄用的功能閘道列表

kubeadm 已棄用的功能閘道
功能預設值AlphaBetaGA已棄用
PublicKeysECDSAfalse1.19--1.31
RootlessControlPlanefalse1.22--1.31

功能閘道說明

PublicKeysECDSA
可用於建立使用 ECDSA 憑證而不是預設 RSA 演算法的叢集。使用 kubeadm certs renew 也支援續訂現有的 ECDSA 憑證,但是您無法動態或在升級期間在 RSA 和 ECDSA 演算法之間切換。v1.31 之前的 Kubernetes 版本存在一個錯誤,即使您啟用了 PublicKeysECDSA 功能閘道,產生的 kubeconfig 檔案中的金鑰仍設定為使用 RSA。此功能閘道已被棄用,以支持 kubeadm v1beta4 中提供的 encryptionAlgorithm 功能。
RootlessControlPlane
設定此標誌會將 kubeadm 部署的控制平面元件靜態 Pod 容器配置為以非 root 使用者身分執行 kube-apiserverkube-controller-managerkube-scheduleretcd。如果未設定此標誌,這些元件將以 root 身分執行。您可以在升級到較新版本的 Kubernetes 之前變更此功能閘道的值。

已移除的功能閘道列表

kubeadm 已移除的功能閘道
功能AlphaBetaGA已移除
IPv6DualStack1.161.211.231.24
UnversionedKubeletConfigMap1.221.231.251.26
UpgradeAddonsBeforeControlPlane1.28--1.31

功能閘道說明

IPv6DualStack
當功能正在進行中時,此標誌有助於配置元件雙堆疊。有關 Kubernetes 雙堆疊支援的更多詳細資訊,請參閱 使用 kubeadm 的雙堆疊支援
UnversionedKubeletConfigMap
此標誌控制 kubeadm 儲存 kubelet 組態資料的 ConfigMap 的名稱。如果未指定此標誌或設定為 true,則 ConfigMap 名稱為 kubelet-config。如果您將此標誌設定為 false,則 ConfigMap 的名稱將包含 Kubernetes 的主要和次要版本 (例如:kubelet-config-1.32)。kubeadm 確保讀取和寫入該 ConfigMap 的 RBAC 規則適用於您設定的值。當 kubeadm 寫入此 ConfigMap 時 (在 kubeadm initkubeadm upgrade apply 期間),kubeadm 會遵循 UnversionedKubeletConfigMap 的值。當 kubeadm 讀取該 ConfigMap 時 (在 kubeadm joinkubeadm resetkubeadm upgrade... 期間),kubeadm 會嘗試先使用未版本化的 ConfigMap 名稱。如果失敗,kubeadm 會退回到使用該 ConfigMap 的舊版 (已版本化) 名稱。
UpgradeAddonsBeforeControlPlane
此功能閘道已移除。它在 v1.28 中作為已棄用的功能引入,然後在 v1.31 中移除。有關舊版本的文檔,請切換到相應的網站版本。

新增 kube-proxy 參數

有關 kubeadm 組態中 kube-proxy 參數的資訊,請參閱

有關使用 kubeadm 啟用 IPVS 模式的資訊,請參閱

將自訂標誌傳遞到控制平面元件

有關將標誌傳遞到控制平面元件的資訊,請參閱

在沒有網際網路連線的情況下執行 kubeadm

為了在沒有網際網路連線的情況下執行 kubeadm,您必須預先提取所需的控制平面映像。

您可以使用 kubeadm config images 子命令列出和提取映像

kubeadm config images list
kubeadm config images pull

您可以將 --config 與上述命令一起傳遞,並使用 kubeadm 組態檔 來控制 kubernetesVersionimageRepository 欄位。

kubeadm 需要的所有預設 registry.k8s.io 映像都支援多種架構。

使用自訂映像

預設情況下,kubeadm 從 registry.k8s.io 提取映像。如果請求的 Kubernetes 版本是 CI 標籤 (例如 ci/latest),則會使用 gcr.io/k8s-staging-ci-images

您可以使用含有設定檔的 kubeadm 來覆寫此行為。允許的自訂項目如下:

  • 提供 kubernetesVersion,其會影響映像檔的版本。
  • 提供替代的 imageRepository 以取代 registry.k8s.io
  • 為 etcd 或 CoreDNS 提供特定的 imageRepositoryimageTag

基於回溯相容性的考量,預設的 registry.k8s.io 和使用 imageRepository 指定的自訂儲存庫之間的映像檔路徑可能會有所不同。例如,一個映像檔的路徑可能在 registry.k8s.io/subpath/image,但當使用自訂儲存庫時,預設路徑可能會變成 my.customrepository.io/image

為了確保您將映像檔推送至 kubeadm 可以使用的自訂儲存庫路徑,您必須

  • 使用 kubeadm config images {list|pull}registry.k8s.io 的預設路徑提取映像檔。
  • 將映像檔推送至 kubeadm config images list --config=config.yaml 輸出的路徑,其中 config.yaml 包含自訂的 imageRepository,和/或 etcd 及 CoreDNS 的 imageTag
  • 將相同的 config.yaml 傳遞給 kubeadm init

自訂沙箱 (pause) 映像檔

若要為這些項目設定自訂映像檔,您需要在您的容器執行期中設定以使用該映像檔。請查閱您的容器執行期的文件,以了解如何變更此設定;對於選定的容器執行期,您也可以在容器執行期主題中找到建議。

將控制平面憑證上傳到叢集

透過將 --upload-certs 標記新增到 kubeadm init,您可以暫時將控制平面憑證上傳到叢集中的 Secret。請注意,此 Secret 將在 2 小時後自動過期。憑證使用 32 位元組金鑰加密,該金鑰可以使用 --certificate-key 指定。當額外的控制平面節點加入時,可以透過將 --control-plane--certificate-key 傳遞給 kubeadm join 來使用相同的金鑰下載憑證。

以下階段命令可用於在過期後重新上傳憑證

kubeadm init phase upload-certs --upload-certs --config=SOME_YAML_FILE

如果沒有將預定義的憑證金鑰傳遞給 kubeadm initkubeadm init phase upload-certs,則會自動產生新的金鑰。

以下命令可用於按需產生新的金鑰

kubeadm certs certificate-key

使用 kubeadm 進行憑證管理

有關使用 kubeadm 進行憑證管理的詳細資訊,請參閱使用 kubeadm 進行憑證管理。該文件包含有關使用外部 CA、自訂憑證和憑證續訂的資訊。

管理 kubelet 的 kubeadm 放置檔案

kubeadm 套件附帶一個設定檔,用於透過 systemd 執行 kubelet。請注意,kubeadm CLI 永遠不會接觸此放置檔案。此放置檔案是 kubeadm DEB/RPM 套件的一部分。

如需更多資訊,請參閱管理 systemd 的 kubelet 放置檔案

搭配 CRI 執行期使用 kubeadm

預設情況下,kubeadm 會嘗試偵測您的容器執行期。有關此偵測的更多詳細資訊,請參閱kubeadm CRI 安裝指南

設定節點名稱

預設情況下,kubeadm 會根據機器的主機位址指派節點名稱。您可以使用 --node-name 標記覆寫此設定。該標記會將適當的 --hostname-override 值傳遞給 kubelet。

請注意,覆寫主機名稱可能會干擾雲端供應商

自動化 kubeadm

您可以並行處理權杖分發以簡化自動化,而不是像基本的 kubeadm 教學中那樣,將從 kubeadm init 取得的權杖複製到每個節點。為了實作此自動化,您必須知道控制平面節點啟動後將擁有的 IP 位址,或者使用 DNS 名稱或負載平衡器的位址。

  1. 產生權杖。此權杖的格式必須為 <6 個字元的字串>.<16 個字元的字串>。更正式地說,它必須符合 regex:[a-z0-9]{6}\.[a-z0-9]{16}

    kubeadm 可以為您產生權杖

    kubeadm token generate
    
  2. 同時啟動控制平面節點和工作節點,並使用此權杖。當它們啟動時,它們應該會找到彼此並形成叢集。相同的 --token 引數可以用於 kubeadm initkubeadm join

  3. 對於加入額外控制平面節點時的 --certificate-key,也可以執行類似的操作。可以使用以下命令產生金鑰

    kubeadm certs certificate-key
    

叢集啟動後,您可以使用控制平面節點中的 /etc/kubernetes/admin.conf 檔案,以管理員身分與叢集通訊,或參閱為其他使用者產生 kubeconfig 檔案

請注意,這種啟動樣式具有較寬鬆的安全性保證,因為它不允許使用 --discovery-token-ca-cert-hash 驗證根 CA 雜湊值(因為它在節點佈建時未產生)。有關詳細資訊,請參閱kubeadm join

下一步

上次修改時間:2024 年 12 月 13 日下午 2:57 PST:Clean up kubeadm/kubeadm-init.md (c5f5a96505)