安裝 kubeadm
本頁說明如何安裝
kubeadm
工具箱。如需瞭解在執行此安裝程序後如何使用 kubeadm 建立叢集的資訊,請參閱使用 kubeadm 建立叢集頁面。
本安裝指南適用於 Kubernetes v1.32。如果您想使用不同的 Kubernetes 版本,請改為參考下列頁面
開始之前
- 相容的 Linux 主機。Kubernetes 專案為基於 Debian 和 Red Hat 的 Linux 發行版,以及那些沒有套件管理員的發行版,提供通用說明。
- 每部機器 2 GB 或更多的 RAM(任何更少都會為您的應用程式留下很少的空間)。
- 控制平面機器需要 2 個或更多的 CPU。
- 叢集中所有機器之間的完整網路連線能力(公用或私有網路皆可)。
- 每個節點的唯一主機名稱、MAC 位址和 product_uuid。請參閱此處以取得更多詳細資訊。
- 您的機器上已開啟某些埠。請參閱此處以取得更多詳細資訊。
注意
kubeadm
安裝是透過使用動態連結的二進位檔完成的,並假設您的目標系統提供 glibc
。這在許多 Linux 發行版(包括 Debian、Ubuntu、Fedora、CentOS 等)上是一個合理的假設,但對於預設不包含 glibc
的自訂和輕量級發行版(例如 Alpine Linux)而言,情況並非總是如此。期望發行版包含 glibc
或提供預期符號的相容性層。驗證每個節點的 MAC 位址和 product_uuid 都是唯一的
- 您可以使用命令
ip link
或ifconfig -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/fstab
、systemd.swap
)中停用交換空間,具體取決於系統上的配置方式。
安裝容器執行期
為了在 Pod 中執行容器,Kubernetes 使用容器執行期。
預設情況下,Kubernetes 使用容器執行期介面 (Container Runtime Interface, CRI) 來與你選擇的容器執行期介接。
如果你未指定執行期,kubeadm 會自動嘗試偵測已安裝的容器執行期,方法是掃描已知端點的清單。
如果偵測到多個或沒有容器執行期,kubeadm 將會拋出錯誤,並要求你指定要使用哪一個。
請參閱容器執行期以取得更多資訊。
注意
Docker Engine 未實作 CRI,而 CRI 是容器執行期與 Kubernetes 協作的必要條件。因此,必須安裝額外的服務 cri-dockerd。cri-dockerd 是一個專案,其基礎是傳統內建的 Docker Engine 支援,該支援已在 1.24 版本中從 kubelet 移除。下表包含支援作業系統的已知端點
執行期 | Unix 網域 Socket 路徑 |
---|---|
containerd | unix:///var/run/containerd/containerd.sock |
CRI-O | unix:///var/run/crio/crio.sock |
Docker Engine (使用 cri-dockerd) | unix:///var/run/cri-dockerd.sock |
執行期 | Windows 具名管道路徑 |
---|---|
containerd | npipe:////./pipe/containerd-containerd |
Docker Engine (使用 cri-dockerd) | npipe:////./pipe/cri-dockerd |
安裝 kubeadm、kubelet 和 kubectl
你將在所有機器上安裝這些套件
kubeadm
:用於引導叢集的指令。kubelet
:在叢集中所有機器上執行的組件,並執行諸如啟動 Pod 和容器之類的工作。kubectl
:用於與叢集交談的命令列工具。
kubeadm 將不會 為你安裝或管理 kubelet
或 kubectl
,因此你需要確保它們與你希望 kubeadm 為你安裝的 Kubernetes 控制平面的版本相符。如果你不這樣做,則存在發生版本偏差的風險,這可能會導致意外的錯誤行為。但是,kubelet 和控制平面之間支援一個次要版本偏差,但 kubelet 版本永遠不得超過 API 伺服器版本。例如,執行 1.7.0 的 kubelet 應與 1.8.0 API 伺服器完全相容,但反之則不然。
有關安裝 kubectl
的資訊,請參閱安裝和設定 kubectl。
警告
這些指示排除所有系統升級中的 Kubernetes 套件。這是因為 kubeadm 和 Kubernetes 需要特別注意升級。有關版本偏差的更多資訊,請參閱
apt.kubernetes.io
和 yum.kubernetes.io
) 已棄用並從 2023 年 9 月 13 日起凍結。強烈建議使用託管在 pkgs.k8s.io
的新套件儲存庫,並且為了安裝 2023 年 9 月 13 日之後發布的 Kubernetes 版本,這是必要的。 棄用的舊版儲存庫及其內容可能會在未來任何時間移除,且不會另行通知。新的套件儲存庫提供從 v1.24.0 開始的 Kubernetes 版本下載。注意
每個 Kubernetes 次要版本都有專用的套件儲存庫。如果你想安裝 v1.32 以外的次要版本,請參閱所需次要版本的安裝指南。這些指示適用於 Kubernetes v1.32。
更新
apt
套件索引,並安裝使用 Kubernetesapt
儲存庫所需的套件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
下載 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
注意
在舊於 Debian 12 和 Ubuntu 22.04 的版本中,目錄/etc/apt/keyrings
預設不存在,應在執行 curl 命令之前建立。新增適當的 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
更新
apt
套件索引,安裝 kubelet、kubeadm 和 kubectl,並釘選其版本sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
(選用) 在執行 kubeadm 之前啟用 kubelet 服務
sudo systemctl enable --now kubelet
將 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
注意
- 透過執行
setenforce 0
和sed ...
將 SELinux 設定為寬容模式,實際上會停用它。這是允許容器存取主機檔案系統所必需的;例如,某些叢集網路外掛程式需要這樣做。在你於 kubelet 中改進 SELinux 支援之前,你必須執行此操作。 - 如果你知道如何配置 SELinux,則可以保持啟用 SELinux,但可能需要 kubeadm 不支援的設定。
新增 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
安裝 kubelet、kubeadm 和 kubectl
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
(選用) 在執行 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
變數必須設定為可寫入的目錄。如果你執行的是 Flatcar Container Linux,請設定 DOWNLOAD_DIR="/opt/bin"
。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
安裝 kubeadm
、kubelet
並新增 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
注意
Flatcar Container Linux 發行版本將/usr
目錄掛載為唯讀檔案系統。在引導叢集之前,你需要採取額外步驟來配置可寫入的目錄。請參閱 Kubeadm 疑難排解指南,以了解如何設定可寫入的目錄。kubelet 現在每隔幾秒鐘重新啟動一次,因為它在 CrashLoopBackOff 狀態中等待 kubeadm 告訴它該怎麼做。
設定 cgroup 驅動程式
容器執行期和 kubelet 都具有一個名為 "cgroup 驅動程式" 的屬性,這對於 Linux 機器上 cgroup 的管理非常重要。
疑難排解
如果你在使用 kubeadm 時遇到困難,請查閱我們的 疑難排解文件。