文章目錄
一、環境
首先需要搭建單master節點部署環境
已完成的相關部署:
Kubernetes集羣二進制部署(一)——Etcd數據庫羣集功能部署、flannel網絡組建
Kubernetes集羣二進制部署(二)——單master集羣
服務器 | IP | 安裝軟件 |
---|---|---|
Master01 | 192.168.11.11 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
Master02 | 192.168.11.12 | kube-apiserver、kube-controller-manager、kube-scheduler、etcd |
負載均衡lb01 | 192.168.11.13/VIP:192.168.11.100 | nginx、keepalived |
負載均衡lb02 | 192.168.11.14/VIP:192.168.11.100 | nginx、keepalived |
Node01 | 192.168.11.16 | kubelet、kube-proxy、docker 、flannel 、etcd |
Node02 | 192.168.11.17 | kubelet、kube-proxy、docker 、flannel 、etcd |
二、軟件包
百度網盤鏈接:https://pan.baidu.com/s/1o8kgiC_9b2hO8FRNaDGC3Q
提取碼:qz5v
三、Master02部署
1、網絡環境準備
#清空防火牆規則、關閉核心防護
[root @master02 ~]# iptables -F #清空防火牆規則
[root @master02 ~]# setenforce 0 #關閉核心防護
#防止重啓虛擬機IP地址變化
生產環境中是一定要關閉該功能的
[root @master02 ~]# systemctl stop NetworkManager
[root @master02 ~]# systemctl enable NetworkManager
2、部署master02
① 將master01上的kuberetes目錄拷貝至master02上
[root @master01 ~]# scp -r /opt/kubernetes/ [email protected]:/opt
② 將master01上的三個組件啓動腳本拷貝至master02上
[root @master01 ~]# scp /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service [email protected]:/usr/lib/systemd/system/
③ 修改master02配置文件 kube-apiserver中的IP地址
[root @master02 ~]# cd /opt/kubernetes/cfg
[root @master02 cfg]# vim kube-apiserver
④ 拷貝master01上已有的etcd證書給master02使用
注意:master02一定要有etcd證書(不裝etcd也需要etcd證書,因爲master02也是要與etcd交互的)
[root @master01 ~]# scp -r /opt/etcd/ [email protected]:/opt
⑤ 啓動master02中的三個組件服務
[root @master02 ~]# systemctl start kube-apiserver
[root @master02 ~]# systemctl enable kube-apiserver
[root @master02 ~]# systemctl status kube-apiserver
[root @master02 ~]# systemctl start kube-controller-manager
[root @master02 ~]# systemctl enable kube-controller-manager
[root @master02 ~]# systemctl status kube-controller-manager
[root @master02 ~]# systemctl start kube-scheduler
[root @master02 ~]# systemctl enable kube-scheduler
[root @master02 ~]# systemctl status kube-scheduler
⑥ 增加環境變量
[root @master02 ~]# vim /etc/profile
#末尾添加
export PATH=$path:/opt/kubernetes/bin
[root @master02 ~]# source /etc/profile
⑦ 查看master02是否可以檢測到node節點
[root @master02 ~]# kubectl get node
至此,多master節點就搭建好了
四、負載均衡部署
lb01、lb02同時操作
1、網絡環境準備
#清空防火牆規則、關閉核心防護
[root @lb01 ~]# iptables -F #清空防火牆規則
[root @lb01 ~]# setenforce 0 #關閉核心防護
#防止重啓虛擬機IP地址變化
生產環境中是一定要關閉該功能的
[root @lb01 ~]# systemctl stop NetworkManager
[root @lb01 ~]# systemctl enable NetworkManager
2、部署nginx
① 配置nginx源環境並安裝nginx
[root@lb01 ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
[root@lb01 ~]# yum list
[root@lb01 ~]# yum install nginx -y #安裝nginx
② 添加四層轉發(添加stream模塊)
#在events模塊和http模塊中間添加一個獨立的stream模塊
[root @lb01 ~]# vim /etc/nginx/nginx.conf
…………省略內容
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 {
#master01的ip地址和端口
server 192.168.11.11:6443; #6443是apiserver的端口號
#master02的ip地址和端口
server 192.168.11.12:6443;
}
server {
listen 6443;
proxy_pass k8s-apiserver;
}
}
…………省略內容
③ 開啓nginx服務
[root@lb01 ~]# nginx -t #檢查配置文件是否有語法錯誤
[root@lb01 ~]# systemctl start nginx #開啓nginx服務
[root@lb01 ~]# netstat -ntap | grep nginx #查看nginx狀態及監聽端口6443
3、部署keepalived高可用
1)安裝並配置keepalived
① 安裝keepalived
[root@lb01 ~]# yum install keepalived -y
② 修改配置文件
刪除原有配置文件,重新定義添加
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
# 接收郵件地址
notification_email {
[email protected]
[email protected]
[email protected]
}
# 郵件發送地址
notification_email_from [email protected]
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id NGINX_MASTER
}
vrrp_script check_nginx {
script "/etc/nginx/check_nginx.sh" #監控nginx腳本的路徑,稍後會創建
}
vrrp_instance VI_1 {
state MASTER #lb01該節點爲MASTER,lb02設爲BACKUP
interface ens33
virtual_router_id 51
priority 100 #優先級,lb01爲master,優先級100。lb02爲backup,優先級設90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.11.100/24 #VIP地址(虛擬IP)
}
track_script {
check_nginx
}
}
2)創建nginx監控腳本
[root@lb01 ~]# vim /etc/nginx/check_nginx.sh
count=$(ps -ef |grep nginx |egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
systemctl stop keepalived
fi
[root@lb01 ~]# chmod +x /etc/nginx/check_nginx.sh #添加執行權限
3)開啓服務
[root@lb01 ~]# systemctl start keepalived.service
[root@lb01 ~]# systemctl status keepalived.service
#查看漂移地址
[root@lb01 ~]# ip a
可以看到vip地址是在lb01上,也就是高可用羣集中的master上的,而backup節點,lb02上是沒有vip地址的
4)驗證漂移地址
① lb01中使用pkill nginx,再在lb02中使用ip a查看vip地址
#結束lb01上的nginx
[root@lb01 ~]# pkill nginx
#keepalived也關閉了
[root@lb01 ~]# systemctl status keepalived
#查看lb01地址
這時lb01上的漂移地址就沒有了
#查看lb02地址
② 恢復操作(在lb01中先啓動給nginx服務,在啓動keepalived服務)
因爲有nginx監控,如果先啓動keepalived是啓不了的,
[root@lb01 ~]# systemctl start nginx
[root@lb01 ~]# systemctl start keepalived
#再次使用ip a查看lb01地址
漂移地址就回到了lb01上,因爲lb01是主節點,優先級高
5)node節點指向VIP漂移地址
兩個node均需要操作
① 修改兩個node節點配置文件(bootstrap.kubeconfig 、kubelet.kubeconfig、kube-proxy.kubeconfig),server ip統一VIP地址
[root@node01 cfg]# vim /opt/kubernetes/cfg/bootstrap.kubeconfig
[root@node01 cfg]# vim /opt/kubernetes/cfg/kubelet.kubeconfig
[root@node01 cfg]# vim /opt/kubernetes/cfg/kube-proxy.kubeconfig
#server: https://192.168.100.100:6443,統統修改爲vip漂移地址
② 重啓服務
[root@node01 cfg]# systemctl restart kubelet.service
[root@node01 cfg]# systemctl restart kube-proxy.service
③ 替換完成後自檢
[root@node01 cfg]# grep 100 *
④ 在lb01上查看nginx的k8s日誌
#檢查日誌是否完成了訪問,建立了負載均衡
[root@node01 cfg]# tail /var/log/nginx/k8s-access.log
至此多節點全部創建完成了
五、k8s集羣測試
master01操作
① 測試創建pod
[root@master01 ~]# kubectl run nginx --image=nginx
#查看pod狀態
[root@master01 ~]# kubectl get pods
#該指令可以查看到資源具體信息,IP及所在節點
[root@master01 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
nginx-dbddb74b8-lsbv2 1/1 Running 0 2m58s 172.17.80.2 192.168.11.16 <none>
② 查看日誌問題
#查看pod資源的日誌
[root@master1 ~]# kubectl logs nginx-dbddb74b8-lsbv2
ERROR報錯:
Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log nginx-dbddb74b8-vj4wk)
原因:出現 error 是由於權限不足,需要提權
解決辦法(添加匿名用戶授予權限):
kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
#提權後查看日誌記錄是空的,因爲現在這個容器並沒有被訪問
#訪問測試(創建的資源是在192.168.11.16節點上的,所以在該節點進行訪問)
[root@node01 cfg]# curl 172.17.80.2
#訪問後就會產生日誌記錄(再次回到master01查看日誌)
可以看到沒訪問之前是沒有日誌記錄的,再次查看已經有了剛剛訪問的一條記錄了