1.概述
公司之前一直使用的是CentOS系统作为测试、开发、生产环境的基础系统镜像,由于最近的CentOS的镜像彻底终止维护之后,我们在为后续项目的基础系统镜像选型进行的调研, 最好是可以平替的进行类似系统的移植, 经过多番对比, 决定使用Rocky Linux系统来完成我们开发测试环境的系统移植,系统镜像的下载、安装、部署都比较简单, 基本跟CentOS发现版都很类似, 这里就不进行详细讲解说明了, 下面我们主要演示在Rocky Linux系统下完成K8S集群开发测试环境搭建的整个过程。
2.软件包来源及下载途径
RockyLinux9.4: https://rockylinux.org/zh-CN/download
docker-ce: http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
cri-docker: https://github.com/Mirantis/cri-dockerd/releases
cri-docker.service: https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
cri-docker.socket: https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
阿里云k8s源: https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/
gpgkey: https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/repodata/repomd.xml.key
Calico配置文件: https://github.com/projectcalico/calico/blob/master/manifests/calico.yaml
3.K8S集群规划
由于资源限制,只有3台开发服务器, 这里的K8S集群搭建采用 1台master, 2台worker节点
集群各节点资源规划分配
IP地址 | 主机名 | 角色 | 系统版本 | CPU/内存/磁盘 |
---|---|---|---|---|
10.10.100.128 | master | 管理节点 | Rocky Linux 9.4 | 2U/4G/100G |
10.10.100.129 | worker01 | 管理节点 | Rocky Linux 9.4 | 2U/4G/100G |
10.10.100.130 | worker02 | 管理节点 | Rocky Linux 9.4 | 2U/4G/100G |
4.主机集群基础环境配置
4.1.集群各节点域名设置
把每一台主机进行hostname设置,方便查看【master、worker节点】
,master节点执行
hostnamectl set-hostname master
,worker01节点执行
hostnamectl set-hostname worker01
,worker02节点执行
hostnamectl set-hostname worker02
4.2.集群IP域名映射
以下命令在所有节点上都执行.
cat >> /etc/hosts << "EOF"
10.10.100.128 master
10.10.100.129 worker01
10.10.100.130 worker02
EOF
4.3.修改终端颜色
以下命令在所有节点上都执行.
cat << EOF >> ~/.bashrc
PS1="\[\e[37;47m\][\[\e[32;47m\]\u\[\e[34;47m\]@\h \[\e[36;47m\]\w\[\e[0m\]]\\$ "
EOF
让修改立即生效
source ~/.bashrc
4.4.关闭防火墙
以下命令在所有节点上都执行.
systemctl disable --now firewalld && systemctl is-enabled firewalld
systemctl status firewalld
4.5.禁用selinux
以下命令在所有节点上都执行.
sed -ri 's#(SELINUX=)enforcing#\1disabled#' /etc/selinux/config
grep ^SELINUX= /etc/selinux/config
setenforce 0
getenforce
4.6.修改软件镜像源
以下命令在所有节点上都执行.
sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' -i.bak /etc/yum.repos.d/rocky-*.repo
在所有节点上都执行以下命令将服务器上的软件包信息缓存到本地,
yum makecache
4.7.配置epel源
以下命令在所有节点上都执行.
所有的主机节点上都要进行配置
vi /etc/yum.repos.d/epel.repo
repo文件内容如下:
[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
# It is much more secure to use the #metalink, but if you wish to use a local mirror
# place its address here.
baseurl=https://repo.huaweicloud.com/epel/$releasever/Everything/$basearch/
enabled=1
gpgcheck=1
countme=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
[epel-debuginfo]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Debug
# It is much more secure to use the #metalink, but if you wish to use a local mirror
# place its address here.
baseurl=https://repo.huaweicloud.com/epel/$releasever/Everything/$basearch/debug/
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-$releasever
gpgcheck=1
[epel-source]
name=Extra Packages for Enterprise Linux $releasever - $basearch - Source
# It is much more secure to use the #metalink, but if you wish to use a local mirror
# place its address here.
baseurl=https://repo.huaweicloud.com/epel/$releasever/Everything/source/tree/
enabled=0
在所有节点上都执行以下命令将服务器上的软件包信息缓存到本地,
yum makecache
4.8.主机集群时间同步设置
检查时区和时间
如果时区和时间不对,需要手动设置时区和设置时间同步,时间同步我们借助chrony服务来进行设置, 如果没有安装该服务, 先通过一下命令进行安装(所有主机节点都执行):
yum install -y ntpdate chrony
修改chrony服务配置文件
vim /etc/chrony.conf
#注释掉官方的时间服务器,换成国内的时间服务器即可
server ntp.aliyun.com iburst
重启chrony服务
systmctl enable chronyd --now
4.9.修改系统最大打开文件数
以下命令在所有节点上都执行.
在/etc/security/limits.conf文件的末尾追加以下内容
* soft nofile 65535
* hard nofile 65535
4.10.修改sysctl.conf内核参数配置
以下命令在所有节点上都执行.
vim /etc/sysctl.conf
打开文件,在文件末尾追加以下几行:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
并运行一下命令使得配置的sysctl.conf文件生效
sysctl -p
4.11.关闭swap
以下命令在所有节点上都执行.
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
4.12.安装系统性能分析及其他工具
以下命令在所有节点上都执行.
yum install -y gcc autoconf sysstat
4.13.开启bridge网桥过滤
以下命令在所有节点上都执行.
vim /etc/sysctl.d/k8s.conf
编辑文件写入以下几行
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
加载br_netfilter模块,并查看
modprobe br_netfilter && lsmod | grep br_netfilter
加载配置文件,使其生效
sysctl -p /etc/sysctl.d/k8s.conf
以上操作完毕之后,最好将整个集群下的所有主机都重启一边, 确保我们修改的系统配置项全部都生效,再继续进行操作。
5.给集群各个节点安装Docker服务
5.1. 配置国内阿里云docker源
以下命令在所有节点上都执行.
我们需要使用yum-config-manager
工具, 可以先执行以下命令安装,确保配置docker源的命令可以正常执行
yum install -y yum-utils
配置国内阿里云docker源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.2. 查看可用的docker版本
以下命令在所有节点上都执行.
yum list docker-ce.x86_64 --showduplicates | sort -r
5.3.安装docker27.2.0-1.el9版本
以下命令在所有节点上都执行.
yum -y install docker-ce-27.2.0-1.el9
5.4.在Docker中配置Cgroup
以下命令在所有节点上都执行.
vim /etc/docker/daemon.json
编辑文件写入以下行
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
5.5. 启动Docker服务并设置随机自启
以下命令在所有节点上都执行.
systemctl enable docker --now
6.cri-docker安装
从kubernetes 1.24开始,dockershim已经从kubelet中移除(dockershim 是 Kubernetes 的一个组件,主要目的是为了通过 CRI 操作 Docker),但因为历史问题docker却不支持kubernetes主推的CRI(容器运行时接口)标准,所以docker不能再作为kubernetes的容器运行时了,即从kubernetesv1.24开始不再使用docker了,默认使用的容器运行时是containerd。目前containerd比较新,可能存在一些功能不稳定的情况,所以这里我们使用容器运行时还是选择docker。
如果想继续使用docker的话,可以在kubelet和docker之间加上一个中间层cri-docker。cri-docker是一个支持CRI标准的shim(垫片)。一头通过CRI跟kubelet交互,另一头跟docker api交互,从而间接的实现了kubernetes以docker作为容器运行时。这里需要在全部节点执行cri-docker安装。
6.1.下载cri-docker
这里我们先在master节点下载该文件, 然后通过scp工具同步到其他节点
wget -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.14/cri-dockerd-0.3.14.amd64.tgz
6.2.解压cri-docker
tar -xvf cri-dockerd-0.3.14.amd64.tgz --strip-components=1 -C /usr/local/bin/
6.3.下载并修改cri-docker配置文件
6.3.1.下载cri-docker.service和cri-docker.socket文件
wget -O /etc/systemd/system/cri-docker.service https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.service
wget -O /etc/systemd/system/cri-docker.socket https://github.com/Mirantis/cri-dockerd/blob/master/packaging/systemd/cri-docker.socket
6.3.2.修改cri-docker.service和cri-docker.socket文件
修改cri-docker.service的启动命令ExecStart
vim /etc/systemd/system/cri-docker.service
修改内容如下:
ExecStart=/usr/local/bin/cri-dockerd --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9 --container-runtime-endpoint=unix:///var/run/cri-dockerd.sock --cri-dockerd-root-directory=/var/lib/dockershim --cri-dockerd-root-directory=/var/lib/docker
如下图:
修改cri-docker.socket的ListenStream参数,
vim /etc/systemd/system/cri-docker.socket
修改内容如下:
#ListenStream=%t/cri-dockerd.sock
ListenStream=/var/run/cri-dockerd.sock
6.4.同步cri-docker服务到其他节点
在master节点执行以下命令
[root@master ~]# scp cri-dockerd-0.3.14.amd64.tgz root@10.10.100.129:/root/
[root@master ~]# scp cri-dockerd-0.3.14.amd64.tgz root@10.10.100.130:/root/
6.5. 在各个worker节点安装cri-docker
在woker01节点、woker02节点执行
tar -xvf cri-dockerd-0.3.14.amd64.tgz --strip-components=1 -C /usr/local/bin/
6.6.同步cri-docker配置文件到其他worker节点
在master节点执行以下命令
[root@master ~]# scp cri-dockerd-0.3.14.amd64.tgz root@10.10.100.129:/etc/systemd/system/
[root@master ~]# scp cri-dockerd-0.3.14.amd64.tgz root@10.10.100.130:/etc/systemd/system
6.7.启动并设置cri-docker自启动
以下命令在所有节点上都执行.
systemctl daemon-reload
systemctl enable cri-docker.service --now
7.使用kubeadm基于Docker Runtime部署kubernetes集群
7.1.配置阿里云K8S源
以下命令在所有节点上都执行.
vim /etc/yum.repos.d/k8s.repo
内容如下:
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/rpm/repodata/repomd.xml.key
7.2.安装K8S集群管理工具
以下命令在所有节点上都执行.
yum install -y kubelet kubeadm kubectl
7.3. 配置k8s Cgoup控制组
以下命令在所有节点上都执行.
vim /etc/sysconfig/kubelet
打开文件写入以下行
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
7.4. 配置kubelet自启动
以下命令在所有节点上都执行.
systemctl enable kubelet.service
7.5. 初始化集群
初始化集群操作只需要在master节点运行
7.5.1. 打印master节点所需的镜像文件
只在master节点运行
kubeadm config images list
7.5.2. 打印集群初始化配置文件
只在master节点运行
kubeadm config print init-defaults > kubeadm-config.yaml
7.5.3. 修改参数
只在master节点运行
主要修改advertiseAddress
,criSocket
, imageRepository
这三个参数,如下:
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.10.100.128 #修改为集群初始化的master节点IP地址
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/cri-dockerd.sock #高版本默认使用containerd,这里修改成使用dcoker
imagePullPolicy: IfNotPresent
imagePullSerial: true
name: master
taints: null
timeouts:
controlPlaneComponentHealthCheck: 4m0s
discovery: 5m0s
etcdAPICall: 2m0s
kubeletHealthCheck: 4m0s
kubernetesAPICall: 1m0s
tlsBootstrap: 5m0s
upgradeManifests: 5m0s
---
apiServer: {}
apiVersion: kubeadm.k8s.io/v1beta4
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:
local:
dataDir: /var/lib/etcd
#imageRepository: registry.k8s.io
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers ##这里修改成使用阿里云容器镜像
kind: ClusterConfiguration
kubernetesVersion: 1.31.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
proxy: {}
scheduler: {}
7.5.4. 使用以上配置文件进行集群初始化
只在master节点运行
kubeadm init --config kubeadm-config.yaml --upload-certs
初始化成功之后就会出现如下图打印
7.5.5. 配置环境变量
只在master节点运行
集群初始化成功之后的打印中提示了我们 需要进行一下环境变量配置
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
7.5.6. 所有woker节点加入到集群中
在所有woker节点上运行
kubeadm join 10.10.100.128:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:92fe2882e5f86ea0e3f3172d1c498eeeb69199ca9b4c4686748d243b6164f151 --cri-socket=unix:///var/run/cri-dockerd.sock
以上命令需要注意一下几点:
- 1.更换IP地址为你的集群的主节点的IP地址
- 2.token使用你自己的token
- 3.token-ca-cert-hash值需要使用你自己的
- 4.–cri-socket=unix:///var/run/cri-dockerd.sock参数是指定使用docker作为容器管理引擎,这个通用。
8.集群网络准备
8.1 calico安装
只在master节点运行
K8s使用calico部署集群网络,只需要在Master节点安装即可。
wget https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml --no-check-certificate
8.2.创建calico网络
只在master节点运行
kubectl apply -f calico.yaml
8.3.验证集群可用性
root@master /home/software/k8s-cluster]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready control-plane 2d23h v1.31.0
worker01 Ready <none> 2d23h v1.31.0
worker02 Ready <none> 2d23h v1.31.0
8.4.查看集群健康情况
[root@master /home/software/k8s-cluster]# kubectl get cs
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy ok
8.5.查看kubernetes集群pod运行情况
root@master /home/software/k8s-cluster]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-94fb6bc47-2slv8 1/1 Running 0 2d23h
calico-node-gt2lx 1/1 Running 0 2d23h
calico-node-nfkn4 1/1 Running 0 2d23h
calico-node-q7lbr 1/1 Running 0 2d23h
coredns-d4ddbc888-7k4s8 1/1 Running 0 3d
coredns-d4ddbc888-gdjs8 1/1 Running 0 3d
etcd-master 1/1 Running 0 3d
kube-apiserver-master 1/1 Running 0 3d
kube-controller-manager-master 1/1 Running 0 3d
kube-proxy-8qrqc 1/1 Running 0 2d23h
kube-proxy-g28lf 1/1 Running 0 2d23h
kube-proxy-klmh5 1/1 Running 0 3d
kube-scheduler-master 1/1 Running 0 3d
8.6.worker节点配置
当我们在Worker节点上执行kubectl命令管理时会报如下错误:
E0909 16:48:18.513539 3733430 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0909 16:48:18.515608 3733430 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0909 16:48:18.517357 3733430 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0909 16:48:18.518838 3733430 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
E0909 16:48:18.520453 3733430 memcache.go:265] "Unhandled Error" err="couldn't get current server API group list: Get \"http://localhost:8080/api?timeout=32s\": dial tcp [::1]:8080: connect: connection refused"
The connection to the server localhost:8080 was refused - did you specify the right host or port?
如何解决已上报错, 很容易,按照如下命令进行操作:
只要把master上的管理文件/etc/kubernetes/admin.conf拷贝到Worker节点的$HOME/.kube/config就可以让Worker节点也可以实现kubectl命令管理。
#在Worker节点创建.kube目录
[root@worker01 ~]# mkdir /root/.kube
[root@worker02 ~]# mkdir /root/.kube
#在master节点做如下操作
[root@master ~]# scp /etc/kubernetes/admin.conf root@10.10.100.129:/root/.kube/config
[root@master ~]# scp /etc/kubernetes/admin.conf root@10.10.100.130:/root/.kube/config
通过以上步骤, 我们就完成了K8S集群的安装部署了,接下来可以愉快的玩耍了。
9.K8S集群的启停管理
默认K8S我们只要设置了systemctl enable kubelet 后,会在开机自动启动K8S集群,如果想要停止kubernetes集群,我们可以通过systemctl stop kubelet 命令停止集群,但是必须先将节点上的docker停止。
不管你是通过哪种方式安装的K8S集群, 只要记住一句口诀就行了:启动K8S集群,先启动集群上所有的容器服务(不管是Docker还是Containerd),停止K8S集群,先停止集群上所有的容器服务。
9.1.停止K8S集群
以下命令在所有节点上都执行.
systemctl stop docker
systemctl stop kubectl
9.2.启动K8S集群
以下命令在所有节点上都执行.
systemctl start docker
systemctl start kubectl