此篇將會使用先前這篇文章當作範例,假如還沒有看過前一篇文章的話,可以先去看怎麼在 EKS 上搭建 Fargate。
ArgoCD 是一套自動化部屬工具可以幫我們管控 Kubernetes,並非使用 Kubernetes 就一定得要搭配 ArgoCD, 只是 ArgoCD 有 UI 畫面可以直接給我們看,所以較為直觀,不然也可以 Kubernetes 搭配 Jenkins Pipeline 等 CI/CD。
以下圖片為 ArgoCD 官網的 gif ,可以從圖片看到,我們可以透過 UI 很直觀地看到 Kubernetes 目前所擁有的資源以及數量等。
首先我們透過 helm 安裝 argocd , 這樣到時再刪除資料的時候比較方便,因為可以透過刪除 namespace 的方式刪除資料。
- 首先透過 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 近來。
- 首先點選 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 創建用戶
- 首先進入 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
待續
參考資源: