安裝 kubeadm

本頁說明如何安裝 kubeadm 工具箱。如需瞭解在執行此安裝程序後如何使用 kubeadm 建立叢集的資訊,請參閱使用 kubeadm 建立叢集頁面。

本安裝指南適用於 Kubernetes v1.32。如果您想使用不同的 Kubernetes 版本,請改為參考下列頁面

開始之前

  • 相容的 Linux 主機。Kubernetes 專案為基於 Debian 和 Red Hat 的 Linux 發行版,以及那些沒有套件管理員的發行版,提供通用說明。
  • 每部機器 2 GB 或更多的 RAM(任何更少都會為您的應用程式留下很少的空間)。
  • 控制平面機器需要 2 個或更多的 CPU。
  • 叢集中所有機器之間的完整網路連線能力(公用或私有網路皆可)。
  • 每個節點的唯一主機名稱、MAC 位址和 product_uuid。請參閱此處以取得更多詳細資訊。
  • 您的機器上已開啟某些埠。請參閱此處以取得更多詳細資訊。

驗證每個節點的 MAC 位址和 product_uuid 都是唯一的

  • 您可以使用命令 ip linkifconfig -a 取得網路介面的 MAC 位址
  • 可以使用命令 sudo cat /sys/class/dmi/id/product_uuid 檢查 product_uuid

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

檢查網路介面卡

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

檢查必要的埠

這些 必要埠 需要開啟,Kubernetes 組件才能彼此通訊。你可以使用像是 netcat 這類的工具來檢查埠是否已開啟。例如:

nc 127.0.0.1 6443 -v

你使用的 Pod 網路外掛程式可能也需要某些埠處於開啟狀態。由於這會因各個 Pod 網路外掛程式而異,請參閱這些外掛程式的文件,以了解它們需要哪些埠。

交換空間(Swap)配置

kubelet 的預設行為是,如果在節點上偵測到交換記憶體,則啟動會失敗。這表示應停用交換空間,或 kubelet 應容許交換空間。

  • 若要容許交換空間,請將 failSwapOn: false 新增至 kubelet 配置或作為命令列引數。請注意:即使提供了 failSwapOn: false,工作負載預設也不會具備交換空間存取權。這可以透過設定 swapBehavior 來變更,同樣在 kubelet 配置檔案中設定。若要使用交換空間,請設定預設 NoSwap 設定以外的 swapBehavior。請參閱 交換記憶體管理 以取得更多詳細資訊。
  • 若要停用交換空間,可以使用 sudo swapoff -a 暫時停用交換。若要讓此變更在重新啟動後仍然有效,請確保在組態檔(例如 /etc/fstabsystemd.swap)中停用交換空間,具體取決於系統上的配置方式。

安裝容器執行期

為了在 Pod 中執行容器,Kubernetes 使用容器執行期

預設情況下,Kubernetes 使用容器執行期介面 (Container Runtime Interface, CRI) 來與你選擇的容器執行期介接。

如果你未指定執行期,kubeadm 會自動嘗試偵測已安裝的容器執行期,方法是掃描已知端點的清單。

如果偵測到多個或沒有容器執行期,kubeadm 將會拋出錯誤,並要求你指定要使用哪一個。

請參閱容器執行期以取得更多資訊。

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

Linux 容器執行期
執行期Unix 網域 Socket 路徑
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 控制平面的版本相符。如果你不這樣做,則存在發生版本偏差的風險,這可能會導致意外的錯誤行為。但是,kubelet 和控制平面之間支援一個次要版本偏差,但 kubelet 版本永遠不得超過 API 伺服器版本。例如,執行 1.7.0 的 kubelet 應與 1.8.0 API 伺服器完全相容,但反之則不然。

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

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

這些指示適用於 Kubernetes v1.32。

  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.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    
  1. 新增適當的 Kubernetes apt 儲存庫。請注意,此儲存庫僅包含 Kubernetes 1.32 的套件;對於其他 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.32/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.32。

    # 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.32 的套件;對於其他 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.32/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://pkgs.k8s.io/core:/stable:/v1.32/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 現在每隔幾秒鐘重新啟動一次,因為它在 CrashLoopBackOff 狀態中等待 kubeadm 告訴它該怎麼做。

設定 cgroup 驅動程式

容器執行期和 kubelet 都具有一個名為 "cgroup 驅動程式" 的屬性,這對於 Linux 機器上 cgroup 的管理非常重要。

疑難排解

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

下一步

上次修改時間:2024 年 10 月 16 日上午 9:28 PST:Tweak and clean up four kubeadm files (67c5917e32)