在上一篇文章中,就已經完成了二進制k8s集群部署的搭建,但是單機master并不適用于企業的實際運用(因為單機master中,僅僅只有一臺master作為節點服務器的調度指揮,一旦宕機。就意味著整個集群的癱瘓,所以成熟的k8s的集群一定要考慮到master的高可用。)企業的運用一般至少存在兩臺master及其以上的部署,本次將根據前面的部署,再添加一臺master(三個master或者更多,也可以根據本次添加步驟重復添加)。添加master后,我們會將借助keepalived+nginx的架構,來實現高可用的master【也可以使用haproxy+keepalived或則是keepalived+lvs(不推薦,步驟過于復雜)
本次部署的架構組件?
?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?mater節點 | ||
mater01 | 192.168.73.100 | kube-apiserver kube-controller-manager kube-scheduler? |
master02 | 192.168.73.130 | kube-apiserver kube-controller-manager kube-scheduler? |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?node節點 | ||
node01 | 192.168.73.110 | kubelet kube-proxy docker (容器引擎) |
node02 | 192.168.73.120 | kubelet kube-proxy docker (容器引擎) |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? etcd? cluster集群 | ||
etcd節點1 | 192.168.73.100(mater01) | etcd |
etcd節點2 | 192.168.73.110(node01) | etcd |
etcd節點3 | 192.168.73.120(node02) | etcd |
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? load balance(高可用調度器) | ||
主調度器 | 192.168.73.140 | nginx,keepalived |
從調度器 | 192.168.73.150 | nginx,keepalived |
?架構說明:
node節點的kubelet只能對接一個master節點的apiserver,不可能同時對接多個master節點的apiserver。簡而言之,node節只能有一個master來領導。
kubelet和kube-proxy是通過kubelet.kubeconfig和kube-proxy.kubeconfig文件中的server參數進行對接 master節點的。
所以在多master節點的環境下,需要有nginx負載均衡器來進行調度,而且需要進行keepalived高可用的構建(主從兩個節點) ,防止主節點宕機導致整個k8s集群的不可用。
?一、新master節點的搭建
1.1 對master02 進行初始化配置
#關閉防火墻
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X#關閉selinux
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config#關閉swap
swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab #根據規劃設置主機名
hostnamectl set-hostname master02
su
#在master添加hosts(添加到整個k8s集群的主機上,保證其他主機均有該映射)
cat >> /etc/hosts << EOF
192.168.73.105 master01
192.168.73.110 master02
192.168.73.106 node01
192.168.73.107 node02
EOF#調整內核參數
cat > /etc/sysctl.d/k8s.conf << EOF
#開啟網橋模式,可將網橋的流量傳遞給iptables鏈
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
#關閉ipv6協議
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOFsysctl --system#時間同步
yum install ntpdate -y
ntpdate ntp.aliyun.com#將時間同步的操作添加到計劃性任務,確保所有節點保證時間的同步
crontab -e
*/30 * * * * /usr/sbin/ntpdate ntp.aliyun.com
crontab -l
?
?1.2? 將master01的配置移植到master02?
##------------ 1、 master01節點,拷貝文件到master02 -------------------------------#從 master01 節點上拷貝證書文件、各master組件的配置文件和服務管理文件到 master02 節點scp -r etcd/ master02:`pwd`scp -r kubernetes/ master02:`pwd`scp /usr/lib/systemd/system/kube-* master02:/usr/lib/systemd/system/scp -r /root/.kube/ master02:/root/?
##----------- 2、 master02節點,修改配置文件并啟動相關服務-------------------------#修改配置文件kube-apiserver中的IPvim /opt/kubernetes/cfg/kube-apiserverKUBE_APISERVER_OPTS="--logtostderr=true \ #輸出日志,false表示標準錯誤不輸出到屏幕,而是輸出到日志中。true表示標準錯誤會輸出到屏幕。--v=4 \ #日志級別--etcd-servers=https://192.168.73.105:2379,https://192.168.73.106:2379,https://192.168.73.107:2379 \ #etcd節點的IP通信地址--bind-address=192.168.73.110 \ #修改,當前綁定的內網IP監聽的地址--secure-port=6443 \ #基于HPPTS開放端口--advertise-address=192.168.73.110 \ #修改,內網通告地址,讓其他node節點地址通信......vim kube-controller-managervim kube-scheduler?#在 master02 節點上啟動各服務并設置開機自啟systemctl enable --now kube-apiserver.servicesystemctl enable --now kube-controller-manager.servicesystemctl enable --now kube-scheduler.service?#將可執行文件,創建軟鏈接ln -s /opt/kubernetes/bin/* /usr/local/bin/?#查看node節點狀態kubectl get nodeskubectl get nodes -o wide #-o=wide:輸出額外信息;對于Pod,將輸出Pod所在的Node名#此時在master02節點查到的node節點狀態僅是從etcd查詢到的信息,而此時node節點實際上并未與master02節點建立通信連接,因此需要使用一個VIP把node節點與master節點都關聯起來
?
?
二、負載均衡的部署?
#配置load balancer集群雙機熱備負載均衡(nginx實現負載均衡,keepalived實現雙機熱備)?#----------------- 1、兩臺負載均衡器配置nginx -------------------------------------?#配置nginx的官方在線yum源,配置本地nginx的yum源
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
EOF?yum install nginx -y?#修改nginx配置文件,配置四層反向代理負載均衡,指定k8s群集2臺master的節點ip和6443端口vim /etc/nginx/nginx.confevents {worker_connections 1024;}?#添加stream {log_format main '$remote_addr $upstream_addr - [$time_local] $status $upstream_bytes_sent';access_log /var/log/nginx/k8s-access.log main;?upstream k8s-apiserver {server 192.168.73.105:6443; #master01server 192.168.73.110:6443; #master02}server {listen 6443;proxy_pass k8s-apiserver;}}?http {......??#檢查配置文件語法nginx -t ?#啟動nginx服務,查看已監聽6443端口systemctl start nginxsystemctl enable nginxss -lntp|grep nginx ??
?
?
#------------------ 2、兩臺負載均衡器配置keepalived ------------------------------?#部署keepalived服務yum install keepalived -y?#修改keepalived配置文件vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {router_id nginx_master
}vrrp_script check_nginx {script "/etc/nginx/check_nginx.sh" #指定檢測腳本的路徑,并且該腳本充當心跳檢測腳本
}vrrp_instance VI_1 {state MASTER #指定狀態為master節點,109為BACKUP備用節點interface ens33virtual_router_id 51priority 100 #108優先級為100 109為90,優先級決定著主備的位置advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.73.66}track_script {check_nginx #追蹤腳本的進程}
}#將該文件 發送給備用調度器,并且將其中的配置修改為備用調度器的屬性
cd /etc/keepalived/
scp keepalived.conf root@192.168.73.109:`pwd`??
#創建nginx狀態檢查腳本
vim /etc/nginx/check_nginx.sh#!/bin/bash
killall -0 nginx &>/dev/null
if [ $? -ne 0 ];thensystemctl stop keepalived
fi?chmod +x /etc/nginx/check_nginx.sh #為腳本增加執行權限#將該腳本發送給備用調度器
cd /etc/nginx
scp check_nginx.conf root@192.168.73.109:`pwd`?#兩臺主備調度器啟動keepalived服務(一定要先啟動了nginx服務,再啟動keepalived服務)systemctl start keepalivedsystemctl enable keepalivedip addr #查看主節點的VIP是否生成?
?nginx心跳檢測腳本說明:
killall -0 可以用來檢測程序是否執行
如果服務未執行的情況下 會進行報錯
并且 $?的返回碼 為非0值?
vim /etc/keepalived/keepalived.conf
scp /etc/keepalived/keepalived.conf 192.168.136.150:/etc/keepalived/
systemctl enable --now keepalived.service
systemctl status keepalived.service systemctl restart nginx keepalived.service
ip a
?
#---------------- 3、關閉主節點的nginx服務,模擬故障,測試keepalived-----------------------?#關閉主節點lb01的Nginx服務,模擬宕機,觀察VIP是否漂移到備節點systemctl stop nginxip addrsystemctl status keepalived #此時keepalived被腳本殺掉了 ?#備節點查看是否生成了VIPip addr #此時VIP漂移到備節點lb02?
?
//修改所有node節點上的bootstrap.kubeconfig,kubelet.kubeconfig配置文件為VIP[root@node01 /opt/kubernetes/cfg]#vim bootstrap.kubeconfig
[root@node01 /opt/kubernetes/cfg]#vim kubelet.kubeconfig
[root@node01 /opt/kubernetes/cfg]#vim kube-proxy.kubeconfig
//重啟node節點kubelet和kube-proxy服務
systemctl restart kubelet.service
systemctl restart kube-proxy.service
//在 lb01 上查看 nginx 和 node 、 master 節點的連接狀態
netstat -natp | grep nginx
三、k8s的web UI界面的搭建?
//在 master01 節點上操作
#上傳 recommended.yaml 文件到 /opt/k8s 目錄中,部署 CoreDNS
cd /opt/k8s
vim recommended.yaml
#默認Dashboard只能集群內部訪問,修改Service為NodePort類型,暴露到外部:
kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443nodePort: 30001 #添加type: NodePort #添加selector:k8s-app: kubernetes-dashboard#通過recommended.yaml資源配置清單,使用kubectl apply創建資源,-f指定資源配置清單文件kubectl apply -f recommended.yaml#創建service account并綁定默認cluster-admin管理員集群角色
kubectl create serviceaccount dashboard-admin -n kube-systemkubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin#獲取token值
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')#使用輸出的token登錄Dashboard,訪問node節點
https://192.168.136.110:30001
?
?
?
?