写点什么

【K8s 入门必看】第二篇 —— 快速部署集群指南

  • 2022 年 7 月 22 日
  • 本文字数:4310 字

    阅读完需:约 14 分钟

【K8s入门必看】第二篇 —— 快速部署集群指南

🌟 前言

工欲善其事,必先利其器,学习 Kubernetes 必须有环境的支撑,搭建出企业级应用环境是一名合格的运维人员必须掌握的技能。 部署集群前需要明确各组件的安装架构,做好规划,防止在工作时出现服务错乱的情况。 其次,要整合环境资源,减少不必要的资源浪费。 本篇文章将带领大家搭建出企业级的 Kubernetes 集群,在实际的操作中感受容器编排的魅力。

1. 官方提供的集群部署方式

Kubernetes 系统支持四种方式在本地服务器或者云端上部署集群,用户可以根据不同的需求灵活选择,下面介绍这些安装方式的特点。

🍑 使用 Minikube 工具安装

Minikube 是一种能够在计算机或者虚拟机(VM)内轻松运行单节点 Kubernetes 集群的工具,可实现一键部署。


这种方式安装的系统在企业中大多数被当作测试系统使用。

🍑 使用 yum 安装

通过直接使用 epel-release yum 源来安装 Kubernetes 集群,这种安装方式的优点是速度快,但只能安装 Kubernetes v1.5 及以下的版本。

🍑 使用二进制编译安装

使用二进制编译包部署集群,用户需要下载发行版的二进制包,手动部署每个组件,组成 Kubernetes 集群。


这种部署方式比较灵活,用户可以根据自身需求自定义配置,而且性能比较稳定。


虽然二进制方式可以提供稳定的集群状态,但是这种方式部署步骤非常烦琐,一些细小的错误就会导致系统运行失败。

🍑 使用 Kubeadm 工具安装

Kubeadm 是一种支持多节点部署 Kubernetes 集群的工具,该方式提供 kubeadm initkubeadm join 命令插件,使用户轻松地部署出企业级的高可用集群架构。


Kubernetes 1.13 版本中,Kubeadm 工具已经进入了可正式发布(General Availability,GA)阶段。

2. Kubeadm 方式快速部署集群

🍑 Kubeadm 简介

Kubeadm 是芬兰高中生卢卡斯·科尔德斯特伦(Lucas Käldström)在 17 岁时用业余时间完成的一个社区项目。


用户可以使用 Kubeadm 工具构建出一个最小化的 Kubernetes 可用集群,但其余的附件,如安装监控系统、日志系统、UI 界面等,需要管理员按需自行安装。


Kubeadm 主要集成了 kubeadm initkube join 工具


其中 kubeadm init 工具负责部署 Master 节点上的各个组件并将其快速初始化,kubeadm join 工具负责将 Node 节点快速加入集群。


kubeadm 还支持令牌认证(bootstrap Token),因此逐渐成为企业中受青睐的部署方式。

🍑 部署系统要求

Kubernetes 系统由一组可执行程序组成,读者可以在 GitHub 开源代码库的 Kubernetes 项目页面内下载所需的二进制文件包或源代码包。


安装 Kubernetes 对系统和硬件的要求如表所示。



Kubernetes 支持的容器包括 DockerContainerdCRI-OFrakti


本次实验在示例中使用 Docker 作为容器运行环境。


部署 Kubernetes 集群使用的是三台 Centos 系统的虚拟机,其中一台作为 Master 节点,另外两台作为 Node 节点,虚拟主机的系统配置信息如表所示。



在部署集群前需要修改各节点的主机名,配置节点间的主机名解析。


注意,以下操作在所有节点上都需要执行,这里只给出在 Master 节点上的操作步骤,示例代码如下所示。



1. 关闭防火墙与禁用 SELinux


KubernetesMaster 节点与 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


配置 KubeadmKubeletRepo 源,并在所有节点上安装 KubeadmKubelet 工具,示例代码如下:



配置完 KubeadmKubeletRepo 源后即可进行安装操作,示例代码:



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 节点的 DockerKubelet 设置完成后,即可在 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 参数需要与上面 Kubeadmpod-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 应用集群。


大家再练习时应该仔细检查配置文件中的参数设置,避免安装过程报错。

发布于: 2 小时前阅读数: 9
用户头像

🏅️ InfoQ 专家博主 2022.03.08 加入

CSDN:飞向星的客机

评论

发布
暂无评论
【K8s入门必看】第二篇 —— 快速部署集群指南_Docker_飞向星的客机_InfoQ写作社区