关于cncf:使用Argo-CD自动化Kubernetes多集群配置

客座文章最后由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 bash
export PROJECT_ID=<YOUR-PROJECT-ID>
export AUTH_NETWORK="<YOUR-IP-ADDRESS>/32" # change to your IP or use dotenv of course
# enable apis
gcloud services enable container.googleapis.com # Kubernetes Engine API
# helper functions
set_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 clusters
echo "Creating and configuring clusters ..."
locations=("west" "east")
for loc in ${locations[@]}; do
 create_cluster $loc
done

启动集群

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


东和西地区的Kubernetes集群


部署到每个集群的Argo CD

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

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

app-of-apps.yaml:

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
 name: applications
 namespace: argocd
 finalizers:
 - resources-finalizer.argocd.argoproj.io
spec:
 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/v1alpha1
kind: Application
metadata:
 name: k8s-config
 namespace: argocd
 finalizers:
 - resources-finalizer.argocd.argoproj.io
spec:
 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-b
gcloud container clusters delete east --zone us-east1-c

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

点击浏览网站原文。


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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理