安装 kubeadm

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

此安装指南适用于 Kubernetes v1.35。如果您想使用不同的 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容器网络接口 插件。

为了帮助您避免因不受支持的内核版本而导致的意外错误,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 网络插件而异,请参阅插件的文档以了解需要哪些端口。

交换配置

kubelet 的默认行为是在检测到节点上的交换内存时失败启动。这意味着应该禁用交换或被 kubelet 容忍。

  • 要容忍交换,请将 failSwapOn: false 添加到 kubelet 配置或作为命令行参数。请注意:即使提供了 failSwapOn: false,工作负载默认情况下也不会有交换访问权限。可以通过在 kubelet 配置文件中设置 swapBehavior 来更改此设置。要使用交换,请将 swapBehavior 设置为除默认 NoSwap 设置以外的设置。有关更多详细信息,请参阅 交换内存管理
  • 要禁用交换,可以使用 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 控制平面版本匹配。否则,可能会发生版本偏差,导致意外的错误行为。但是,kubelet 和控制平面之间支持一个次要版本偏差,但 kubelet 版本不得超过 API 服务器版本。例如,运行 1.7.0 的 kubelet 应与 1.8.0 API 服务器完全兼容,反之则不兼容。

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

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

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

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

    # 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.35 的软件包;对于其他 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.35/rpm/
    enabled=1
    gpgcheck=1
    gpgkey=https://pkgs.k8s.io/core:/stable:/v1.35/rpm/repodata/repomd.xml.key
    exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
    EOF
    
  2. 安装 kubelet、kubeadm 和 kubectl

    对于使用 DNF 的系统

    sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    

    对于使用 DNF5 的系统

    sudo yum install -y kubelet kubeadm kubectl --setopt=disable_excludes=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 年 9 月 17 日下午 4:34 PST:修复 kubelet、kubeadm、kubectl 安装命令的缩进 (6086553949)