安装 kubeadm

    • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
    • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
    • 2 CPU 核或更多
    • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
    • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
    • 开启机器上的某些端口。请参见 了解更多详细信息。
    • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。

    确保每个节点上 MAC 地址和 product_uuid 的唯一性

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

    一般来讲,硬件设备会拥有唯一的地址,但是有些虚拟机的地址可能会重复。 Kubernetes 使用这些值来唯一确定集群中的节点。 如果这些值在每个节点上不唯一,可能会导致安装 。

    检查网络适配器

    如果你有一个以上的网络适配器,同时你的 Kubernetes 组件通过默认路由不可达,我们建议你预先添加 IP 路由规则,这样 Kubernetes 集群就可以通过对应的适配器完成连接。

    确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter

    为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。例如:

    更多的相关细节可查看页面。

    检查所需端口

    启用这些后才能使 Kubernetes 的各组件相互通信。可以使用 netcat 之类的工具来检查端口是否启用,例如:

    1. nc 127.0.0.1 6443

    你使用的 Pod 网络插件 (详见后续章节) 也可能需要开启某些特定端口。由于各个 Pod 网络插件的功能都有所不同, 请参阅他们各自文档中对端口的要求。

    安装 runtime

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

    默认情况下,Kubernetes 使用 容器运行时接口(Container Runtime Interface,CRI) 来与你所选择的容器运行时交互。

    如果你不指定运行时,则 kubeadm 会自动尝试检测到系统上已经安装的运行时, 方法是扫描一组众所周知的 Unix 域套接字。 下面的表格列举了一些 kubeadm 查找的容器运行时及其对应的套接字路径:

    如果同时检测到 Docker Engine 和 containerd,kubeadm 将优先考虑 Docker Engine。 这是必然的,因为 Docker 18.09 附带了 containerd 并且两者都是可以检测到的, 即使你仅安装了 Docker。 **如果检测到其他两个或多个运行时,kubeadm 输出错误信息并退出。**

    kubelet 可以使用已弃用的 dockershim 适配器与 Docker Engine 集成(dockershim 是 kubelet 本身的一部分)。

    参阅 以了解更多信息。

    默认情况下, kubeadm 使用 Docker 作为容器运行时。 kubelet 可以使用已弃用的 dockershim 适配器与 Docker Engine 集成(dockershim 是 kubelet 本身的一部分)。 参阅 以了解更多信息。

    你需要在每台机器上安装以下的软件包:

    • kubeadm:用来初始化集群的指令。

    • kubectl:用来与集群通信的命令行工具。

    kubeadm 不能 帮你安装或者管理 kubeletkubectl,所以你需要 确保它们与通过 kubeadm 安装的控制平面的版本相匹配。 如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。 然而,控制平面与 kubelet 间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过 API 服务器的版本。 例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。

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

    Warning:

    这些指南不包括系统升级时使用的所有 Kubernetes 程序包。这是因为 kubeadm 和 Kubernetes 有。

    关于版本偏差的更多信息,请参阅以下文档:

    1. 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:

      1. sudo apt-get update
      2. sudo apt-get install -y apt-transport-https ca-certificates curl
    2. 下载 Google Cloud 公开签名秘钥:

      1. sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
    3. 添加 Kubernetes apt 仓库:

    4. 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:

      1. sudo apt-get update
      2. sudo apt-mark hold kubelet kubeadm kubectl
    1. cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
    2. [kubernetes]
    3. name=Kubernetes
    4. baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-\$basearch
    5. enabled=1
    6. gpgcheck=1
    7. repo_gpgcheck=1
    8. gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
    9. exclude=kubelet kubeadm kubectl
    10. EOF
    11. # 将 SELinux 设置为 permissive 模式(相当于将其禁用)
    12. sudo setenforce 0
    13. sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
    14. sudo systemctl enable --now kubelet

    请注意:

    • 通过运行命令 setenforce 0sed ... 将 SELinux 设置为 permissive 模式 可以有效地将其禁用。 这是允许容器访问主机文件系统所必需的,而这些操作时为了例如 Pod 网络工作正常。

      你必须这么做,直到 kubelet 做出对 SELinux 的支持进行升级为止。

    • 如果你知道如何配置 SELinux 则可以将其保持启用状态,但可能需要设定 kubeadm 不支持的部分配置

    安装 CNI 插件(大多数 Pod 网络都需要):

    1. CNI_VERSION="v0.8.2"
    2. ARCH="amd64"
    3. sudo mkdir -p /opt/cni/bin
    4. curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-linux-${ARCH}-${CNI_VERSION}.tgz" | sudo tar -C /opt/cni/bin -xz

    定义要下载命令文件的目录。

    Note:

    DOWNLOAD_DIR 变量必须被设置为一个可写入的目录。 如果你在运行 Flatcar Container Linux,可将 DOWNLOAD_DIR 设置为 /opt/bin

    安装 crictl(kubeadm/kubelet 容器运行时接口(CRI)所需)

    1. CRICTL_VERSION="v1.22.0"
    2. ARCH="amd64"
    3. 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

    安装 kubeadmkubeletkubectl 并添加 kubelet 系统服务:

    1. RELEASE="$(curl -sSL https://dl.k8s.io/release/stable.txt)"
    2. ARCH="amd64"
    3. cd $DOWNLOAD_DIR
    4. sudo curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/${ARCH}/{kubeadm,kubelet,kubectl}
    5. sudo chmod +x {kubeadm,kubelet,kubectl}
    6. RELEASE_VERSION="v0.4.0"
    7. curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service
    8. sudo mkdir -p /etc/systemd/system/kubelet.service.d
    9. curl -sSL "https://raw.githubusercontent.com/kubernetes/release/${RELEASE_VERSION}/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf" | sed "s:/usr/bin:${DOWNLOAD_DIR}:g" | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

    激活并启动 kubelet

    Note:

    Flatcar Container Linux 发行版会将 /usr/ 目录挂载为一个只读文件系统。 在启动引导你的集群之前,你需要执行一些额外的操作来配置一个可写入的目录。 参见 kubeadm 故障排查指南 以了解如何配置一个可写入的目录。

    kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。

    配置 cgroup 驱动程序

    容器运行时和 kubelet 都具有名字为 “cgroup driver” 的属性,该属性对于在 Linux 机器上管理 CGroups 而言非常重要。

    Warning:

    你需要确保容器运行时和 kubelet 所使用的是相同的 cgroup 驱动,否则 kubelet 进程会失败。

    相关细节可参见。

    故障排查

    如果你在使用 kubeadm 时遇到困难,请参阅我们的 。

    最后修改 April 20, 2022 at 6:14 PM PST: