Kubernetes是Google一直在推動的容器調度和管理系統,是Google內部使用的容器管理系統Borg的開源版本。它能夠實現對Docker容器的部署,配置,伸縮和監控等。當下,Kubernetes絕對是最火熱的開源工程之一,在短短的一年多時間裏,其Github工程已有接近兩萬次的Commits提交,一千多個PR。目前已經正式發佈1.0版本,具有服務生產環境的能力。node
Kubernetes做爲容器管理和調度系統,能在多臺Host上部署預約義的容器,實現跨Host容器的互通訪問。下圖是Kubernetes的High-level架構圖:nginx
Kubernetes的基本概念包括:web
Cluster:Kubernetes維護一個集羣,Docker的containers都運行其上。而且,這個集羣能夠運維在任何雲及Bare Metal物理機上。
Master:Master節點包含apiserver,controller-manager,sheduler等核心組件(經常也將etcd部署於其中)。api
Node:Kubernetes採用Master-Slaves方式部署,單獨一臺Slave機器稱爲一個Node(之前叫 Minion)。安全
Pods:Kubernetes最小管理單位,用於控制建立、重啓、伸縮一組功能相近,共享磁盤的Docker容器。雖然Pod能夠單首創建使用,可是推薦經過Replication Controller管理。服務器
Replication controllers(RC):管理其下控制的Pods的生命週期,保證指定數量(replicas)的Pods正常運行。網絡
Service:可用做服務發現,相似於Loadbalancer,經過Selectors爲一組Pods提供對外的接口。架構
Labels:K/V鍵值對,用來標記Kubernetes組件的類別關係(例如標記一組Pods是frontServices,另外一組是backServices)。Labels對於Kubernetes的伸縮調度很是重要。app
若是想了解Low-Level的架構細節,能夠查看其官網的架構圖http://kubernetes.io/v1.0/docs/design/architecture.png。負載均衡
從官網的架構圖中能夠看到,Kubernetes是一個組件多且依賴複雜的系統(上圖僅僅是單Master,三臺Node的狀況。目前,Kubernetes已經支持Multi-Masters的部署架構,即須要至少三臺主機做爲Master)。而且Kubernetes社區開發速度很是快,版本差別大,文檔更新每每不及時。因此,若是須要完整部署測試仍然有很多的工做量。若是要在生產中使用它,其運維管理也有較高的門檻。這裏,咱們將詳細介紹如何使用FIT2CLOUD幫助用戶高效完成Kubernetes的系統部署、平常運維等,下降用戶使用它的難度。
首先,Kubernetes做爲容器管理系統,其自身也須要部署在相應的計算資源之上。而咱們認爲只有部署在IaaS平臺上的Kubernetes才能充分發揮其彈性調度管理的特性。這裏,咱們選擇了QingCloud做爲部署Kubernetes集羣的IaaS平臺,主要是考慮以下幾個因素:
從安全角度看,相似Kubernetes這類的PaaS應該是部署在VPC內。青雲VPC在國內是獨樹一幟,特別適合用來部署Kubernetes這種分佈式應用。
從部署管理角度看,青雲提供的「userdata」和「metadata」功能在自動初始化雲主機上很是有用,能夠簡化整個部署過程。
從成本和靈活性角度看,青雲的按秒計費,資源快速響應是很是有吸引力的。這點以咱們自身爲例:一年多以來咱們已經在青雲上面建立了超過1萬五千臺虛機,花費僅在1000多。
其次,Kubernetes自己做爲一個複雜的分佈式應用,也須要工具(好比FIT2CLOUD)來實現快速部署、統一管理、監控告警、升級和伸縮。Kubernetes負責容器的調度和管理,FIT2CLOUD則負責主機的調度和管理。
最後,從目標用戶視角看,Kubernetes集羣(容器雲)的使用者是應用開發人員,或者準確的講是基於Docker容器的微服務開發者,而FIT2CLOUD和QingCloud的使用者是Kubernetes集羣(容器雲)運維和系統管理員。下圖清晰描述了Kubernetes、QingCloud、FIT2CLOUD三者及其使用者之間的關係:
QingCloud的VPC基於二層網絡隔離,實現了100%的私有網絡隔離,而且用戶在其Web控制檯就能徹底操做VPC私有網絡,包括建立私有網絡,綁定公網 IP,DHCP,端口映射轉發等。
咱們推薦在QingCloud的VPC內網中部署Kubernetes,以後經過綁定公網IP和端口映射將KubernetesMaster節點的apiserver endpoint暴露出來。具體部署架構以下圖所示:
在此以前,咱們須要在QingCloud的Web控制檯上配置下VPC網絡。具體以下:
建立一個VPC私有網絡,同時建立一個路由器,以下圖所示:
建立一個虛擬路由器,並把上一步建立的私有網絡鏈接到該路由器上,以下圖所示:
注意:建立虛擬路由器時,需打開該虛擬路由器所用防火牆下行8080端口。由於該端口將在後面用於向外暴露Kubernetes服務接口。
申請一個公網 IP,綁定在路由器上,以便VPC內的Kubernetes apiserver 能夠經過路由器對外提供服務。
在VPC內創建一個負載均衡器(LoadBalancer),併爲其在8080端口負載均衡器的監聽器來監聽Kubernetes Master節點上的apiserver服務(該服務默認運行在8080端口)。 這樣作的好處是能夠只須要配置一次VPC私有網絡及端口轉發規則,在私有網絡內部啓動關閉主機都會自動attach到LoadBalancer,對外提供服務。 具體操做以下圖:
一旦VPC建立配置完成,就能夠開始經過FIT2CLOUD快速部署Kubernetes集羣。
如上所示,本次示例中,咱們會部署一個單Master(192.168.0.3),2個Nodes(Minions)節點的Kubernetes集羣。首先,咱們會在FIT2CLOUD上建立兩個不一樣的虛機組。一個是k8s-master,做爲Master節點;一個是k8s-node做爲Nodes 節點。具體步驟以下所示:
注:經過FIT2CLOUD在QingCloud上啓動機器,須要先登入FIT2CLOUD控制檯並綁定QingCloud雲帳號,具體步驟能夠參考FIT2CLOUD官方文檔。另外請參考 FIT2CLOUD新手指南(QingCloud版)瞭解如何快速開始在FIT2CLOUD中管理QingCloud資源。
第一步:經過FIT2CLOUD控制檯建立Kubernetes集羣和虛機組
以下圖建立Master節點虛機組。注意這裏必須按指定虛機組名稱,由於後續的初始化Master節點腳本須要利用到這個參數自動發現master的相關信息。
相似建立Node節點的虛機組。兩個虛機組建立完成後會在虛機組列表中顯示,以下圖:
第二步:新建虛機建立模版,分別用來Provision Master節點主機和Nodes節點主機
「虛機建立模板」是FIT2CLOUD內用來快速建立雲主機的預約義模板。包括雲帳號信息、雲主機配置以及相關初始化操做。爲快速Provision這裏的Kubernetes集羣,咱們須要首先新建這些模板。爲新建這些模板並實現自動部署Kubernetes集羣,咱們已經在FIT2CLOUD中內置了3個Kubernetes集羣部署腳本(這些腳本在CentOS 7.0系統上測試經過,在本示例中不管是Master節點仍是Salve節點都請選擇CentOS 7.0操做系統),分別以下:
k8s_master_installer.sh
:用來部署Kubernetes Master節點。
k8s_node_installer.sh
: 用來部署Kubernetes Node節點。
k8s_ui_installer.sh
:用來激活安裝 kube-ui (Kubernetes webUI)。
這些腳本能夠在FIT2CLOUD的腳本列表中查看到,以下圖:
首先,設置Master節點的「建立虛機模版」,以下圖:
在這其中有兩個點須要注意,具體以下:
第一點:如上圖可見,建立虛機模版時能夠在初始化操做中執行腳本,這裏選擇Kubernetes Master節點的安裝部署腳本k8s_master_installer.sh
。如但願瞭解Master節點的部署流程,請倉庫該腳本內具體內容。
第二點:須要在Master節點的「建立虛機模板」內指定Master主機自動attach到負載均衡器上,從而將Kubernetes Master節點上的apiserver暴露給VPC外部,方便用戶從VPC外部經過公網IP控制Kubernetes集羣。同時,集羣上運行的真正負載Service也能夠由此經過apiserver proxy供外部訪問。該設置以下圖所示:
其次,設置Node節點的「建立虛機模板」。和Master節點相似,設置Node節點的「建立虛機模板」時候須要指定初始化腳本爲k8s_node_installer.sh
,並一樣把啓動的Node節點放到和Master節點相同的QingCloud私有網絡。可是,Node節點不須要如同Master節點那樣掛載到負載均衡器上(由於Node節點在本示例不須要對外暴露端口,而是經過Master節點的apiserver proxy轉發的方式對外暴露服務)。k8s_node_installer.sh
腳本中詳細描述了整個Node節點的部署流程,以下圖:
在Slave節點的部署腳本中須要注意以下兩點:
上圖第一處紅色標註中,腳本會調用f2cadm
命令獲取集羣Master節點的內網IP信息,以便配置Node節點的kubelet服務,使其加入集羣。 其中,f2cadm
是FIT2CLOUD提供的命令行工具,可在任何被FIT2CLOUD管理的機器上運行。該命令行工具可從FIT2CLOUD服務端獲取當前集羣/虛機組/虛機的元數據信息。這裏,f2cadm
工具經過虛機組名稱"k8s-master"來獲取集羣中Master節點的內網IP信息,這也是爲何前面建立Master節點虛機組名稱必須爲"k8s-master"的緣由。固然,理論上只須要保持腳本內和虛機組定名稱一致便可,不必定必須是"k8s-master"。
kubelet配置文件中,設定 KUBELET_ARGS=\"--pod-infra-container-image=repository.fit2cloud.com:5000/pause:latest\"
。若是不設置,國內用戶啓動 kubelet 服務會到Google服務器下載 pause 的image,這會致使網絡問題。
第三步:建立Kubernetes集羣所需的虛機
完成上述配置以後,咱們就能夠回到控制檯虛機頁面,按順序啓動一臺KubernetesMaster 主機,等待其建立成功並執行初始化部署腳本完畢,再啓動2臺Nodes主機(之後若是須要擴展Node節點,只須要再啓動所需數量的Nodes主機便可)。以下圖,Kubernetes集羣已經建立完畢:
至此,Kubernetes集羣啓動完畢,並已經能夠部署完成並正常工做。這裏嘗試用kubectl
命令行工具檢查下集羣狀態。在本地運行該命令後,其結果會展現2個Node節點已經上線(Ready),具體以下。
➜ ~ export KUBERNETES_MASTER=http://119.254.111.36:8080 ➜ ~ kubectl get nodes NAME LABELS STATUS 192.168.100.3 kubernetes.io/hostname=192.168.100.3 Ready 192.168.100.5 kubernetes.io/hostname=192.168.100.5 Ready
因爲是本地使用 kubectl
命令,須要設定下 KUBERNETES_MASTER 環境變量(apiserver endpoint地址),即爲VPC出口公網IP的8080端口。
這時候咱們就能夠開始測試一些Kubernetes的基本功能,好比建立Replication Controllers,啓動nginx pods 並註冊一個名爲nginxservice的Service作服務發現。
建立 replication controller
➜ k8s cat ./nginx-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: nginx spec: replicas: 3 selector: app: nginx template: metadata: name: nginx labels: app: nginx spec: containers: - name: nginx image: index.alauda.cn/library/nginx:latest ports: - containerPort: 80 ➜ k8s kubectl create -f nginx-rc.yaml replicationcontrollers/nginx
檢查 pods 啓動狀態:
➜ k8s kubectl get pods NAME READY REASON RESTARTS AGE nginx-5wjo3 1/1 Running 0 14m nginx-a2nak 1/1 Running 0 14m nginx-lb5rv 1/1 Running 0 14m
註冊名爲nginxservice的Service:
➜ k8s cat nginx-svc.yaml apiVersion: v1 kind: Service metadata: labels: name: nginxservice name: nginxservice spec: ports: - port: 80 selector: app: nginx ➜ k8s kubectl create -f nginx-svc.yaml services/nginxservice
建立好nginx pods和相應service後,咱們能夠經過apiserver proxy轉發集羣內部的service, 這樣咱們就能夠經過 Master節點8080端口訪問集羣Node節點上運行的nginx服務。
本示例爲簡單起見,選擇了apiserver proxy來轉發集羣內Node節點的服務。用戶還能夠設置其餘方式訪問Node節點上的服務。更多具體的Kubernetes的操做細節,能夠參考 Kubernetes 官方文檔。
第四步:安裝Kubnetes WebUI
此外,FIT2CLOUD還內置了Kubernetes webUI addon的安裝腳本,只須要在Master節點上執行一下 kube_ui_installer.sh腳本就能夠激活安裝 kube-ui。
等待腳本執行完畢,訪問VPC路由器上綁定的公網IP(端口爲8080),即http://<公網_IP>:8080/ui,就能看到部署成功的Kubernetes WebUI。其上會展現該集羣的基本信息、當前狀態等。
與前文所述,Kubernetes負責的是容器的建立、部署、監控和伸縮,FIT2CLOUD負責的是VM(虛機/雲主機)的建立,部署,監控和伸縮。FIT2CLOUD默認系統監控能夠對Kubernetes集羣的CPU、內存、硬盤和網絡進行監控,也能夠設定`自定義監控指標,對Docker或者Containers作應用級別的監控。例如,能夠監控每臺KubernetesNode上的containers數量,方便之後基於Nodes節點的Containers數量來伸縮Nodes虛機。以下圖嘗試設置該自定義監控。
將其應用於Kubernetes Node虛機組(包括兩臺機器)上:
Kubernetes集羣的Node節點已經應用了一個自定義監控指標,如今能夠嘗試啓動50個nginx的容器,在Master節點執行以下命令
kubectl run my-nginx --image=nginx --replicas=50 --port=80
等待幾分鐘後就能夠在監控面板上實時查看Kubernetes集羣中每一個Node上的container數量(以下圖所示):
除此以外,也能夠在經過這個自定義監控實現VM水平上的自動伸縮,下面立刻會介紹如何利用FIT2CLOUD自定義監控實現Kubernetes集羣的自動伸縮。
咱們知道,kubectl scale
命令能夠用來伸縮容器數量,實現容器(應用)水平的伸縮,可是對於虛機水平的伸縮,Kubernetes自身無能爲力,這就須要相似FIT2CLOUD這樣的管理平臺來幫忙實現。FIT2CLOUD所作的虛機水平自動伸縮,能保證Kubernetes集羣中容器(應用)水平的伸縮可以不受限於節點數量和每一個節點的配額限制,保證容器(應用)的成功伸縮。
這裏假設Kubernetes Nodes中的Pods/Containers的資源配額是40個,經過FIT2CLOUD設定自定義監控指標監控Nodes中的Containers數量。當超過80%資源配額(40*80%=32個)後,自動建立一臺新的Kubernetes Nodes雲主機,並自動部署後加入到集羣之中;同理也能夠設定當每臺Nodes中的Pods/Containers平均數量小於必定數值時,自動回收雲主機,節約開支。經過如此設置就可以保證當Kubernetes集羣的負載達到資源配額上限前提早經過FIT2CLOUD擴容雲主機並加入集羣,保證上層容器擴容得以順利實施。當突發負載發生並觸發Node節點的資源配額上限時,一樣會觸發FIT2CLOUD自動伸縮機制並擴容雲主機加入集羣,而後由Kubernetes調度機制保證新加入雲主機最終承擔相應的負載。下面示例將演示突發負載這一場景。
如今假定已經經過上述教程建立好了一個單Master節點,3個Node節點的Kubernetes集羣。接下來演示如何利用FIT2CLOUD自動伸縮功能支持上層Kubernetes的彈性伸縮特性。
首先,在虛擬機組頁面,對Kubernetes Node節點,設定自動伸縮。
採用情景伸縮,針對咱們上面所述自定義監控指標,當Node節點上的平均pod數量超過32個時擴容一臺Node雲主機;當其中Node節點上的平臺pod數量最小值小於20臺時,縮容一臺Node雲主機,由Kubernetes自行將這一臺上已有的pod在其餘Node上從新啓動。具體設置以下:
其次,當自動伸縮設置完畢以後嘗試經過kubectl工具,把nginx pod總數擴展到150臺。
kubectl scale rc my-nginx --replicas=150
觀察自動伸縮狀況,如今總共有3臺Node。當pod總數忽然擴展到150臺時,因爲Kubernetes的默認配額限制(每一個節點pod數量不得超過40),如今每臺Node上最多運行40個pods,總共3*40=120個,沒法知足Kubernetes層擴容到150臺的要求,如圖:
當前總共有3臺Node
自定義監控每臺Node上實際的pod數量
可是,這時平均每臺Node上會運行40個pod,這會觸發40>32個pods的自動伸縮條件,FIT2CLOUD自動伸縮機制會擴容一臺Node主機,如圖所示:
系統已經擴展了一臺Node,新擴展的節點經過虛機模板建立啓動,自動會加入Kubernetes集羣
新啓動的Node節點加入Kubernetes集羣后,Kubernetes會自動把前面未成功scale的30個containers調度到該臺Node節點運行。在FIT2CLOUD中查看以前建立的自定義監控指標「podsNum」便可觀察到這一點。
Kubernetes表明着目前最早進的容器管理系統,可是它做爲PaaS(容器雲)與IaaS(或者Bare-Metal物理機)之間還須要FIT2CLOUD對其進行運維管理。FIT2CLOUD能夠幫助相似Kubernetes這樣的PaaS(容器雲)更好在雲環境中使用。Kubernetes+FITCLOUD+QingCloud可讓用戶很是快速穩定地從底至頂搭建一套容器管理系統。