本文记录了在作者本地使用三台CentOS虚拟机,搭建部署单Master双Slave Kubernetes集群。
题图源:Understanding Your Kubernetes Deployment Lifecycle
1 系统准备
搭建部署包含1个Master结点和2个Slave结点的Kubernetes集群,需要准备3台Linux虚拟机作为集群结点,可以通过VMware Worksation快速创建三台CentOS虚拟机。
1.1 工具安装
1.2 网络配置
使用VMware工具本身的界面操作起来并不方便,对CentOS虚拟机固定IP后,可使虚拟机每次启动时IP不会发生变化,可以使用XShell
或Tabby
通过SSH访问虚拟机,进行后续的配置操作,会节省很多时间。
此配置保证后续Kubernetes集群结点IP不会随意改变,这里不做过多介绍,具体可参考这篇文章:Vmware虚拟机Linux配置固定IP地址(详细版)。
通过以上配置,在各个结点执行ip addr
获取到三个结点的IP信息:
192.168.198.129
192.168.198.130
192.168.198.131
1.3 CentOS系统配置
1.3.1 主机名配置
设置192.168.198.129主机名 apple
1
|
hostnamectl set-hostname apple
|
设置192.168.198.130主机名 banana
1
|
hostnamectl set-hostname banana
|
设置192.168.198.131主机名 cherry
1
|
hostnamectl set-hostname cherry
|
1.3.2 配置主机IP地址
设置Apple IP地址为 192.168.198.129
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="529588ee-2c22-4dd4-99c1-c823fbf96642"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.198.129
GATEWAY=192.168.198.2
NETMASK=255.255.255.0
|
设置Banana IP地址为 192.168.198.130
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="529588ee-2c22-4dd4-99c1-c823fbf96642"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.198.130
GATEWAY=192.168.198.2
NETMASK=255.255.255.0
|
设置Cherry IP地址为 192.168.198.131
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
vim /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="529588ee-2c22-4dd4-99c1-c823fbf96642"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.198.131
GATEWAY=192.168.198.2
NETMASK=255.255.255.0
|
1.3.3 配置DNS网络信息
在每个结点执行
1
2
3
4
5
6
|
# 缺少此配置可能无法访问外网
cat >> /etc/resolv.conf << EOF
# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 114.114.114.114
EOF
|
重启生效
1
2
3
4
5
|
# 重启网络服务
systemctl restart network
# 验证网络
ping www.baidu.com
|
1.3.4 配置主机名与IP地址解析
在每个结点执行
1
2
3
4
5
|
cat >> /etc/hosts << EOF
192.168.198.129 apple
192.168.198.130 banana
192.168.198.131 cherry
EOF
|
1.3.5 防火墙配置
在每个结点执行
1
2
3
4
5
|
# 关闭防火墙
systemctl stop firewalld
# 禁止防火墙开机自启
systemctl disable firewalld
|
1.3.6 SELinux配置
在每个结点执行,修改后需要重启
1
2
3
4
5
|
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
#临时关闭
setenforce 0
|
重启生效
1.3.7 swap分区配置
在每个结点执行,修改后需重启
1
2
3
4
5
|
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 临时关闭
swapoff -a
|
重启生效
1.3.8 配置内核转发及网桥过滤
在每个结点执行
1
2
3
4
5
6
|
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF
|
1
2
3
4
5
6
7
8
|
# 加载br_netfilter模块
modprobe br_netfilter
# 查看是否加载
lsmod | grep br_netfilter
# 生效
sysctl --system
|
1.3.9 时间同步配置
在每个结点执行
1
2
3
4
5
|
# 安装 ntpdate
yum install ntpdate -y
# 同步时间
ntpdate time.windows.com
|
1.3.10 IPVS配置
在每个结点执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 安装ipset和ipvsadm
yum -y install ipset ipvsadm
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 添加执行权限
chmod 755 /etc/sysconfig/modules/ipvs.modules
# 运行
bash /etc/sysconfig/modules/ipvs.modules
# 检查是否加载
lsmod | grep -e ipvs -e nf_conntrack_ipv4
|
1.3.11 升级操作系统内核
在每个结点执行,升级后需重启
安装YUM源
1
2
3
4
5
|
# 导入elrepo gpg key
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装elrepo YUM源仓库
yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
|
升级内核版本
1
2
3
4
5
6
7
8
9
10
11
|
# 稳定版kernel-ml 长期维护版本kernel-lt
yum -y --enablerepo=elrepo-kernel install kernel-ml
# 查看已安装的内核
rpm -qa | grep kernel
# 查看默认内核
grubby --default-kernel
# 若不是最新版本时执行
grubby --set-default $(ls /boot/vmlinuz-* | grep elrepo)
|
重启生效
至此,操作系统环境准备已完成,下一步可以进行Docker、容器运行时以及Kubernetes软件安装和配置!
1.4 创建快照
技巧
在VMware对3台虚拟机创建一份快照,便于后续配置出现问题时回滚!
2 容器运行时准备
在每个结点执行
2.1 安装Docker
参考:清华大学开源软件镜像站 Docker CE 软件仓库
因作者本地为CentOS7.9
操作系统环境,这里使用CentOS/RHEL
版本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# 如果你之前安装过docker,请先删掉
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装依赖,下载repo文件,并把软件仓库地址替换为镜像站:
yum install -y yum-utils
# 这里从docker官方下载文件可能会失败,修改为从阿里云下载
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# 安装Docker及相关插件
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
|
2.2 配置镜像加速
参考:中科大USTC镜像站 Docker Hub 源使用帮助
注意
截止2024年7月,以下镜像加速已不可用
以下镜像加速仍可用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 在/etc路径下新建docker文件夹
sudo mkdir -p /etc/docker
# 在docker目录下新建daemon.json文件,并加入registry-mirrors
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://docker.m.daocloud.io"]
}
EOF
# 重新加载systemd管理的单位文件
sudo systemctl daemon-reload
# 重新启动Docker服务
sudo systemctl restart docker
# 设置Docker服务开机自启
systemctl enable docker
|
2.3 安装cri-docker
采用软件包离线安装方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# 下载cri-docker.rpm包
# 可能无法直接从Github下载软件包,需自行下载拷贝到虚拟机
https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.8/cri-dockerd-0.3.8-3.el7.x86_64.rpm
# 安装libcgroup
yum install -y libcgroup
# 安装cri-docker
rpm -ivh cri-dockerd-0.3.8-3.el7.x86_64.rpm
# 修改cri-docker.service配置第10行
vi /usr/lib/systemd/system/cri-docker.service
修改为以下配置
ExecStart=/usr/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint fd://
# 启动cri-docker服务
systemctl start cri-docker
# 设置cri-docker服务开机自启
systemctl enable cri-docker
|
3 部署Kubernetes集群
3.1 配置阿里云镜像源代理
在每个结点执行
1
2
3
4
5
6
7
8
9
10
11
12
13
|
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
yum makecache
yum install -y --nogpgcheck kubelet kubeadm kubectl
yum list kubelet --showduplicates | sort -r |grep 1.28
|
3.2 安装kubeadm、kubelet、kubectl
在每个结点执行
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 安装最新版本
yum install -y kubelet kubeadm kubectl -y
# 配置kubectl命令补全
yum install bash-completion -y
kubectl completion bash > /etc/profile.d/kubectl_completion.sh
. /etc/profile.d/kubectl_completion.sh
# 启动kubelet服务
systemctl start kubelet
# 设置kubelet开机自启
systemctl enable kubelet
|
3.3 准备启动镜像
配置从阿里云镜像源拉取
1
2
3
4
5
6
|
kubeadm config images list --kubernetes-version=v1.28.2
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2
# 可能会卡在这里,加--v=5查看日志,可忽略该步,直接执行下面的kubeadm init xxx
kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.28.2 --cri-socket=unix:///var/run/cri-dockerd.sock
|
3.4 初始化Master结点
仅在Master结点执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[root@apple ~]# kubeadm init --kubernetes-version=v1.28.2 --image-repository registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock
# 按照提示完成以下配置
....
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.198.129:6443 --token 3o9lba.lm3tk8w0muttgth7 \
--discovery-token-ca-cert-hash sha256:4d8ba51c787dd9fdaf0060573a14ad25c85eba1dc08c1b5f2d91d823185fdb22
....
|
3.5 将Slave结点加入集群
在Slave结点执行
1
2
3
4
5
|
# 加入worker结点
kubeadm join 192.168.198.129:6443 --token 3o9lba.lm3tk8w0muttgth7 --discovery-token-ca-cert-hash sha256:4d8ba51c787dd9fdaf0060573a14ad25c85eba1dc08c1b5f2d91d823185fdb22 --cri-socket=unix:///var/run/cri-dockerd.sock
# 若忘记,可在master结点执行以下命令,重新获取
kubeadm token create --print-join-command
|
在Master结点执行查看结点状态命令,Master和Slave都处于NotReady
状态
1
2
3
4
5
|
[root@apple ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
apple NotReady control-plane 3m47s v1.28.2
banana NotReady <none> 2m29s v1.28.2
cherry NotReady <none> 17s v1.28.2
|
3.6 安装CNI网络接口插件
CNI网络插件
Flannel和Calico都是Kubernetes流行的容器网络接口(CNI)插件(除此之外还有Canal、Weave等),用于在集群中的 pod 之间提供网络连接,它们都具有自己的优缺点,适合不同的用例。
Flannel是一种简单、易用的 overlay 网络解决方案。它使用虚拟网络技术在主机之间创建隧道,使 pod 能够相互通信,即使它们位于不同的子网或物理主机上。
Calico 是一种功能更全面的 CNI 插件,它提供路由、策略和可观察性等功能。它使用 BGP 协议在主机之间路由流量,这使其具有高度的可扩展性和可管理性。
深入了解可参考Kubernetes指南-网络插件
这里安装使用Calico网络接口插件,以下命令仅在Master结点执行
1
2
3
4
5
|
# 安装wget命令
yum install -y wget
# 下载Calico插件部署yaml
wget https://docs.projectcalico.org/manifests/calico.yaml
|
修改calico.yaml中CALICO_IPV4POOL_CIDR参数,该配置参数值应与Pod网段pod-network-cidr
一致,若kubectl init中未指定pod-network-cidr
,默认Pod网段为10.244.0.0/16
,此配置默认为注释需要取消
1
2
3
4
5
6
7
8
|
vi calico.yaml
# 修改后如下
···
# no effect. This should fall within `--cluster-cidr`.
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
···
|
因docker.io国内访问受限,需修改默认拉取的镜像地址,通过其他镜像站加速,这里使用华为云
1
2
|
# 执行全局sed替换
sed -i 's/docker.io/swr.cn-north-4.myhuaweicloud.com\/ddn-k8s\/docker.io/g' calico.yaml
|
部署安装Calico插件,因拉取镜像慢,需等待一段时间再观察Pod状态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 部署calico插件
kubectl apply -f calico.yaml
# 查看kube-system命名空间Pod状态
[root@apple ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-665548954f-9qlzn 1/1 Running 0 6m43s
calico-node-c66l9 1/1 Running 0 6m43s
calico-node-mjblm 1/1 Running 0 6m43s
calico-node-xtwbc 1/1 Running 0 6m43s
coredns-66f779496c-9996t 1/1 Running 0 31h
coredns-66f779496c-ft72m 1/1 Running 0 31h
etcd-apple 1/1 Running 2 (88m ago) 31h
kube-apiserver-apple 1/1 Running 2 (88m ago) 31h
kube-controller-manager-apple 1/1 Running 2 (88m ago) 31h
kube-proxy-brb6b 1/1 Running 2 (87m ago) 31h
kube-proxy-f9zlq 1/1 Running 2 (87m ago) 31h
kube-proxy-s2blk 1/1 Running 2 (88m ago) 31h
kube-scheduler-apple 1/1 Running 2 (88m ago) 31h
|
可以看到,Kubernetes集群的核心组件都已正常工作,在Master结点可查看集群结点都处于Ready
状态
1
2
3
4
5
|
[root@apple ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
apple Ready control-plane 32h v1.28.2
banana Ready <none> 32h v1.28.2
cherry Ready <none> 32h v1.28.2
|
到这里,一个单Master双Slave的Kubernetes集群就搭建完成啦!