本文裝載至:https://blog.csdn.net/networken/article/details/86550735前端
項目地址:https://github.com/wise2c-devops/breeze
本次使用睿雲智合開源 Breeze工具部署 Kubernetes 高可用集羣。
Breeze項目旨在提供一個可信的、安全的、穩定的Kubernetes集羣部署工具,它能夠幫助您經過圖形化操做界面快捷地在生產環境部署一個或多個Kubernetes集羣,而不須要連入互聯網環境。node
功能簡介linux
Breeze 軟件架構簡圖:nginx
組件git
部署要求github
問題反饋溝通docker
在本次實驗環境中準備了6臺服務器,使用Vmware Workstation進行部署,配置與角色以下(若是須要增長 Minion/Worker 節點請自行準備便可):shell
主機名 | IP 地址 | 角色 | OS | 組件 |
---|---|---|---|---|
deploy | 192.168.92.10 | Breeze Deploy | CentOS 7.6 x64 | docker / docker-compose / Breeze |
master01 | 192.168.92.11 | K8S Master Node | CentOS 7.6 x64 | K8S Master / etcd / HAProxy / Keepalived |
master02 | 192.168.92.12 | K8S Master Node | CentOS 7.6 x64 | K8S Master / etcd / HAProxy / Keepalived |
master03 | 192.168.92.13 | K8S Master Node | CentOS 7.6 x64 | K8S Master / etcd / HAProxy / Keepalived |
worker01 | 192.168.92.21 | K8S Worker Node | CentOS 7.6 x64 | K8S Worker / Prometheus |
harbor | 192.168.92.20 | Harbor | CentOS 7.6 x64 | Harbor 1.7.0 |
192.168.92.30 | VIP | HA 虛 IP 地址在 3 臺 K8S Master 浮動 |
硬件資源規劃:api
主機名 | CPU | 內存 | 磁盤 | 網卡 |
---|---|---|---|---|
deploy | 1C | 2G | 系統盤50G x1,(可選數據盤300G x1) | x1 |
master01 | 2C | 4G | 系統盤50G x1,(可選數據盤300G x1) | x1 |
master02 | 2C | 4G | 系統盤50G x1,(可選數據盤300G x1) | x1 |
master03 | 2C | 4G | 系統盤50G x1,(可選數據盤300G x1) | x1 |
worker01 | 2C | 4G | 系統盤50G x1,(可選數據盤300G x1) | x1 |
harbor | 1C | 2G | 系統盤50G x1,(可選數據盤300G x1) | x1 |
注意master和worker節點至少配置2顆CPU、4G內存,不然可能致使資源不足部署失敗。部署前可對全部虛擬機創建快照,方便回滾。
這裏僅作測試不配置數據盤(對於集羣master和worker節點,磁盤規劃建議系統盤/dev/sda和數據盤/dev/sdb組成vg卷組,從卷組劃分兩個lv邏輯卷分別掛載至/var/lib/docker/目錄下和/data目錄下。)瀏覽器
全部節點設置防火牆
關閉selinux並放開firewalld,請勿禁用firewalld服務,保證firewalld服務正常運行狀態便可。
setenforce 0 sed --follow-symlinks -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config firewall-cmd --set-default-zone=trusted firewall-cmd --complete-reload
全部節點配置時間同步
使用chrony同步時間,指定deploy節點爲內網NTP服務器,與網絡NTP服務器同步時間,其餘節點與deploy節點同步時間。
配置deploy節點(NTP服務端):
#安裝chrony: yum install -y chrony cp /etc/chrony.conf /etc/chrony.conf.bak #註釋默認ntp服務器 sed -i 's/^server/#&/' /etc/chrony.conf #指定上游公共 ntp 服務器,並容許其餘節點同步時間 cat >> /etc/chrony.conf << EOF server 0.asia.pool.ntp.org iburst server 1.asia.pool.ntp.org iburst server 2.asia.pool.ntp.org iburst server 3.asia.pool.ntp.org iburst allow all EOF #配置時區 timedatectl set-timezone Asia/Shanghai #開啓時間同步功能 timedatectl set-ntp true #重啓chronyd服務並設爲開機啓動: systemctl enable chronyd && systemctl restart chronyd
配置全部其餘節點(NTP客戶端):
#安裝chrony: yum install -y chrony cp /etc/chrony.conf /etc/chrony.conf.bak #註釋默認服務器 sed -i 's/^server/#&/' /etc/chrony.conf #指定內網 deploy節點爲上游NTP服務器 echo server 192.168.92.10 iburst >> /etc/chrony.conf #配置時區 timedatectl set-timezone Asia/Shanghai #開啓時間同步功能 timedatectl set-ntp true #重啓服務並設爲開機啓動: systemctl enable chronyd && systemctl restart chronyd
注意修改ntp服務器ip地址,執行chronyc sources命令,查看存在以*開頭的行,說明已經與服務器時間同步,執行timedatectl查看時間是否同步。
部署節點環境準備(deploy/192.168.92.10)
如下全部操做在部署節點執行
安裝 docker-compose
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose $ sudo chmod +x /usr/local/bin/docker-compose
安裝 docker
$ curl -sSL https://raw.githubusercontent.com/willzhang/shell/master/install_docker.sh | sh
在部署機上作好對集羣內其它全部服務器的ssh免密登陸:
#生成密鑰 $ ssh-keygen
#針對目標服務器作 ssh 免密登陸,依次執行: $ ssh-copy-id 192.168.92.11 $ ssh-copy-id 192.168.92.12 $ ssh-copy-id 192.168.92.13 $ ssh-copy-id 192.168.92.20 $ ssh-copy-id 192.168.92.21
下載用於部署某個Kubernetes版本的docker-compose文件並使部署程序運行起來,例如這次實驗針對剛剛發佈的 K8S v1.13.2。
$ curl -L https://raw.githubusercontent.com/wise2c-devops/breeze/v1.13.2/docker-compose.yml -o docker-compose.yml $ docker-compose up -d
查看拉取的鏡像
[root@deploy ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE wise2c/playbook v1.13.2 6c57dc3440b1 3 days ago 1.17GB wise2c/yum-repo v1.13.2 d08304a41136 5 days ago 745MB wise2c/pagoda v1.1 d4f2b4cabdec 13 days ago 483MB wise2c/deploy-ui v1.3 2f159b37bf13 2 weeks ago 40.1MB
(可選)因爲鏡像較大,能夠將全部4個鏡像打包爲tar文件,備份到其餘地方,從新部署可使用docker load從新載入鏡像:
#打包全部鏡像 $ docker save -o breeze.tar $(docker images | grep -v TAG | awk '{print $1":"$2}') #從新載入鏡像 $ docker load -i breeze.tar
查看運行的容器
若是一切正常(注意deploy-playbook這個容器是個卷容器,它是退出狀態這是正常現象),部署機的88端口將可以被正常訪問。
[root@deploy ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0221f2177505 wise2c/deploy-ui:v1.3 "/root/entrypoint.sh" 8 minutes ago Up 8 minutes deploy-ui cd24a52cd499 wise2c/pagoda:v1.1 "sh -c '/root/pagoda…" 8 minutes ago Up 8 minutes 0.0.0.0:88->80/tcp, 0.0.0.0:8088->8080/tcp deploy-main a0dcf2bc42e6 wise2c/playbook:v1.13.2 "sh" 8 minutes ago Exited (0) 8 minutes ago deploy-playbook b1f92f68fffa wise2c/yum-repo:v1.13.2 "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 80/tcp, 0.0.0.0:2009->2009/tcp deploy-yumrepo [root@deploy ~]#
打開瀏覽器,訪問部署程序的圖形界面(部署機 IP 及端口 88),添加主機列表、添加服務角色並將加入的主機進行角色分配,而後開始部署:http://192.168.92.10:88
點擊 + 號添加一個集羣:
點擊「添加主機」,輸入主機名、主機IP、描述信息(主機用途),點擊肯定。重複該步驟直至將集羣所需的所有節點服務器加入(k8s master服務器、k8s worker node服務器、harbor服務器等等):
點擊「下一步」再點擊「添加組件」按鈕,對每一個組件進行設置和分配服務器(docker角色、harbor角色、loadbalance角色、etcd角色、kubernetes角色、prometheus角色):
若是但願Breeze部署程序使用界面裏輸入的主機名代替當前服務器的主機名,則勾選format host name選項框:
鏡像倉庫設置這裏的harbor entry point是指用戶端訪問鏡像倉庫的URL,能夠直接寫IP地址或寫對應的域名:
接下來是設置高可用組件(haproxy+keepalived):
vip for k8s master是指三個k8s master服務器的高可用虛擬浮動IP地址;網卡請填寫實際操做系統下的網卡名,注意請保證3個節點網卡名一致;router id和virtual router id請確保不一樣k8s集羣使用不一樣的值。
Etcd能夠選擇部署於K8S Master節點也能夠選擇獨立的三臺主機:
kubernetes entry point是指高可用的一個設定值,若是生產環境有硬件或軟件負載均衡指向這裏的k8s master全部節點,那麼就能夠在這裏填寫負載均衡的統一入口地址。
相對於昂貴的F5專業硬件設備,咱們也可使用HAProxy和Keepalived的組合輕鬆完成這個設置,Breeze自帶這個組合模塊的部署。
例以下圖的 192.168.92.30:6444 就是k8s集羣高可用的統一入口,k8s的worker node會使用這個地址訪問API Server。請注意若是使用的是Breeze自帶的高可用組件haproxy+keepalived,則請填寫實際的虛IP與默認端口6444。
接下來是可選安裝項Prometheus(基於Prometheus Operator方式部署,集成Prometheus、Alertmanager、Grafana),這裏請擇一臺Worker節點進行部署便可,有三個服務暴露端口可自行設定,注意NodePort端口號大於30000。
全部角色定義完成以下:
點擊「下一步」開始安裝部署。
若是界面上全部角色圖標所有變爲綠色,則表示部署任務結束。能夠登陸任一k8s節點運行命令 kubectl get nodes 查看結果。
以上例子是3臺etcd、3臺k8s master、1臺k8s worker node、1臺鏡像倉庫的環境。實際能夠增減規模。
Kubernetes Dashboard的訪問入口咱們採用了NodePort:30300的方式暴露端口,所以能夠經過火狐瀏覽器訪問 https://任意服務器IP:30300 來登陸Dashboard頁面,注意其它瀏覽器例如Chrome由於不接受自簽名證書會拒絕訪問請求。
新版本Dashboard引入了驗證模式,能夠經過如下命令獲取admin-user的訪問令牌:
$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
將返回的token字串粘貼至登陸窗口便可實現登陸。
安裝好Prometheus以後,能夠訪問如下服務頁面:
Grafana:
用戶名密碼默認爲admin/admin
這裏使用ID 315的dashboard模板進行展現:
Prometheus:
http://任意服務器IP:30900
Alertmanager:
http://任意服務器IP:30903
默認用戶名密碼admin/Harbor12345
登陸成功:
查看集羣狀態:
[root@master01 ~]# kubectl get cs NAME STATUS MESSAGE ERROR scheduler Healthy ok controller-manager Healthy ok etcd-1 Healthy {"health": "true"} etcd-2 Healthy {"health": "true"} etcd-0 Healthy {"health": "true"} [root@master01 ~]#
查看節點狀態:
[root@master01 ~]# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master01 Ready master 25m v1.13.2 192.168.92.11 <none> CentOS Linux 7 (Core) 4.20.2-1.el7.elrepo.x86_64 docker://18.6.1 master02 Ready master 24m v1.13.2 192.168.92.12 <none> CentOS Linux 7 (Core) 4.20.2-1.el7.elrepo.x86_64 docker://18.6.1 master03 Ready master 24m v1.13.2 192.168.92.13 <none> CentOS Linux 7 (Core) 4.20.2-1.el7.elrepo.x86_64 docker://18.6.1 worker01 Ready <none> 23m v1.13.2 192.168.92.21 <none> CentOS Linux 7 (Core) 4.20.2-1.el7.elrepo.x86_64 docker://18.6.1 [root@master01 ~]#
查看集羣組件pod狀態:
[root@master01 ~]# kubectl -n kube-system get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES coredns-8595b69b-25nqs 1/1 Running 0 25m 10.244.1.2 master03 <none> <none> coredns-8595b69b-dfzwz 1/1 Running 0 25m 10.244.1.3 master03 <none> <none> kube-apiserver-master01 1/1 Running 0 25m 192.168.92.11 master01 <none> <none> kube-apiserver-master02 1/1 Running 0 24m 192.168.92.12 master02 <none> <none> kube-apiserver-master03 1/1 Running 0 24m 192.168.92.13 master03 <none> <none> kube-controller-manager-master01 1/1 Running 0 24m 192.168.92.11 master01 <none> <none> kube-controller-manager-master02 1/1 Running 0 24m 192.168.92.12 master02 <none> <none> kube-controller-manager-master03 1/1 Running 0 24m 192.168.92.13 master03 <none> <none> kube-flannel-ds-6v625 1/1 Running 0 24m 192.168.92.13 master03 <none> <none> kube-flannel-ds-8p8m7 1/1 Running 0 24m 192.168.92.12 master02 <none> <none> kube-flannel-ds-m4ppq 1/1 Running 0 23m 192.168.92.21 worker01 <none> <none> kube-flannel-ds-xrmd2 1/1 Running 0 24m 192.168.92.11 master01 <none> <none> kube-proxy-bh4vl 1/1 Running 0 25m 192.168.92.13 master03 <none> <none> kube-proxy-cq4fc 1/1 Running 0 23m 192.168.92.21 worker01 <none> <none> kube-proxy-dz6l2 1/1 Running 0 25m 192.168.92.12 master02 <none> <none> kube-proxy-qkmq8 1/1 Running 0 25m 192.168.92.11 master01 <none> <none> kube-scheduler-master01 1/1 Running 0 24m 192.168.92.11 master01 <none> <none> kube-scheduler-master02 1/1 Running 0 24m 192.168.92.12 master02 <none> <none> kube-scheduler-master03 1/1 Running 0 24m 192.168.92.13 master03 <none> <none> kubernetes-dashboard-6f9bfdf8cb-rn6wd 1/1 Running 0 24m 10.244.1.4 master03 <none> <none> [root@master01 ~]#
查看prometheus相關pod
[root@master01 ~]# kubectl -n monitoring get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES alertmanager-main-0 2/2 Running 0 19m 10.244.3.8 worker01 <none> <none> alertmanager-main-1 2/2 Running 0 19m 10.244.3.10 worker01 <none> <none> alertmanager-main-2 2/2 Running 0 19m 10.244.3.11 worker01 <none> <none> grafana-5c59c6fb9c-78ng5 1/1 Running 0 20m 10.244.3.4 worker01 <none> <none> kube-state-metrics-565c6647f7-sc8d5 4/4 Running 0 20m 10.244.3.5 worker01 <none> <none> node-exporter-5hdqk 2/2 Running 0 20m 192.168.92.21 worker01 <none> <none> node-exporter-nxllq 2/2 Running 0 20m 192.168.92.11 master01 <none> <none> node-exporter-q2znp 2/2 Running 0 20m 192.168.92.12 master02 <none> <none> node-exporter-shdt8 2/2 Running 0 20m 192.168.92.13 master03 <none> <none> prometheus-adapter-68c9d7dc54-bb9t4 1/1 Running 0 20m 10.244.3.6 worker01 <none> <none> prometheus-k8s-0 3/3 Running 1 19m 10.244.3.9 worker01 <none> <none> prometheus-k8s-1 3/3 Running 1 19m 10.244.3.7 worker01 <none> <none> prometheus-operator-5fcf4d9b4d-qkpb8 1/1 Running 0 20m 10.244.3.2 worker01 <none> <none> [root@master01 ~]#
查看service
[root@master01 ~]# kubectl get service -n kube-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE coredns-prometheus ClusterIP None <none> 9153/TCP 23m kube-controller-manager-prometheus-discovery ClusterIP None <none> 10252/TCP 23m kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP 30m kube-scheduler-prometheus-discovery ClusterIP None <none> 10251/TCP 23m kubelet ClusterIP None <none> 10250/TCP 21m kubernetes-dashboard NodePort 10.99.39.217 <none> 8443:30300/TCP 30m [root@master01 ~]# kubectl get service -n monitoring NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE alertmanager-main NodePort 10.101.39.236 <none> 9093:30903/TCP 24m alertmanager-operated ClusterIP None <none> 9093/TCP,6783/TCP 23m etcd-k8s ClusterIP None <none> 2379/TCP 23m grafana NodePort 10.110.93.179 <none> 3000:30902/TCP 24m kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 24m node-exporter ClusterIP None <none> 9100/TCP 24m prometheus-adapter ClusterIP 10.105.49.184 <none> 443/TCP 24m prometheus-k8s NodePort 10.103.34.132 <none> 9090:30900/TCP 24m prometheus-operated ClusterIP None <none> 9090/TCP 23m prometheus-operator ClusterIP None <none> 8080/TCP 24m [root@master01 ~]#
在已經部署的集羣內添加新的Worker Nodes。
準備worker節點,執行以前部署環境準備的配置相關步驟,配置主機名,配置ssh免密登陸等。
(1) 在Breeze界面添加主機(設定主機名、IP地址、備註)。
(2) 在Breeze界面編輯Kubernetes角色,將新主機加入到kubernetes worker nodes列表並勾選"Just add new worker nodes, do not reinstall this cluster"。
(3) 在Breeze界面僅僅勾選Docker和Kubernetes並開始部署。
添加節點完成
查看節點狀態
[root@master01 ~]# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME master01 Ready master 10h v1.13.2 192.168.92.11 <none> CentOS Linux 7 (Core) 4.20.2-1.el7.elrepo.x86_64 docker://18.6.1 master02 Ready master 10h v1.13.2 192.168.92.12 <none> CentOS Linux 7 (Core) 4.20.2-1.el7.elrepo.x86_64 docker://18.6.1 master03 Ready master 10h v1.13.2 192.168.92.13 <none> CentOS Linux 7 (Core) 4.20.2-1.el7.elrepo.x86_64 docker://18.6.1 worker01 Ready <none> 10h v1.13.2 192.168.92.21 <none> CentOS Linux 7 (Core) 4.20.2-1.el7.elrepo.x86_64 docker://18.6.1 worker02 Ready <none> 4m48s v1.13.2 192.168.92.22 <none> CentOS Linux 7 (Core) 4.20.2-1.el7.elrepo.x86_64 docker://18.6.1 [root@master01 ~]#
手動刪除節點
在Master節點上運行:
[root@master01 ~]# kubectl drain worker02 --delete-local-data --force --ignore-daemonsets [root@master01 ~]# kubectl delete node worker02 node "worker02" deleted [root@master01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master01 Ready master 10h v1.13.2 master02 Ready master 10h v1.13.2 master03 Ready master 10h v1.13.2 worker01 Ready <none> 10h v1.13.2 [root@master01 ~]#
上面兩條命令執行完成後,在k8s-node2節點執行清理命令,重置kubeadm的安裝狀態:
[root@worker02 ~]# kubeadm reset
在master上刪除node並不會清理k8s-node2運行的容器,須要在刪除節點上面手動運行清理命令。
常見故障排錯方法
參考:https://github.com/wise2c-devops/breeze/blob/master/TroubleShooting-CN.md
前端Web UI的日誌若是不能判斷出具體問題所在,能夠在部署機上輸入如下命令來獲取更詳細的日誌:
[root@deploy ~]# docker logs -f deploy-main
</div>