安装 kubeadm

半兽人 发表于: 2020-11-02   最后更新时间: 2020-11-16  

本页面显示如何安装 kubeadm 工具箱。
有关在执行此安装过程后如何使用 kubeadm 创建集群的信息。

准备开始

  • 一台或多台运行着下列系统的机器:
    • Ubuntu 16.04+
    • Debian 9+
    • CentOS 7
    • Red Hat Enterprise Linux (RHEL) 7
    • Fedora 25+
    • HypriotOS v1.0.1+
    • Container Linux (测试 1800.6.0 版本)
  • 每台机器 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 集群就可以通过对应的适配器完成连接。

确保 iptables 工具不使用 nftables 后端

在 Linux 中,nftables 当前可以作为内核 iptables 子系统的替代品。
iptables 工具可以充当兼容性层,其行为类似于 iptables 但实际上是在配置 nftables。
nftables 后端与当前的 kubeadm 软件包不兼容:它会导致重复防火墙规则并破坏 kube-proxy

如果您系统的 iptables 工具使用 nftables 后端,则需要把 iptables 工具切换到“旧版”模式来避免这些问题。
默认情况下,至少在 Debian 10 (Buster)、Ubuntu 19.04、Fedora 29 和较新的发行版本中会出现这种问题。RHEL 8 不支持切换到旧版本模式,因此与当前的 kubeadm 软件包不兼容。

检查所需端口

控制节点

协议 方向 端口范围 作用 使用者
TCP 入站 6443* Kubernetes API 服务器 所有组件
TCP 入站 2379-2380 etcd server client API kube-apiserver, etcd
TCP 入站 10250 Kubelet API kubelet 自身、控制平面组件
TCP 入站 10251 kube-scheduler kube-scheduler 自身
TCP 入站 10252 kube-controller-manager kube-controller-manager 自身

工作节点

协议 方向 端口范围 作用 使用者
TCP 入站 10250 Kubelet API kubelet 自身、控制平面组件
TCP 入站 30000-32767 NodePort 服务** 所有组件

使用 * 标记的任意端口号都可以被覆盖,所以您需要保证所定制的端口是开放的。

虽然控制平面节点已经包含了 etcd 的端口,您也可以使用自定义的外部 etcd 集群,或是指定自定义端口。

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

安装 runtime

从 v1.6.0 版本起,Kubernetes 开始默认允许使用 CRI(容器运行时接口)。

从 v1.14.0 版本起,kubeadm 将通过观察已知的 UNIX 域套接字来自动检测 Linux 节点上的容器运行时。
下表中是可检测到的正在运行的 runtime 和 socket 路径。

运行时 域套接字
Docker /var/run/docker.sock
containerd /run/containerd/containerd.sock
CRI-O /var/run/crio/crio.sock

如果同时检测到 docker 和 containerd,则优先选择 docker。
这是必然的,因为 docker 18.09 附带了 containerd 并且两者都是可以检测到的。
如果检测到其他两个或多个运行时,kubeadm 将以一个合理的错误信息退出。

在非 Linux 节点上,默认使用 docker 作为容器 runtime。

如果选择的容器 runtime 是 docker,则通过内置 dockershim CRI 在 kubelet 的内部实现其的应用。

基于 CRI 的其他 runtimes 有:

请参考 CRI 安装指南 来进行安装。

安装 kubeadm、kubelet 和 kubectl

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

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

  • kubelet:在集群中的每个节点上用来启动 pod 和容器等。

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

kubeadm 不能 帮您安装或者管理 kubeletkubectl,所以您需要确保它们与通过 kubeadm 安装的控制平面的版本相匹配。

如果不这样做,则存在发生版本偏差的风险,可能会导致一些预料之外的错误和问题。
然而,控制平面与 kubelet 间的相差一个次要版本不一致是支持的,但 kubelet 的版本不可以超过 API 服务器的版本。

例如,1.7.0 版本的 kubelet 可以完全兼容 1.8.0 版本的 API 服务器,反之则不可以。

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

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

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

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

可以指定使用国内镜像

sudo apt-get update && sudo apt-get install -y apt-transport-https curl

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

## 另外,你也可以指定版本安装
## apt-get install kubectl=1.19.3-00 kubelet=1.19.3-00 kubeadm=1.19.3-00

在控制节点上配置 kubelet 使用的 cgroup 驱动程序

使用 docker 时,kubeadm 会自动为其检测 cgroup 驱动并在运行时对 /var/lib/kubelet/kubeadm-flags.env 文件进行配置。

如果您使用不同的 CRI,您需要使用 cgroup-driver 值修改 /etc/default/kubelet 文件(对于 CentOS、RHEL、Fedora,修改 /etc/sysconfig/kubelet 文件),像这样:

KUBELET_EXTRA_ARGS=--cgroup-driver=<value>

这个文件将由 kubeadm initkubeadm join 使用以获取额外的用户自定义的 kubelet 参数。

请注意,您 需要在您的 cgroup 驱动程序不是 cgroupfs 时这么做,因为它已经是 kubelet 中的默认值。

需要重新启动 kubelet:

systemctl daemon-reload
systemctl restart kubelet

自动检测其他容器运行时的 cgroup 驱动,例如在进程中工作的 CRI-Ocontainerd

故障排查

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

接下来



您需要解锁本帖隐藏内容请: 点击这里
本帖隐藏的内容




上一条: 使用kubeadm安装kubernetes(k8s)集群
下一条: 使用 kubeadm 创建集群实战