安装 kubeadm

本页介绍如何安装 kubeadm 工具箱。有关安装过程完成后如何使用 kubeadm 创建集群的信息,请参阅使用 kubeadm 创建集群页面。

本安装指南适用于 Kubernetes v1.33。如果你想使用不同的 Kubernetes 版本,请参阅以下页面:

开始之前

  • 兼容的 Linux 主机。Kubernetes 项目提供了基于 Debian 和 Red Hat 的 Linux 发行版以及没有包管理器的发行版的通用说明。
  • 每台机器 2 GB 或更多内存(少于此值将为你的应用程序留下很小的空间)。
  • 控制平面机器需要 2 个或更多 CPU。
  • 集群中所有机器之间完整的网络连接(公共或私有网络均可)。
  • 每个节点都需要唯一的 hostname、MAC 地址和 product_uuid。更多详细信息请参见此处
  • 你的机器上需要开放某些端口。更多详细信息请参见此处

检查你的操作系统版本

  • kubeadm 项目支持 LTS 内核。请参见LTS 内核列表
  • 你可以使用命令 uname -r 获取内核版本

更多信息请参见Linux 内核要求

  • kubeadm 项目支持最新的内核版本。有关最新内核的列表,请参见Windows Server 发布信息
  • 你可以使用命令 systeminfo 获取内核版本(也称为操作系统版本)

更多信息请参见Windows 操作系统版本兼容性

kubeadm 创建的 Kubernetes 集群依赖于使用内核特性的软件。这些软件包括但不限于容器运行时、运行在集群中每个节点上的代理kubelet 以及容器网络接口 (Container Network Interface) 插件。

为了帮助你避免由于不支持的内核版本导致的意外错误,kubeadm 会运行 SystemVerification 预检。如果内核版本不受支持,此检查将失败。

如果你知道你的内核提供了所需的功能,即使 kubeadm 不支持其版本,你也可以选择跳过此检查。

验证每个节点的 MAC 地址和 product_uuid 是唯一的

  • 你可以使用命令 ip linkifconfig -a 获取网络接口的 MAC 地址
  • 可以使用命令 sudo cat /sys/class/dmi/product_uuid 检查 product_uuid

硬件设备很可能有唯一的地址,但一些虚拟机可能具有相同的值。Kubernetes 使用这些值来唯一标识集群中的节点。如果这些值对于每个节点不是唯一的,安装过程可能会失败

检查网络适配器

如果你有多个网络适配器,并且你的 Kubernetes 组件无法通过默认路由访问,建议你添加 IP 路由,以便 Kubernetes 集群地址通过适当的适配器。

检查所需端口

需要打开这些所需端口,以便 Kubernetes 组件之间可以相互通信。你可以使用 netcat 等工具来检查端口是否开放。例如:

nc 127.0.0.1 6443 -zv -w 2

你使用的 Pod 网络插件可能也需要开放某些端口。由于每个 Pod 网络插件的要求不同,请查阅插件文档以了解其所需的端口。

Swap 配置

Kubelet 的默认行为是,如果在节点上检测到 Swap 内存,则启动失败。这意味着 Swap 应该被禁用或被 kubelet 容忍。

  • 要容忍 Swap,请将 failSwapOn: false 添加到 kubelet 配置或作为命令行参数。注意:即使提供了 failSwapOn: false,工作负载默认也无法访问 Swap。这可以通过在 kubelet 配置文件中设置 swapBehavior 来改变。要使用 Swap,请设置一个不同于默认 NoSwap 设置的 swapBehavior。更多详细信息请参见Swap 内存管理
  • 要禁用 Swap,可以使用命令 sudo swapoff -a 临时禁用 Swap。要使此更改在重新启动后持久化,请确保在配置文件(如 /etc/fstabsystemd.swap)中禁用了 Swap,具体取决于你的系统配置方式。

安装容器运行时

为了在 Pod 中运行容器,Kubernetes 使用容器运行时

默认情况下,Kubernetes 使用容器运行时接口 (Container Runtime Interface)(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 控制平面版本匹配。如果不匹配,可能会发生版本偏差,导致意外的、有问题的行为。但是,Kubelet 和控制平面之间允许有一个次要版本的偏差,但 kubelet 的版本不能超过 API Server 的版本。例如,运行 1.7.0 的 kubelet 应该与 1.8.0 的 API Server 完全兼容,反之则不然。

有关安装 kubectl 的信息,请参阅安装和配置 kubectl

有关版本偏差的更多信息,请参阅:

这些说明适用于 Kubernetes v1.33。

  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.33/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
    
  1. 添加相应的 Kubernetes apt 仓库。请注意,此仓库仅包含 Kubernetes 1.33 的软件包;对于其他 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.33/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.33。

    # 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.33 的软件包;对于其他 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.33/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/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 现在每隔几秒钟重启一次,因为它在 crashloop 中等待 kubeadm 告诉它要做什么。

配置 cgroup 驱动

容器运行时和 kubelet 都有一个称为“cgroup 驱动”的属性,这对 Linux 机器上的 cgroups 管理很重要。

故障排除

如果你在使用 kubeadm 时遇到困难,请查阅我们的故障排除文档

下一步

本页上的内容涉及提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者对此类第三方产品或项目不负责。更多详细信息请参阅 CNCF 网站指南

在提议添加额外的第三方链接的更改之前,你应该阅读内容指南