混合雲管理IV: ArgoCD with Anthos Fleet

Shawn Ho
輕鬆小品-k8s的點滴
11 min readDec 23, 2022
圖連結自Argo Project Github

Argo在12/6由CNCF宣布畢業了!目前累計有超過350個企業,包含Adobe, Blackrock, Capital One, Google, Intuit, PagerDuty, Peloton, Snyk, Swisscom, Tesla, and Volvo,真的是太厲害了。Argo專案主要包含了大家耳熟能詳的Argo Workflows, ArgoCD, Argo Rollouts, 和Argo Events。筆者只玩過ArgoCD跟Argo Rollouts,前者主要是GitOps的CD部署工具,後者是可以做progressive rollout的強大工具(還可以跟Anthos Service Mesh直接整合),都是完成度非常高的產品。

今天主要要跟大家分享的是ArgoCD,為什麼要特別介紹?恩 主要是最近客戶通過標準的ArgoCD QuickStarter Guide在使用時,發現沒法通過下面的指令將TargetCluster成功的加入ArgoCD中。

argocd cluster add [target cluster kube-context]

問題:

大家要猜猜原因嗎?對了,就是Private VPC造成的網路連接問題,下圖頗析主要的原因,原本ArgoCD所在的叢集有自己的VPC,在與Target Cluster的VPC Peering之後,但因為客戶的Target Cluster是個Private Cluster,其Master IP是與GKE Control Plane Peering時,所設定預留的/28的網段,基於Transitive VPC Peering不會Propagate的這個原則,本Master IP網段無法Argo VPC無法路由出來,因此會造成ArgoCD無法連線Target Cluster部署所需的ServiceAccount/ClusterRolebinding的狀況。

解法:

之前的混合雲管理系列文,我們聊過可以通過Anthos Fleet來避免Private VPC的問題,但卡在ArgoCD需要在本身所在的叢集內,取得Target Cluster的部署權限,因此有了上面那個指令,有人問說,那可以用gcloud container fleet memberships get-credentials 拿回的kubeconfig來加入嗎?抱歉,沒辦法唷!還好有大拿已經給出了完整的做法,我們來底下來驗證一下。

預先準備: 將GKE叢集註冊進Anthos Fleet,並啟動ConnectGateway API

# 啟動API
gcloud services enable --project=${PROJECT_ID} \
connectgateway.googleapis.com \
anthos.googleapis.com \
gkeconnect.googleapis.com \
gkehub.googleapis.com \
cloudresourcemanager.googleapis.com
# 註冊
gcloud container fleet memberships register ${CLUSTER_NAME} \
--gke-cluster=GKE_CLUSTER \
--enable-workload-identity

步驟1: 部署ArgoCD: 依照ArgoCD官方文件

kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

步驟2: 通過Workload Identity建置ArgoCD的權限:

在ArgoCD標準建置中,需要取得Workload Identity對應權限的K8S服務帳號為argocd-server與argocd-application-controller兩個。我們通過設定一個專用給argocd使用的GSA: argocd-fleet-admin,將這兩個k8s 服務帳號,設定對應的Workload Identity Binding如下:

#!/bin/bash
export PROJECT_ID="your-project"
export PROJECT_NUMBER="1234556"
export CLUSTER_NAME="your-target-cluster"
export MEMBERSHIP="your-target-cluster"
export CONTEXT="Target K8S Context"
export KUBECONFIG=${HOME}/.kube/config

# Create & Config argocd-fleet-admin serviceaccount
gcloud iam service-accounts create argocd-fleet-admin --project $PROJECT_ID

gcloud projects add-iam-policy-binding $PROJECT_ID --member "serviceAccount:argocd-fleet-admin@${PROJECT_ID}.iam.gserviceaccount.com" --role roles/gkehub.gatewayEditor

gcloud projects add-iam-policy-binding $PROJECT_ID --member "serviceAccount:argocd-fleet-admin@${PROJECT_ID}.iam.gserviceaccount.com" --role roles/container.admin

# Config workload identity
gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:${PROJECT_ID}.svc.id.goog[argocd/argocd-server]" argocd-fleet-admin@$PROJECT_ID.iam.gserviceaccount.com

kubectl annotate serviceaccount argocd-server --namespace argocd iam.gke.io/gcp-service-account=argocd-fleet-admin@shawn-mesh-2022.iam.gserviceaccount.com

gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:${PROJECT_ID}.svc.id.goog[argocd/argocd-application-controller]" argocd-fleet-admin@$PROJECT_ID.iam.gserviceaccount.com

kubectl annotate serviceaccount argocd-application-controller --namespace argocd iam.gke.io/gcp-service-account=argocd-fleet-admin@shawn-mesh-2022.iam.gserviceaccount.com

步驟3: 建立GSA (argocd-fleet-admin)在Target Cluster的權限

之前原本需要手動在Target Cluster建置impersonate跟cluster-admin的RBAC,目前Anthos Fleet提供快速簡易指令,一行就完成。完成後,我們以Secret的方式,將Fleet的資訊提供給ArgoCD。

# 接續前方Bash Script
# Generate Cluster RBAC
gcloud container fleet memberships generate-gateway-rbac --membership=${MEMBERSHIP} --users=argocd-fleet-admin@$PROJECT_ID.iam.gserviceaccount.com --role=clusterrole/cluster-admin --context=${CONTEXT} --kubeconfig=${KUBECONFIG} --apply

cat << EOF > cluster-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: cluster-app
labels:
argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
name: cluster-app
server: https://connectgateway.googleapis.com/v1beta1/projects/$PROJECT_NUMBER/locations/global/gkeMemberships/$CLUSTER_NAME
config: |
{
"execProviderConfig": {
"command": "argocd-k8s-auth",
"args": ["gcp"],
"apiVersion": "client.authentication.k8s.io/v1beta1"
},
"tlsClientConfig": {
"insecure": false,
"caData": ""
}
}
EOF
kubectl apply -f cluster-secret.yaml -n argocd --context ${ARGOCD_CONTEXT}

Command Line(舉例): 第一行為通過Anthos Fleet加入的Target Cluster,第二行為ArgoCD所在的K8S Cluster

argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://connectgateway.googleapis.com/v1beta1/projects/123456789123/locations/global/gkeMemberships/shawn-mesh-2022-asia-east1-cht-test-cluster cluster-app 1.24 Successful
https://kubernetes.default.svc in-cluster 1.23 Successful

[Note] 剛部署完成的ArgoCD UI裡面的叢集(包含自身叢集與Target Cluster),在部署App前,如果呈現反灰的狀態是正常的,需要通過服務部署,並加上Synchronize才會變成綠色。

最後,我們通過argocd的CLI指令(下載點),快速部署一個服務

argocd app create test --repo https://github.com/argoproj/argocd-example-apps.git --path guestbook --dest-namespace default --dest-server https://connectgateway.googleapis.com/v1beta1/projects/$PROJECT_NUMBER/locations/global/gkeMemberships/$CLUSTER_NAME --directory-recurse

大功告成之後,快速檢查一下:

UI(舉例):

--

--

Shawn Ho
輕鬆小品-k8s的點滴

一個心態年輕的中年大叔。年輕時不學好~ 台大電機畢業後,去美國取得了博士學位,念完博士後,不想教書。當過補習班老師,碼農,產品總監,ISO稽核顧問,技術銷售,目前在Google Cloud跟客戶一起玩Kubernetes,也跟喜歡的客戶在金融, 政府, 電信, 高科技業內共同成長學習是斜槓人生的好案例。