【K8s 入门必看】第二篇 —— 快速部署集群指南
🌟 前言
工欲善其事,必先利其器,学习 Kubernetes 必须有环境的支撑,搭建出企业级应用环境是一名合格的运维人员必须掌握的技能。 部署集群前需要明确各组件的安装架构,做好规划,防止在工作时出现服务错乱的情况。 其次,要整合环境资源,减少不必要的资源浪费。 本篇文章将带领大家搭建出企业级的 Kubernetes 集群,在实际的操作中感受容器编排的魅力。
1. 官方提供的集群部署方式
Kubernetes 系统支持四种方式在本地服务器或者云端上部署集群,用户可以根据不同的需求灵活选择,下面介绍这些安装方式的特点。
🍑 使用 Minikube 工具安装
Minikube 是一种能够在计算机或者虚拟机(VM)内轻松运行单节点 Kubernetes 集群的工具,可实现一键部署。
这种方式安装的系统在企业中大多数被当作测试系统使用。
🍑 使用 yum 安装
通过直接使用 epel-release yum 源来安装 Kubernetes 集群,这种安装方式的优点是速度快,但只能安装 Kubernetes v1.5 及以下的版本。
🍑 使用二进制编译安装
使用二进制编译包部署集群,用户需要下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。
这种部署方式比较灵活,用户可以根据自身需求自定义配置,而且性能比较稳定。
虽然二进制方式可以提供稳定的集群状态,但是这种方式部署步骤非常烦琐,一些细小的错误就会导致系统运行失败。
🍑 使用 Kubeadm 工具安装
Kubeadm 是一种支持多节点部署 Kubernetes 集群的工具,该方式提供 kubeadm init 和 kubeadm join 命令插件,使用户轻松地部署出企业级的高可用集群架构。
在 Kubernetes 1.13 版本中,Kubeadm 工具已经进入了可正式发布(General Availability,GA)阶段。
2. Kubeadm 方式快速部署集群
🍑 Kubeadm 简介
Kubeadm 是芬兰高中生卢卡斯·科尔德斯特伦(Lucas Käldström)在 17 岁时用业余时间完成的一个社区项目。
用户可以使用 Kubeadm 工具构建出一个最小化的 Kubernetes 可用集群,但其余的附件,如安装监控系统、日志系统、UI 界面等,需要管理员按需自行安装。
Kubeadm 主要集成了 kubeadm init 和 kube join 工具。
其中 kubeadm init 工具负责部署 Master 节点上的各个组件并将其快速初始化,kubeadm join 工具负责将 Node 节点快速加入集群。
kubeadm 还支持令牌认证(bootstrap Token),因此逐渐成为企业中受青睐的部署方式。
🍑 部署系统要求
Kubernetes 系统由一组可执行程序组成,读者可以在 GitHub 开源代码库的 Kubernetes 项目页面内下载所需的二进制文件包或源代码包。
安装 Kubernetes 对系统和硬件的要求如表所示。
Kubernetes 支持的容器包括 Docker、Containerd、CRI-O 和 Frakti。
本次实验在示例中使用 Docker 作为容器运行环境。
部署 Kubernetes 集群使用的是三台 Centos 系统的虚拟机,其中一台作为 Master 节点,另外两台作为 Node 节点,虚拟主机的系统配置信息如表所示。
在部署集群前需要修改各节点的主机名,配置节点间的主机名解析。
注意,以下操作在所有节点上都需要执行,这里只给出在 Master 节点上的操作步骤,示例代码如下所示。
1. 关闭防火墙与禁用 SELinux
Kubernetes 的 Master 节点与 Node 节点间会有大量的网络通信,为了避免安装过程中不必要的报错,需要将系统的防火墙关闭。
同时在主机上禁用 SELinux,示例代码如下:
SELinux 有两种禁用方式,分为临时禁用与永久性禁用。临时禁用 SELinux 的示例代码如下:
永久禁用 SELinux 服务需要编辑文件 /etc/selinux/config,将 SELINUX 修改为 disabled,示例代码如下:
2. 关闭系统 Swap
从 Kubernetes 1.8 版本开始,部署集群时需要关闭系统的 Swap(交换分区)。
如果不关闭 Swap,则默认配置下的 Kubelet 将无法正常启动。用户可以通过两种方式关闭 Swap。
(1)方法一:通过修改 Kubelet 的启动参数 "–fail-swap-on=false" 更改这个限制。
(2)方法二:使用 swapoff -a 参数来修改 /etc/fstab 文件,使用 # 将 Swap 自动挂载配置注释。
示例代码如下:
Swap 关闭后可以使用 free –m 命令来确认 Swap 是否已经关闭,代码如下所示。
通过 free –m 命令的执行结果可以看出,Swap 关闭。再次提醒,以上操作需要在所有节点上执行。
3. 主机时间同步
如果各主机可以访问互连网,直接启动各主机上的 chronyd 服务即可;
否则需要使用本地的时间服务器,确保各主机时间同步。启动 chronyd 服务的示例代码如下。
以上操作完后,需要重新启动计算机,以便配置修改生效。
🍑 基本环境和集群架构
前面已经介绍过部署 Kubernetes 所需的基本环境,包括关闭 SELinux 和 防火墙、主机时间同步、关闭 Swap 和主机名称解析,基本环境的部署流程此处将不再赘述。
Kubernetes 项目目前仍处于快速迭代阶段,本次实验在演示过程中使用的配置可能不完全适合后续版本,因此,在使用不同版本时,建议大家可以去参考官方安装文档。
在部署集群前,首先要了解集群中组件的基本情况,Kubeadm 方式部署 Kubernetes 集群系统配置信息如表所示。
集群的基本环境配置好后,接下来进行实际的部署操作。
🍑 安装流程
Kubeadm 在构建集群过程中要访问 gcr.io(谷歌镜像仓库)并下载相关的 Docker 镜像,所以需要确保主机可以正常访问此站点。
如果无法访问该站点,用户可以访问国内的镜像仓库(如清华镜像站)下载相关镜像。镜像下载完成后,修改为指定的 tag(标签)即可。
1. 安装 Docker 与镜像下载
Kubeadm 需要 Docker 环境,因此要在各节点上安装并启动 Docker,代码如下:
Docker 安装完成后,需要从 Docker Hub 网站拉取相应的镜像并为镜像更换标签,代码如下:
从 Docker Hub 上拉取镜像速度缓慢为正常现象,需耐心等待。
2. 安装 Kubeadm 和 Kubelet
配置 Kubeadm 和 Kubelet 的 Repo 源,并在所有节点上安装 Kubeadm 和 Kubelet 工具,示例代码如下:
配置完 Kubeadm 和 Kubelet 的 Repo 源后即可进行安装操作,示例代码:
3. 配置转发参数
Kubelet 安装完成后,通过配置网络转发参数以确保集群能够正常通信,示例代码如下:
如果在执行上述命令后出现 "net.bridge.bridge-nf-call-iptables" 相关信息的报错,则需要重新加载 br_netfilter 模块,代码如下:
4. 加载 IPVS 相关内核模块
Kubernetes 运行中需要非永久性地加载相应的 IPVS 内核模块,可以将其添加在开机启动项中,代码如下:
IPVS 加载完成后,可以通过命令 "lsmod | grep ip_vs" 查看内核模块是否加载成功。
5. 配置 Kubelet
在所有节点上配置 Kubelet,示例代码如下:
6. 启动 Kubelet 服务
Kubelet 配置完成后即可启动该服务,代码如下:
接下来可以运行 "systemctl status kubelet" 命令查看 Kubelet 状态。
命令的返回结果中出现以下信息属于正常现象。
通过运行 journalctl -xefu kubelet 命令查看系统日志,可以得到以下结果。
导致上述现象的原因是还没有为集群签发 CA 证书,在使用 kubeadm init 工具生成 CA 证书后该问题会自动解决,但在运行 Kubeadm init 之前 Kubelet 插件会不断地重启。
7. 初始化 Master 节点
在 Master 节点和各 Node 节点的 Docker 和 Kubelet 设置完成后,即可在 Master 节点上执行 kubelet init 命令初始化集群。
kubeadm init 命令支持两种初始化方式,一是通过命令选项传递参数来设定,二是使用 YAML 格式的专用配置文件设定更详细的配置参数。本实例将使用第一种较为简单的初始化方式。
在 Master 节点执行 Kubeadm init 命令即可实现对 Master 节点的初始化操作,代码如下:
Kubeadm init 初始化命令中 "--apiserver-advertise-address=192.168.26.10" 表示所要初始化的节点为 Master。
注意,在进行此操作时,需要将参数值修改为自己部署环境中的参数值。
上面的内容记录了系统完成初始化的过程,从代码中可以看出 Kubernetes 集群初始化会进行以下四步。
(1)[kubelet]: 生成 Kubelet 的配置文件 "/var/lib/kubelet/config.yaml"。
(2)[certificates]: 生成相关的各种证书。
(3)[kubeconfig]: 生成 kubeconfig 文件。
(4)[bootstraptoken]: 生成 token。
另外在加载结果的最后会出现配置 Node 节点加入集群的 token 指令:
"kubeadm join 192.168.26.10:6443 --token wip0ux.19q3dpudrnyc6q7i --discovery-token-ca-cert-hash sha256:e41c201f32d7aa6c57254cd78c13a5aa7242979f7152bf33ec25dde13c1dcc9a"
需要注意,后面审批 Node 节点加入集群时需要该指令。
8. 配置使用 Kubectl
在 Master 节点配置使用 Kubectl 并通过命令查看节点状态,代码如下:
9. 配置使用网络插件
通过 kubectl get nodes 的执行结果可以看出 Master 节点为 NotReady 状态,这是因为还没有安装网络插件。
在 Master 节点上安装网络插件,代码如下:
网络插件文件 kube-flannel.yml 下载完成后,需要修改文件中的网络配置信息。
其中配置文件中的 IP 参数需要与上面 Kubeadm 的 pod-network 一致,修改后的文件代码如下:
配置文件中默认的镜像源路径为 "quay.io/coreos/flannel:v0.10.0-amd64",如果用户可以从该镜像路径下载镜像就不需要修改。
否则,需要将镜像地址修改为阿里镜像源 "image: registry.cn-shanghai.aliyuncs.com/gcr-k8s/flannel:v0.10.0-amd64",示例代码如下:
如果 Node 节点存在多个网卡,则需要在 kube-flannel.yaml 中使用 --iface 参数指定集群主机内网网卡的名称,否则可能会出现 DNS 无法解析,容器无法通信的情况。
在 flanneld 启动参数中加加入 --iface=<iface-name> 项,示例代码如下:
Kubeadm 部署方式中,系统默认情况下给 Node 节点设置一个污点(Taint):node.Kubernetes.io/not-ready:NoSchedule,该污点表示在各节点还没有进入 ready 状态之前,Node 节点不会接受系统的调度。
如果 Kubernetes 的网络插件还未部署,节点是不会进入 ready 状态的。
因此需要在 kube-flannel.yaml 文件中加入对 node.Kubernetes.io/not-ready:NoSchedule 污点的容忍,示例代码如下:
网络配置完成后,测试 Kubectl 服务是否能够正常启动,示例代码如下:
网络插件完成安装配置后,节点状态会显示为 Ready,代码如下:
此时,在 Node 节点输入 token 指令即可将 Node 节点加入集群,代码如下:
注意,此 token 指令为 Master 节点初始化完成后的返回值。
🍑 集群状态检测
Node 节点加入集群后,即可在 Master 节点对集群状态进行检测。
1. 查看 Pod
使用 Kubectl 命令行工具查看 Pod 状态,并使用 -n 参数指定 Pod 的命令空间,代码如下:
2. 查看异常 Pod 信息
从上面的代码可以看出 kube-flannel-ds-sr6tq 的状态为 0,此时可以输入以下指令查看异常 Pod 信息。
当然,用户也可以删除异常的 Pod,示例代码如下:
至此,Kubernetes 集群部署完成。
3. 总结
本章带领大家使用 Kubeadm 方式搭建出企业级的 Kubernetes 应用集群。
大家再练习时应该仔细检查配置文件中的参数设置,避免安装过程报错。
版权声明: 本文为 InfoQ 作者【飞向星的客机】的原创文章。
原文链接:【http://xie.infoq.cn/article/2173921deedf56c5d64ff9464】。文章转载请联系作者。
评论