1. 程式人生 > 其它 >Kubernetes部署(多master和Dashboard UI )

Kubernetes部署(多master和Dashboard UI )

在上一篇單節點的基礎上增加master和負載均衡伺服器https://www.cnblogs.com/pengdi/p/15471935.html

多master節點部署master02:192.168.150.20

從 master01 節點上拷貝證書檔案、各master元件的配置檔案和服務管理檔案到 master02 節點
scp -r /opt/etcd/ [email protected]:/opt/
scp -r /opt/kubernetes/ [email protected]:/opt
cd /usr/lib/systemd/system/
scp /usr/lib/systemd/system/{kube-apiserver,kube-scheduler,kube-controller-manager}.service [email protected]:`pwd`

#在master02節點上設定環境並修改配置檔案kube-apiserver中的IP
vim /opt/kubernetes/cfg/ kube-apiserver 
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://192.168.150.5:2379,https://192.168.150.10
:2379,https://192.168.150.15:2379 \ --bind-address=192.168.150.20 \ #修改 --secure-port=6443 \ --advertise-address=192.168.150.20 \ #修改 ........ 啟動各服務並設定開機自啟 systemctl daemon-reload systemctl enable --now kube-apiserver.service systemctl enable --now kube-controller-manager.service systemctl enable --now kube-scheduler.service 檢視node節點狀態,但無法進行操作,需要關聯node節點 ln -s /opt/kubernetes/bin/* /usr/local/bin/ kubectl get nodes kubectl get nodes -o wide #-o=wide∶輸出額外資訊;對於Pod,將輸出Pod所在的Node名 此時在master02節點查到的node節點狀態僅是從etcd查詢到的資訊,而此時node節點實際上並未與master02節點建立通訊連線,因此需要使用一個VIP把node節點與master節點都關聯起來

負載均衡部署

配置load balancer叢集雙機熱備負載均衡(nginx實現負載均衡,keepalived實現雙機熱備)

### 在lb01、lb02192.168.150.25、192.168.150.30節點上操作 #####

部署ngixn服務

配置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.conf
events {
    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.150.5:6443;
            server 192.168.150.20:6443;
         }
       server {
            listen 6443;
            proxy_pass k8s-apiserver;
         }
       }
http {
。。。。。。。。。。。
檢查配置檔案語法
nginx -t
systemctl enable --now nginx
netstat -natp | grep nginx

部署keepalived服務

yum install keepalived -y                                     
vim /etc/keepalived/keepalived.conf                                     #修改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                         #lb01為NGINX_MASTER lb02為NGINX_BACKUP  
}
#新增一個週期性執行的指令碼,指定指令碼路徑
vrrp_script check_nginx {
      script "/etc/nginx/check_nginx.sh"
}

vrrp_instance VI_1 {
    state MASTER                                          #lb01節點為manster,lb02為backup        
    interface ens33                                                             #指定物理網絡卡
    virtual_router_id 51                                               #指定vrid,兩個節點一致
    priority 100                          #指定lb01節點優先順序100為manster,lb02的90為backup
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.150.100                       #指定VIP
    }
    track_script {
        check_nginx                           #指定vrrp_scrip指令碼名,前後一致
    }
}

vim /etc/nginx/check_nginx.sh
#!/bin/bash
count=$(ps -ef | grep nginx | egrep -cv "grep|$$")
if [ "$count" -eq 0 ];then
      systemctl stop keepalived
fi
# egrep -cv "grep|$$"表示過濾掉包含grep或者$$表示當前shell程序的ID,如果直接執行會包含前面的ps程序,過濾掉後只剩下nginx的程序,統計行數,如果為0說明nginx宕機,手動斷開節點keepalived服務
啟動keepalived服務
systemctl enable --now keepalived
ip a                                                                 #檢視VIP是否生成

修改node節點上的bootstrap.kubeconfig、kubelet.kubeconfig配置檔案為VIP

cd /opt/kubernetes/cfg/
vim bootstrap.kubeconfig
server: https://192.168.150.100:6443

vim kubelet.kubeconfig
server: https://192.168.150.100:6443

vim kube-proxy.kubeconfig
server: https://192.168.150.100:6443 

重啟kubelet和kube-proxy服務
systemctl restart kubelet.service 
systemctl restart kube-proxy.service

#在lb01節點上檢視負載均衡器的對接狀態

netstat -natp | grep nginx

#在任意master主機上建立pod

kubectl create deployment nginx-03 --image=nginx:1.14

kubectl get pod -o wide#檢視pod詳細資訊

#在pod對應網段的node節點上直接瀏覽器訪問或者curl訪問pod

curl 172.17.26.3

在master節點上檢視pod日誌發現沒有許可權,需要繫結角色許可權才可以執行命令
[root@master02 system]# kubectl logs nginx-03-6545547fcb-qj896  
Error from server (Forbidden): Forbidden (user=system:anonymous, verb=get, resource=nodes, subresource=proxy) ( pods/log nginx-03-6545547fcb-qj896)

將cluster-admin授予使用者system:anonymous
[root@master02 system]# kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
clusterrolebinding.rbac.authorization.k8s.io/cluster-system-anonymous created

kubectl logs nginx-03-6545547fcb-qj896                                       再次檢視可以執行

部署 Dashboard UI

Dashboard 介紹

儀表板是基幹web的Kubernetes使用者介面。可以使用儀表板將容器化應用程式部署到Kubernetes叢集,對容器化應用程式進行故障排除,並管理叢集本身及其伴隨資源。可以使用儀表板來概述群集上執行的應用程式,以及建立或修改單個Kubernetes資源(例如部署,作業,守護程序等)。 例如,可以使用部署嚮導擴充套件部署,啟動滾動更新,重新啟動Pod或部署新應用程式。儀表板還提供有關群集中Kubernetes資源狀態以及可能發生的任何錯誤的資訊。

上傳Dashboard.zip壓縮包,並解壓,一共有7個檔案,包含5個構建該介面的核心檔案,一個k8s-admin.yaml檔案是自己寫的,用來生成在瀏覽器中登入時所用的令牌;一個dashboard-cert.sh,用來快速生成解決谷歌瀏覽器加密通訊問題所需的證書檔案

核心檔案官方下載資源地址∶

https://qithub.com/kubernetes/kubernetes/tree/master/cluster/addons/dashboard

dashboard-configmap.yamldashboard-rbac.yamldashboard-service.yaml

dashboard-controller.yaml dashboard-secret.yaml

1、dashboard-rbac.yaml∶用於訪問控制設定,配置各種角色的訪問控制權限及角色繫結(繫結角色和服務賬戶),內容中包含對應各種角色所配置的規則(ru les)

2、dashboard-secret.yaml∶提供令牌,訪問API伺服器所用(個人理解為一種安全認證機制)

3、dashboard-configmap.yaml∶配置模板檔案,負責設定Dashboard的檔案,ConfigMap提供了將配置資料注入容器的方式,保證容器中的應用程式配置從Image內容中解耦

4、dashboard-controller.yaml∶負責控制器及服務賬戶的建立,來管理pod副本

5、dashboard-service.yaml∶負責將容器中的服務提供出去,供外部訪問

通過kubectl create 命令建立resources需要按照順序建立資源

在 master01 節點上操作

在k8s工作目錄中建立dashborad工作目錄

mkdir /opt/k8s/dashboard

cd /opt/k8s/dashboard

1、規定kubernetes-dashboard-minimal該角色的許可權

例如其中具備獲取更新刪除等不同的許可權,有幾個kind就會有幾個結果被建立,格式為kind+apiServer/name
[root@master01 dashboard]# kubectl create -f dashboard-rbac.yaml
role.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard-minimal created

檢視型別為 Role,RoleBinding 的資源物件 kubernetes-dashboard-minimal 是否生成
kubectl get role,rolebinding -n kube-system
-n kube-system 表示檢視指定名稱空間中的pod,預設值為default

2、證書和金鑰建立

[root@master01 dashboard]# kubectl create -f dashboard-secret.yaml 
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-key-holder created

檢視型別為 Secret 的資源物件 kubernetes-dashboard-certs,kubernetes-dashboard-key-holder 是否生成kubectl get secret -n kube-system

3、配置檔案,對於叢集dashboard設定的建立

[root@master01 dashboard]# kubectl create -f dashboard-configmap.yaml 
configmap/kubernetes-dashboard-settings created

4、建立容器需要的控制器以及服務賬戶

[root@master01 dashboard]# kubectl create -f dashboard-controller.yaml
serviceaccount/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created

檢視型別為 serviceAccount,Deployment 的資源物件 kubernetes-dashboard-settings 是否生成
kubectl get serviceaccount,deployment -n kube-system

5、將服務提供出去

[root@master01 dashboard]# kubectl create -f dashboard-service.yaml 
service/kubernetes-dashboard created

檢視建立在指定的 kube-system 名稱空間下的 pod 和 service 狀態資訊
kubectl get pods,svc -n kube-system -o wide
svc 為 service 的縮寫,可用 kubectl api-resources 檢視

dashboard分配給了node01伺服器,訪問的入口是30001埠,開啟瀏覽器訪問 https://nodeIP:30001來進行測試火狐瀏覽器可直接訪問∶https://192.168.150.10:30001

谷歌瀏覽器則因為缺少加密通訊的認證證書,導致無法直接訪問。可通過選單->更多工具->開發者工具->Security 檢視訪問失敗的原因。

解決谷歌瀏覽器加密通訊問題

使用的指令碼 dashboard-cert.sh 來快速生成證書檔案
cd /opt/k8s/dashboard/
vim dashboard-controller.yaml

執行指令碼
cd /opt/ k8s/dashboard/
chmod +x dashboard-cert.sh
./dashboard-cert.sh /opt/k8s/k8s-cert/

在 dashboard 工作目錄下將生成兩個證書
ls *.pem
dashboard.pem  dashboard-key.pem

重新進行部署(注意:當apply不生效時,先使用delete清除資源,再apply建立資源)
kubectl apply -f dashboard-controller.yaml

由於可能會更換所分配的節點,所以要再次檢視一下分配的節點伺服器地址和埠號
kubectl get pods,svc -n kube-system -o wide

再次進行訪問測試,選擇使用令牌方式登入,使用 k8s-admin.yaml 檔案進行建立令牌
cd /opt/k8s/dashboard/
[root@master01 dashboard]# kubectl create -f k8s-admin.yaml
serviceaccount/dashboard-admin created
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin created

#獲取token簡要資訊,名稱為dashboard-admin-token-xxxxx 
kubectl get secrets -n kube-system

檢視令牌序列號,取 token:後面的內容
kubectl describe secrets dashboard-admin-token-wp5xm -n kube-system

將令牌序列號複製填入到瀏覽器頁面中,點選登入

先通過 kubectl get pods 命令檢視一下叢集中是否有資源在執行,再在 Dashboard UT 介面中命令間選default,點選側邊欄中的"容器組",點選容器名稱,進入一個頁面,點選右上方的"執行命令"或"日誌"控制元件會彈出另一個額外頁面,可在"執行命令"輸入 curl <podip> 命令訪問容器,再通過dashboard頁面檢視日誌更新結果。

可以使用web介面直接拉取pod注意埠的設定(可以是外部也可以是內部根據服務是否需要釋出),例如建立一個nginx的pod並且將服務釋出,選擇8080為外部埠,80為容器內部埠

kubectl get pods,svc -n kube-system -o wide                             
檢視名稱空間pod和service,發現除了建立的對映埠8080還有隨機生成39767埠,該埠為node節點對映
curl 172.17.27.6:80                                          #使用容器IP加埠內部訪問
curl 10.0.0.77:8080                                          #使用叢集ip加埠可以實現內部訪問
curl 192.168.150.10:39767                             #使用對映的埠加node節點ip可以實現服務的釋出訪