K8S雲平台是目前公司核心産品的主推部署方式,通過雲平台進行産品、方案部署,可以加快部署效率,特别是針對叢集式、高可用部署,雲平台具有天然的優勢。雲平台部署模式在滿足正常部署的同時,也提供了對于伺服器資源的監控、運維的輔助,能協助運維人員快速進行伺服器更新、擴容、啟停等操作,降低運維難度。
最近參與了實際項目的K8S叢集部署工作,參考已有的部署文檔順利地完成雲平台部署,是以在原有的叢集部署方案基礎上對相關内容進行了梳理,同時也總結了在雲平台部署時UMC産品的一些配置内容。
1基礎環境
基礎環境主要是對伺服器進行一些配置工作,以滿足K8S雲平台部署的需要,由于本次部署采用的是Centos7系統,是以以Centos7為例進行說明,包括各伺服器之間的通信、防火牆政策以及一些系統參數等。
1.1主機名稱
1.為了便于K8S叢集各台伺服器之間的通信,對主機名稱進行修改。
2.修改hosts檔案,添加主機名與IP對應:
1.2安全政策
本文的伺服器安全主要針對于伺服器防火牆進行處理,包括防火牆端口的開放以及IP白名單配置,以保證雲平台部署和後續運作時各伺服器之間的通信,以及部署後外部通路的需要。
1.2.1防火牆端口
1.編輯public.xml:
2.添加80端口:
3.儲存退出,重新開機防火牆:
注意:這裡采用直接修改配置檔案的方式,也可以通過firewall-cmd指令添加。
1.2.2防火牆白名單
1.編輯trusted.xml:
2.添加各伺服器IP:
注意:10.244.0.0/16為K8S内部通信IP。
3.儲存退出,重新開機防火牆:
1.3其他配置
伺服器一些其他參數的配置,K8S基礎環境(非高可用)的部署主要是處理網絡映射以及selinux和swap子產品,以屏蔽K8S叢集部署時的異常資訊。
1.3.1網絡映射
添加配置檔案,将橋接的IPv4流量傳遞到iptables的鍊;
1.編輯k8s.conf檔案:
2.添加配置:
3.添加完畢後執行生效:
1.3.2selinux
1.修改selinux配置檔案:
2.關閉selinux:
3.立即生效:
1.3.3swap
1.臨時關閉swap:
2.修改配置檔案:
3.永久關閉swap:
2軟體安裝
主要是安裝K8S雲平台必要的一些資源,如docker、K8S元件以及一些配置參數,這一部分的内容不論是高可用部署還是非高可用部署都需要安裝。
2.1安裝Docker
在K8S叢集的各台伺服器上部署Docker并進行設定啟動項。
1.所有伺服器都需要安裝;
2.非root用于在指令前加“sudo”,并且輸入root賬戶伺服器密碼;
3.系統沒有wget時需要先安裝:yum -y install wget。
2.2添加yum源
在/etc/yum.repos.d目錄下建立kubernetes.repo檔案;
2.3安裝K8S元件
安裝kubeadm、kubelet、kubectl等K8S元件;
kubeadm: 部署叢集用的指令;
kubelet: 在叢集中每台機器上都要運作的元件,負責管理pod、容器的生命周期;
kubectl: 叢集管理工具(可選,隻要在控制叢集的節點上安裝即可)。
2.4修改Cgroup
修改cgroup driver,消除相應的警告資訊;
1.檢視Cgroup;
2.修改Cgroup;
3.重新加載docker;
4.修改驗證;
3叢集配置
主要是在伺服器端配置K8S的叢集環境,包括Master和Worker節點上軟體的部署,叢集的啟動及節點的加入,同時部署網絡插件以實作叢集節點的通信。
3.1部署Master
Master是K8S叢集部署的關鍵,叢集部署大部分工作都是在Master上處理,包括叢集的部署、初始化以及啟動,一般Worker節點隻是在Master部署完成後加入叢集即可。
3.1.1部署步驟
1.在/opt目錄下建立kubeadm-config.yaml;
參數解釋:
2.通過阿裡源預先拉鏡像;
3.檢視鏡像(共7個鏡像);
4.執行節點初始化;
5.執行如下指令;
6.檢視nodes;
7.檢視pods;
注意:node現在是NotReady狀态,pod中coredns是Pending狀态,是因為CNI網絡插件未安裝,繼續3.2。
3.1.2叢集重置
注意:如果修改過配置,修改完之後,需要重新初始化,重新搭建(沒問題直接跳過)。
注意:如果使用kubeadm reset指令重置叢集,CNI插件也需要重新安裝。
3.2部署CNI插件
CNI是叢集各節點進行通信的網絡插件,是叢集部署時的必需步驟,隻有部署網絡插件才能建立叢集,加入節點,當然網絡插件不止一種,這裡我們采用flannel插件。
3.2.1資料準備
直接使用下列檔案:
3.2.2安裝過程
1.安裝flannel;
2.再次檢視nodes和pods(需要等待flannel初始化完成);
注意:quay.io國内無法通路,可能會報錯Init:ImagePullBackOff,需要多等待一會進行重試。
如果網絡完全不通,使用flanneld-v0.12.0-amd64.docker手動安裝在所有節點上。
注意:如果使用kubeadm reset指令重置叢集,CNI插件也需要重新安裝。
3.3加入Node
在192.168.1.222/223(Node)上執行。
1.向叢集添加新節點,執行在kubeadm init輸出的kubeadm join指令:這個在master init初始化時會有提示。
2.在192.168.1.221(Master)上檢視nodes和pods。
3.192.168.1.223(worker2)采用同樣方式加入即可。
注意:如果提示如下錯誤,需要删除/etc/kubernetes下面的manifests檔案夾然後重新init和安裝kube-flannel.yml,步驟同上:
删除操作步驟:
3.4部署Ingress
Ingress也叫Ingress-nginx,實際是Nginx的一種實作,主要是用于K8S叢集内部代理轉發的需要。
3.4.1鏡像上傳
nginx-ingress.tar上傳到192.168.1.221(Master)上,路徑自己能找到就行(如果下面的mandatory.yaml裡配置指定master,這裡可以隻放到指定的master就可以),導入鏡像:
3.4.2配置檔案
參考檔案如下:
1)編輯添加212行,表示使用主機網絡;
hostNetwork: true
關于上面yaml檔案中寫入的“hostNetwork: true”具體解釋:如果添加了此字段,意味着pod中運作的應用可以直接使用node節點端口,這樣node節點主機所在網絡的其他主機,就可以通過通路該端口通路應用。(類似于docker映射到主控端的端口)。
2)編輯221行,修改鏡像版本,改成上面導入的0.29.0;
上傳到192.168.1.221(Master)伺服器,路徑自己能找到就行。
3)設定pod時間,通常情況雲伺服器的時區為世界标準時間,和中國标準時間相差8個小時;
加入紅框部分,如下圖:
3.4.3節點部署
1.因為ingress-controller我們需要部署到master伺服器上,而預設master不允許部署pod,是以使用如下方法解決;
輸出如下:node “k8s” untainted。
輸出error: taint “node-role.kubernetes.io/master:” not found錯誤忽略。
2.執行mandatory.yaml;
3.确認Ingress-nginx容器;
注意:Ingress-nginx部署後為Pending狀态,需要添加标簽後采用變成Running狀态,可以通過UMC添加标簽,是以隻需要确認Ingress-nginx容器已經存在即可。
3.4.4開啟變量
1.内部ingress-nginx,data參數說明:
1)proxy-add-original-uri-header: "true"
作用:擷取到ingress的完整路徑。
2)enable-underscores-in-headers: "true"
作用:允許ingress支援自定義變量。
3)use-forwarded-headers: "true"
作用:擷取X-Forwarded-Proto,如https。
2.外部nginx.conf配置追加:
proxy_set_header proxy-by-outer-ng true
作用:如果true,說明是外部nignx,不帶ingress路徑。
如果false,不是外部nginx,需要加ingress路徑。
4NFS安裝
NFS主要是搭建共享資源庫,用于産品部署後的資源共享,包括配置檔案、日志檔案以及Server部署的資源檔案等。
4.1服務端
1.在192.168.1.221(Master)上安裝NFS和rpc;
2.啟動服務和設定開啟啟動;
3.建立共享檔案夾;
4.設定共享;
說明:
/opt/mnt/volumes 192.168.1.0/24(fsid=0,rw,async,no_root_squash)
目錄 授權給 網段 權限
注意:192.168.1.0/24是Master的網段,如果需要修改,隻修改前3個位置,保留最後一位是0,即可表示全網段可以通路。
5.啟動NFS;
6.檢視2049端口是否打開;
4.2用戶端
1.在192.168.1.222/223(Worker)上也安裝nfs,確定每個節點安裝nfs(用戶端上不需要啟動nfs服務,隻是為了使用showmount工具);
2.檢視挂載配置;
3.在用戶端建立目錄,并挂載共享目錄;
4.檢查(有就行,和順序無關);
5鏡像庫安裝
搭建鏡像庫,用于存儲上傳的鏡像檔案,包括系統鏡像、産品Server、Redis鏡像等。
5.1部署安裝
1.将registry鏡像pull下來;
2.啟動;
5.2基礎鏡像
1.上傳基礎鏡像:base-centos-v3.0.tar;
2.導入基礎鏡像;
5.3推送鏡像
1.查詢docker鏡像:docker images;
2.通過對base-centos鏡像打标,準備釋出到Registry中;
3.推送給Registry;
注意:如果上傳、擷取本地鏡像會提示如下報錯,需要設定daemon.json檔案。
1.設定daemon.json檔案;
2.其他節點擷取本地鏡像會提示。
由于Registry為了安全性考慮,預設是需要https證書支援的,但是我們可以通過一個簡單的辦法解決:
注意:<ip>:Registry的機器ip位址,在安裝registry的節點和用戶端需要通路私有Registry的節點都需要執行此步操作。
5.4檢視鏡像
1.檢視倉庫有哪些鏡像,運作如下指令:
檢視具體鏡像标簽(黃色是鏡像名):
6UMC配置
UMC産品以及JDK、MySQL、Nginx、Redis的部署安裝與配置可以參考相關部署手冊,不做重點說明,這裡主要介紹UMC中叢集的配置與啟動。
6.1叢集配置
1.首先需要配置鏡像倉庫,打開UMC的鏡像倉庫,點選新增,配置位址:
2.打開租戶管理,新增一個租戶,也可以使用預設的預置集團租戶,在基礎資訊中選擇剛才添加的鏡像庫位址:
3.打開叢集配置,新增一個叢集,配置共享目錄(部署NFS時的共享目錄):
4.先從192.168.1.221(Master)的/etc/kubernetes/admin.conf檔案複制到本地,然後點選上傳授權按鈕上傳檔案:
5.在節點資訊中配置3台伺服器的各個節點(Master、Worker1、Worker2):
6.建立命名空間(可以先不建立,在叢集配置時增加命名空間):
7.建立标簽,UMC初始化有預置标簽資訊,可以手動新增:
8.新增鏡像,并選擇相應的産品,選擇配置的鏡像倉庫:
9.上傳産品壓縮包(rar格式),并根據按鈕的高亮,構造鏡像、推送鏡像:
6.2租戶配置
1.在租戶配置功能下新增方案:
2.在方案下新增環境:
3.選擇環境的叢集名稱:
4.新增命名空間(和叢集配置的命名空間同步):
5.切換參數配置标簽,配置資料庫、Redis連接配接資訊:
6.生成并儲存通路位址:
7.依次點選Deploy、Service、Ingress的編輯按鈕進行建立:
8.通路測試:
7分析總結
K8S雲平台部署模式是後續所有産品和方案統一采用的部署方案,通過雲平台模式不僅可以降低産品部署、運維的難度,同時對于伺服器的資源監控、統計分析也能發揮作用,實作集中的、一體化管理。
7.1問題總結
筆者是第一次在實際項目中整體進行K8S雲平台的部署,雖然是第一次部署,但是借鑒于部署文檔以及以往項目的部署經驗,整體部署過程還是比較順利的。但是在部署的過程中難免會遇到一些問題,後續梳理了一遍部署過程,出現的問題在文檔中都有展現和說明,隻是浏覽文檔不認真或者由于文檔記錄的相對簡單,是以才忽略了。這也提醒了自己後續工作中一定要仔細認真,在做事情前最好有一個總體地了解,這樣工作中才能盡量減少問題的發生。
7.2産品方案
UMC雲平台實際是一個K8S的管理平台,通過Web端配置實作對K8S叢集的配置、啟停、監控、擴容等操作,并且通過UMC的管理功能可以将産品元件方案直接融合到平台中,實作不同産品、不同方案的快速部署,同時也提供租戶、方案、環境等不同粒度的管控,可集中、可分散,并且通過命名空間有效地實作資料隔離。