2.2 使用kubeadm工具快速安装Kubernetes集群

Kubernetes从1.4版本开始引入了命令行工具kubeadm,致力于简化集群的安装过程,到Kubernetes 1.13版本时,kubeadm工具达到GA阶段。本节讲解基于kubeadm的安装过程,操作系统以CentOS 7为例。

2.2.1 安装kubeadm

对kubeadm工具的安装在CentOS操作系统上可以通过yum工具一键完成。

首先配置yum源,官方yum源配置文件/etc/yum.repos.d/kubernetes.repo的内容如下:

如果无法访问官方yum源的地址,则也可以使用国内的一个yum源。

然后运行yum install命令安装kubeadm、kubelet和kubectl:

kubeadm将使用kubelet服务以容器方式部署和启动Kubernetes的主要服务,所以需要先启动kubelet服务。运行systemctl start命令启动kubelet服务,并设置为开机自启动:

kubeadm还需要关闭Linux的swap系统交换区,这可以通过swapoff-a命令实现:

2.2.2 修改kubeadm的默认配置

kubeadm的初始化控制平面(init)命令和加入节点(join)命令均可以通过指定的配置文件修改默认参数的值。kubeadm将配置文件以ConfigMap形式保存到集群中,便于后续的查询和升级工作。kubeadm config子命令提供了对这组功能的支持。

◎ kubeadm config print init-defaults:输出kubeadm init命令默认参数的内容。

◎ kubeadm config print join-defaults:输出kubeadm join命令默认参数的内容。

◎ kubeadm config migrate:在新旧版本之间进行配置转换。

◎ kubeadm config images list:列出所需的镜像列表。

◎ kubeadm config images pull:拉取镜像到本地。

例如,运行kubeadm config print init-defaults命令,可以获得默认的初始化参数文件:

对生成的文件进行编辑,可以按需生成合适的配置。例如,若需要自定义镜像的仓库地址、需要安装的Kubernetes版本号及Pod的IP地址范围,则可以将默认配置修改如下:

将上面的内容保存为init-config.yaml备用。

2.2.3 下载Kubernetes的相关镜像

为了加快kubeadm创建集群的过程,可以预先将所需镜像下载完成。可以通过kubeadm config images list命令查看镜像列表,例如:

如果无法访问k8s.gcr.io,则可以使用国内镜像托管站点进行下载,例如https://1nj0zren.mirror.aliyuncs.com,这可以通过修改Docker服务的配置文件(默认为/etc/docker/daemon.json)进行设置,例如:

然后,使用kubeadm config images pull命令或者docker pull命令下载上述镜像,例如:

在镜像下载完成之后,就可以进行安装了。

2.2.4 运行kubeadm init命令安装Master节点

至此,准备工作已经就绪,运行kubeadm init命令即可一键安装Kubernetes的Master节点,也称之为Kubernetes控制平面(Control Plane)。

在开始之前需要注意:kubeadm的安装过程不涉及网络插件(CNI)的初始化,因此kubeadm初步安装完成的集群不具备网络功能,任何Pod(包括自带的CoreDNS)都无法正常工作。而网络插件的安装往往对kubeadm init命令的参数有一定要求。例如,安装Calico插件时需要指定--pod-network-cidr=192.168.0.0/16。关于安装CNI网络插件的更多内容,可参考官方文档的说明。

kubeadm init命令在执行具体的安装操作之前,会执行一系列被称为pre-flight checks的系统预检查,以确保主机环境符合安装要求,如果检查失败就直接终止,不再进行init操作。用户可以通过kubeadm init phase preflight命令执行预检查操作,确保系统就绪后再执行init操作。如果不希望执行预检查,则也可以为kubeadm init命令添加--ignore-preflight-errors参数进行关闭。如表2.3所示是kubeadm检查的系统配置,对不符合要求的检查项以warning或error级别的信息给出提示。

表2.3 kubeadm检查的系统配置

▼续表

另外,Kubernetes默认设置cgroup驱动(cgroupdriver)为“systemd”,而Docker服务的cgroup驱动默认值为“cgroupfs”,建议将其修改为“systemd”,与Kubernetes保持一致。这可以通过修改Docker服务的配置文件(默认为/etc/docker/daemon.json)进行设置:

准备工作就绪之后,就可以运行kubeadm init命令,使用之前创建的配置文件一键安装Master节点(控制平面)了:

一切正常的话,控制台将输出如下内容:

看到“Your Kubernetes control-plane has initialized successfully!”的提示,就说明Master节点(控制平面)已经安装成功了。

接下来就可以通过kubectl命令行工具访问集群进行操作了。由于kubeadm默认使用CA证书,所以需要为kubectl配置证书才能访问Master。

按照安装成功的提示,非root用户可以将admin.conf配置文件复制到HOME目录的.kube子目录下,命令如下:

如果用户是root,则也可以通过设置环境变量KUBECONFIG完成kubectl的配置:

然后就可以使用kubectl命令行工具对Kubernetes集群进行访问和操作了。

例如查看命名空间kube-system中的ConfigMap列表:

到此,Kubernetes的Master节点已经可以工作了,但在集群内还是没有可用的Worker Node,并缺乏容器网络的配置。

接下来安装Worker Node,需要用到kubeadm init命令运行完成后的最后几行提示信息,其中包含将节点加入集群的命令(kubeadm join)和所需的Token。

2.2.5 将新的Node加入集群

对于新节点的添加,系统准备和安装Master节点的过程是一致的,在待安装的各个Node主机上进行下面的安装过程。

(1)安装kubeadm和kubelet(在Node上无须安装kubectl):

运行systemctl start命令启动kubelet服务,并设置为开机自启动:

(2)使用kubeadm join命令加入集群,可以从安装Master节点的成功提示内容中复制完整的命令,例如:

如果需要调整其他配置,则也可以通过自定义配置文件的方式进行操作,通过kubeadm config print join-defaults命令获取默认配置的内容,再进行修改,例如:

修改配置文件join.config.yaml的内容如下:

其中,apiServerEndpoint的值为Master服务的URL地址,token和tlsBootstrapToken的值来自使用kubeadm init安装Master时的最后一行提示信息。

运行kubeadm join命令,将本Node加入集群:

成功将Node加入集群后,可以通过kubectl get nodes命令确认新的Node已加入:

另外,在初始安装的Master节点上也启动了kubelet和kube-proxy,在默认情况下并不参与工作负载的调度。如果希望Master节点也作为Node角色,则可以运行下面的命令(删除Node的Label“node-role.kubernetes.io/master”),让Master节点也成为一个Node:

2.2.6 安装CNI网络插件

运行kubeadm init和join命令后,Kubernetes提示各节点均为NotReady状态,这是因为还没有安装CNI网络插件:

对于CNI网络插件,可以有许多选择。例如选择Calico CNI插件,运行下面的命令即可一键完成安装:

在CNI网络插件成功运行之后,再次查看Node,其状态会更新为Ready:

2.2.7 验证Kubernetes集群是否工作正常

运行查看Pod的命令,验证Kubernetes集群服务的Pod是否创建成功且正常运行:

如果发现有状态错误的Pod,则可以运行kubectl--namespace=kube-system describe pod <pod_name>命令查看错误原因,常见的错误原因是镜像没有下载完成。

至此,通过kubeadm工具就实现了Kubernetes集群的快速搭建。

如果安装失败,则可以运行kubeadm reset命令将主机恢复原状,重新运行kubeadm init命令再次进行安装。