安装 kubeadm

此页面展示了如何安装 kubeadm 工具箱。 有关在执行此安装过程后如何使用 kubeadm 创建集群的信息,请参阅使用 kubeadm 创建集群页面。

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

开始之前

  • 兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及那些没有包管理器的发行版提供了通用说明。
  • 每台机器 2 GB 或更多的 RAM(任何更少的内存都会为你的应用程序留下很少的空间)。
  • 控制平面机器 2 个或更多 CPU。
  • 集群中所有机器之间的完全网络连接(公共或私有网络都可以)。
  • 每个节点唯一的 hostname、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 网络插件而异,请参阅有关这些插件需要哪些端口的文档。

交换配置

如果在节点上检测到交换内存,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.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 参数确保与 Kubernetes 相关的软件包在运行 yum update 时不会升级,因为升级 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 现在每隔几秒钟重启一次,因为它在 crashloop 中等待 kubeadm 告诉它该做什么。

配置 cgroup 驱动程序

容器运行时和 kubelet 都具有一个名为"cgroup 驱动程序"的属性,这对于 Linux 机器上 cgroup 的管理非常重要。

故障排除

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

下一步

上次修改时间:2024 年 10 月 16 日上午 9:28 PST:调整和清理四个 kubeadm 文件 (67c5917e32)