通过配置Kubernetes集群联邦创建全球部署集群的实践


在Kubernetes中运行应用负载的一个优点是容易配置成所期望的状态。只要将一个Replica Set、 StatefulSet或 Deployment定义好Pod数量,Kubernetes控制面板就能确保那些实例都处于可用状态。像谷歌Kubernetes引擎Azure Kubernetes服务之类的托管服务都提供高可用性模式下的节点,用以增强系统的弹性。

Kubernetes的集群联邦通过建立集群弹性,将高可用性的概念带入更深的层次。它可以将多个分散的集群建立结盟,从而保证应用负载至少正常运行在一个集群内。理解Cluster federation功能的最好方法就是将它想象成一个跨多个Kubernetes集群的元数据集群。把master节点看成是集群内的node节点,Cluster federation就是架设在这个”node”集群之上的“master”节点。
Untitled.jpg

在本教程中,我们将配置一个集群联邦,它所包含的集群分散运行在三个大洲——亚洲、欧洲和美洲。

与global ingress配合使用时,流量可以自动流转到最近的集群。任何单个集群上的应用健康监控失败,请求都将流转到下一个可用集群。

联邦集群功能可以支持运行在包括公有云和私有数据中心在内的不同环境。但简单起见,本教程实践仅运行在谷歌云平台上。

准备条件:


操作步骤:

1、在Google Cloud DNS上建立域名的zone, 联邦控制台将用它发现跨集群服务。
$ gcloud dns managed-zones create gfed \

--description "Kubernetes Federation Zone" \
        --dns-name cloudreadylabs.xyz

Verify the zone creation before proceeding.
$ gcloud dns managed-zones describe gfed

creationTime: '2018-06-07T07:28:59.581Z'
description: Kubernetes Federation Zone
dnsName: cloudreadylabs.xyz.
id: '8535855681944743838'
kind: dns#managedZone
name: gfed
nameServers:
- ns-cloud-a1.googledomains.com.
- ns-cloud-a2.googledomains.com.
- ns-cloud-a3.googledomains.com.
- ns-cloud-a4.googledomains.com. 

2、在亚洲、欧洲和美洲分别建立3个Kubernetes集群。
$ gcloud container clusters create asia \
      --zone asia-southeast1-a \
        --scopes cloud-platform

$ gcloud container clusters get-credentials asia \
        --zone asia-southeast1-a 

$ kubectl create clusterrolebinding cluster-admin-binding \
        --clusterrole cluster-admin --user $(gcloud config get-value account) 

以上命令建立了集群并指定了kubectl,将GCP用户添加为集群管理角色。

3、重复以上步骤,建立另外2个大洲的集群。
$ gcloud container clusters create europe \
        --zone europe-west2-a \
        --scopes cloud-platform 

$ gcloud container clusters get-credentials europe \
        --zone europe-west2-a 

$ kubectl create clusterrolebinding cluster-admin-binding \

--clusterrole cluster-admin --user $(gcloud config get-value account)

Create a cluster in US Central

$ gcloud container clusters create america \
        --zone us-central1-a \
        --scopes cloud-platform

$ gcloud container clusters get-credentials america \
        --zone us-central1-a 

$ kubectl create clusterrolebinding cluster-admin-binding \
        --clusterrole cluster-admin --user $(gcloud config get-value account) 


4、检查GCP终端将看到3个集群已经建立并处于运行状态。
Untitled_3.jpg

默认情况下,GKE是基于GCP项目ID,集群ID和区的信息来命名集群context,所产生的名字比较累赘,不便于使用。因此我们在集群本地的kubeconfig中重命名了集群context,这样就便于我们切换集群context 的操作。

5、执行如下命令修改默认的GKE集群context,更改为更有代表性的名字。
$ kubectl config set-context asia-context \
--cluster gke_janakiramm-sandbox_asia-southeast1-a_asia \
--user gke_janakiramm-sandbox_asia-southeast1-a_asia 

$ kubectl config delete-context \
        gke_janakiramm-sandbox_asia-southeast1-a_asia
$ kubectl config set-context europe-context \
--cluster gke_janakiramm-sandbox_europe-west2-a_europe \
--user gke_janakiramm-sandbox_asia-europe-west2-a_europe

$ kubectl config delete-context \
        gke_janakiramm-sandbox_europe-west2-a_europe 

$ kubectl config set-context america-context \
--cluster gke_janakiramm-sandbox_us-central1-a_america \
--user gke_janakiramm-sandbox_us-central1-a_america 

$ kubectl config delete-context \
        gke_janakiramm-sandbox_us-central1-a_america

切记不要忘记用你自己的GCP项目ID替换命令中janakiramm-sandbox。
通过如下命令检查kubeconfig中最新的集群context名。可以看到一个更短的名字。
$ kubectl config get-contexts

另外,强烈鼓励大家去探索一下$HOME/.kube目录下config文件的结构。

6、下载kubefed CLI,这个工具目前只能运行在Linux下面。

截止到目前,我们已经具备了创建联邦集群的条件。接下来创建联邦控制台。

1、初始化联邦集群的命名 空间。
$ kubefed init global-context \

--host-cluster-context=america-context \
--dns-zone-name="cloudreadylabs.xyz." \
--dns-provider="google-clouddns"

这个步骤是创建联邦控制台最关键的步骤。等待数分钟后,将可以看到如下输出。
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: 35.202.187.107

输出信息表示在US Central区的GKE集群内创建了一个联邦控制台集群。集群本地的kubeconfig也完成了更新。联邦控制台的服务地址是35.202.187.107,这个地址上的kubectl CLI和kubefed CLI的API端点均是可用的。

如果我们访问GCP终端的云负载均衡器,就会注意到多了一个负载均衡器。这是由于联邦集群是由us-central1-a区的集群所搭载,所以这个负载均衡器也在同一个集群。
Untitled_4.jpg

当有请求送达联邦控制台,它会通过这个负载均衡器送给响应了kubefed API的node节点。

2、继续将所有的3个集群加入到联邦控制台。
$ kubefed --context=global-context join asia \
--cluster-context=asia-context \
--host-cluster-context=america-context

$ kubefed --context=global-context join europe \
--cluster-context=europe-context \
--host-cluster-context=america-context

$ kubefed --context=global-context join america \
--cluster-context=america-context \
--host-cluster-context=america-context

3、接下来确认一下是否所有的集群都成功注册到联邦控制台。
$ kubectl --context=global-context get clusters

Untitled_5.jpg

因为kubefed存在一个BUG,默认的命名空间不能显示在联邦控制台,可以通过如下命令建立起来。
$ kubectl --context=global-context create ns default

到这里,我们已经执行了创建联邦控制台的全部步骤,接下来要做的是部署一个应用负载测试一下。这个内容包含在本教程的第2部分。

我将采用谷歌的kubemci开源工具,这个工具可以配置一个多集群的ingress入口控制策略。通过这些,我们可以通过单一IP测试分布的应用负载。请静候教程的第2部分和最终部分。

原文链接:Configuring Kubernetes Cluster Federation to Create a Global Deployment(翻译:易理林)

0 个评论

要回复文章请先登录注册