閱讀503 返回首頁    go 阿裏雲 go 技術社區[雲棲]


如何在阿裏雲一鍵部署高可用的Kubernetes集群

摘要:在雲棲TechDay34期:DockerCon2017最新的技術解讀中,阿裏雲的容器服務團隊技術專家謝瑤瑤做了題為《Kubernetes on Alibaba Cloud》的分享,主要介紹了Kubernetes的基本概念,如何在阿裏雲快速一鍵部署高可用安全的Kubernetes集群以及阿裏雲的Cloud Provider所提供的能力。

以下內容根據演講嘉賓現場視頻以及速記整理而成。

今天主要會分享三個方麵的問題:
  • Kubernetes的基本概念介紹
  • 如何在阿裏雲快速一鍵部署高可用安全的Kubernetes集群
  • Kubernetes在阿裏巴巴的Cloud Provider,也就是雲廠商的集成提供的一些能力

首先簡單介紹一下Kubernetes。Kubernetes簡稱K8S,這是社區的一種叫法。Kubernetes是整個CaaS工作流中的一環,CaaS是什麼呢?就是Container As A Service——容器即服務,下圖中的右圖是一個簡化版的CaaS的架構圖,從最底層是一個基礎服務,其上層主要提供的是物理機、網絡、存儲等一些比較硬件化的基礎設施。再往上一層會構建PaaS平台,PaaS平台裏頭主要交付的對象是一些虛擬機,或者邏輯的結構,比如邏輯的VPC網絡、存儲等,讓你可以方便地一鍵去創建這些資源,而不需要再去機房裏頭自己去運維管理這些東西。然後在PaaS平台上麵會構建一層容器平台,這一層中主要的交互單元就是容器。
176b7cbce6ea004780b019541e18665a9c0073e0
對於容器服務來講,在這一層的時候,就更不需要關心於底層的PaaS平台所具有的特性了,比如在創建應用的時候,不需要關心底層使用的虛擬機是什麼,或者是否需要手動創建一個虛擬機網絡以及存儲,然後去構建並放置應用去運行,這個時候隻需要首先聲明應用,然後告訴它說我需要在這個CaaS平台裏運行我的應用,然後其他的事情你就不用操心了。平台會主動地幫你去尋找最合適的機器以及最合適的環境,把應用布置上去,並幫你解決好應用的故障恢複,網絡的訪問情況,以及資源分配問題。Kubernetes的這個層次之上是上圖綠色部分,它屬於編排係統,可以很方便地把應用按照係統合適的方式分布到各個節點上去,然後由它來處理故障恢複、副本保證等資源調度問題。另外它還提供容器的生命周期管理,比如啟停一個應用、當應用失敗之後重新拉起,或者不需要這個應用後執行刪除等操作。

接下來分享一下Kubernetes的一些基本的概念,一個比較核心的概念就是Pod,Pod是一組容器的統稱,就是它把一組容器作為一個最基礎的調度單元,這組容器會被協同調度到一起,比如說有兩個屬於同一個Pod的容器,那麼它們會被調度到同一個節點,一起調度,一起Fail Over。Service是一組Pod的抽象,比如在創建應用的時候可能需要創建很多個Pod來同時對外界提供服務,那麼這一組Pod是同一個層次的東西,具有同等的地位,在前麵提供一個Services對這一組Pod做負載均衡,當訪問這個Services的時候,就會從後端隨意挑出一個Pod來為前端提供服務,相當於負載均衡的概念,不過Services是集群內部的,它的網絡隻會局限於集群內部。

另外一個是Deployment概念,這是一個描述性的概念,就是當描述一個應用的時候就需要聲明這個應用需要達到的狀態,比如需要它有三個副本一直運行,需要它在故障的時候能夠自動拉起來。用Deployment來描述它,然後係統就會自動保證這些東西,一旦出現了不符合預期的情況,係統會自動把這個狀態轉化到正常,無論是通過重新創建一組Pod或者是拉起原來的Pod。在K8S裏麵還有一個另外比較重要的概念就是持久化卷,通常來講容器在創建的時候是沒有數據卷的,對於存儲在容器中的數據,如果把容器刪掉了,那麼這個數據也就會丟失。K8S提供一個持久化卷的概念,就是在創建服務的時候,可以先創建出這個卷,然後把這個卷掛載到容器裏頭去。通過這樣的方式,在刪除容器時,持久化卷是不會被刪除的,數據也就可以保留下來。

下圖是K8S的架構示意圖,這是一個典型的無狀態、多Master的分布式架構圖。K8S主要功能組件:Kubelet,相當於Agent,在每一個節點上提供一個守護進程的服務,上報節點狀態、運行Controller等。aplserver是一個Master,它是無狀態的,所有的數據都存在後端的一致性存儲中。Scheduler負責調度所有的Pod,也就是應用,為應用找一個合適的位置並運行起來。
aa5868d1fbe7d22c170fa5ca87fc7248bccc8634
這裏前端使用一個Load Balancer來提供一個高可用的負載均衡的服務,其中一個Master掛了之後,仍然會有其他的幾個Master會提供服務,所以不用擔心會有幾個Master 掛掉了。

在使用K8S當中遇到的一個比較大的問題就是部署問題。眾所周知K8S一直在業界被詬病的就是太難用了,組件太多,概念太多,導致無法理解。對於開發者來講,不希望去操心如何把集群快速地部署起來,如何去理解底層的東西,隻需在用到的時候能夠部署一個集群出來,這是需要達到最終的目標,就是部署簡單。
9c115afe0372e5c1c59223a5c08dec066dd03b9a
看一下現在比較流行的一些部署工具,Kubeup是最早期的一種部署工具,它支持多種的環境,CentOS、Ubuntu,J2EE以及AWS等等,但是目前沒有辦法直接在阿裏雲上麵部署起來,需要一些手工的改動。Kargo的底層主要使用的是Ansible,適合對Ansible比較熟悉的人去部署使用。Kops與AWS等雲廠商集成度比較高,所以在AWS下麵比較好用。Kubeadm主要是K8S原生支持的,也是未來官方主推的一種方式,它的特點就是簡單易用,但是目前還處在α階段,還不支持HA。但是這並不妨礙我們去使用它部署出一個HA的K8S集群。

那麼阿裏雲的選擇是什麼呢?ROS + Kubeadm,原因隻有一個:簡單。首先簡單介紹一下ROS,ROS是阿裏雲的資源編排服務,它可以非常方便的在阿裏雲一鍵創建出來所需要的各種資源比如ECS、VPC網絡、SLB以及其他資源等等,相關的文檔大家可以去阿裏雲官網查看。

一鍵部署主要分為三個步驟:
  1. 進入到ROS的控製台,這裏有一個Kubernetes for chinese版本的,然後去點擊創建。
  2. 選一個創建的區域。
  3. 填寫創建的集群名稱,填寫節點的密碼,點擊創建。
這就是一鍵創建,非常簡單。

主要的部署過程分為三個步驟:第一個是創建集群需要提供阿裏雲的KeyID跟KeySecret,首先需要設置這兩個環境變量,然後需要從阿裏雲官方網站上下載一個腳本,執行一個node-type=Master命令,這個命令要在Master上執行,這樣執行完了之後就在這台機器上初始化了一個Master了,然後它會返回一個Token和節點的IP。第二步再到node節點上麵去把node-type改為node,然後帶上KeyID跟KeySecre以及剛才返回的End Point和Token,就可以把這個結點加入到剛才創建的Master集群當中,如此反複,就可以把更多的節點加入到集群中去。當不想要某個節點的時候,還可以通過node-type = down的命令銷毀掉這個節點。
fc833a1947a857c67c29bfa235326245e81bdf7b
注意的地方就是在創建集群的過程中一定要保證hostname的一致性,CP的規範是使用hostname作為校驗ECS一致性的參數,所以一定要保證hostname與傳給CP的值是一樣的。另外一個是阿裏雲的安全組設置問題,安全組默認禁止了所有非VPC地址的訪問,因此需要根據最小需求設置來開放安全組,CP使用了172.16以及172.19網段,需要把這兩個網段開放出來,同時還需要開放30000到32768的主機端口,用來給Service提供服務。第三個比較重要的是CentOS默認的內核配置的問題,這個要求配置內核的net.bridge.bridge-nf-call-iptables=1參數,否則所有主機上網橋的數據流量都不會經過iptables規則的轉化,從而導致服務沒有辦法互相訪問。如果這些還沒有辦法解決問題,那可以祭出終極大殺器——tcpdump,然後抓包分析數據。
dd87e5b24c00016e6bc326fb0c6e3dc4867ae1fe
接下來介紹一下K8S的阿裏巴巴Cloud Provider,阿裏雲的Cloud Provider支持如下的一些特性:比如在網絡支持方麵,支持VPC的網絡、阿裏雲的SLB以及Ingress network;存儲方麵,支持NAS、OSS。支持跨Region的單集群部署方案,可以把集群部署在多個可用區,甚至多個Region上,這樣當出現單可用區fail的時候,集群仍然是可用的,提供了一種高可用的方案。還可以在K8S上使用原生的ELK作為日誌方案,也可以使用阿裏雲提供的Fluentd-pilot開源解決方案,這個可以和阿裏雲的日誌服務提供完整的對接,也是非常不錯的選擇;然後監控方麵也可以通過阿裏雲監控來監控node節點的狀態,也可以選擇使用原生的Heapster + inluxdb來做網絡監控方案;在應用倉庫方麵,可以使用現在開源的Helm/tiller的方式。
d76fc612e999810b3cbc25cae0ff3535b6c0d427
然後我們來看一下我們的VPC網絡支持,Kubernetes支持非常豐富的網絡形態,如VXLAN、Calico以及VPC網絡等,VXLAN主要是一種Overlay,它通過對IP層然數據進行二次封裝,封裝完了之後在通過宿主機的網絡路由到對端主機之後,然後再進行解封裝,解封裝之後再放到主機的內核棧裏頭,處理這些協議然後解碼出來,傳到另外Container容器裏的網絡裏頭,這個過程涉及到了一個數據包的封裝與解封裝,所以它的性能會有稍微的損耗。
cd6d19b535d3f195d396b26c5f369f5460419563
Calico網絡是通過3層路由的方式實現的,它直接把網關指向了對端節點的主機IP,這樣所有發送到對端節點上麵的容器IP的數據包都可以直接先發到對端節點上,然後由對端節點直接路由給容器。這種方式的好處是沒有數據包的額外封裝,所以性能損耗非常小。但是它要求所有的主機之間是二層可達的,這個要求通常對於許多雲廠商來說是無法滿足的,但是自建機房一般是都可以用的。然後就是VPC網絡,阿裏雲VPC的方案跟Calico非常類似,也是通過路由的方式,然後把一個節點的容器的數據包導到另一個節點上的容器中去,所以性能損耗非常小,推薦大家使用VPC網絡,而且現在阿裏雲支持的K8S也是僅僅支持這一種網絡。當然你也可以使用VXLAN網絡,但是VPC網絡會提供給你的更好的性能,而且它還提供租戶隔離級別的網絡環境,網段也可以自由劃分,而且如果把多個交換機創建在不同的可用區之內,還可以提供一種可用區級別的Fail Over。

實踐過程中比較多的問題都來自於客戶想了解VPC網絡的性能究竟如何。在這裏通過幾種不同的方案來測試了一下VPC性能,主要有netprof、iprof以及qprof,下圖是得出來的結果。從這些結果來看,容器的VPC網絡跟主機VPC網絡差距是非常小的,性能損耗是幾乎是沒有的,當然不同的人在不同的環境下測出來的結果會有略微的差異,大家可以自己測試一下。
54b06ae9bb8bb600891b0c0c9383c35280430c21
阿裏雲的CP還支持自己的LSB,前麵提到的Service的訪問範圍隻是在集群內部,如果想要從集群外部來訪問集群內部所提供的服務,那就需要一個入口點。阿裏雲Load Balancer可以支持這樣的功能,這個功能也集成到了阿裏雲的Cloud Provider中,使用的時候隻需要在創建應用的yaml File中指定service 的type = Load Balancer,然後就可以創建一個阿裏雲Load Balancer,然後它會自動地把Load Balancer關聯到後端應用服務器,然後提供給用戶一個靜態的IP外網接入口,這樣就可以通過IP來訪問到集群內部的服務了,並且還提供了HTTPS的支持,用戶可以上傳自己的證書來提供HTTPS服務,還可以自定義SLB的帶寬、健康檢查類型以及URL、收費類型等。
5246c26d6a7e3fb2f449ed6102a5e1b7168bb5f5
K8S的Service是集群範圍內的,同時阿裏雲現在提供另一套解決方案就是使用Ingress。Ingress可以把外部的流量引入進來,那麼這與上麵提到的LSB有什麼區別呢?其實LSB是一個四層的東西,在IP層做負載均衡,而Ingress支持七層的負載均衡,它可以提供一種簡單的路由服務,比如把某個域名的url定向一個Service的後端,也可以提供一種簡單的服務的Fanout,就是可以用一個域名來提供服務,並根據不同的URL來定位到後端不同服務上去。用戶也可以使用多個域名來提供服務,這類似於虛擬主機路由的方式,不同的域名會被路由到不同的後端服務上去。
74dda4f759751b9d9473a0e96333ddbcfa6e2cfc
然後右邊這個是一個簡單的架構圖,最上層是阿裏雲的SLB,阿裏雲的SLB它的流量會被定位到兩個Ingress Controller Pod裏頭去,這兩個是一個簡單的Nginx實現,通過這個Nginx做7層負載均衡,然後把這些流量再定位到你的應用Pod裏麵。另外一個特點它支持豐富的Annotation,可以支持SSL,第三方授權,ORL的Rewrite白名單管理等等這些功能。

阿裏雲的Cloud Provider還支持各種存儲,比如NAS存儲、OSS存儲等。NAS存儲是由原生的K8S的NFS驅動支持的。在這裏簡單介紹一下KBS的Volume的使用機製,K8S的PV就是一個持久化的卷,這需要由集群管理員首先在集群中創建出來作為一個集群內的資源,如果應用方想要在應用中使用,要先創建一個PVC,並要宣稱要使用集群的存儲資源,然後K8S會從所有的集群Volume裏麵去挑選出最合適、最匹配的,把它們綁定起來,綁定就意味著你可以使用這個PVC了。對於應用來講,需要在Pod裏麵去聲明需要使用PVC,然後應用就和PVC綁定起來了,這樣在創建應用的時候,K8S就會把這個掛載到應用Pod裏去,這樣就可以像寫本地磁盤一樣去寫Persistent-Volume。
01caceef542b8cfcd890fad3ee54097d7858e437
阿裏雲還支持多可用區,主要是為了實現可用區的Fail Over。讓用戶可以在多個可用區之中創建集群,即使其他可用區Fail了,服務仍然是可用的。
16fe626fbe9d99c294ef3310eefbb868b76be3ee
阿裏雲還提供跨Region的支持。可用區級別是在各個可用區之間的,而同一個Region下的各個可用區的網絡是連通的,所以部署起來非常簡單。但是各個Region之間的網絡是不通的,需要通過阿裏雲的高速通道把各個Region的網絡首先打通,然後再部署應用。那麼這裏有一些限製,就是默認情況下,跨Region的阿裏雲資源是無法通用的,就是說在Region裏麵隻能使用這個Region的資源,所以通常建議在每一個Region裏麵創建相同的資源,比如說SLB,創建一個應用之後,把這些應用的Pod平鋪調度到多個Region當中,然後在每個Region中創建出一個SLB,把它綁定到應用上去。這樣的好處是什麼呢?綁定到SLB,然後在最外端提供一個智能DNS解析,把流量分別導入到這兩個Region中,這樣做可以支持一種鄰近用戶路由,比如說在杭州有一個Region,一些用戶也在杭州,那麼就會把杭州的用戶導到杭州的Pod節點上麵去,這樣它的用戶響應速度是非常快的,然後歐洲的用戶就可以全部導到歐洲的集群裏麵去,所以這個對鄰近用戶選擇是非常有幫助的。下圖展現的就是跨Region支持的細節圖。
f4446ebe31521500796bb865065f90fc210a0b3b

最後更新:2017-05-29 13:02:07

  上一篇:go  Docker最新特性介紹
  下一篇:go  MongoDB優化