1. 程式人生 > >Kubernetes 1.5 新功能解析之「叢集聯盟」_Kubernetes中文社群

Kubernetes 1.5 新功能解析之「叢集聯盟」_Kubernetes中文社群

編者注:
這篇帖子來源於 Kubernetes 官方文件,是「深度探討 Kubernetes 1.5 系列」之中的一篇,深度闡述叢集聯盟。

最近,Kubernetes 1.5 釋出,不難發現,它對於叢集聯盟的支援正趨於成熟。叢集聯盟功能是在 Kubernetes1.3 的時候引入的。1.5 版本不僅包含了很多新功能,而且更容易設定,目測不久之後就可以支援所有的 Kubernetes API 物件了。

1.5 版本此次還引入了‘kubefed’命令列工具,用於簡化叢集開啟步驟。同樣,該功能處於 Alpha 階段,用於 Federated DaemonSets,Deployments 和 ConfigMaps。總結如下:

DaemonSets——它是 Kubernetes 的部署規則,確保在新的節點被新增到叢集的時候,已給的 Pod 可以呈現在任意節點上。(更多資訊連結:http://kubernetes.io/docs/admin/daemons/ )
Deployments——描述了 Replica Sets 的理想狀態。(更多資訊連結:http://kubernetes.io/docs/user-guide/deployments/ )
ConfigMaps——它是應用於 Replica Sets 的變數,當映象引數被外化的時候,它很大程度上提升了映象的可重複使用率。(更多資訊連結:http://kubernetes.io/docs/user-guide/configmap/ )

Federated DaemonSets,Federated Deployments,Federated ConfigMaps 是下一階段的核心概念。比如,Federated DaemonSets 確保 pod 部署在新新增叢集的每個節點上。
說到這裡,到底什麼是“federation”?讓我們來解釋一下。假設現在有一個 service 全球都在用。當然,無論使用者是在亞洲、歐洲還是在美國,所有的使用者都希望獲得相同數量的 service。也就是說,無論在哪裡落地,使用者們都希望 service 的迴應速度跟需求速度能夠對等。雖然這聽起來非常簡單,但是要實現這樣的場景,需要不少精力。

這就是 Kubernetes 叢集需要去做的事情。

那麼,它是如何運作的呢?通過執行 Federation 控制面板,Kubernetes 眾多叢集中,其中一個必定會變成 master。就實踐上來說,這就是一個管理叢集健康的 controller,並且為管理提供單一入口點。入口點的功能有點像 Kubernetes 叢集,能夠建立 Replica Sets,Deployments,Service,但是 Federated 控制面板通過資源到達底層叢集。也就是說,如果我們要求 federation 控制面板用 1000 個 replicas 來建立 Replica Set,它就會傳播請求到所有叢集;如果我們有 5 個叢集,那麼預設設定下,每個叢集都會分享到 200 個 replica 中。

這對於 Kubernetes 本身來說就是一個很強大的機制。但是,這個功能還遠遠不止於此。這個功能用於建立 Federated Ingress 也是可能的。實際上,這是一個全球應用程式層面的負載均衡器。得益於對應用程式層面的瞭解,它使得負載均衡器更加“智慧化”——比如,將客戶端和伺服器的地址位置也納入考慮因素,並且對他們之間的流量用最佳方法進行引導。
總而言之,Kubernetes 叢集聯盟可以促進對叢集(單個訪問點)的管理,但是同時也會對全球內容交付進行優化。接下來,我們會展示具體運作細節。

建立 Federation 面板

在以下實踐中,我們會將一些叢集結成聯盟。方便起見,所有的命令會被分成 6 個可用的指令碼的組:

· 0-settings.sh
· 1-create.sh
· 2-getcredentials.sh
· 3-initfed.sh
· 4-joinfed.sh
· 5-destroy.sh

首先,我們需要定義幾個變數(0-settings.sh)。

$ cat 0-settings.sh && . 0-settings.sh

# this project create 3 clusters in 3 zones. FED_HOST_CLUSTER points to the one, which will be used to deploy federation control plane

export FED_HOST_CLUSTER=us-east1-b


# Google Cloud project name

export FED_PROJECT=<YOUR PROJECT e.g. company-project>


# DNS suffix for this federation. Federated Service DNS names are published with this suffix. This must be a real domain name that you control and is programmable by one of the DNS providers (Google Cloud DNS or AWS Route53)

export FED_DNS_ZONE=<YOUR DNS SUFFIX e.g. example.com>

獲取 kubectl 和 kubefed 變數。(參考指令:http://kubernetes.io/docs/user-guide/prereqs/)

現在,設定已經 OK,接下來就使用 gcloudcontainer cluster create(1-create.sh)建立新的谷歌 GCE 叢集。在這個例子裡面,一個是在美國,一個是在歐洲,另外一個是在亞洲。

$ cat 1-create.sh && . 1-create.sh

gcloud container clusters create gce-us-east1-b --project=${FED_PROJECT} --zone=us-east1-b --scopes cloud-platform,storage-ro,logging-write,monitoring-write,service-control,service-management,https://www.googleapis.com/auth/ndev.clouddns.readwrite


gcloud container clusters create gce-europe-west1-b --project=${FED_PROJECT} --zone=europe-west1-b --scopes cloud-platform,storage-ro,logging-write,monitoring-write,service-control,service-management,https://www.googleapis.com/auth/ndev.clouddns.readwrite


gcloud container clusters create gce-asia-east1-a --project=${FED_PROJECT} --zone=asia-east1-a --scopes cloud-platform,storage-ro,logging-write,monitoring-write,service-control,service-management,https://www.googleapis.com/auth/ndev.clouddns.readwrite

下一步就是用 gcloud -q containercluster get-credentials(2-getcredentials.sh)提取kubectl配置。該配置使用 kubectl 命令列來指引當下的內容。

$ cat 2-getcredentials.sh && . 2-getcredentials.sh

gcloud -q container clusters get-credentials gce-us-east1-b --zone=us-east1-b --project=${FED_PROJECT}

gcloud -q container clusters get-credentials gce-europe-west1-b --zone=europe-west1-b --project=${FED_PROJECT}

gcloud -q container clusters get-credentials gce-asia-east1-a --zone=asia-east1-a --project=${FED_PROJECT}

我們來驗證設定:

$ kubectl config get-contexts

CURRENT   NAME CLUSTER  AUTHINFO  NAMESPACE

*         

gke_container-solutions_europe-west1-b_gce-europe-west1-b

gke_container-solutions_europe-west1-b_gce-europe-west1-b   

gke_container-solutions_europe-west1-b_gce-europe-west1-b      

gke_container-solutions_us-east1-b_gce-us-east1-b

gke_container-solutions_us-east1-b_gce-us-east1-b           

gke_container-solutions_us-east1-b_gce-us-east1-b

gke_container-solutions_asia-east1-a_gce-asia-east1-a

gke_container-solutions_asia-east1-a_gce-asia-east1-a  

gke_container-solutions_asia-east1-a_gce-asia-east1-a

我們有 3 個叢集。第一個:由 FED_HOST_CLUSTER 指示環境變數,被用於執行federated面板。對於這點,我們會使用 kubefed init federated 命令(3-initfed.sh)。

$ cat 3-initfed.sh && . 3-initfed.sh

kubefed init federation --host-cluster-context=gke_${FED_PROJECT}_${FED_HOST_CLUSTER}_gce-${FED_HOST_CLUSTER} --dns-zone-name=${FED_DNS_ZONE}

注意,在執行完以上命令之後,新的 kubectl 內容如下所示:

$ kubectl config get-contexts

CURRENT   NAME  CLUSTER  AUTHINFO NAMESPACE

...         

federation

federation

聯盟內容會變成我們的管理入口點。現在該加入叢集了(4-joinfed.sh):

$ cat 4-joinfed.sh && . 4-joinfed.sh

kubefed --context=federation join cluster-europe-west1-b --cluster-context=gke_${FED_PROJECT}_europe-west1-b_gce-europe-west1-b --host-cluster-context=gke_${FED_PROJECT}_${FED_HOST_CLUSTER}_gce-${FED_HOST_CLUSTER}




kubefed --context=federation join cluster-asia-east1-a --cluster-context=gke_${FED_PROJECT}_asia-east1-a_gce-asia-east1-a --host-cluster-context=gke_${FED_PROJECT}_${FED_HOST_CLUSTER}_gce-${FED_HOST_CLUSTER}




kubefed --context=federation join cluster-us-east1-b --cluster-context=gke_${FED_PROJECT}_us-east1-b_gce-us-east1-b --host-cluster-context=gke_${FED_PROJECT}_${FED_HOST_CLUSTER}_gce-${FED_HOST_CLUSTER}

注意,叢集 gce-us-east1-b 被用於執行 federation 控制面板,並且也被用作 worker 叢集。迴圈依賴可以更加高效地使用資源,它可以通過使用 kubectl –context=federationget clusters 命令來驗證。

$ kubectl --context=federation get clusters

NAME                        STATUS    AGE

cluster-asia-east1-a        Ready     7s

cluster-europe-west1-b      Ready     10s

cluster-us-east1-b          Ready     10s

使用 Federation 執行應用程式

在我們的 repository 中,你會知道如何使用網頁服務來建立 Docker 映象,這個網頁服務展示了容器的 hostname 以及谷歌 GCP 地帶。

展示一個輸出的例子:

{"hostname":"k8shserver-6we2u","zone":"europe-west1-b"}

現在我們要開始部署 Replica Set(地址:https://github.com/ContainerSolutions/k8shserver/blob/master/rs/k8shserver.yaml)

$ kubectl --context=federation create -f rs/k8shserver

以及 Federated Service(地址:https://github.com/ContainerSolutions/k8shserver/blob/master/services/k8shserver.yaml)

$ kubectl --context=federation create -f service/k8shserver

正如你所看到的,兩個命令列指向“federation”內容,也就是指向 federation 控制面板。幾分鐘後,你就會發現,以下叢集在執行 Replica Set 和 Service 了。

建立 Ingress

在 Service 準備就緒之後,我們建立了 Ingress——全域性負載均衡器。命令列如下所示:

kubectl --context=federation create -f ingress/k8shserver.yaml

檔案內容指向我們在之前步驟中建立的 service:

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

 name: k8shserver

spec:

 backend:

   serviceName: k8shserver

   servicePort: 80

幾分鐘後,我們就會得到一個IP地址:

$ kubectl --context=federation get ingress

NAME         HOSTS     ADDRESS          PORTS     AGE

k8shserver   *         130.211.40.125   80        20m

執行很快,出現迴應:

$ curl 130.211.40.125

取決於客戶端的位置。在美國區域,如下所示是大家期望看到的:

{"hostname":"k8shserver-w56n4","zone":"us-east1-b"}

但是如果是在歐洲,我們看到的可能是這樣的:

{"hostname":"k8shserver-z31p1","zone":"eu-west1-b"}

除了上述我們描述過的東西,額外的細節可以參考這個連結:https://github.com/kubernetes/kubernetes/issues/39087

Demo:

總結

叢集聯盟已經被使用者投入使用,但是還不通用。一些 API 還在 beta 測試階段,其餘的也還都在 alpha 測試階段。有些功能丟失了,比如它就不支援跨雲負載均衡(federated ingress 目前只在谷歌 GCP 平臺上執行,因為它依賴於 GCP HTTP(S)負載均衡,網址連結:https://cloud.google.com/compute/docs/load-balancing/http/)。

然而,隨著功能的成熟,對於所有意在全球市場的公司來說,該功能會變成一個促成者,但是目前就 Netflix 或者 Amazon 使用來看,這個功能還無法支援複雜的管理技術。這也就是為什麼我們近觀這項技術,會希望它能夠按照期望的方向來發展,越做越好!

PS,部署結束的時候,記得刪掉你的叢集:

$ . 5-destroy.sh

原文:http://blog.kubernetes.io/2016/12/cluster-federation-in-kubernetes-1.5.html