客座文章最后由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微信公众号。