最近, 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
本文轉自中文社群-
Kubernetes 1.5 新功能解析之「叢集聯盟」