天天看點

K8S叢集部署與配置心得

K8S雲平台是目前公司核心産品的主推部署方式,通過雲平台進行産品、方案部署,可以加快部署效率,特别是針對叢集式、高可用部署,雲平台具有天然的優勢。雲平台部署模式在滿足正常部署的同時,也提供了對于伺服器資源的監控、運維的輔助,能協助運維人員快速進行伺服器更新、擴容、啟停等操作,降低運維難度。

最近參與了實際項目的K8S叢集部署工作,參考已有的部署文檔順利地完成雲平台部署,是以在原有的叢集部署方案基礎上對相關内容進行了梳理,同時也總結了在雲平台部署時UMC産品的一些配置内容。 

1基礎環境 

基礎環境主要是對伺服器進行一些配置工作,以滿足K8S雲平台部署的需要,由于本次部署采用的是Centos7系統,是以以Centos7為例進行說明,包括各伺服器之間的通信、防火牆政策以及一些系統參數等。 

1.1主機名稱 

1.為了便于K8S叢集各台伺服器之間的通信,對主機名稱進行修改。 

K8S叢集部署與配置心得

2.修改hosts檔案,添加主機名與IP對應: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

1.2安全政策 

本文的伺服器安全主要針對于伺服器防火牆進行處理,包括防火牆端口的開放以及IP白名單配置,以保證雲平台部署和後續運作時各伺服器之間的通信,以及部署後外部通路的需要。 

1.2.1防火牆端口 

1.編輯public.xml: 

K8S叢集部署與配置心得

2.添加80端口: 

K8S叢集部署與配置心得

3.儲存退出,重新開機防火牆: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

注意:這裡采用直接修改配置檔案的方式,也可以通過firewall-cmd指令添加。 

1.2.2防火牆白名單 

1.編輯trusted.xml: 

K8S叢集部署與配置心得

2.添加各伺服器IP:  

K8S叢集部署與配置心得

注意:10.244.0.0/16為K8S内部通信IP。 

3.儲存退出,重新開機防火牆: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

1.3其他配置 

伺服器一些其他參數的配置,K8S基礎環境(非高可用)的部署主要是處理網絡映射以及selinux和swap子產品,以屏蔽K8S叢集部署時的異常資訊。 

1.3.1網絡映射 

添加配置檔案,将橋接的IPv4流量傳遞到iptables的鍊; 

1.編輯k8s.conf檔案:

K8S叢集部署與配置心得

2.添加配置: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

3.添加完畢後執行生效: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

1.3.2selinux 

1.修改selinux配置檔案: 

K8S叢集部署與配置心得

2.關閉selinux: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

3.立即生效: 

K8S叢集部署與配置心得

1.3.3swap 

1.臨時關閉swap: 

K8S叢集部署與配置心得

2.修改配置檔案: 

K8S叢集部署與配置心得

3.永久關閉swap: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

2軟體安裝 

主要是安裝K8S雲平台必要的一些資源,如docker、K8S元件以及一些配置參數,這一部分的内容不論是高可用部署還是非高可用部署都需要安裝。 

2.1安裝Docker 

在K8S叢集的各台伺服器上部署Docker并進行設定啟動項。 

1.所有伺服器都需要安裝; 

2.非root用于在指令前加“sudo”,并且輸入root賬戶伺服器密碼; 

3.系統沒有wget時需要先安裝:yum -y install wget。 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

2.2添加yum源 

在/etc/yum.repos.d目錄下建立kubernetes.repo檔案; 

K8S叢集部署與配置心得

2.3安裝K8S元件 

安裝kubeadm、kubelet、kubectl等K8S元件; 

kubeadm: 部署叢集用的指令; 

kubelet: 在叢集中每台機器上都要運作的元件,負責管理pod、容器的生命周期; 

kubectl: 叢集管理工具(可選,隻要在控制叢集的節點上安裝即可)。 

K8S叢集部署與配置心得

2.4修改Cgroup 

修改cgroup driver,消除相應的警告資訊; 

1.檢視Cgroup; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

2.修改Cgroup; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

3.重新加載docker; 

K8S叢集部署與配置心得

4.修改驗證; 

K8S叢集部署與配置心得

3叢集配置 

主要是在伺服器端配置K8S的叢集環境,包括Master和Worker節點上軟體的部署,叢集的啟動及節點的加入,同時部署網絡插件以實作叢集節點的通信。 

3.1部署Master 

Master是K8S叢集部署的關鍵,叢集部署大部分工作都是在Master上處理,包括叢集的部署、初始化以及啟動,一般Worker節點隻是在Master部署完成後加入叢集即可。 

3.1.1部署步驟 

1.在/opt目錄下建立kubeadm-config.yaml; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

參數解釋: 

K8S叢集部署與配置心得

2.通過阿裡源預先拉鏡像; 

K8S叢集部署與配置心得

3.檢視鏡像(共7個鏡像); 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

4.執行節點初始化; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得
K8S叢集部署與配置心得
K8S叢集部署與配置心得

5.執行如下指令; 

K8S叢集部署與配置心得

6.檢視nodes; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

7.檢視pods; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

注意:node現在是NotReady狀态,pod中coredns是Pending狀态,是因為CNI網絡插件未安裝,繼續3.2。 

3.1.2叢集重置 

注意:如果修改過配置,修改完之後,需要重新初始化,重新搭建(沒問題直接跳過)。 

K8S叢集部署與配置心得

注意:如果使用kubeadm reset指令重置叢集,CNI插件也需要重新安裝。 

3.2部署CNI插件 

CNI是叢集各節點進行通信的網絡插件,是叢集部署時的必需步驟,隻有部署網絡插件才能建立叢集,加入節點,當然網絡插件不止一種,這裡我們采用flannel插件。 

3.2.1資料準備 

直接使用下列檔案: 

K8S叢集部署與配置心得

3.2.2安裝過程 

1.安裝flannel; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

2.再次檢視nodes和pods(需要等待flannel初始化完成); 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

注意:quay.io國内無法通路,可能會報錯Init:ImagePullBackOff,需要多等待一會進行重試。 

如果網絡完全不通,使用flanneld-v0.12.0-amd64.docker手動安裝在所有節點上。 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

注意:如果使用kubeadm reset指令重置叢集,CNI插件也需要重新安裝。 

3.3加入Node 

在192.168.1.222/223(Node)上執行。 

1.向叢集添加新節點,執行在kubeadm init輸出的kubeadm join指令:這個在master init初始化時會有提示。 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

2.在192.168.1.221(Master)上檢視nodes和pods。 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

3.192.168.1.223(worker2)采用同樣方式加入即可。 

注意:如果提示如下錯誤,需要删除/etc/kubernetes下面的manifests檔案夾然後重新init和安裝kube-flannel.yml,步驟同上: 

K8S叢集部署與配置心得

删除操作步驟: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

3.4部署Ingress 

Ingress也叫Ingress-nginx,實際是Nginx的一種實作,主要是用于K8S叢集内部代理轉發的需要。 

3.4.1鏡像上傳 

nginx-ingress.tar上傳到192.168.1.221(Master)上,路徑自己能找到就行(如果下面的mandatory.yaml裡配置指定master,這裡可以隻放到指定的master就可以),導入鏡像: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

3.4.2配置檔案 

參考檔案如下: 

K8S叢集部署與配置心得

1)編輯添加212行,表示使用主機網絡; 

hostNetwork: true 

K8S叢集部署與配置心得

關于上面yaml檔案中寫入的“hostNetwork: true”具體解釋:如果添加了此字段,意味着pod中運作的應用可以直接使用node節點端口,這樣node節點主機所在網絡的其他主機,就可以通過通路該端口通路應用。(類似于docker映射到主控端的端口)。 

2)編輯221行,修改鏡像版本,改成上面導入的0.29.0; 

K8S叢集部署與配置心得

上傳到192.168.1.221(Master)伺服器,路徑自己能找到就行。 

3)設定pod時間,通常情況雲伺服器的時區為世界标準時間,和中國标準時間相差8個小時; 

加入紅框部分,如下圖: 

K8S叢集部署與配置心得

3.4.3節點部署 

1.因為ingress-controller我們需要部署到master伺服器上,而預設master不允許部署pod,是以使用如下方法解決; 

K8S叢集部署與配置心得

輸出如下:node “k8s” untainted。 

輸出error: taint “node-role.kubernetes.io/master:” not found錯誤忽略。 

K8S叢集部署與配置心得

2.執行mandatory.yaml; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

3.确認Ingress-nginx容器; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

注意:Ingress-nginx部署後為Pending狀态,需要添加标簽後采用變成Running狀态,可以通過UMC添加标簽,是以隻需要确認Ingress-nginx容器已經存在即可。 

3.4.4開啟變量 

K8S叢集部署與配置心得
K8S叢集部署與配置心得
K8S叢集部署與配置心得

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; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

2.啟動服務和設定開啟啟動; 

K8S叢集部署與配置心得

3.建立共享檔案夾; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

4.設定共享; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

說明: 

/opt/mnt/volumes 192.168.1.0/24(fsid=0,rw,async,no_root_squash) 

目錄 授權給 網段 權限

注意:192.168.1.0/24是Master的網段,如果需要修改,隻修改前3個位置,保留最後一位是0,即可表示全網段可以通路。 

K8S叢集部署與配置心得

5.啟動NFS; 

K8S叢集部署與配置心得

6.檢視2049端口是否打開; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

4.2用戶端 

1.在192.168.1.222/223(Worker)上也安裝nfs,確定每個節點安裝nfs(用戶端上不需要啟動nfs服務,隻是為了使用showmount工具); 

K8S叢集部署與配置心得

2.檢視挂載配置; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

3.在用戶端建立目錄,并挂載共享目錄; 

K8S叢集部署與配置心得

4.檢查(有就行,和順序無關); 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

5鏡像庫安裝 

搭建鏡像庫,用于存儲上傳的鏡像檔案,包括系統鏡像、産品Server、Redis鏡像等。 

5.1部署安裝 

1.将registry鏡像pull下來; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

2.啟動; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

5.2基礎鏡像 

1.上傳基礎鏡像:base-centos-v3.0.tar; 

2.導入基礎鏡像;

K8S叢集部署與配置心得
K8S叢集部署與配置心得

5.3推送鏡像 

1.查詢docker鏡像:docker images; 

K8S叢集部署與配置心得

2.通過對base-centos鏡像打标,準備釋出到Registry中; 

K8S叢集部署與配置心得

3.推送給Registry; 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

注意:如果上傳、擷取本地鏡像會提示如下報錯,需要設定daemon.json檔案。 

1.設定daemon.json檔案; 

2.其他節點擷取本地鏡像會提示。 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

由于Registry為了安全性考慮,預設是需要https證書支援的,但是我們可以通過一個簡單的辦法解決: 

注意:<ip>:Registry的機器ip位址,在安裝registry的節點和用戶端需要通路私有Registry的節點都需要執行此步操作。 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

5.4檢視鏡像 

1.檢視倉庫有哪些鏡像,運作如下指令: 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

檢視具體鏡像标簽(黃色是鏡像名): 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

6UMC配置 

UMC産品以及JDK、MySQL、Nginx、Redis的部署安裝與配置可以參考相關部署手冊,不做重點說明,這裡主要介紹UMC中叢集的配置與啟動。 

6.1叢集配置 

1.首先需要配置鏡像倉庫,打開UMC的鏡像倉庫,點選新增,配置位址: 

K8S叢集部署與配置心得

2.打開租戶管理,新增一個租戶,也可以使用預設的預置集團租戶,在基礎資訊中選擇剛才添加的鏡像庫位址: 

K8S叢集部署與配置心得

3.打開叢集配置,新增一個叢集,配置共享目錄(部署NFS時的共享目錄): 

K8S叢集部署與配置心得

4.先從192.168.1.221(Master)的/etc/kubernetes/admin.conf檔案複制到本地,然後點選上傳授權按鈕上傳檔案: 

K8S叢集部署與配置心得

5.在節點資訊中配置3台伺服器的各個節點(Master、Worker1、Worker2): 

K8S叢集部署與配置心得
K8S叢集部署與配置心得

6.建立命名空間(可以先不建立,在叢集配置時增加命名空間): 

K8S叢集部署與配置心得

7.建立标簽,UMC初始化有預置标簽資訊,可以手動新增: 

K8S叢集部署與配置心得

8.新增鏡像,并選擇相應的産品,選擇配置的鏡像倉庫: 

K8S叢集部署與配置心得

9.上傳産品壓縮包(rar格式),并根據按鈕的高亮,構造鏡像、推送鏡像: 

K8S叢集部署與配置心得

6.2租戶配置 

1.在租戶配置功能下新增方案: 

K8S叢集部署與配置心得

2.在方案下新增環境: 

K8S叢集部署與配置心得

3.選擇環境的叢集名稱: 

K8S叢集部署與配置心得

4.新增命名空間(和叢集配置的命名空間同步): 

K8S叢集部署與配置心得

5.切換參數配置标簽,配置資料庫、Redis連接配接資訊: 

K8S叢集部署與配置心得

6.生成并儲存通路位址: 

K8S叢集部署與配置心得

7.依次點選Deploy、Service、Ingress的編輯按鈕進行建立: 

K8S叢集部署與配置心得

8.通路測試: 

K8S叢集部署與配置心得

7分析總結 

K8S雲平台部署模式是後續所有産品和方案統一采用的部署方案,通過雲平台模式不僅可以降低産品部署、運維的難度,同時對于伺服器的資源監控、統計分析也能發揮作用,實作集中的、一體化管理。 

7.1問題總結 

筆者是第一次在實際項目中整體進行K8S雲平台的部署,雖然是第一次部署,但是借鑒于部署文檔以及以往項目的部署經驗,整體部署過程還是比較順利的。但是在部署的過程中難免會遇到一些問題,後續梳理了一遍部署過程,出現的問題在文檔中都有展現和說明,隻是浏覽文檔不認真或者由于文檔記錄的相對簡單,是以才忽略了。這也提醒了自己後續工作中一定要仔細認真,在做事情前最好有一個總體地了解,這樣工作中才能盡量減少問題的發生。 

7.2産品方案 

UMC雲平台實際是一個K8S的管理平台,通過Web端配置實作對K8S叢集的配置、啟停、監控、擴容等操作,并且通過UMC的管理功能可以将産品元件方案直接融合到平台中,實作不同産品、不同方案的快速部署,同時也提供租戶、方案、環境等不同粒度的管控,可集中、可分散,并且通過命名空間有效地實作資料隔離。 

7.3個人提升 

繼續閱讀