當 Kubernetes 遇到阿裡雲
阿裡雲提供了豐富多樣的雲産品支援,包括ECS、VPC網絡、經典網絡、負載均衡SLB等等,可以幫助Docker應用輕松在雲端運作。阿裡雲除了推出
容器服務提供了一站式的容器應用管了解決方案,也在不斷推動其他開源容器技術和阿裡雲的內建更好地滿足使用者的多樣化需求。
本文将會介紹如何非常友善的在阿裡雲上運作起一個安全的高可用的Kubernetes叢集。同時為了讓Kubernetes使用者更好的使用阿裡雲服務,容器服務團隊為Kubernetes提供了阿裡雲CloudProvider,支援為Kubernetes service 建立阿裡雲LoadBalance; 也為Flannel編寫了網絡驅動,讓Flannel可以更好的支援阿裡雲VPC網絡;同時我們基于目前最新的kubernetes 1.6.0-alpha版本制作了阿裡雲上一鍵部署安裝腳本,開箱即用。
前置條件
- 支援阿裡雲CentOS 7.2-x64版本 、Ubuntu 16.04 x64版本
- 支援阿裡雲VPC網絡和經典網絡,建立VPC網絡的網段建議使用192.168.0.0或者10.0.0.0網段,可以避免與本次安裝Kubernetes的預設網段172.16.0.0沖突。
- 準備阿裡雲賬号KeyID與KeySecret
- 如果您需要下載下傳任何牆外的鏡像,請移步使用阿裡雲鏡像服務 加速器 。
- 請至少準備兩個ECS執行個體,其中 node1 将作為master節點,node2作為工作節點。請注意不要修改ECS執行個體的名稱(包括hostname)。
安裝Kubernetes
準備3個配置參數
- 擷取阿裡雲KeyID和KeySecret, 請點選 . 假設
,ACCESS_KEY_ID=xxxxxxxx
ACCESS_KEY_SECRET=xxxxxxxxxxxxxxxx
- 建立ECS CentOS 7.2-x64版本或者Ubuntu 16.04 x64版本。記錄ECS所在region,以下清單為支援的region。例如杭州region名稱為
cn-hangzhou
REGION=cn-hangzhou
Region名稱 | 值 |Region名稱 | 值 | ------------------|-----------------------|------------------|-----------------------| 杭州 | cn-hangzhou |新加坡 | ap-southeast-1 | 青島 | cn-qingdao |上海 | cn-shanghai | 北京 | cn-beijing |迪拜 | me-east-1 | 香港 | cn-hongkong |東京 | ap-northeast-1 | 深圳 | cn-shenzhen |悉尼 | ap-southeast-2 | 矽谷 | us-west-1 |法蘭克福 | eu-central-1 | 弗吉尼亞 | us-east-1 |||
注意: VPC網絡可以不用設定REGION參數,系統會自動推測。但是經典網絡必須要設定REGION參數。
開始安裝
- 安裝Master節點:
登入master節點安裝master.注意将下面的ssh root@node1
和$ACCESS_KEY_ID
,$ACCESS_KEY_SECRET
替換成上一步中獲得的參數。$REGION
輸出如下,注意記錄輸出中的token,[root@node1 ~]# curl -L 'http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/installer/kubemgr.sh' | \ bash -s nice --node-type master --key-id $ACCESS_KEY_ID --key-secret $ACCESS_KEY_SECRET \ --region $REGION --discovery token://
:TOKEN=token://xxxxxx:[email protected]:989x
docker has been installed 3.0: Pulling from google-containers/pause-amd64 Digest: sha256:3b3a29e3c90ae7762bdf587d19302e62485b6bef46e114b741f7d75dba023bd3 ... [tokens] Generated token: "xxxxxx:xxxxxxxxxxxxxxxx" [certificates] Generated Certificate Authority key and certificate. ... [apiclient] All control plane components are healthy after 17.286402 seconds [apiclient] Waiting for at least one node to register and become ready [apiclient] First node is ready after 4.003314 seconds ... Your Kubernetes master has initialized successfully! You should now deploy a pod network to the cluster. ## 注意記錄這個Token kubeadm join --discovery token://xxxxxx:[email protected]:989x ... NAME READY STATUS RESTARTS AGE dummy-3158885821-vkv5q 1/1 Running 0 5s etcd-izbp12l8fznm0yt7bas5p2z 1/1 Running 0 19s kube-apiserver-izbp12l8fznm0yt7bas5p2z 1/1 Running 1 18s ... kubectl --namespace=kube-system get po
- 安裝Node節點:
登入到您的node2節點上。使用剛才您記錄下來的token,執行以下指令,注意替換下面的變量:ssh root@node2
輸出如下:[root@node2 ~]# curl -L 'http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/installer/kubemgr.sh' \ | bash -s nice --node-type node --key-id $ACCESS_KEY_ID --key-secret \ $ACCESS_KEY_SECRET --region $REGION --discovery $TOKEN
Congratulations! 您已經成功的安裝的了一個master和一個node節點。您可以重複在其他機器上執行安裝node操作來添加更多節點。但是要讓Kubernetes能正常運作您還需要為叢集添加網絡支援。docker has been installed 3.0: Pulling from google-containers/pause-amd64 ... Digest: sha256:3b3a29e3c90ae7762bdf587d19302e62485b6bef46e114b741f7d75dba023bd3 Status: Image is up to date for registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 [preflight] Running pre-flight checks [discovery] Created cluster info discovery client, requesting info from "http://12x.2x.24x.21x:989x/cluster-info/v1/?token-id=56974f" [discovery] Cluster info object received, verifying signature using given token [discovery] Cluster info signature and contents are valid, will use API endpoints [https://12x.2x.24x.21x:6443] [bootstrap] Trying to connect to endpoint https://12x.2x.24x.21x:6443 [bootstrap] Detected server version: v1.6.0-alpha.0.2229+88fbc68ad99479-dirty [bootstrap] Successfully established connection with endpoint "https://12x.2x.24x.21x:6443" [csr] Created API client to obtain unique certificate for this node, generating keys and certificate signing request [csr] Received signed certificate from the API server: Issuer: CN=kubernetes | Subject: CN=system:node:iZbp12l8fznm0yt7bas5p1Z | CA: false Not before: 2017-01-18 07:46:00 +0000 UTC Not After: 2018-01-18 07:46:00 +0000 UTC [csr] Generating kubelet configuration [kubeconfig] Wrote KubeConfig file to disk: "/etc/kubernetes/kubelet.conf" Node join complete: * Certificate signing request sent to master and response received. * Kubelet informed of new secure connection details. Run 'kubectl get nodes' on the master to see this machine join.
為叢集添加網絡支援
目前阿裡雲支援兩種類型的網絡:VPC網絡和經典網絡。請根據您的叢集的網絡類型不同為kubernetes選擇相應的網絡元件。
注意:以下兩種網絡隻需要按照您的實際網絡情況安裝對應的一種。
方案一、增加VPC 網絡支援: (适用于VPC網絡)我們專門為flannel編寫了vpc支援的插件。為Kubernetes安裝flannel網絡插件支援也非常容易。注意修改flannel-vpc.yml 檔案中的
replace with your id
為您自己的KEY_ID和KEY_SECRET。在Master node上面執行下面的指令:
[root@node1 ~]# curl -sSL http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/conf/flannel-vpc.yml -o flannel-vpc.yml
[root@node1 ~]# vi flannel-vpc.yml
[root@node1 ~]# kubectl apply -f flannel-vpc.yml
等待一會兒,然後使用
kubectl --namespace=kube-system get ds
列出所有kube-system命名空間下的所有daemonsets,您會看見一個名字叫
kube-falnnel
的ds處于Running狀态. 說明網絡部署成功。
[root@node1 ~]# kubectl get ds --namespace=kube-system
NAME DESIRED CURRENT READY NODE-SELECTOR AGE
kube-flannel-ds 2 2 2 <none> 2h
kube-proxy 2 2 2 <none> 2h
方案二、增加經典網絡支援: (适用于經典網絡和VPC網絡)通過flannel的VXLAN,我們可以為Pod打通經典網絡内的網絡連通性。安裝經典網絡支援同樣很簡單,運作以下指令即可:
[root@node1 ~]# kubectl apply -f http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/conf/flannel-vxlan.yml
等待一會兒,通過指令
kubectl --namespace=kube-system get ds
可以檢視您的網絡插件的運作狀态。安裝完成,收工。
在您的Kubernetes叢集裡建立應用
運作nginx應用
現在運作一個nginx應用,運作以下指令建立一個具有兩個nginx副本的應用。
[root@node1 ~]# kubectl run nginx --image=registry.cn-hangzhou.aliyuncs.com/spacexnice/nginx:latest --replicas=2 --labels run=nginx
deployment "nginx" created
[root@node1 ~]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-3579028506-9qxxl 1/1 Running 0 50s
nginx-3579028506-p032g 1/1 Running 0 50s
然後為nginx應用建立服務。可以指定
type=Loadbalance
來啟用阿裡雲SLB能力,阿裡雲CloudProvider會自動為該服務建立LoadBalance。
[root@node1 ~]# kubectl expose deployment nginx --port=80 --target-port=80 --type=LoadBalancer
service "nginx" exposed
[root@node1 ~]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 172.19.0.1 <none> 443/TCP 3h
nginx 172.19.6.158 118.178.111.31 80:30146/TCP 6s
現在打開您的浏覽器通路
http://118.178.111.31
(注意,這兒需要替換成您自己的EXTERNAL-IP)吧,熟悉的
Welcome to nginx!
是否出現。您還可以去您的阿裡雲
SLB控制台上确認SLB相關資訊。
重置節點
當您發現安裝過程有錯誤,或者想解除安裝Kubernetes安裝的時候,随時執行如下指令即可解除安裝安裝。
[root@node1 ~]# curl -L 'http://aliacs-k8s.oss-cn-hangzhou.aliyuncs.com/installer/kubemgr.sh' | bash -s nice --node-type down
阿裡雲SLB能力支援
Kubernetes阿裡雲CloudProvider提供了豐富的annotation來讓使用者高度定制化自己的SLB的行為,支援建立一個https和http的SLB,支援自定義SLB的帶寬,支援自定義SLB健康檢查,SLB網絡位址類型等等。
為nginx建立一個https的SLB
如将剛剛建立的nginx服務的SLB類型更換成https,可以執行如下操作步驟:
- 前往阿裡雲 将您自己的https證書上傳到阿裡雲。并記錄生成的
。假如生成的certid=certid
.124395s8ifs8ffftte
- 為剛剛建立的service添加相應的annotation(每個可用的annotation的含義見附表).并将spec節中的port更改為443端口。使用指令
來編輯剛剛建立的服務,編輯完成後按kubectl edit svc nginx
儲存即可::wq
[root@node1 ~]# kubectl edit svc nginx apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alicloud-loadbalancer-ProtocolPort: "https:443" service.beta.kubernetes.io/alicloud-loadbalancer-Bandwidth: 60 service.beta.kubernetes.io/alicloud-loadbalancer-CertID: "replace with your certid" service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckFlag: off creationTimestamp: 2017-01-18T10:45:32Z labels: run: nginx name: nginx namespace: default resourceVersion: "14365" selfLink: /api/v1/namespaces/default/services/nginx uid: 3c0e72e1-dd6b-11e6-b1ec-00163e0c1de5 spec: clusterIP: 172.19.6.158 ports: - nodePort: 30146 port: 443 protocol: TCP targetPort: 80 selector: run: nginx sessionAffinity: None type: LoadBalancer status: loadBalancer: ingress: - ip: 118.178.111.31
稍等片刻,然後通路
https://118.178.111.31
即可看到一個安全的https nginx服務。 Go rock and roll!
小結
阿裡雲提供一個開放的公有雲環境,為開源社群軟體提供豐富的運作環境。您可以十分友善的在阿裡雲環境上搭建一個kubernetes叢集來運作您的服務,但是阿裡雲
為您提供了一站式解決方案,使用阿裡雲容器服務可以免去您叢集運維的煩惱。
阿裡雲容器服務團隊緻力于在阿裡雲上推廣容器技術。想了解更多容器服務内容,請通路
https://www.aliyun.com/product/containerservice附件 可用Annotation清單參考
Annotation | Description | Default |
---|---|---|
service.beta.kubernetes.io/alicloud-loadbalancer-ProtocolPort | comma separated pair like "https:443, http:8 0" | none |
service.beta.kubernetes.io/alicloud-loadbalancer-AddressType | Be "internet" or "intranet" | "internet" |
service.beta.kubernetes.io/alicloud-loadbalancer-SLBNetworkType | slb network type, which is classic or vpc | Be "classic" or "vpc" |
service.beta.kubernetes.io/alicloud-loadbalancer-ChargeType | Be "paybytraffic" or "payby bandwidth" | "paybybandwidth" |
service.beta.kubernetes.io/alicloud-loadbalancer-Region | Which region this SLB in | |
service.beta.kubernetes.io/alicloud-loadbalancer-Bandwidth | SLB bandwidth | 50 |
service.beta.kubernetes.io/alicloud-loadbalancer-CertID | certification id on AlibabaCloud, you need to upload first | "" |
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckFlag | "on" or "off" | "off" tcp no need for this mark because it default to "on" |
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckType | see HealthCheck | |
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckURI | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckConnectPort | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthyThreshold | ||
service.beta.kubernetes.io/alicloud-loadbalancer-UnhealthyThreshold | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckInterval | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckConnectTimeout | ||
service.beta.kubernetes.io/alicloud-loadbalancer-HealthCheckTimeout |