阿里雲上Kubernetes集羣聯邦

摘要: kubernetes集羣讓您可以方便的部署管理運維容器化的應用。可是實際狀況中常常遇到的一些問題,就是單個集羣一般沒法跨單個雲廠商的多個Region,更不用說支持跨跨域不一樣的雲廠商。這樣會給企業帶來一些擔心,如何應對可用區級別的Fail,以及容災備份?是否會形成廠商鎖定,增長遷移成本?如何應對線上線下突發流量?如何統一管理調度容器資源?單個集羣規模的上限等等。html

點此查看原文:http://click.aliyun.com/m/43608/python

kubernetes集羣讓您可以方便的部署管理運維容器化的應用。可是實際狀況中常常遇到的一些問題,就是單個集羣一般沒法跨單個雲廠商的多個Region,更不用說支持跨跨域不一樣的雲廠商。這樣會給企業帶來一些擔心,如何應對可用區級別的Fail,以及容災備份?是否會形成廠商鎖定,增長遷移成本?如何應對線上線下突發流量?如何統一管理調度容器資源?單個集羣規模的上限等等。nginx

Federation集羣聯邦能夠必定程度上解決這些問題。Federation是能夠將分佈在多個Region或者多個雲廠商的Kubernetes集羣整合成一個大的集羣,統一管理與調度。web

本文檔演示搭建一個杭州和北京的kubernetes集羣組成集羣聯邦,其中杭州集羣做爲聯邦的控制平面api

準備域名

Federation使用域名將不一樣子集羣的同一個服務暴露出來,所以須要用戶提供一個可配置的域名。您能夠經過萬網在阿里雲上購買域名而後配置到您的Federation集羣上。
以域名spacexnice.xyz爲例,請按照購買域名文檔購買好域名。跨域

配置域名

因爲Federation在添加域名解析記錄的時候設置域名的TTL爲3分鐘,域名層級爲5級,所以須要到阿里雲上對您剛購買的域名進行設置,使得該域名容許的最小TTL值小於3分鐘,同時域名層級大於5.app

進入雲解析控制檯選擇您剛剛購買的域名,更多裏面選[升級]或者[升級VIP]
image運維

image

在彈出的頁面中更改最低TTL值爲60s,子域名級別爲7級,而後保存。ssh

建立多個子集羣

本示例建立的Federation集羣包含兩個子集羣,分別在杭州和北京region。咱們首先須要在這兩個Region建立出兩個可用的集羣,集羣建立步驟參考文檔curl

杭州集羣

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get no
NAME                                 STATUS    ROLES     AGE       VERSION
cn-hangzhou.i-bp11ajet2v9o3tp0o2uw   Ready     master    3d        v1.8.4
cn-hangzhou.i-bp15pt2475mgw64k72ma   Ready     master    3d        v1.8.4
cn-hangzhou.i-bp18fggko6p3vyr0p0ew   Ready     <none>    3d        v1.8.4
cn-hangzhou.i-bp18fggko6p3vyr0p0ex   Ready     <none>    3d        v1.8.4
cn-hangzhou.i-bp1bpj58bdzdosdxxf82   Ready     master    3d        v1.8.4

北京集羣

[root@iZze7z98ssc50pfzt6be9 ~]# kubectl get no
NAME                                STATUS    ROLES     AGE       VERSION
cn-beijing.i-2ze7z98ssc50pfzt6be9   Ready     master    3d        v1.8.4
cn-beijing.i-2ze8hr6k03ccroopicd2   Ready     master    3d        v1.8.4
cn-beijing.i-2zeipodwz2junslmihqz   Ready     master    3d        v1.8.4
cn-beijing.i-2zeipodwz2junyipunrf   Ready     <none>    3d        v1.8.4

部署federation控制平面

選擇杭州的子集羣做爲Federation的宿主集羣,安裝Federation的控制平面。並配置好本地的kubeconfig。經過運行kubefed init命令來初始化主集羣。具體步驟以下:

安裝kubefed

在hangzhou集羣的master節點安裝kubefed

[root@iZze7z98ssc50pfzt6be9 ~]# curl -L http://aliacs-k8s-cn-hangzhou.oss.aliyuncs.com/bin/kubefed-1.8.4 -o kubefed
[root@iZze7z98ssc50pfzt6be9 ~]# sudo cp kubefed /usr/bin
[root@iZze7z98ssc50pfzt6be9 ~]# sudo chmod +x /usr/bin/kubefed
[root@iZze7z98ssc50pfzt6be9 ~]# kubefed version

配置kubeconfig

在杭州集羣master節點中配置hangzhou,beijing兩個集羣的context,讓改節點能經過切換context鏈接不一樣的子集羣。要修改的內容以下:

  1. 修改hangzhou集羣的kubeconfig的cluster,user,context的名字爲hangzhou
  2. 拷貝beijing集羣kubeconfig中的cluster,user,context內容到a)步驟中kubeconfig,並修改相應的cluster,user,context名字爲beijing

爲了方便初學者,咱們提供了一個自動化的腳本,能夠自動經過ssh從您指定的集羣中下載kubeconfig配置文件,併合併成一個總體。
經過執行腳原本自動生成~/.kube/config文件。腳本須要指明從哪些集羣上下載kubeconfig文件併合並,格式以下python context.py -H hangzhou:1.1.1.1,beijing:2.2.2.2 注意參數替換成你本身的集羣Region和IP,腳本可能會要求您輸入ssh的登陸密碼。

[root@iZbp1bpj58bdzdosdxxf82Z ~]# curl http://aliacs-k8s-cn-hangzhou.oss.aliyuncs.com/tools/context.py > context.py
[root@iZbp1bpj58bdzdosdxxf82Z ~]# sudo pip install pyyaml
[root@iZbp1bpj58bdzdosdxxf82Z ~]# unset KUBECONFIG
[root@iZbp1bpj58bdzdosdxxf82Z ~]# python context.py -H ${HOST}
Info: host, hangzhou:118.31.177.21,beijing:47.95.96.234 .
Info: file /root/.kube/config successfully generated.

配置結果以下:

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl config get-contexts
CURRENT   NAME       CLUSTER               AUTHINFO                    NAMESPACE
          hangzhou   kubernetes-hangzhou   kubernetes-admin-hangzhou
*         beijing    kubernetes-beijing    kubernetes-admin-beijing

配置alidns.yaml文件

zones填寫您前面申請的域名,注意以點號結尾。而且替換您的accesskeyid和accesskeysecret.

cat >alidns.yaml <<EOF
[Global]
access-key-id = <Your-key-id>
access-key-secret = <Your-key-secret>
zones = spacexnice.xyz.
EOF

初始化控制federation平面

經過本條命令初始化federation控制平面,參數以下:            
            kubefed init federation \ # 聯邦的名字
            --host-cluster-context=hangzhou \ # 主集羣的context名字
            --dns-provider="alidns" \ # DNS服務提供商
            --dns-zone-name="spacexnice.xyz." \ # 前面註冊好的域名,必須以.結束
            --dns-provider-config="alidns.yaml" \ # alidns配置文件
            --image="registry.cn-hangzhou.aliyuncs.com/google-containers/hyperkube-amd64:v1.8.4-4_99c084ce" \ # hyperkube鏡像
            --etcd-image='registry.cn-hangzhou.aliyuncs.com/google-containers/etcd-amd64:3.1.11' \ #etcd 鏡像
            --etcd-persistent-storage=false # 關閉etcd持久存儲
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubefed init federation \
            --host-cluster-context=hangzhou \
            --dns-provider="alidns" \
            --dns-zone-name="spacexnice.xyz." \
            --dns-provider-config="alidns.yaml" \
            --image="registry.cn-hangzhou.aliyuncs.com/google-containers/hyperkube-amd64:v1.8.4-4_99c084ce" \
            --etcd-image='registry.cn-hangzhou.aliyuncs.com/google-containers/etcd-amd64:3.1.11' \
            --etcd-persistent-storage=false

Creating a namespace federation-system for federation system components... done
Creating federation control plane service..... done
Creating federation control plane objects (credentials, persistent volume claim)... done
Creating federation component deployments... done
Updating kubeconfig... done
Waiting for federation control plane to come up..................................................................................................................................................... done
Federation API server is running at: 120.55.196.1

添加集羣至federation

目前爲止您已經成功的初始化好了Federation的控制平面。接下來須要將各個子集羣加入到Federation集羣中。

添加hangzhou集羣

命令行參數解析
    kubefed join hangzhou \ #加入聯邦的集羣命名名字
            --context=federation \ #聯邦的context
            --cluster-context=hangzhou \ #要添加集羣的context
            --host-cluster-context=hangzhou #主集羣的context
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubefed join hangzhou \
            --context=federation \
            --cluster-context=hangzhou \
            --host-cluster-context=hangzhou

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get cluster --context=federation
NAME       STATUS    AGE
hangzhou   Ready     28s

添加beijing集羣

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubefed join beijing \
            --context=federation \
            --cluster-context=beijing \
            --host-cluster-context=hangzhou

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get cluster --context=federation
NAME       STATUS    AGE
hangzhou   Ready     4m
beijing    Ready     59s

後面介紹下集羣查詢,移除集羣,刪除聯邦等命令

集羣查詢

查詢註冊到Federation的kubernetes集羣列表

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get cluster --context=federation
NAME       STATUS    AGE
hangzhou   Ready     4m
beijing    Ready     59s

移除集羣

移除beijing集羣

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubefed unjoin beijing --host-cluster-context=hangzhou --context=federation

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get clusters --context=federation
NAME       STATUS    AGE
hangzhou   Ready     1d

刪除集羣聯邦

集羣聯邦控制平面的刪除功能還在開發中,目前能夠經過刪除namespace federation-system的方法來清理(注意pv不會刪除)。命令在host-cluster-context上執行。

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl delete ns federation-system

建立服務

集羣聯邦支持如下聯邦資源,這些資源會自動在全部註冊的kubernetes集羣中建立.

  • Federated ConfigMap
  • Federated Service
  • Federated DaemonSet
  • Federated Deployment
  • Federated Ingress
  • Federated Namespaces
  • Federated ReplicaSets
  • Federated Secrets
  • Federated Events(僅存在federation控制平面)

建立service

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl run nginx --image nginx --context=federation
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl expose deploy nginx --port 80 --target-port 80 --type LoadBalancer --context=federation
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get svc --context=federation

您還能夠經過kubectl scale deploy nginx --replicas=3 --context=federation來擴展nginx副本,而後觀察nginx應用在各個子集羣中的分佈狀況。

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get deploy --context=beijing
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl get deploy --context=hangzhou

建立deployment

[root@iZbp1bpj58bdzdosdxxf82Z ~]# cat deployment-nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl create -f deployment-nginx.yaml --context=federation

查看federation service

[root@iZbp1bpj58bdzdosdxxf82Z ~]# kubectl describe svc nginx --context=federation
Name:            nginx
Namespace:        default
Labels:            app=nginx
Annotations:        federation.kubernetes.io/service-ingresses={"items":[{"cluster":"hangzhou","items":[{"ip":"120.55.149.69"}]},{"cluster":"shanghai","items":[{"ip":"139.196.70.146"}]}]}
Selector:        app=nginx
Type:            LoadBalancer
IP:
LoadBalancer Ingress:    120.55.149.69, 139.196.70.146
Port:            http    80/TCP
Endpoints:        <none>
Session Affinity:    None
Events:            <none>

經過域名訪問服務:

[root@iZbp1bpj58bdzdosdxxf82Z ~]# curl nginx.default.fed.svc.spacexnice.xyz
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

查看雲解析dns的record記錄

咱們能夠在阿里云云解析控制檯看見剛剛添加的nginx的dns記錄。

image

總結

Federation爲您提供一種多集羣管理的途徑,統一管理多雲(multi-cloud)資源,並提供了一種災備的新途徑。阿里雲Kubernetes服務也將進一步簡化Federation的用戶體驗,將容器服務Kubernetes集羣管理與Federation完美結合在一塊兒。也歡迎您的意見和建議,幫助咱們迭代產品能力。 阿里雲Kubernetes服務 全球首批經過Kubernetes一致性認證,簡化了Kubernetes集羣生命週期管理,內置了與阿里雲產品集成,也將進一步簡化Kubernetes的開發者體驗,幫助用戶關注雲端應用價值創新。

相關文章
相關標籤/搜索