安装 kubeadm

安装 kubeadm - 图1本页面显示如何安装 kubeadm 工具箱。 有关在执行此安装过程后如何使用 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 软件包不兼容。

  • Debian 或 Ubuntu
  • Fedora
    1. update-alternatives --set iptables /usr/sbin/iptables-legacy

    检查所需端口

    控制平面节点

    | 协议 | 方向 | 端口范围 | 作用 | 使用者 | | —- | —- | —- | —- | —- | | 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 服务** 所有组件

* 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 有特殊的升级注意事项

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

https://www.jianshu.com/p/d02416d67e21

阿里云上没有附Help说明连接,简单摸索了下,如下设置可用(centos)。注意不要开启check。

  1. cat <<EOF > /etc/yum.repos.d/kubernetes.repo
  2. [kubernetes]
  3. name=Kubernetes
  4. baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
  5. enabled=1
  6. gpgcheck=0
  7. repo_gpgcheck=0
  8. gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
  9. http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
  10. EOF
  11. cat /etc/yum.repos.d/kubernetes.repo
  12. # 将 SELinux 设置为 permissive 模式(相当于将其禁用)
  13. setenforce 0
  14. sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
  15. yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
  16. systemctl enable --now kubelet && systemctl start kubelet

image.png

image.png
请注意:

  • 通过运行命令 setenforce 0sed ... 将 SELinux 设置为 permissive 模式可以有效的将其禁用。 这是允许容器访问主机文件系统所必须的,例如正常使用 pod 网络。 您必须这么做,直到 kubelet 做出升级支持 SELinux 为止。
  • 一些 RHEL/CentOS 7 的用户曾经遇到过问题:由于 iptables 被绕过而导致流量无法正确路由的问题。您应该确保 在 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 被设置为 1。

    cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    sysctl --system
    
  • 确保在此步骤之前已加载了 br_netfilter 模块。这可以通过运行 lsmod | grep br_netfilter 来完成。要显示加载它,请调用 modprobe br_netfilter

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

在控制平面节点上配置 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-O 和 containerd。

故障排查

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

接下来

https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/