安裝 kubeadm

本頁面介紹如何安裝 kubeadm 工具包。有關在完成此安裝過程後如何使用 kubeadm 建立叢集的資訊,請參閱使用 kubeadm 建立叢集頁面。

此安裝指南適用於 Kubernetes v1.34。如果你想使用不同的 Kubernetes 版本,請參考以下頁面:

準備工作

  • 相容的 Linux 主機。Kubernetes 專案提供了基於 Debian 和 Red Hat 的 Linux 發行版以及沒有包管理器的發行版的通用說明。
  • 每臺機器 2 GB 或更多記憶體(少於 2 GB 將為應用程式留下很少的空間)。
  • 控制平面機器需要 2 個或更多 CPU。
  • 叢集中所有機器之間完全網路連通(公共或私有網路均可)。
  • 每個節點都有唯一的 hostname、MAC 地址和 product_uuid。有關更多詳細資訊,請參閱此處
  • 你的機器上需要開啟某些埠。有關更多詳細資訊,請參閱此處

檢查作業系統版本

  • kubeadm 專案支援 LTS 核心。請參閱LTS 核心列表
  • 你可以使用命令 uname -r 獲取核心版本。

有關更多資訊,請參閱Linux 核心要求

  • kubeadm 專案支援最新的核心版本。有關最新核心列表,請參閱Windows Server 釋出資訊
  • 你可以使用命令 systeminfo 獲取核心版本(也稱為作業系統版本)。

有關更多資訊,請參閱Windows 作業系統版本相容性

kubeadm 建立的 Kubernetes 叢集依賴於使用核心功能的軟體。此軟體包括但不限於容器執行時kubelet容器網路介面外掛。

為了幫助你避免因不支援的核心版本而導致的意外錯誤,kubeadm 執行 SystemVerification 預檢檢查。如果核心版本不受支援,此檢查將失敗。

如果你知道你的核心提供了所需的功能,即使 kubeadm 不支援其版本,你也可以選擇跳過此檢查。

驗證每個節點的 MAC 地址和 product_uuid 是否唯一

  • 你可以使用命令 ip linkifconfig -a 獲取網路介面的 MAC 地址。
  • product_uuid 可以使用命令 sudo cat /sys/class/dmi/product_uuid 檢查。

硬體裝置很可能有唯一的地址,儘管某些虛擬機器可能具有相同的值。Kubernetes 使用這些值來唯一標識叢集中的節點。如果這些值對於每個節點不唯一,則安裝過程可能會失敗

檢查網路介面卡

如果你有多個網路介面卡,並且你的 Kubernetes 元件無法在預設路由上訪問,我們建議你新增 IP 路由,以便 Kubernetes 叢集地址透過適當的介面卡。

檢查所需埠

這些所需埠需要開啟,以便 Kubernetes 元件能夠相互通訊。你可以使用 netcat 等工具檢查埠是否開啟。例如:

nc 127.0.0.1 6443 -zv -w 2

你使用的 Pod 網路外掛可能也需要開啟某些埠。由於這因每個 Pod 網路外掛而異,請參閱外掛的文件以瞭解需要哪些埠。

Swap 配置

kubelet 的預設行為是如果節點上檢測到交換記憶體則啟動失敗。這意味著交換要麼被停用,要麼被 kubelet 容忍。

  • 要容忍交換,請將 failSwapOn: false 新增到 kubelet 配置或作為命令列引數。注意:即使提供了 failSwapOn: false,工作負載預設也不會有交換訪問許可權。這可以透過在 kubelet 配置檔案中設定 swapBehavior 來更改。要使用交換,請設定除預設 NoSwap 設定之外的 swapBehavior。有關更多詳細資訊,請參閱交換記憶體管理
  • 要停用交換,可以使用 sudo swapoff -a 暫時停用交換。要使此更改在重新啟動後持久生效,請確保在 /etc/fstabsystemd.swap 等配置檔案中停用交換,具體取決於系統上的配置方式。

安裝容器執行時

要在 Pod 中執行容器,Kubernetes 使用容器執行時

預設情況下,Kubernetes 使用容器執行時介面 (CRI) 與你選擇的容器執行時進行介面。

如果你未指定執行時,kubeadm 將自動嘗試透過掃描已知端點列表來檢測已安裝的容器執行時。

如果檢測到多個或沒有容器執行時,kubeadm 將丟擲錯誤並要求你指定要使用哪個。

有關更多資訊,請參閱容器執行時

下表包含受支援作業系統的已知端點。

Linux 容器執行時
執行時Unix 域套接字路徑
containerdunix:///var/run/containerd/containerd.sock
CRI-Ounix:///var/run/crio/crio.sock
Docker Engine(使用 cri-dockerd)unix:///var/run/cri-dockerd.sock

Windows 容器執行時
執行時Windows 命名管道路徑
containerdnpipe:////./pipe/containerd-containerd
Docker Engine(使用 cri-dockerd)npipe:////./pipe/cri-dockerd

安裝 kubeadm、kubelet 和 kubectl

你將在所有機器上安裝這些軟體包:

  • kubeadm:用於引導叢集的命令。

  • kubelet:在叢集中所有機器上執行的元件,用於啟動 Pod 和容器等。

  • kubectl:用於與叢集通訊的命令列工具。

kubeadm 不會為你安裝或管理 kubeletkubectl,因此你需要確保它們與你希望 kubeadm 為你安裝的 Kubernetes 控制平面版本匹配。如果版本不匹配,可能會出現版本偏差,從而導致意外的、有 bug 的行為。但是,kubelet 和控制平面之間支援一個次要版本偏差,但 kubelet 版本不能超過 API 伺服器版本。例如,執行 1.7.0 的 kubelet 應該與 1.8.0 API 伺服器完全相容,但反之則不然。

有關安裝 kubectl 的資訊,請參閱安裝和設定 kubectl

有關版本偏差的更多資訊,請參閱:

這些說明適用於 Kubernetes v1.34。

  1. 更新 apt 軟體包索引並安裝使用 Kubernetes apt 倉庫所需的軟體包。

    sudo apt-get update
    # apt-transport-https may be a dummy package; if so, you can skip that package
    sudo apt-get install -y apt-transport-https ca-certificates curl gpg
    
  2. 下載 Kubernetes 軟體包倉庫的公共簽名金鑰。所有倉庫都使用相同的簽名金鑰,因此你可以忽略 URL 中的版本。

    # If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
    # sudo mkdir -p -m 755 /etc/apt/keyrings
    curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    
  1. 新增適當的 Kubernetes apt 倉庫。請注意,此倉庫僅包含 Kubernetes 1.34 的軟體包;對於其他 Kubernetes 次要版本,你需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本(你還應該檢查你正在閱讀的文件是否是你計劃安裝的 Kubernetes 版本)。

    # This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
    echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
    
  2. 更新 apt 軟體包索引,安裝 kubelet、kubeadm 和 kubectl,並固定它們的版本。

    sudo apt-get update
    sudo apt-get install -y kubelet kubeadm kubectl
    sudo apt-mark hold kubelet kubeadm kubectl
    
  3. (可選)在執行 kubeadm 之前啟用 kubelet 服務。

    sudo systemctl enable --now kubelet
    

  1. 將 SELinux 設定為 permissive 模式。

    這些說明適用於 Kubernetes 1.34。

    # Set SELinux in permissive mode (effectively disabling it)
    sudo setenforce 0
    sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    
  1. 新增 Kubernetes yum 倉庫。倉庫定義中的 exclude 引數確保在執行 yum update 時不會升級與 Kubernetes 相關的軟體包,因為升級 Kubernetes 必須遵循特殊的程式。請注意,此倉庫僅包含 Kubernetes 1.34 的軟體包;對於其他 Kubernetes 次要版本,你需要更改 URL 中的 Kubernetes 次要版本以匹配你所需的次要版本(你還應該檢查你正在閱讀的文件是否是你計劃安裝的 Kubernetes 版本)。

    # This overwrites any existing configuration in /etc/yum.repos.d/kubernetes.repo
    cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    [kubernetes]
    name=Kubernetes
    baseurl=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key
    exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
    EOF
    
  2. 安裝 kubelet、kubeadm 和 kubectl。

    sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    
  3. (可選)在執行 kubeadm 之前啟用 kubelet 服務。

    sudo systemctl enable --now kubelet
    

安裝 CNI 外掛(大多數 Pod 網路需要)。

CNI_PLUGINS_VERSION="v1.3.0"
ARCH="amd64"
DEST="/opt/cni/bin"
sudo mkdir -p "$DEST"
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_PLUGINS_VERSION}/cni-plugins-linux-${ARCH}-${CNI_PLUGINS_VERSION}.tgz" | sudo tar -C "$DEST" -xz

定義下載命令檔案的目錄。

DOWNLOAD_DIR="/usr/local/bin"
sudo mkdir -p "$DOWNLOAD_DIR"

可選安裝 crictl(與容器執行時介面 (CRI) 互動所需,對 kubeadm 可選)。

CRICTL_VERSION="v1.31.0"
ARCH="amd64"
curl -L "https://github.com/kubernetes-sigs/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-${ARCH}.tar.gz" | sudo tar -C $DOWNLOAD_DIR -xz

安裝 kubeadmkubelet 並新增 kubelet systemd 服務。

RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
ARCH="amd64"
cd $DOWNLOAD_DIR
sudo curl -L --remote-name-all https://dl.k8s.io/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet}
sudo chmod +x {kubeadm,kubelet}

RELEASE_VERSION="v0.16.2"
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubelet/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service
sudo mkdir -p /usr/lib/systemd/system/kubelet.service.d
curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/krel/templates/latest/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf

按照安裝工具頁面上的說明安裝 kubectl

(可選)在執行 kubeadm 之前啟用 kubelet 服務。

sudo systemctl enable --now kubelet

kubelet 現在每隔幾秒鐘重啟一次,因為它在崩潰迴圈中等待 kubeadm 告訴它該做什麼。

配置 cgroup 驅動程式

容器執行時和 kubelet 都有一個名為“cgroup 驅動程式”的屬性,這對於 Linux 機器上的 cgroup 管理很重要。

故障排除

如果你在使用 kubeadm 時遇到困難,請查閱我們的故障排除文件

下一步

本頁面上的專案涉及提供 Kubernetes 所需功能的第三方產品或專案。Kubernetes 專案作者不對這些第三方產品或專案負責。有關更多詳細資訊,請參閱CNCF 網站指南

在提議新增額外第三方連結的更改之前,你應該閱讀內容指南

最後修改於 2025 年 8 月 6 日太平洋標準時間下午 5:43:修復了 en 版本 install-kubeadm.md 中的交換連結 (11e3addb00)