k8s_1.32版本高可用集群搭建+KubeSphere管理
k8s 1.32高可用版本集群搭建
摘要:
本次搭建因电脑资源有限只使用了3台虚拟机作为master节点做参考,同时去除了master污点直接用来调度跑测试业务。
1.整体架构:
采用kubeadm部署的方式,使用haproxy做负载均衡,keepalived做高空用,使用calico网络组件,并使用kubespher开源云原生平台管理集群,所有组件均部署在麒麟v10 sp2操作系统,内核版本为(4.19)。
| 节点名规划 | ip规划 | 组件 |
|---|---|---|
| k8s-master01 | 192.168.228.154 | kubeadm,kubelet,kubectl,keepalived,haproxy |
| k8s-master02 | 192.168.228.155 | kubeadm,kubelet,kubectl,keepalived,hapoxy |
| k8s-master03 | 192.168.228.156 | kubeadm,kubelet,kubectl,keepalived,haproxy |
| VIP | 192.168.228.100 | / |
2.初始化环境
包括,修改主机名,hosts,关闭selinux,防火墙,时间同步,等基础配置。
在对应节点执行如下操作
#关闭防火墙在所有节点(本文就3台)节点执行
systemctl stop firewalld
systemctl disable firewalld
修改主机名,可根据需要自己规划名字
#在192.168.228.154,155,156三台服务器节点分别执行如下操作
hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-master02
hostnamectl set-hostname k8s-master03
所有节点执行(本文就3台)关闭swap,并取消开启启动(如果没有可忽略)
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
#关闭selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
在所有节点执行(本文就3台)修改hosts,注意替换自己的ip地址
echo "192.168.228.154 k8s-master01" >>/etc/hosts
echo "192.168.228.155 k8s-master02" >>/etc/hosts
echo "192.168.228.156 k8s-master03" >>/etc/hosts
#可以通过ping命令测试本地解析是否正常
ping k8s-master01
ping k8s-master02
ping k8s-master03
在所有节点执行(本文就3台)调整内核参数
# 加载 br_netfilter 内核模块
modprobe br_netfilter
# 配置参数
echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6=1" >> /etc/sysctl.conf
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl --system
#以上操作所有节点(本文就3台)虚拟机均需要,
#重启,重启是为了让哪些参数能够自动生效。
reboot
3.安装Containerd
注:Kubernetes最后一个支持的Docker的版本是v1.23.12,后面默认就是Containerd
因我搭建环境系统为麒麟系统搭建高版本的containerd可能会报错(GLIBC_2.34' not found)需要手动升级glibc,如果系统是高版本的glibc则不需要进行升级,我采用使用静态编译的 containerd 版本,静态版本不依赖glibc,,需要下载指定其它版本可以在github上面找到对应的版本。
安装containerd
#下载的时候注意AMD 包(x86_64)架构,而 ARM 包是(aarch64/arm64)架构
wget https://github.com/containerd/containerd/releases/download/v2.0.5/containerd-static-2.0.5-linux-amd64.tar.gz
tar xf containerd-static-2.0.5-linux-amd64.tar.gz
cp bin/* /usr/bin/
#生成全量的配置文件,默认里面几乎没什么配置
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
#修改镜像地址为国内镜像源地址和cgroup配置
vi /etc/containerd/config.toml
sandbox = 'registry.aliyuncs.com/google_containers/pause:3.10'
注!如果搭建环境为内网环境可以提前在有网环境将镜像下载打包好导入到内网环境,如果计划后面用本地镜像仓库可修改仓库为本地镜像仓库,并把这些镜像打入到自建镜像仓库
配置启动文件
mkdir -p /usr/local/lib/systemd/system
tee /usr/local/lib/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Restart=always
RestartSec=5
Delegate=yes
KillMode=process
OOMScoreAdjust=-999
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
EOF
启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable --now containerd
4.安装haproxy高可用组件
在3台主节点执行如下操作
yum install haproxy -y
所有Master节点配置HAProxy(详细配置参考HAProxy文档,所有Master节点的HAProxy配置相同)
vim /etc/haproxy/haproxy.cfg
global
maxconn 2000
ulimit-n 16384
log 127.0.0.1 local0 err
stats timeout 30s
defaults
log global
mode http
option httplog
timeout connect 5000
timeout client 50000
timeout server 50000
timeout http-request 15s
timeout http-keep-alive 15s
frontend monitor-in
bind *:33305
mode http
option httplog
monitor-uri /monitor
frontend k8s-master
bind 0.0.0.0:16443
bind 127.0.0.1:16443
mode tcp
option tcplog
tcp-request inspect-delay 5s
default_backend k8s-master
backend k8s-master
mode tcp
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server k8s-master01 192.168.228.154:6443 check
server k8s-master02 192.168.228.155:6443 check
server k8s-master03 192.168.228.156:6443 check
启动haproxy
systemctl enable --now haproxy
systemctl status haproxy
5.安装keepalived
所有Master节点配置KeepAlived,配置不一样,注意区分
注意每个节点的IP和网卡(interface参数)
所有节点执行安装
yum install keepalived -y
Master01节点的配置:
#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface ens160
mcast_src_ip 192.168.228.154
virtual_router_id 51
priority 101
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.228.100
}
track_script {
chk_apiserver
}
}
Master02节点的配置
#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
mcast_src_ip 192.168.228.155
virtual_router_id 51
priority 100
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.228.100
}
track_script {
chk_apiserver
}
}
Master03节点的配置
#vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
script_user root
enable_script_security
}
vrrp_script chk_apiserver {
script "/etc/keepalived/check_apiserver.sh"
interval 5
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens160
mcast_src_ip 192.168.228.156
virtual_router_id 51
priority 99
advert_int 2
authentication {
auth_type PASS
auth_pass K8SHA_KA_AUTH
}
virtual_ipaddress {
192.168.228.100
}
track_script {
chk_apiserver
}
}
所有Master节点配置KeepAlived健康检查文件:
# vi /etc/keepalived/check_apiserver.sh
#!/bin/bash
err=0
for k in $(seq 1 3)
do
check_code=$(pgrep haproxy)
if [[ $check_code == "" ]]; then
err=$(expr $err + 1)
sleep 1
continue
else
err=0
break
fi
done
if [[ $err != "0" ]]; then
echo "systemctl stop keepalived"
/usr/bin/systemctl stop keepalived
exit 1
else
exit 0
fi
启动keepalived
chmod +x /etc/keepalived/check_apiserver.sh
systemctl daemon-reload
systemctl enable --now keepalived
#查看启动状态
systemc status keepalived
#使用ip addr可以看到其中一台有192.168.228.100虚拟ip,在权限最大的服务器上面
6.安装kubernetes基础软件
6.1.在部署kubernetes前开启ipvs
#安装ipvs组件
yum install -y ipvsadm ipset conntrack
#在每个节点执行临时开启
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
#确保模块加载成功:
lsmod | grep ip_vs
永久开启,在服务器重启后自动生效
cat <<EOF | sudo tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
#从1.28开始,这里要写具体的版本,是和以前不一样的地方
vi /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
6.2.安装必要的软件
yum -y install kubelet kubeadm kubectl
systemctl start kubelet && systemctl enable kubelet
如果是内网环境搭建,可以提前在有网环境将rpm包下载下来然后导入到内网环境服务器进行安装,下载rpm包操作如下,只下载不安装
yum install --downloadonly --downloaddir=./k8s-rpms kubelet kubeadm kubectl
#参数解析
--downloadonly:仅下载不安装
--downloaddir=./k8s-rpms:指定下载目录
#将rpm上传到内网环境后执行如下操作
cd k8s-rpms/
rpm -ivh *.rpm
#验证是否正常安装kubelet,kubeadm,kubectl
kubeadm version
kubectl version
kubelet --version
systemctl start kubelet && systemctl enable kubelet
6.3.准备集群配置文件
因为这里需要把证书加到100年,所以只能通过配置文件形式,命令行方式不能直接实现,根据资料这个支持是从v1.31开始支持。
这里主要指定了一些临时token,并指定了容器运行时,和证书路径及VIP信息,etcd路径,和镜像下载地址,版本,默认域名,Pod和Service的IP地址段,证书包含的IP地址(也可以用域名替代,避免后面出现IP更换的问题)CA和签发证书的时间。
查看该版本的kubeadm-config配置选项
kubeadm config print init-defaults --component-configs KubeletConfiguration
在Master01节点创建kubeadm-config.yaml配置文件如下:
cd /etc/kubernetes/
mkdir yaml && cd yaml
#将该版本示例配置导入到初始化配置文件并修改对应配置
kubeadm config print init-defaults --component-configs KubeletConfiguration > kubeadm-config.yaml
修改后的配置如下
#vi kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: ufw2x5.c255p8a0437pxp0x
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
imagePullSerial: true
---
apiVersion: kubeadm.k8s.io/v1beta4
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.228.100:6443
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.32.5
networking:
dnsDomain: cluster.local
podSubnet: 172.20.0.0/16
serviceSubnet: 10.10.0.0/16
proxy: {}
scheduler: {}
apiServer:
certSANs:
- 192.168.228.100
- 192.168.228.154
- 192.168.228.155
- 192.168.228.156
- 127.0.0.1
caCertificateValidityPeriod: 876000h0m0s
certificateValidityPeriod: 876000h0m0s
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
!注意上面配置主要是添加定义了pod-ip, cluster-ip ,master节点ip地址以及指定版本和设置证书过期时间和国内阿里云镜像仓库地址,后期可以修改为自建的镜像仓库地址,最下面配置是开启使用ipvs做转发
6.4.初始化安装集群
可以先通过配置文件尝试拉取相关组件镜像
# yum install runc -y #因安装的是containerd可能默认安装的rnuc版本过低会导致初始化失败,版本过低可以升级runc
#升级runc
runc --version #查看当前版本
wget https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64
chmod +x runc.amd64
mv runc.amd64 /usr/local/bin/runc
runc --version
kubeadm config images pull --config ./kubeadm-config.yaml
crictl images 查看镜像是否正常拉取下来
在控制节点开始初始化k8s节点
kubeadm init --config=kubeadm-config.yaml --upload-certs
#如果初始化报错可以通过如下命名清理初始化数据,解决问题后然后再重新初始化
kubeadm reset -f ; ipvsadm --clear ; rm -rf ~/.kube
最终结果如下master01节点就初始化成功,可以根据提示将其它节点加入到集群

配置kubectl命令执行权限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
在其它master节点执行命令加入到master集群
kubeadm join 192.168.228.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1c294c890e64e8d6ebf1eaa4b060f991d421ad71433aaf22f9160cacd5182b53 \
--control-plane --certificate-key f4d57061abdac1a1f74e36a47b2ce49cefe2a4145fa2718b9ec9db674fbb3116
node节点加入执行如下命令即可
kubeadm join 192.168.228.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1c294c890e64e8d6ebf1eaa4b060f991d421ad71433aaf22f9160cacd5182b53
6.4安装网络插件calico
简介:
由于K8S本身不支持网络,当 node 全部启动后,由于网络组件(CNI)未安装会显示为 NotReady 状态,需要借助第三方网络才能进行创建Pod,下面将部署 Calico 网络为K8S提供网络支持,完成跨节点网络通讯。
Calico与Flannel为什么选择calico这种网络方式进行通信,flannel vxlan和calico ipip模式都是隧道方案,但是calico的封装协议IPIP的header更小,所以性能比flannel vxlan要好一点点。,Flannel过程是需要封装跟解封装的过程比较消耗CPU资源
部署calico:
在控制节点进行calico的部署安装,calico未部署好之前coredns会一直处于pending状态。
cd /etc/kubernetes/yaml/
wget https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
第一处修改,修改pod 的ip网段
vim calico.yaml

第二处修改,修改指定服务器的网卡名,可以指定写死网卡bon0,如果多个网卡可以使用(bond.)ens.根据自己网卡名进行修改。
- name: IP_AUTODETECTION_METHOD
value: "interface=ens160"
vim calico.yaml

提前在有外网的情况下将calico镜像下载好(需要配置国内镜像加速地址进行拉取官方镜像),并上传至每个节点,或者上传至私有仓库:

docker save calico/kube-controllers:v3.27.0 calico/cni:v3.27.0 calico/node:v3.27.0 -o calico.tar
在所有节点通过这个打包文件导入镜像:
ctr -n=k8s.io images import calico.tar
查看镜像导入结果
crictl images

创建calico
kubectl apply -f calico.yaml
查看calico是否正常启动

7.检查集群状态
kubectl get node -o wide

8.检查高可用&证书
这里我们关闭了master01节点,这个时候显示master01已经是NotReady,VIP也飘逸到了master02节点。并且集群也可以正常使用。

查看证书有效期
#无论是CA证书,还是CA签发的证书都是100年
kubeadm certs check-expiration

9.在k8s集群内离线安装KubeSphere
我们将一起探索如何在离线环境中部署 KubeSphere v4.1.2 高可用集群。对于离线环境的镜像仓库管理,官方推荐使用 Harbor 作为镜像仓库管理工具,它为企业级用户提供了高效、安全的镜像存储方案。而在本指南中,我们将以 Docker Registry 作为镜像仓库示例,展示如何实现离线部署。
如果您更倾向于使用 Harbor,请参考官方文档 KubeSphere 离线安装文档 获取具体的 Harbor 部署方式。
通过本文的指导,您将掌握以下关键技能:
- K8s 和 KubeSphere 离线安装包制作
- 离线环境部署 K8s 和 KubeSphere v4.1.2 高可用集群
- 离线环境安装配置 KubeSphere v4 的扩展组件
KubeSphere Core (ks-core) 是 KubeSphere 的核心组件,为扩展组件提供基础的运行环境。KubeSphere Core 安装完成后,即可访问 KubeSphere Web 控制台。
-
您需要在控制节点提前安装 Helm。
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash -
在集群节点,执行以下命令安装 KubeSphere Core
# 如果无法访问 charts.kubesphere.io, 可将 charts.kubesphere.io 替换为 charts.kubesphere.com.cn
#在有网状态下下载ks-core离线包然后上传至控制节点
wget https://charts.kubesphere.com.cn/main/ks-core-1.1.4.tgz
#在控制节点执行,并指定镜像仓库地址,如果搭建的本地镜像仓库地址,并将平台镜像上传至了私有仓库,可改为私有仓库,或者先提前将平台所需要镜像下载导入到集群服务器本地
helm upgrade --install -n kubesphere-system --create-namespace ks-core https://charts.kubesphere.com.cn/main/ks-core-1.1.4.tgz --set global.imageRegistry=swr.cn-southwest-2.myhuaweicloud.com/ks --set extension.imageRegistry=swr.cn-southwest-2.myhuaweicloud.com/ks --debug --wait
因本次只部署了3个master节点,所以将master节点设置为可调度,有node节点的可省略
kubectl taint nodes k8s-master01 node-role.kubernetes.io/control-plane:NoSchedule-
kubectl taint nodes k8s-master02 node-role.kubernetes.io/control-plane:NoSchedule-
kubectl taint nodes k8s-master03 node-role.kubernetes.io/control-plane:NoSchedule-
浙公网安备 33010602011771号