多服务器 Kubernetes 集群的部署
环境介绍
- 服务器及系统版本:2 台阿里云服务器,Cenos7.8 版本
- Kubernetes 版本:最新版(截止本文时间 24 年 4 月 1 日,最新版为 1.29.3)
- 服务器配置:4 核 8G
- Docker 版本:最新版(截止本文时间 24 年 4 月 1 日,最新版为 26.0.0)
- cri-dockerd 版本:最新版(截止本文时间 24 年 4 月 1 日,最新版为 0.3.12)
- 网络插件 Calico 版本:最新版(截止本文时间 24 年 4 月 1 日,最新版为 3.27.2)
前置准备
- 2 台或以上阿里云服务器,配置至少为 4 核 8G
- 因为需要从 GitHub 上下载东西,需要可以下载东西的网络
- 教程内出现的所有命令,如未特殊标注则默认是在每台机器上都要执行!!!
本文会从机器基础配置、基础插件安装、docker 及其 cri-dockerd、Kubernetes 以及最后的可视化 kuboard 的安装,循序渐进,并且会在每一步进行对应的解析,来更好的帮助理解
机器基础配置
1. 集群机器互通
首先我们需要确保集群内的网络互通,我们需要从机器内选择一个做为 master 节点,其余的则是 work 工作节点,将 master 机器的名称改为 master,其余的改为 work1、work2 等等(当然也可以不改,这里只是为了更直观一点,但如果是阿里云服务器则有必要改了,因为默认是一串乱码……)
1 | 查看机器名称 |
接下来需要修改每台机器的 hosts 文件,
1 | vim /etc/hosts |
2. 关闭 setLinux
setLinux 是提供访问控制安全策略的安全模块,但它可能限制 Kubernetes Pod 访问宿主机上的某些资源,导致应用运行失败,所以我们需要在每台机器上将其禁用
1 | sudo vim /etc/selinux/config |
3. 关闭 swap 分区
swap 也叫做交换空间,相当于 win 系统中的虚拟内存。如果在 Kubernetes 中开启了 swap,会导致 Kubernetes 调度器无法获取真实的节点内存使用情况,会导致意外的性能下降等问题,我们需要关闭所有机器上的 swap。PS:官方在 1.28 又引入了 swap 的支持,不过是 beta 版,不过为了严谨,还是统一关闭吧。
1 | 首先临时禁用所有激活的swap分区 |
4. 修改内核网络规则
1 | cat > /etc/sysctl.d/k8s.conf << EOF |
net.bridge.bridge-nf-call-ip6tables = 1 :针对桥接的 IPv6 流量,实现 IPv6 网络的流量过滤和控制
net.bridge.bridge-nf-call-iptables = 1 :针对桥接的 IPv4 流量,实现 IPv4 网络的流量过滤和控制
net.ipv4.ip_forward = 1 :启用 IPv4 的转发功能,节点可能需要转发来自一个 Pod 到另一个 Pod 的流量
5. 加载 br_netfilter 模块
这个模块使桥接流量被 iptables 规则处理,配合内核网络的规则,可以让集群内部通信更安全高效。
PS:br_netfilter 与内核网络规则是相辅相成的,我们刚刚编辑完成了一个规则,现在需要一个模块来加载这些规则,这个模块就是 br_netfilter,它可以确保网络流量在 Pods 之间安全的传输。
1 | 启用br_netfilter模块 |
6. 关闭防火墙
禁用防火墙的目的是集群内部的通信需要通过特定的端口,以及 Pods 的动态分配等,在生产中通常不会一棒子打死关闭防火墙。这里仅是做为测试,所以全部关闭
1 | 关闭防火墙 |
7. 重启
以上内容配置完成后,我们重启机器完成应用
1 | reboot |
至此,机器的基础部分完成
基础插件安装
接下来我们需要在每台机器上完成时间同步、插件的安装,插件如下:
- ntpdate:时间同步工具
- ipvsadm:IPVS 负载均衡
- lrzsz:Linux 上传下载工具
1 | ntpdate |
Docker 及其 cri-dockerd
1. Docker 和 cri-dockerd 是什么?
Docker 我们都知道,是一个容器化平台,通过运行镜像,避免环境差异带来的问题。而 cri-dockerd 则是一个组件,是 Docker 和 Kubernetes 之间的桥梁,允许 Kubernetes 通过容器运行时接口(CRI)与 Docker 交互。从 Kubernetes1.20 开始,官方弃用 Docker Shim,推荐使用兼容 CRI 的容器运行时。下面我们需要在每台机器上安装 Docker 与 cri-dockerd。
2. 安装 Docker
1 | 下载阿里云的docker-ce文件到yum仓库 |
配置 cgroup 驱动,因为 Docker 默认使用 cgroupfs 做为驱动,但 Kubernetes 则推荐使用 systemd,为了确保系统的一致性,我们更改 Docker 的 cgroup 驱动为 systemd
1 | 配置守护进程 使用systemd做为驱动 |
3. 安装 cri-dockerd
dockerd 需要我们进入 GitHub 官网下载,
1 | cri-dockerd下载 |
进入后我们可以看到很多版本,这里对每个版本做一些解释:
- el7:对应 Cenos7 系统
- el8:对应 Cenos8 系统
- fc35:对应 Fedora 35 系统
- fc36:对应 Fedora 36 系统
- x86_64:带此后缀的表示 64 位版本
选择自己的系统对应的版本,如果不知道自己的系统版本使用下面的命令
1 | 查看系统版本 |
在我们本地下载完成后我们需要将下载的文件上传到服务器内
1 | 通过lrzsz上传文件 |
到这里,我们的 Docker 以及对应的 cri 就安装完成了,接下来正式进入 Kubernetes 的安装!
Kubernetes
1. 安装 kubeadm kubelet kubectl
在每台机器上应用 Kubernetes 社区 yum 源并安装 PS:注意下面的 v1.29 只能安装 1.29.x 版本的 Kubernetes,如果需要安装其他版本或者更高版本的需要手动将下面的版本改为对应版本,本文截止时,最高版本为 1.29!
1 | 应用Kubernetes社区源 |
2. 拉取 Kubernetes 镜像
这里我编写了一段脚本,主要原因是在国内无法直接访问谷歌的仓库,所以我们需要借助阿里云镜像来下载,然后将下载完成的镜像 tag 重新打包为 Kubernets 的标签,这样就可以做到不修改镜像源的方式安装原生的 Kubernetes。脚本内的前 2 个变量,一个是 Kubernetes 的官方仓库地址,一个是阿里云的官方仓库地址,一般不会变,但以防万一可以通过 kubeadm config images lis 命令获取当前最新版,然后查看前缀是否和脚本一致,不一致将脚本的修改为最新的即可。
脚本默认会安装最新的 Kubernetes 镜像,所以一定要注意和第一步的 yum 源版本对应上!!!当然你也可以指定版本,就是我注释的那行
创建一个.sh 类型的文件,例如 pullImages.sh
,将下面的内容拷贝到文件内
1 | !/bin/bash |
对文件赋予属性并执行
1 | 赋予可执行属性 |
下载完成后一般是 7 个镜像,下面对每个镜像进行解释
- registry.k8s.io/kube-apiserver:为集群共享状态提供前端,处理用户以及集群内部的所有 REST 请求,相当于集群大脑
- registry.k8s.io/kube-controller-manager:运行控制器进程,包括节点控制器、副本控制器、命名空间和服务账号控制器等等,确保集群处于正常的工作状态,并会对故障的副本进行修复、扩展等
- registry.k8s.io/kube-scheduler:调度 Pod 到节点,监听那些创建但未指定节点的 Pod,为 Pod 分配工作节点
- registry.k8s.io/kube-proxy:网络代理与负载均衡,确保每个 Pod 能够通过 Kubernetes 虚拟网络进行通信以及服务的负载均衡
- registry.k8s.io/etcd:Kubernetes 的所有集群数据的后备存储,保存了整个集群的状态,包括节点、Pods、配置等的信息。
- registry.k8s.io/coredns/coredns:集群内部的 DNS 服务器,使得 Pod 可以通过服务名进行通信,而不是直接通过 IP 地址。
- registry.k8s.io/pause:充当 Pod 的基础设施容器
3. 初始化 master 节点
PS:这里的命令只在 master 节点执行!!!
1 | 初始化master节点 |
下面对这四个参数进行解释:
–kubernetes-version=v1.29.3:指定 Kubernetes 的节点,这里指定为 1.29.3(务必对应自己下载的版本!)
–pod-network-cidr=10.244.0.0/16:指定 Pod 网络的 CIDR 范围,一般用 10.244.0.0/16
–apiserver-advertise-address=172.27.207.115:指定 API 服务器的 IP 地址,也就是其他集群组件和用户将用来与 API 服务器通信的地址,一般为 master 节点的内网 IP
–cri-socket unix:///var/run/cri-dockerd.sock:指定容器运行时接口(CRI)的通信 socket 路径,使用我们下载的 cri-dockerd
执行完成后,我们会获得一个 token,我们先提前保存一下
1 | kubeadm join 172.27.207.110:6443 --token xby2g1.nmlhcqqy1ylkwepk \ |
接下来需要配置 kubectl 工具,通过 kubectl 来管理集群
1 | 一般我们只在master管理集群,所以只在master执行 |
4. 工作节点加入 master 节点
我们将刚刚的 token 后面追加 --cri-socket unix:///var/run/cri-dockerd.sock
然后在所有的工作节点执行
通过在 master 节点上执行 kubectl get nodes
查看所有节点
5. 安装 Calico 网络插件
Calico 提供了网络连接和高级网络策略,可以为每个 Pod 提供唯一的 IP 地址,保证 Pod 之间的通信既安全又高效,下面我们来安装 Calico 插件 Calico 官网
进入官网后往下滑,我们可以看到目前的最新版为 3.27.2,我们复制第一个命令并执行(注意是在 master 节点执行,因为只有 master 节点能使用 kubectl 命令)
1 | 下载tigera-operator自动化部署工具 |
至此,Kubernetes 安装完成,下面我们进入可视化的安装
Kuboard
1. 安装 Kuboard
我们在 master 节点上创建安装脚本:
1 | 创建kuboard缓存文件夹 |
注意,我们在访问前需要在阿里云放行对应端口,我暴露在 1001 端口
在入方向放行所有的端口
出方向只需要放行 1001 即可
访问 IP:1001 端口进入主页面,默认用户名和密码为 admin、Kuboard123
2. 添加 Kubernetes 集群
点击添加集群,通过 KubeConfig 的方式引入,在 master 节点执行 cat ~/.kube/config
,然后将其所有内容复制到输入框,输入集群的名称和描述,将 ApiServer 的 IP 地址改为公网 IP 地址即可
至此,Kuboard 安装完成。
3. kubernetes 常用命令
1 | kubernetes常用命令 |
结束语
到这里,Kubernetes 最新版就安装完成了。可能随着 Kubernetes 官方的不断更新,教程可能会失效,但如果安装 1.29 是肯定没问题的,而且这个版本也算很超前了吧。不少教程甚至停留在 1.1x 的版本.. 最后,如果这个教程有问题欢迎文章下面留言~