在谷歌Kubernetes引擎上部署多集群Ingress


在本教程第1部分中,我们已经通过Kubernetes联邦功能配置出了一个跨地域的分布式Kubernetes集群。现在,我们将在这个联邦集群上部署一个应用,并通过全局Ingress 端点暴露给外界。

在联邦控制台编排这个跨集群部署的过程中,我们需要配置一个Ingress,实现可以根据访问用户的地理位置,将请求路由到离用户最近的集群。这个Ingress还需要足够智能,可在单个集群出现故障的情况下,将请求路由到其他正常的集群上。
22222.png

在谷歌Kubernetes引擎(GKE)上,这个全局ingress将被配置成一个HTTP负载均衡器,它将可以与每个集群内所对应的NodePort进行通信。
谷歌云平台(GCP)的负载均衡器已经可以为HTTP(S)请求提供全局负载均衡服务。用户可以在此服务上通过配置URL规则,将部分请求路由到一组计算实例上,将另一部分请求路由到其他组的计算实例。而请求总是能够被路由到离访问用户最近,且具备足够请求处理能力的实例组。有效的实例组必须具备足够的处理能力和离用户最近这2个条件。

谷歌充分利用了GCP负载均衡器的如上特性。虽然没有与GCP的官方命令行接口gcloud SDK进行原生集成,但发布了kubemci工具,通过这个工具能够实现全局、多集群负载均衡。

只要为你的Mac或Linux机器下载kubemci,就可以利用GCP负载均衡器部署并发布应用程序。由于kubemci需要应用凭证才能访问GCP资源,因此我们将运行下面的命令。
$ gcloud auth application-default login

应用程序默认凭据(ADC)提供了获取凭据的方法,用在调用谷歌的API过程中。gcloud auth application-default这个命令组允许你管理本机的的活动凭据,作本地应用程序开发用。

另外,还需要将每个集群配置传给kubemci,因此,我们使用默认应用凭据创建一个新的自定义kubeconfig配置文件。这是kubemci工具专用的文件。命令如下:
$ KUBECONFIG=$HOME/mcikubeconfig gcloud container clusters get-credentials asia --zone asia-southeast1-a --project janakiramm-sandbox

$ KUBECONFIG=$HOME/mcikubeconfig gcloud container clusters get-credentials europe --zone europe-west2-a --project janakiramm-sandbox

$ KUBECONFIG=$HOME/mcikubeconfig gcloud container clusters get-credentials america --zone us-central1-a --project janakiramm-sandbox

备注:请用你的GCP项目ID替换命令行的项目ID。

接下来,还需要为项目中的全局ingress建立一个静态IP,命令如下:
$ gcloud compute addresses create g-ingress --global

到此,基本配置就已经完成了,接下来准备部署和发布应用。谷歌的工程师已经构建了一个不错的应用程序样本,这样本是列出了为请求提供服务的zone的详细信息。我们将在联合集群中部署这个应用程序样本。

首先,建一个zone-printer.yaml文件,包括如下信息:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: zoneprinter
labels:
app: zoneprinter
spec:
replicas: 6
selector:
matchLabels:
  app: zoneprinter
template:
metadata:
  labels:
    app: zoneprinter
spec:
  containers:
  - name: frontend
    image: gcr.io/google-samples/zone-printer:0.1
  ports:
  - containerPort:80

---
apiVersion: v1
kind: Service
metadata:
name: zoneprinter
labels:
app: zoneprinter
spec:
type: NodePort
selector:
app: zoneprinter
ports:
- name: http
port: 80
nodePort: 30061

这个文件的作用是建立一个deployment,有6个副本,通过绑定了主机节点的30061端口,向外公布了HTTP 80端口服务。

然后,把这个yaml文件提交给联邦控制台。
$ kubectl --context=global-context create -f zone-printer.yaml

这个步骤开启了一个编排任务,将新建的deployment部署到每个注册的集群里。因为配置了6个副本的缘故,所以每个集群都将运行2个Pod。通过命令确认一下。
$ kubectl --context=global-context get deploy

33333.png

联邦控制台报告了6个Pod,每个集群有2个Pod。切换到单个集群确认一下。
$ kubectl --context=asia-context get deploy

4444.png

$ kubectl --context=europe-context get deploy

444-2.png

$ kubectl --context=america-context get deploy

5555.png

服务也如配置所要求的一样,如下截图显示每个集群都给zoneprinter服务分配了NodePort。
66666.png

接下来,建立一个ingress对象。先定义ingress,然后通过kubemci工具进行提交。

备注:kubemci其实是独立于联邦集群概念的工具,它也可以用于多个非联邦的个体集群。本教程所演示的是将kubemci工具和联邦集群功能组合起来发布应用负载。Ingress对象的yaml定义如下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: zoneprinter
annotations:
kubernetes.io/ingress.class: gce-multi-cluster
kubernetes.io/ingress.global-static-ip-name: g-ingress
spec:
backend:
serviceName: zoneprinter
servicePort: 80

这个ingress定义中包含了一个注释,其中一行是将对象与前面创建的静态IP地址关联起来。另外一行中的gce-multi-cluster其实是到GKE的说明,以提供一个全局HTTP(S)负载均衡器。运行如下命令创建ingress对象:
$ kubemci create zone-ingress \
--ingress=zone-ingress.yaml \
--gcp-project=janakiramm-sandbox \
--kubeconfig=$HOME/mcikubeconfig

这个步骤的完成,实际上是涉及创建负载均衡器、防火墙规则、健康检查、代理等一系列配置任务的执行。

在联邦控制台上,每个集群成功注册到这个ingress,就会显示这个集群状态是健康的。不断刷新GCP控制台的健康检查查看进度,当所有集群都完成时,将在后端服务区域的健康列看到3/3的数值,整个过程通常需要耗时几分钟。
77777.png

接下来进行最后的测试,验证地域路由功能,我们用启用了VPN的Opera浏览器,可以选择VPN的位置来模拟来自不同地方的流量。
88888.png

依据VPN的物理位置,在浏览器上将看到不同的结果输出。国旗和定位表示请求的GKE位置区域。

Kubernetes正稳步成为运行高可用和分布式应用负载的首选。诸如联邦集群和全局ingress等特性为平台带来了额外的功能,再加上集合了Google Cloud Spanner这种全球分布式、强一致性的数据库服务,它现在完全可能运行全球部署的应用程序。

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

0 个评论

要回复文章请先登录注册