Kubernetes 1.5中的集群联合

编者注:这篇文章是 系列深入文章 Kubernetes 1.5的新功能

在最新的 Kubernetes 1.5发布,您会注意到对Cluster Federation的支持正在逐步成熟。该功能是在Kubernetes 1.3中引入的,而1.5版本包含了许多新功能,包括更轻松的设置体验以及距离支持所有Kubernetes API对象更近的一步。

新的命令行工具称为“胡闹的引入使“群集联盟”的入门变得更加简单。此外,还为联合DaemonSet,部署和ConfigMap添加了alpha级支持。综上所述:

  • 守护程序集 是Kubernetes部署规则,可确保在将新节点添加到集群时,每个节点上始终存在给定的Pod(更多 信息)。
  • 部署 描述副本集的所需状态(更多 信息)。
  • ConfigMaps 是应用于副本集的变量(由于可以将其参数外部化,因此可以大大提高图像的可重用性-更多 信息)。 联合守护程序集 , 联合部署 , 联合ConfigMap 将基本概念的品质提升到新的水平。例如,Federated 守护程序集可以确保将Pod部署在新添加的群集的每个节点上。

但是“联邦”到底是什么?让我们通过满足它的需求来解释它。想象一下一项在全球范围内运作的服务。自然,无论位于亚洲,欧洲还是美国,其所有用户都希望获得相同的服务质量。这意味着服务必须同样快速地响应每个位置的请求。这听起来很简单,但是幕后涉及很多逻辑。这就是Kubernetes Cluster Federation的目标。

它是如何工作的? Kubernetes集群之一必须通过运行 联邦控制平面。实际上,这是一个控制器,用于监视其他群集的运行状况,并为管理提供单个入口点。入口点的行为类似于典型的Kubernetes集群。它允许创建 副本集, 部署, 服务,但联邦控制平面将资源传递到基础群集。这意味着,如果我们请求联盟控制平面创建具有1,000个副本的副本集,它将在整个基础群集中散布该请求。如果我们有5个群集,则默认情况下,每个群集将获得200个副本的份额。

这本身就是一个强大的机制。但是还有更多。也可以创建联合入口。实际上,这是一个全局应用程序层负载平衡器。多亏了对应用程序层的了解,它使负载平衡变得“更智能”-例如,通过考虑客户端和服务器的地理位置,并以最佳方式路由它们之间的流量。

总而言之,借助Kubernetes集群联盟,我们可以简化所有集群的管理(单个访问点),而且还可以优化全球范围内的全球内容交付。在以下各节中,我们将展示其工作原理。

创建联合平面

在本练习中,我们将联合几个集群。为了方便起见,所有命令已分为6个可用脚本 这里:

  • 0-settings.sh
  • 1-create.sh
  • 2 getcredentials.sh
  • 3-initfed.sh
  • 4-joinfed.sh
  • 5破坏 首先,我们需要定义几个变量(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 和 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二进制文件。 (有关安装说明,请参阅指南 这里这里)。
现在,安装程序可以使用gcloud容器集群create(1-create.sh)创建一些Google容器引擎(GKE)集群。在这种情况下,一个在美国,一个在欧洲,一个在亚洲。

$ 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,//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,//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,//www.googleapis.com/auth/ndev.clouddns.readwrite

下一步是使用gcloud -q容器群集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环境变量指示的一个将用于运行联合平面。为此,我们将使用kubefed初始化联合命令(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来运行联邦控制平面,并用作工作集群。这种循环依赖关系有助于更有效地利用资源,可以使用kubectl --context = federation get 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

我们很好。

使用联合运行应用程序

在我们的 资料库 您将找到有关如何使用可显示容器的主机名和Google Cloud Platform(GCP)区域的网络服务构建docker映像的说明。

输出示例如下所示:

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

现在,我们将部署副本集(k8shserver.yaml):

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

和联合服务(k8shserver.yaml):

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

如您所见,这两个命令引用“联邦”上下文,即联邦控制平面。几分钟后,您将意识到基础群集运行了副本集和服务。

创建入口

服务准备好后,我们可以创建 入口 -全局负载平衡器。该命令是这样的:

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

该文件的内容指向我们在上一步中创建的服务:

apiVersion: extensions/v1beta1

kind: 入口

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"}

请参考这里 问题 有关我们所描述的一切如何工作的更多详细信息。

演示版

概要

集群联合正在积极开展工作,但仍未完全可用。一些API处于beta状态,另一些处于alpha状态。缺少某些功能,例如,不支持跨云负载平衡(联合入口当前仅在Google Cloud Platform上有效,因为它取决于GCP HTTP(S)负载平衡)。

但是,随着功能的成熟,它将成为所有面向全球市场的公司的推动者,但目前无法负担Netflix或Amazon之类的复杂管理技术。因此,我们密切关注这项技术,希望它能尽快实现其承诺。

PS。完成后,请记住销毁群集:

$ . 5破坏

-__- Lukasz Guminski,容器解决方案的软件工程师。 Google产品经理Allan Naim