客座文章最后由DoiT International高级云架构师Mike Sparr在DoiT博客上公布

在我看来,谷歌Anthos企业解决方案中,最酷的方面是Anthos配置管理(Anthos Config Management,ACM)。你能够设置一个Git repo,并将各种集群连贯到它,它们将以GitOps的形式标准化配置,并避免漂移。这对于在不同托管地位治理成千盈百个集群的大型企业尤其重要。


应用Argo CD自动化Kubernetes多集群配置

受到ACM的启发,我想晓得是否能够应用另一种GitOps解决方案,Argo CD,从新创立这种类型的性能。我很快乐与大家分享它的工作原理,当我在Git repo中批改配置文件时,它们无缝地利用到两个集群中。


架构概述

设置

为了简略起见,我在谷歌云的托管Kubernetes服务GKE上,别离在两个区域创立了两个集群,以模仿东和西的场景。当然,你能够在集群的任何中央装置Argo CD,并确保它们可能拜访你的Git repo。

我创立了上面的shell脚本来疏导所有;然而,对于生产用处,我倡议在可能的状况下应用Terraform来治理基础设施。

create-k8s-clusters.sh:

#!/usr/bin/env bashexport PROJECT_ID=<YOUR-PROJECT-ID>export AUTH_NETWORK="<YOUR-IP-ADDRESS>/32" # change to your IP or use dotenv of course# enable apisgcloud services enable container.googleapis.com # Kubernetes Engine API# helper functionsset_location () { case $1 in "west") export ZONE="us-west2-b" export REGION="us-west2" ;; "central") export ZONE="us-central1-a" export REGION="us-central1" ;; "east") export ZONE="us-east1-c" export REGION="us-east1" ;; *) echo $"Usage: $0 {west|central|east}" exit 1 esac}install_argo_cd () { echo "Installing Argo CD ..." kubectl create clusterrolebinding cluster-admin-binding  --clusterrole=cluster-admin --user="$(gcloud config get-value account)" kubectl create namespace argocd kubectl apply -n argocd  -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml # configure app-of-apps git repo echo "Configuring app-of-apps repo ..." kubectl apply -f app-of-apps.yaml}create_cluster () { CLUSTER_NAME=$1 set_location $CLUSTER_NAME echo "Creating cluster $CLUSTER_NAME in zone $ZONE ..." gcloud beta container --project $PROJECT_ID clusters create "$CLUSTER_NAME"  --zone "$ZONE"  --no-enable-basic-auth  --cluster-version "1.16.9-gke.6"  --machine-type "e2-standard-2"  --image-type "COS"  --disk-type "pd-standard" --disk-size "100"  --node-labels location=west  --metadata disable-legacy-endpoints=true  --scopes "https://www.googleapis.com/auth/compute","https://www.googleapis.com/auth/devstorage.read_write","https://www.googleapis.com/auth/sqlservice.admin","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/pubsub","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append"  --preemptible  --num-nodes "1"  --enable-stackdriver-kubernetes  --enable-ip-alias  --network "projects/${PROJECT_ID}/global/networks/default"  --subnetwork "projects/${PROJECT_ID}/regions/${REGION}/subnetworks/default"  --default-max-pods-per-node "110"  --enable-autoscaling --min-nodes "0" --max-nodes "3"  --enable-network-policy  --enable-master-authorized-networks --master-authorized-networks $AUTH_NETWORK  --addons HorizontalPodAutoscaling,HttpLoadBalancing  --enable-autoupgrade  --enable-autorepair --max-surge-upgrade 1 --max-unavailable-upgrade 1  --labels env=sandbox  --enable-vertical-pod-autoscaling  --identity-namespace "${PROJECT_ID}.svc.id.goog"  --enable-shielded-nodes  --shielded-secure-boot  --tags "k8s","$1"  # authenticate echo "Authenticating kubectl ..." gcloud container clusters get-credentials $CLUSTER_NAME --zone $ZONE # install argo cd echo "Installing Argo CD ..." install_argo_cd echo "Cluster $CLUSTER_NAME created in zone $ZONE"}# create clustersecho "Creating and configuring clusters ..."locations=("west" "east")for loc in ${locations[@]}; do create_cluster $locdone

启动集群

在8-10分钟内,两个集群都处于活动状态,并部署了Argo CD工作负载。


东和西地区的Kubernetes集群


部署到每个集群的Argo CD

应用程序的应用程序(App of Apps)

这个设置的独特之处在于,我还在每个集群上装置了Argo CD,初始化的应用程序应用App of Apps模式,指向我的Github仓库。这提供了在未来向repo增加任意数量的配置,以及自定义部署到其中的集群或应用程序的灵活性。

app-of-apps.yaml:

apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata: name: applications namespace: argocd finalizers: - resources-finalizer.argocd.argoproj.iospec: destination: namespace: argocd server: https://kubernetes.default.svc project: default source: path: applications repoURL: https://github.com/mikesparr/multi-cluster-argo-demo targetRevision: HEAD syncPolicy: automated: selfHeal: true prune: true

留神,主动同步齐全是可选的。如果集群的数量很大,我倡议你这样做,这样你的集群就能够自愈和治理漂移。然而,主动同步的一个毛病是回滚性能无奈工作。

applications/文件夹(门路)中有一个应用程序(目前来说),叫做k8s-config。这是另一个Argo应用程序,它指向另一个带有Kubernetes configs的文件夹。

k8s-config.yaml:

apiVersion: argoproj.io/v1alpha1kind: Applicationmetadata: name: k8s-config namespace: argocd finalizers: - resources-finalizer.argocd.argoproj.iospec: destination: namespace: argocd server: https://kubernetes.default.svc project: default source: path: k8s-config repoURL: https://github.com/mikesparr/multi-cluster-argo-demo targetRevision: HEAD syncPolicy: automated: selfHeal: true prune: true

k8s-config/文件夹(门路)蕴含咱们想要利用到kubernetes集群的所有YAML文件。如果有很多文件须要组织,也能够抉择申明一个应用程序来递归地利用configs。

源代码仓库

对于我的试验,我在Github上的mikesparr/multi-cluster-argo-demo上公布了一个源代码库,目录构造如下。


源代码仓库构造

本例中的所有内容都在单个仓库中,然而你能够通过应用不同的存储库,并授予不同团队编辑它们的权限,来拆散关注点。

Argo UI

从命令行,你能够端口转发到argo-server服务。

kubectl -n argocd port-forward svc/argo-server 8080:443

在浏览器中拜访http://localhost:8080,并在提醒时承受平安异样(无https)。提醒:默认状况下,你用admin和argocd server pod的全名登录:


复制argocd-server-XXXXXXX作为默认明码


刚开始时应用程序(应用程序的应用程序)呈现,直到同步

在你的应用程序的应用程序同步之后,它会辨认出你的第一个应用程序k8s-config。


在两个应用程序同步之后

如果单击k8s-config应用程序面板,你能够看到它在服务器上安装的所有内容的具体视图。


仓库上/k8s-config目录中的所有YAML文件都利用到服务器

确认集群配置

将kubectl上下文切换到每个集群,并查看namespaces,test-namespace的serviceaccounts、roles和rolebindings。你能够看到它们都装置在两个集群上。祝贺你!


集群主动从Git repo装置工作负载

有限的后劲

假如你想要向堆栈增加一个API网关,并决定应用Ambassador,或者是Kong,两者都配置了CRD和YAML。你能够简略地增加另一个文件夹或repo,而后在applications/文件夹中增加另一个app YAML,ArgoCD会主动为你装置和配置它。

对于工程团队公布的每个应用程序,他们能够在部署清单中编辑Docker镜像版本,为更改创立一个pull request,并且你有内置的手动判断和职责拆散。PR合并后,Argo CD将别离将其部署到该集群和环境中。

另一个用例是反对多云部署,并应用DNS均衡流量,实现真正的active-active配置。另一个用例可能是从一个云迁徙到另一个云。

我期待着尝试更多的可能性,并心愿你喜爱另一种在不同环境中放弃集群同步的办法。

清理

如果你应用了脚本和/或仓库,请不要遗记清理和删除你的资源,以防止不必要的账单。最简略的办法是应用上面的命令(或你的我的项目)删除集群。

gcloud container clusters delete west --zone us-west2-bgcloud container clusters delete east --zone us-east1-c

在DoiT International和Mike一起工作!请到咱们的招聘网站申请工程职位。

点击浏览网站原文。


CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux  Foundation,是非营利性组织。
CNCF(云原生计算基金会)致力于培养和保护一个厂商中立的开源生态系统,来推广云原生技术。咱们通过将最前沿的模式民主化,让这些翻新为公众所用。扫描二维码关注CNCF微信公众号。