ArgoCD 搭配 Kubernetes

Gary Ng
16 min readOct 7, 2024

--

此篇將會使用先前這篇文章當作範例,假如還沒有看過前一篇文章的話,可以先去看怎麼在 EKS 上搭建 Fargate。

ArgoCD 是一套自動化部屬工具可以幫我們管控 Kubernetes,並非使用 Kubernetes 就一定得要搭配 ArgoCD, 只是 ArgoCD 有 UI 畫面可以直接給我們看,所以較為直觀,不然也可以 Kubernetes 搭配 Jenkins Pipeline 等 CI/CD。

以下圖片為 ArgoCD 官網的 gif ,可以從圖片看到,我們可以透過 UI 很直觀地看到 Kubernetes 目前所擁有的資源以及數量等。

首先我們透過 helm 安裝 argocd , 這樣到時再刪除資料的時候比較方便,因為可以透過刪除 namespace 的方式刪除資料。

  1. 首先透過 helm 增加 argocd repo
helm repo add argo https://argoproj.github.io/argo-helm

2. helm 安裝 argocd 到 argocd namespace

helm install argocd argo/argo-cd -n argocd --create-namespace

回傳結果

檢查 namespace argocd 是否有正在運行的 pod

kubectl get pods -n argocd

到時本地測試可以連到 argocd , 所以使用 port-forward

kubectl port-forward service/argocd-server -n argocd 8080:443

假如之後是部署到雲端的話改為使用 ingress

3. 執行完 port-forward 後即可輸入 http://127.0.0.1:8080 會進入到 argocd 登入畫面

4. ArgoCD 登入

ArgoCD 首次登入的使用者為 admin, 而密碼則是透過以下指令取得

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

5. 登入畫面

參考資源;

ArgoCD 建置好後,接著將服務新增至 ArgoCD 中

我們這邊先使用官網的範例做 demo, 之後再加入自己撰寫的 application 近來。

  1. 首先點選 NEW APP

1–1 輸入 General 資訊

Application Name: 輸入 guestbook

Project Name: 選擇 default (目前只有 default)

SYNC Policy: 選擇手動同步

1–2 設定 ArgoCD Source 資訊

Repository URL: https://github.com/argoproj/argocd-example-apps.git

Revision: HEAD

Path: 選擇來源為 guestbook 資料夾內的檔案

1–3 設定目的地

Cluster URL: 選擇 https://kubernetes.default.svc, 意思是使用該 Cluster 的 kubernetes 這個 svc, 然後位在 default namespace。

格式如下:

<service name>.<namespace name>.svc

Namespace: default

1–4 資料夾設定,看是否需要遞迴抓設定檔,抑或是排程掉特定檔案或者資料夾等,不過這邊目前都使用預設值

我們除了用 GUI 操作外,我們也可以看 GUI 撰寫出來的 YAML File, 以目前的範例 yaml file 內容如下

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: guestbook
spec:
destination:
name: ''
namespace: default
server: https://kubernetes.default.svc
source:
path: guestbook
repoURL: https://github.com/argoproj/argocd-example-apps.git
targetRevision: HEAD
sources: []
project: default

1–5 都設定完畢後點選 Create

1–6 建立完後在 argocd dashboard 即可看到我們建立的 application, 然後因為剛剛在建立的時候是使用 manual Sync, 所以這邊的 status 還是為 OutOfSync (尚未同步)

1–7 點選 Sync 做同步

1–8 點選同步

同步中

1–9 guestbook 圖表資訊

我的動態更新 deploy replica 的數量看 UI 會怎麼呈現

增加 deploy 的 replica

kubectl scale --replicas=2 deployment/guestbook-ui

會看到 ArgoCD UI 的 guestbook application deploy 多了一個 pod, 且狀態變成為 OutOfSync

可以透過 Diff 看 OutOfSync 的原因, 看到是因為 replicas 從1 變成 2 所以 Status 變成 OutOfSync

假如在頁面點選 Sync 的話,會重新同步 git 的 replica, 所以這個範例來看的話 replica 的數量會從 2 變回 1

建置 Application 、AppProject yaml file for ArgoCD

待續

抓取自己建立的 private repository

可以為 github 增加 personal token 然後在 argocd 將 repo 的 username 以及 token 設定在 argocd。

滾動式更新(rolling update) & 藍綠部署 (Blue-Green Deployment)

滾動式更新 (rolling update)

nginx-deploy.yaml 更改成如下

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
labels:
nginx: deploy
annotations:
kubernetes.io/change-cause: <change cause> # 改動原因
spec:
selector:
matchLabels:
nginx: pod
# rolling update
minReadySeconds: 5
# 紀錄 history record
revisionHistoryLimit: 5
strategy:
# 設定滾動式更新
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 比原先多出多少 pod
maxUnavailable: 1 # 最多可以有多少 pod 不可用
template:
metadata:
name: nginx-pod
labels:
nginx: pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- name: web-port
containerPort: 80
# 因為運行在 minikube 上,因此先不限制資源, 否則要對 minikube 增加資源
#resources:
# requests:
# cpu: 500m
# memory: 1Gi
# limits:
# cpu: 500m
# memory: 1Gi

參數說明:

annotations.kubernetes.io/change-cause: 改動原因

minReadySeconds: rolling update 等待時間

revisionHistoryLimit: 版本紀錄數量

strategy:
type: RollingUpdate # 啟用滾動式更新
rollingUpdate:
maxSurge: 1 # 比原先多出多少 pod, 也可以使用比例 (%)
maxUnavailable: 1 # 最多可以有多少 pod 不可用

套用新的 nginx-deploy.yaml

kubectl apply -f ./nginx-deploy.yaml

檢查 rollout history ,這指令會列出滾動更新的紀錄

kubectl rollout history deploy/nginx-deploy

查看 argocd 介面資訊

參考資源:

水平 AutoScaler

水平 AutoScaler 這邊會使用到 Kubernetes 的另外一個類型叫做 HorizontalPodAutoScaler

啟用 minikube metric-server

minikube addons enable metrics-server

horizontal-autoscaler.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
labels:
nginx: hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deploy
minReplicas: 1
maxReplicas: 2
# 另外一種寫法
# targetCPUUtilizationPercentage: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageValue: 10

套用 hpa

kubectl apply -f horizontal-autoscaler.yaml

查看是否建立成功

kubectl get hpa
kubectl describe hpa nginx-hpa

可以透過 top 去查看 pod、node 的資源狀況

kubectl top pod

參考資源:

設定 user role 權限管理

使用 argocd configmap 以及 argocd rbac 創建用戶

  1. 首先進入 argocd server pod

1–1 找出 argocd server pod name

kubectl get pods -n argocd

1–2 進入 argocd server pod

kubectl exec -n argocd -it argocd-server-d446f6cb8-cmsk9 -- bash

1–3 登入 argocd

argocd login argocd-server.argocd.svc:80

輸入 admin 以及 admin 的 password

將 argocd config 導出成 yaml

kubectl get cm -n argocd argocd-cm -o yaml > argocd-cm.yaml

將 argocd rbac config map 導出成 yaml

kubectl get cm -n argocd argocd-rbac-cm -o yaml > argocd-rbac-cm.yaml

在 argocd-cm.yaml 設定新的使用者

在 data 區塊多增加 accounts.example-user: login

套用 argocd-cm.yaml

kubectl replace -f argocd-cm.yaml --force

透過 argocd cli 檢查是否用戶以創立成功

argocd account list

設定該帳號的 rbac 權限, 編輯 argocd-rbac-cm.yaml

policy.csv 改為以下,允許 example-user 對於 applications 擁有 get 的權限。

policy.csv: |
p, example-user, applications, get, *, allow

套用 rbac 變動

kubectl replace -f argocd-rbac-cm.yaml --force

設定 password

argocd account update-password --account <account> --current-password <admin password> --new-password <new password>

更新完成後即可透過 UI 進行登入。

參考資料:

如何災害復原

可以使用 K8S Schedule 搭配 argocd command, 透過 argocd command login 到 argocd server, 然後在進行備份指令,將備份檔案定期上傳到 AWS S3 之類的 data lake

參考資料:

使用 Jenkins + ArgoCD 建置 CI/CD

待續

參考資源:

--

--

Gary Ng
Gary Ng

Written by Gary Ng

軟體工程師、後端工程師

No responses yet