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

10次阅读

共计 5769 个字符,预计需要花费 15 分钟才能阅读完成。

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

正文完
 0