#服務(wù)器 #部署 #云原生 #k8s
欄目全部章節(jié)
一、ubuntu20.04上搭建containerd版( 1.2.4 以上)k8s及kuboard V3
二、kubernetes master單節(jié)點(diǎn)拓展為集群
三、kubernetes kuboard部署分布式系統(tǒng)
一、 前言
接上文中,我們已經(jīng)部署好了單節(jié)點(diǎn)master的k8s集群,在生產(chǎn)環(huán)境中,單節(jié)點(diǎn)的master肯定是不行的,那么我們?nèi)绾螌?duì)master進(jìn)行集群的拓展呢?
對(duì)master拓展,實(shí)際上就是對(duì)api-server的拓展,只要對(duì)其做個(gè)負(fù)載均衡即可。
本文選型 haproxy + keepalive 方案來(lái)實(shí)現(xiàn)。當(dāng)然也可以選擇 nginx + keepalive。
二、 haproxy 介紹
HAProxy是一款專(zhuān)注于負(fù)載均衡和代理的高性能軟件,它的核心功能就是負(fù)載均衡,能夠有效地將來(lái)自客戶端的請(qǐng)求分發(fā)到多個(gè)后端節(jié)點(diǎn)。
為什么選用 haproxy 而不是 nginx?
- HAProxy主要專(zhuān)注于高可用性和負(fù)載均衡,將客戶端請(qǐng)求分發(fā)到多個(gè)服務(wù)器,以實(shí)現(xiàn)高性能和高可用性的應(yīng)用部署。
- Nginx也可以用作反向代理和負(fù)載均衡,但它更廣泛地被用于作為靜態(tài)內(nèi)容服務(wù)器和應(yīng)用服務(wù)器,同時(shí)還能提供緩存、SSL終止等功能。
- HAProxy提供了豐富的負(fù)載均衡算法,可以根據(jù)需求選擇合適的算法,例如加權(quán)輪詢、最少連接、源IP哈希等,以更好地適應(yīng)不同的應(yīng)用場(chǎng)景。Nginx在負(fù)載均衡算法方面的選擇相對(duì)較少。
這并不是說(shuō)Nginx不適合用于Kubernetes集群的Master節(jié)點(diǎn),而是在這個(gè)特定的場(chǎng)景下,HAProxy由于其專(zhuān)注性、負(fù)載均衡算法和高可用性特點(diǎn),更容易滿足Master節(jié)點(diǎn)集群的需求。
三、keepalive 介紹
Keepalived 是一個(gè)用于實(shí)現(xiàn)高可用性和故障轉(zhuǎn)移的開(kāi)源工具,它通常與負(fù)載均衡器(如HAProxy)等配合使用,以確保在集群中的服務(wù)器或服務(wù)發(fā)生故障時(shí)能夠?qū)崿F(xiàn)快速的切換和恢復(fù),從而保證服務(wù)的持續(xù)可用性。
為什么有haproxy還需要keepalive?
盡管HAProxy可以實(shí)現(xiàn)負(fù)載均衡,但在發(fā)生主節(jié)點(diǎn)故障時(shí),單獨(dú)的HAProxy實(shí)例可能需要一些時(shí)間來(lái)進(jìn)行重新配置和重新分發(fā)請(qǐng)求。Keepalived則提供了一種快速的故障切換機(jī)制,它能夠迅速檢測(cè)到主節(jié)點(diǎn)的失效,并將虛擬IP(VIP)遷移到備用節(jié)點(diǎn),實(shí)現(xiàn)幾乎無(wú)感知的故障轉(zhuǎn)移。
四、實(shí)操
假設(shè)master的機(jī)子ip為192.168.16.200,201,202
worker的機(jī)子:192.168.16.203,192.168.16.204,192.168.16.205
虛擬ip為192.168.16.210
虛擬 IP 地址應(yīng)該是網(wǎng)絡(luò)上可用的、未被分配的,并且適合你要實(shí)現(xiàn)的服務(wù)或應(yīng)用。在配置中,你會(huì)將這個(gè)虛擬 IP 地址列入 `virtual_ipaddress` 配置項(xiàng)中,使 Keepalived 的 MASTER 實(shí)例能夠在活動(dòng)時(shí)綁定并使用它。
vim /etc/hosts
將虛擬ip加入到hosts文件中
192.168.16.200 k8s-master1
192.168.16.201 k8s-master2
192.168.16.202 k8s-master3
192.168.16.203 k8s-node1
192.168.16.204 k8s-node2
192.168.16.205 k8s-node3
#將虛擬ip加入到hosts文件中
192.168.16.210 k8s-cluster
在不同的機(jī)子上 設(shè)置各自的hostname
hostname k8s-master1
hostname k8s-master2
hostname k8s-master3
hostname k8s-node1
hostname k8s-node2
hostname k8s-node3
永久設(shè)置(重啟后生效)
sudo vim /etc/hostname
1、haproxy
1)安裝haproxy
在所有master機(jī)子上安裝haproxy
sudo apt-get update
sudo apt-get install -y haproxy
2)編輯haproxy的配置文件
sudo vim /etc/haproxy/haproxy.cfg
在配置文件最下方加入 兩個(gè)監(jiān)聽(tīng)器
#配置了一個(gè)監(jiān)聽(tīng)器,用于提供統(tǒng)計(jì)信息和管理界面。
listen admin_stats
bind 0.0.0.0:1080
mode http
log 127.0.0.1 local0 err
stats refresh 30s
stats uri /status #管理界面的訪問(wèn)路徑
stats realm welcome login\ Haproxy
stats auth admin:admin #登錄認(rèn)證
stats hide-version
stats admin if TRUE
#配置了一個(gè)監(jiān)聽(tīng)器,用于轉(zhuǎn)發(fā)流量到Kubernetes主節(jié)點(diǎn)。
listen kube-master
bind 0.0.0.0:8443 #負(fù)載均衡的端口為8848
mode tcp
option tcplog
balance source
server 192.168.16.200 192.168.16.200:6443 check inter 2000 fall 2 rise 2 weight 1
server 192.168.16.201 192.168.16.201:6443 check inter 2000 fall 2 rise 2 weight 1
server 192.168.16.202 192.168.16.202:6443 check inter 2000 fall 2 rise 2 weight 1
3)設(shè)置開(kāi)機(jī)啟動(dòng),并進(jìn)入管理界面
systemctl enable haproxy && systemctl restart haproxy
查看haproxy頁(yè)面:
http://192.168.16.200:1080/status
賬號(hào)/密碼:
admin/admin
?? 由于還沒(méi)初始化k8s的master, 這里其余兩臺(tái)都還不可用。
2、keepalive
1)安裝keepalive
在所有master機(jī)子上安裝keepalive
apt-get install -y keepalived
2)編輯keepalive的配置文件
- 查看可用的網(wǎng)卡
ip addr
我的是ens33
![[Pasted image 20230823231343.png]]
vim /etc/keepalived/keepalived.conf
- master1 (192.168.16.200)
global_defs {
script_user root
router_id k8s-lb
enable_script_security
}
vrrp_script check-haproxy {
script "/usr/bin/killall -0 haproxy"
interval 5
weight -30
}
vrrp_instance VI-kube-master {
state MASTER #200為主節(jié)點(diǎn)
priority 120 #主節(jié)點(diǎn)權(quán)重要大點(diǎn)
dont_track_primary
interface ens33 #上面的網(wǎng)卡
virtual_router_id 80
advert_int 3
track_script {
check-haproxy
}
virtual_ipaddress {
192.168.16.210
}
}
- master2 (192.168.16.201) ,master3 (192.168.16.202)
global_defs {
script_user root
router_id k8s-lb
enable_script_security
}
vrrp_script check-haproxy {
script "/usr/bin/killall -0 haproxy"
interval 5
weight -30
}
vrrp_instance VI-kube-master {
state BACKUP #設(shè)置為從節(jié)點(diǎn)
priority 110
dont_track_primary
interface ens33 #上面的網(wǎng)卡
virtual_router_id 68
advert_int 3
track_script {
check-haproxy
}
virtual_ipaddress {
192.168.16.210
}
}
3)依次在master1 master2 master3 上啟動(dòng)
systemctl enable keepalived && systemctl start keepalived && systemctl status keepalived
keepalived啟動(dòng)成功之后,在master1上通過(guò)ip addr可以看到vip(192.168.16.210)已經(jīng)綁定到ens33這個(gè)網(wǎng)卡上了
![[Pasted image 20230823231446.png]]
3、k8s master集群拓展
1)以下操作在master1執(zhí)行
備份一下之前k8s master的配置文件
mv init-default.yaml init-default.yaml.bak
vim init-default.yaml
將配置文件修改為以下的樣子:
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.16.200
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: k8s-master1 #這里是機(jī)子的host
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
certSANs:
- k8s-cluster
- k8s-master1
- k8s-master2
- k8s-master3
- k8s-node1
- k8s-node2
- k8s-node3
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.27.4 #根據(jù)實(shí)際版本修改
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
scheduler: {}
controlPlaneEndpoint: k8s-cluster:8443
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
- 主要修改的部分:
-
controlPlaneEndpoint
為控制面設(shè)置一個(gè)穩(wěn)定的 IP 地址或 DNS 名稱(chēng)。
controlPlaneEndpoint: k8s-cluster:8443
- 設(shè)置 API 服務(wù)器簽署證書(shū)所用的額外主題替代名
certSANs:
- k8s-master1
- k8s-master2
- k8s-master3
- k8s-node1
- k8s-node2
- k8s-node3
將k8s集群的host都加入到certSANs中,因?yàn)槲抑挥腥_(tái)服務(wù)器,所以node1和node2其實(shí)也是master2和master3。按你實(shí)際的服務(wù)器情況修改即可。
- 當(dāng)前ubuntu系統(tǒng)默認(rèn)開(kāi)啟了ipvs, 后續(xù)k8s部署的kube-proxy組件將會(huì)使用ipvs模式,提高轉(zhuǎn)發(fā)效率。
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
- 重新初始化master
#重置初始化
kubeadm reset -f
#配置kubetl
rm -rf /root/.kube/
mkdir -p /root/.kube/
sudo kubeadm init --upload-certs --config=init-default.yaml --ignore-preflight-errors=all
跟第一章一樣看到token信息,拷貝保存一下
- master的join命令
kubeadm join k8s-cluster:8443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8ae4635e544e225c19a0b303a75de62169a910c6d44095903340526f0fdd2c2d \
--control-plane --certificate-key 7dbedbba04cb0f5582ecb06ef78eabfe587de17f4393fe38fd772c5573e66d3d
- worker的join命令
kubeadm join k8s-cluster:8443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8ae4635e544e225c19a0b303a75de62169a910c6d44095903340526f0fdd2c2d
執(zhí)行以下命令
export KUBECONFIG=/etc/kubernetes/admin.conf
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
檢查是否有啟動(dòng)成功
curl -k https://k8s-cluster:8443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s
- 重新安裝flannel
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
#如果你修改了`podCIDR` yml中也要修改
export POD_SUBNET=10.244.0.0/16
sed -i "s#10.244.0.0/16#${POD_SUBNET}#" kube-flannel.yml
kubectl apply -f kube-flannel.yml
使用以下命令查看鏡像拉取狀態(tài),pending可能是還在下載鏡像
watch kubectl get pods -n kube-system -o wide
等全部鏡像變成RUNNING狀態(tài)后,master狀態(tài)也會(huì)變成Ready
kubectl get nodes
2)master2、master3加入集群
- 安裝k8s
第一章已經(jīng)安裝過(guò)了,這里就不重復(fù)了
- 重新初始化節(jié)點(diǎn)的信息
由于我之前這兩臺(tái)服務(wù)器上初始過(guò)worker,所以重新清除掉
#重置初始化
kubeadm reset -f
#配置kubetl
rm -rf /root/.kube/
mkdir -p /root/.kube/
- master2 master3加入集群
kubeadm join k8s-cluster:8443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8ae4635e544e225c19a0b303a75de62169a910c6d44095903340526f0fdd2c2d \
--control-plane --certificate-key 7dbedbba04cb0f5582ecb06ef78eabfe587de17f4393fe38fd772c5573e66d3d
賦予權(quán)限
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
檢查狀態(tài),全部READY
kubectl get nodes
進(jìn)入haproxy查看集群狀態(tài)
http://192.168.16.210:1080/status
全部正常啟動(dòng)!
3)worker集群重新加入master
kubeadm join k8s-cluster:8443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:8ae4635e544e225c19a0b303a75de62169a910c6d44095903340526f0fdd2c2d
在master1上檢查狀態(tài)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-688931.html
kubectl get nodes -o wide
kubectl get pods --all-namespaces -o wide
至此整個(gè)k8s多master的環(huán)境就部署好啦!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-688931.html
到了這里,關(guān)于【二】kubernetes master單節(jié)點(diǎn)拓展為集群的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!