安装 kubeadm
此页面介绍如何安装 kubeadm 工具箱。有关使用 kubeadm 创建集群的信息,请参阅 使用 kubeadm 创建集群 页面。
此安装指南适用于 Kubernetes v1.35。如果您想使用不同的 Kubernetes 版本,请参阅以下页面:
开始之前
- 兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及没有包管理器的发行版提供通用说明。
- 每台机器 2 GB 或更多内存(更少会给您的应用程序留下很少的空间)。
- 控制平面机器 2 个或更多 CPU。
- 集群中所有机器之间的完全网络连接(公共或专用网络均可)。
- 每个节点都有唯一的 hostname、MAC 地址和 product_uuid。有关更多详细信息,请参阅 此处。
- 您的机器上打开了某些端口。有关更多详细信息,请参阅 此处。
说明
kubeadm 安装通过使用动态链接的二进制文件完成,并假定您的目标系统提供 glibc。这在许多 Linux 发行版(包括 Debian、Ubuntu、Fedora、CentOS 等)中是一个合理的假设,但对于默认情况下不包含 glibc 的自定义和轻量级发行版(例如 Alpine Linux)而言并非总是如此。期望是该发行版要么包含 glibc,要么提供 兼容层,以提供预期的符号。检查您的操作系统版本
- kubeadm 项目支持 LTS 内核。请参阅 LTS 内核列表。
- 您可以使用命令
uname -r获取内核版本
有关更多信息,请参阅 Linux 内核要求。
- kubeadm 项目支持最新的内核版本。有关最新内核的列表,请参阅 Windows Server 发布信息。
- 您可以使用命令
systeminfo获取内核版本(也称为操作系统版本)
有关更多信息,请参阅 Windows 操作系统版本兼容性。
由 kubeadm 创建的 Kubernetes 集群依赖于使用内核功能的软件。这些软件包括但不限于 容器运行时、kubelet 和 容器网络接口 插件。
为了帮助您避免因不受支持的内核版本而导致的意外错误,kubeadm 会运行 SystemVerification 预检检查。如果内核版本不受支持,此检查将失败。
如果您知道您的内核提供了所需的功能,即使 kubeadm 不支持其版本,您也可以选择跳过检查。
验证每个节点的 MAC 地址和 product_uuid 是否唯一
- 您可以使用命令
ip link或ifconfig -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/fstab、systemd.swap)中禁用交换,具体取决于系统上配置交换的方式。
安装容器运行时
为了在 Pod 中运行容器,Kubernetes 使用 容器运行时。
默认情况下,Kubernetes 使用 容器运行时接口 (CRI) 与您选择的容器运行时进行交互。
如果您没有指定运行时,kubeadm 会自动尝试检测已安装的容器运行时,方法是扫描已知端点列表。
如果检测到多个或没有容器运行时,kubeadm 将抛出错误,并要求您指定想要使用的运行时。
有关更多信息,请参阅 容器运行时。
说明
Docker Engine 未实现 CRI,这是容器运行时与 Kubernetes 协同工作的要求。因此,必须安装额外的服务 cri-dockerd。cri-dockerd 是一个基于旧版内置 Docker Engine 支持的项目,该支持已在 1.24 版本的 kubelet 中 移除。下表包含受支持操作系统上的已知端点
| 运行时 | Unix 域套接字的路径 |
|---|---|
| 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.35 以外的次要版本,请参阅您想要安装的次要版本的安装指南。这些说明适用于 Kubernetes v1.35。
更新
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.35/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.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更新
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.35。
# 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 设置为 permissive 模式有效地禁用了它。这是允许容器访问主机文件系统所必需的;例如,某些集群网络插件需要它。您必须这样做,直到 kubelet 中的 SELinux 支持得到改进。 - 如果您知道如何配置 SELinux,可以启用它,但它可能需要 kubeadm 不支持的设置。
添加 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安装 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(可选)在运行 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 现在正在每隔几秒重新启动一次,因为它正在等待 kubeadm 告诉它该做什么。
配置 cgroup 驱动
容器运行时和 kubelet 都有一个名为 “cgroup 驱动程序” 的属性,这对于 Linux 机器上的 cgroup 的管理非常重要。
故障排除
如果您在使用 kubeadm 时遇到困难,请参阅我们的 故障排除文档。
接下来
此页面上的项目引用了提供 Kubernetes 所需功能的第三方产品或项目。Kubernetes 项目作者不对这些第三方产品或项目负责。有关更多详细信息,请参阅 CNCF 网站指南。
在提出添加额外的第三方链接的更改之前,您应该阅读 内容指南。