跳至主要内容

ArgoCD 整合 Kubernetes 集群

本文章會透過 K3d 和 ArgoCD 理解 ArgoCD 管理 Kubernetes 集群方式。學習目標

  1. ArgoCD CLI 連線至 ArgoCD
  2. 透過 ArgoCD CLI 變更密碼
  3. 透過 ArgoCD CLI 和使用 Secret 資源建立要管理的 Kubernetes 集群

建立環境

本實驗環境

  • OS: Windows 11 WSL
  • Docker Engine: 23.0.5
  • k3d version: v5.6.0
  • kubectl version: v1.27.1
  • Helm version: v3.11.3
  • ArgoCD Helm Chart: 7.1.3
  • ArgoCD CLI: v2.11.5

使用 K3d 建置 ArgoCD、Dev、Stage 環境。這邊會讓 K3d 建立的集群都共用同一個 docker 建立的網路,是為了能方便的進行連線。

  1. 建立網路
docker network create argo-net
  1. 建置給 ArgoCD 的環境,使用 K3d
k3d cluster create -c argocd-conf.yaml --servers-memory 6G --agents-memory 2G
  1. Helm 安裝 ArgoCD,版本使用 7.1.3

本實驗 ArgoCD 的 Helm 配置可至本實驗 Repo 查閱。

$ helm repo add argo https://argoproj.github.io/argo-helm
$ helm search repo argo-cd
NAME CHART VERSION APP VERSION DESCRIPTION
argo/argo-cd 7.1.3 v2.11.3 A Helm chart for Argo CD, a declarative, GitOps...
$ helm install argo-cd argo/argo-cd --version 7.1.3 --namespace argo --create-namespace -f values.yaml
NAME: argo-cd
LAST DEPLOYED: Mon Feb 27 14:54:00 2023
NAMESPACE: argo
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
In order to access the server UI you have the following options:
...
  1. 安裝 ArgoCD CLI 工具
curl -sSL -o argocd-linux-amd64 https://github.com/argoproj/argo-cd/releases/download/v2.11.5/argocd-linux-amd64
sudo install -m 555 argocd-linux-amd64 /usr/local/bin/argocd
rm argocd-linux-amd64
  1. 建立 Dev 的 Kubernetes 環境

建置後可藉由 kubectl config get-contexts 驗證,是否有建置 k3d-dev-cluster

k3d cluster create -c dev-conf.yaml --servers-memory 2G --agents-memory 2G
  1. 建立 Stage 的 Kubernetes 環境

同樣可藉由 kubectl config get-contexts 驗證是否有建置。

k3d cluster create -c stag-conf.yaml --servers-memory 2G --agents-memory 2G

上述的 K3d 配置檔案可直接至本實驗 Repo 查看對應的配置。配置內容可依照自己當下的環境配置。

備註

本實驗 K3d 環境 Ingress 資源預設是將其關閉,需手動安裝 Nginx Ingress

ArgoCD CLI 使用

透過 K3d 和 Helm 安裝 ArgoCD 後,透過 Ingress 資源會提供可連線的端點。首先將會透過此端點進行連線登入 ArgoCD。

$ argocd login argo.cch.com:8443
WARNING: server certificate had error: x509: certificate is valid for ingress.local, not argo.cch.com. Proceed insecurely (y/n)?
WARNING: server certificate had error: x509: certificate is valid for ingress.local, not argo.cch.com. Proceed insecurely (y/n)? y
WARN[0012] Failed to invoke grpc call. Use flag --grpc-web in grpc calls. To avoid this warning message, use flag --grpc-web.
Username: admin
Password:
'admin:login' logged in successfully
Context 'argo.cch.com:8443' updated

透過 argocd context 查看當前連接的集群位置,如果不是上述所建置的環境,可使用 argocd context {NAME} 進行切換。

$ argocd context
CURRENT NAME SERVER
* argo.cch.com:8443 argo.cch.com:8443

$ argocd context argo.cch.com:8443 # 切換

透過下面指令可以看到有一個 Kubernetes 集群被管理。預設 ArgoCD 建立起來時管理的 Kubernetes 群集是 ArgoCD 被安裝到的 Kubernetes 群集。

$ argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.

ArgoCD 變更密碼

預設安裝 ArgoCD 會提供 admin 帳號和一組密碼。如果要進行密碼變更可以透過 argocd account update-password 進行密碼變更。

$ argocd login argo.cch.com:8443 --grpc-web-root-path argocd --username admin
$ argocd account update-password --account admin --grpc-web-root-path argocd
WARN[0000] Failed to invoke grpc call. Use flag --grpc-web in grpc calls. To avoid this warning message, use flag --grpc-web.
*** Enter password of currently logged in user (admin):
*** Enter new password for user admin:
*** Confirm new password for user admin:
Password updated
Context 'argo.cch.com:8443/argocd' updated

管理多個 Kubernetes 集群

ArgoCD 要管理多個 Kubernetes 來說,目前已知會有兩種方式,透過 Secret 資源和透過 CLI 方式,下面會演示這兩種方式。

ArgoCD CLI 與 KUBECONFIG

使用 ArgoCD CLI 會需要使用 KUBECONFIG 讓 ArgoCD 來對集群進行管理。下面就開始演示。

對於每個 K3d 所建立出來對集群的連線是由一些複雜網路技巧所組成,因此預設下 ArgoCD 無法透過 KUBECONFIG 內的連線位置進行存取,需透過容器中 IP。所以這邊讓 K3d 建立的集群都共用同一個 docker 建立的網路

藉由以下方式獲取 k3d-dev-cluster 的 IP 位置。下面表示對於 k3d-dev-cluster 他的 IP 位置是 172.18.0.6。

$ docker exec k3d-dev-cluster-server-0 ifconfig eth0
eth0 Link encap:Ethernet HWaddr 02:42:AC:12:00:06
inet addr:172.18.0.6 Bcast:172.18.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:15514 errors:0 dropped:0 overruns:0 frame:0
TX packets:8103 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:37337554 (35.6 MiB) TX bytes:1535864 (1.4 MiB)

獲取到 IP 後,這邊修改 .kube/configk3d-dev-cluster 的 API Server 連線位置,以讓 ArgoCD 能夠連線。

$ vi .kube/config
....
server: https://dev.cch.com:6446 # 替換成 https://172.18.0.6:6443
...

替換完成後即可透過 ArgoCD CLI 方式加入集群,先透過 argocd login 登入,再來使用 argocd cluster add 新增集群,其格式

argocd cluster add --kubeconfig <path-of-kubeconfig-file> --kube-context string <cluster-context> --name <cluster-name>

實際上執行如下,指定 --kubeconfig--kube-context 並給一個要在 ArgoCD 平台上顯示的名稱(--name)。獲取 Kubernetes context 名稱可以使用 kubectl config get-contexts -o name 指令來獲取。

$ argocd login argo.cch.com:8443 --grpc-web-root-path argocd --username admin
$ argocd cluster add --kubeconfig ~/.kube/config --kube-context string k3d-dev-cluster --name k3d-dev-cluster
WARNING: This will create a service account `argocd-manager` on the cluster referenced by context `k3d-dev-cluster` with full cluster level privileges. Do you want to continue [y/N]? y
INFO[0001] ServiceAccount "argocd-manager" created in namespace "kube-system"
INFO[0001] ClusterRole "argocd-manager-role" created
INFO[0001] ClusterRoleBinding "argocd-manager-role-binding" created
INFO[0006] Created bearer token secret for ServiceAccount "argocd-manager"
Cluster 'https://172.18.0.6:6443' added

新增後,藉由 argocd cluster 指令驗證。可以看到有一個 k3d-dev-cluster 名稱的集群被 ArgoCD 管理。

$ argocd  cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://172.18.0.6:6443 k3d-dev-cluster Unknown Cluster has no applications and is not being monitored.
https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.

ArgoCD 之 Secret 資源管理 Kubernetes 集群

第二種方式是使用 Secret 資源綁定 Kubernetes 集群存取資訊。這用另一種方式讓 ArgoCD 能夠加入要管理的 Kubernetes 集群,這邊會用 ServiceAccount 所綁定的 Token 進行綁定,而非來自 KUBECONFIG 中資訊,基於安全意識原則上能這樣做最好。

接著要至 stage 環境建立要給 ArgoCD 存取的 ServiceAccount 的資訊,記住 ServiceAccount 需要綁定 Token,要給 ArgoCD 使用。步驟如下:

  1. 切換至 stage 環境
$ kubectl config use-context k3d-stage-cluster
  1. 建立 ServiceAccountClusterRoleClusterRoleBinding 的資源
apiVersion: v1
kind: ServiceAccount
metadata:
name: argocd-admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: argocd-admin-role
rules:
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'
- nonResourceURLs:
- '*'
verbs:
- '*'
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: argocd-admin-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: argocd-admin-role
subjects:
- kind: ServiceAccount
name: argocd-admin
namespace: kube-system
  1. ServiceAccount 綁定 Token
apiVersion: v1
kind: Secret
metadata:
name: argocd-admin-token
namespace: kube-system
annotations:
kubernetes.io/service-account.name: argocd-admin
type: kubernetes.io/service-account-token
  1. service-account-token 獲取 CA 與 Token
export CA=$(kubectl get -n kube-system secret/argocd-admin-token -o jsonpath='{.data.ca\.crt}')

export TOKEN=$(kubectl get -n kube-system secret/argocd-admin-token -o jsonpath='{.data.token}' | base64 --decode)
  1. 至 ArgoCD 的 Server 位置,建置 Secret 資源

在建立 Kubernetes 集群資訊給 ArgoCD 時,每個 Secret 資源,必須要有標籤 argocd.argoproj.io/secret-type: cluster,這樣 ArgoCD 才能識別。下面是建立給 ArgoCD 的 Secret 配置。

cat <<EOF |  kubectl -n argo apply --context k3d-argo-cluster  -f -
apiVersion: v1
kind: Secret
metadata:
name: stage-secret
labels:
argocd.argoproj.io/secret-type: cluster
type: Opaque
stringData:
name: stage-cluster
server: https://172.18.0.9:6443
namespaces: "team-a, ingress"
clusterResources: "true"
config: |
{
"bearerToken": "$TOKEN",
"tlsClientConfig": {
"serverName": "k3d-stage-cluster",
"caData": "$CA"
}
}
EOF

關於配置的參數官方描述的很詳細,可查閱官方資源 ArgoCD | clusters

最後透過 argocd cluster 指令,可以看到該從 K3d 建立的 k3d-stage-cluster 群集資源被 ArgoCD 管理。

$ argocd cluster list
SERVER NAME VERSION STATUS MESSAGE PROJECT
https://172.18.0.6:6443 k3d-dev-cluster Unknown Cluster has no applications and is not being monitored.
https://172.18.0.9:6443 (2 namespaces) stage-cluster Unknown Cluster has no applications and is not being monitored.
https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.

如果要移除管理的 Kubernetes 集群可用 argocd cluster rm [SERVER_NAME] 方式行移除。

總結

本實驗,可以讓使用者清楚的讓 ArgoCD 整合第三方 Kubernetes 群集和變更密碼以及使用 ArgoCD CLI。ArgoCD 加入集群是重要的一步,否則無法對後續更高階的 ArgoCD Application 進行管理。後續會有一系列的文章來持續探索 ArgoCD。