客座文章最初由DoiT International高級雲架構師Mike Sparr在DoiT博客上發布
https://blog.doit-intl.com/automating-kubernetes-multi-cluster-config-with-argo-cd-5ac5e371ef01
在我看來,谷歌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"
gcloud services enable container.googleapis.com
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
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" echo "Authenticating kubectl ..." gcloud container clusters get-credentials $CLUSTER_NAME --zone $ZONE
echo "Installing Argo CD ..." install_argo_cd
echo "Cluster $CLUSTER_NAME created in zone $ZONE"}
echo "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: truek8s-config/文件夾(路徑)包含我們想要應用到kubernetes集群的所有YAML文件。如果有很多文件需要組織,也可以選擇聲明一個應用程式來遞歸地應用configs。
原始碼倉庫
對於我的實驗,我在Github上的mikesparr/multi-cluster-argo-demo上發布了一個原始碼庫,目錄結構如下。
https://github.com/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 gcloud container clusters delete east在DoiT International和Mike一起工作!請到我們的招聘網站申請工程職位:
https://careers.doit-intl.com/
點擊【閱讀原文】閱讀網站原文。
:參加2020北美KubeCon + CloudNativeCon虛擬大會,免費註冊!
掃描二維碼聯繫我們!
CNCF (Cloud Native Computing Foundation)成立於2015年12月,隸屬於Linux Foundation,是非營利性組織。
CNCF(雲原生計算基金會)致力於培育和維護一個廠商中立的開源生態系統,來推廣雲原生技術。我們通過將最前沿的模式民主化,讓這些創新為大眾所用。請長按以下二維碼進行關注。