共計 4941 個字符,預計需要花費 13 分鐘才能閱讀完成。
這篇文章給大家介紹怎樣在 K8S 中使用 Argo CD 做持續部署,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
什么是 ArgoCD
Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.
Argo CD 是一個基于 Kubernetes 的聲明式的 GitOps 工具。
在說 Argo CD 之前,我們先來了解一下什么是 GitOps。
什么是 GitOps
GitOps 是以 Git 為基礎,使用 CI/CD 來更新運行在云原生環境的應用,它秉承了 DevOps 的核心理念 –“構建它并交付它 (you built it you ship it)”。
概念說起來有點虛,我畫了張圖,看了你就明白了。
當開發人員將開發完成的代碼推送到 git 倉庫會觸發 CI 制作鏡像并推送到鏡像倉庫 CI 處理完成后,可以手動或者自動修改應用配置,再將其推送到 git 倉庫 GitOps 會同時對比目標狀態和當前狀態,如果兩者不一致會觸發 CD 將新的配置部署到集群中
其中,目標狀態是 Git 中的狀態,現有狀態是集群的里的應用狀態。
不用 GitOps 可以么?
當然可以,我們可以使用 kubectl、helm 等工具直接發布配置,但這會存在一個很嚴重的安全問題,那就是密鑰共享。
為了讓 CI 系統能夠自動的部署應用,我們需要將集群的訪問密鑰共享給它,這會帶來潛在的安全問題。
ArgoCD
Argo CD 遵循 GitOps 模式,使用 Git 存儲庫存儲所需應用程序的配置。
Kubernetes 清單可以通過以下幾種方式指定:
kustomize 應用程序 helm 圖表 ksonnet 應用程序 jsonnet 文件基于 YAML/json 配置配置管理插件配置的任何自定義配置管理工具
Argo CD 實現為 kubernetes 控制器,它持續監視運行中的應用程序,并將當前的活動狀態與期望的目標狀態進行比較 (如 Git repo 中指定的那樣)。如果已部署的應用程序的活動狀態偏離了目標狀態,則認為是 OutOfSync。Argo CD 報告和可視化這些差異,同時提供了方法,可以自動或手動將活動狀態同步回所需的目標狀態。在 Git repo 中對所需目標狀態所做的任何修改都可以自動應用并反映到指定的目標環境中。
Argo CD 就處在如下位置:
它的優勢總結如下:
應用定義、配置和環境信息是聲明式的,并且可以進行版本控制;應用部署和生命周期管理是全自動化的,是可審計的,清晰易懂;Argo CD 是一個獨立的部署工具,支持對多個環境、多個 Kubernetes 集群上的應用進行統一部署和管理 實踐
前提:有一個可用的 Kubernetes 集群。
實驗環境:
kubernetes:1.17.2argo cd:latest 安裝 Argo CD
安裝很簡單,不過在實際使用中需要對數據進行持久化。
我這里直接使用官方文檔的安裝命令:
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
執行成功后會在 argocd 的 namespace 下創建如下資源。
# kubectl get all -n argocd
NAME READY STATUS RESTARTS AGE
pod/argocd-application-controller-0 1/1 Running 0 16h
pod/argocd-dex-server-74d9998fdb-mvpmh 1/1 Running 0 16h
pod/argocd-redis-59dbdbb8f9-msxrp 1/1 Running 0 16h
pod/argocd-repo-server-599bdc7cf5-ccv8l 1/1 Running 0 16h
pod/argocd-server-576b4c7ff4-cnp9d 1/1 Running 0 16h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/argocd-dex-server ClusterIP 10.105.217.139 none 5556/TCP,5557/TCP,5558/TCP 16h
service/argocd-metrics ClusterIP 10.97.116.36 none 8082/TCP 16h
service/argocd-redis ClusterIP 10.105.63.34 none 6379/TCP 16h
service/argocd-repo-server ClusterIP 10.111.153.131 none 8081/TCP,8084/TCP 16h
service/argocd-server ClusterIP 10.105.229.250 none 80/TCP,443/TCP 16h
service/argocd-server-metrics ClusterIP 10.104.8.45 none 8083/TCP 16h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/argocd-dex-server 1/1 1 1 16h
deployment.apps/argocd-redis 1/1 1 1 16h
deployment.apps/argocd-repo-server 1/1 1 1 16h
deployment.apps/argocd-server 1/1 1 1 16h
NAME DESIRED CURRENT READY AGE
replicaset.apps/argocd-dex-server-74d9998fdb 1 1 1 16h
replicaset.apps/argocd-redis-59dbdbb8f9 1 1 1 16h
replicaset.apps/argocd-repo-server-599bdc7cf5 1 1 1 16h
replicaset.apps/argocd-server-576b4c7ff4 1 1 1 16h
NAME READY AGE
statefulset.apps/argocd-application-controller 1/1 16h
訪問 Argo server 的方式有兩種:
通過 web ui 使用 argocd 客戶端工具
我這里直接使用 web ui 進行管理。
通過 kubectl edit -n argocd svc argocd-server 將 service 的 type 類型改為 NodePort。改完后通過以下命令查看端口:
# kubectl get svc -n argocd
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
argocd-dex-server ClusterIP 10.105.217.139 none 5556/TCP,5557/TCP,5558/TCP 17h
argocd-metrics ClusterIP 10.97.116.36 none 8082/TCP 17h
argocd-redis ClusterIP 10.105.63.34 none 6379/TCP 17h
argocd-repo-server ClusterIP 10.111.153.131 none 8081/TCP,8084/TCP 17h
argocd-server NodePort 10.105.229.250 none 80:32109/TCP,443:30149/TCP 17h
argocd-server-metrics ClusterIP 10.104.8.45 none 8083/TCP 17h
然后通過 http://IP:32109 訪問頁面,如下:
登錄賬號為 admin,密碼通過以下命令獲取。
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d / -f 2
然后進入如下界面。
創建應用
這里僅僅是為了測試 argo,所以并沒有做 ci 部分。
我在 gitlab 上準備了一個倉庫,倉庫里的文件很簡單,如下:
其中 manifests 下就是一個 deployment 文件,內容如下:
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: devops-argocd-test
name: devops-argocd-test
namespace: default
spec:
minReadySeconds: 60
progressDeadlineSeconds: 600
replicas: 1
revisionHistoryLimit: 10
selector:
matchLabels:
app: devops-argocd-test
template:
metadata:
labels:
app: devops-argocd-test
spec:
containers:
- name: devops-argocd-test
image: registry.cn-hangzhou.aliyuncs.com/rookieops/argocd-test-app:v1
imagePullPolicy: Always
ports:
- containerPort: 8080
name: tcp-8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
labels:
app: devops-argocd-test
name: devops-argocd-test
namespace: default
spec:
ports:
- name: tcp-8080
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: devops-argocd-test
sessionAffinity: None
type: NodePort
現在我們在 Argo 里創建應用,步驟如下:
(1)添加倉庫地址,Settings → Repositories,點擊 Connect Repo using HTTPS 按鈕:
填入以下信息。
驗證通過后顯示如下:
(2)創建應用
創建完成后如下所示:
由于我設置的是手動 SYNC,所以需要點一下下面的 SYNC 進行同步。
然后可以看到狀態都變成正常。
這時候我們在集群里可以看到創建了 v1 版本的應用了。
# kubectl get pod | grep devops-argocd-test
devops-argocd-test-7f5fdd9fcf-xbzmp 1/1 Running 0 118s
# kubectl get svc | grep devops-argocd-test
devops-argocd-test NodePort 10.97.159.140 none 8080:31980/TCP 2m6s
這時候訪問應用,如下:
配置變更
接下來我手動進行配置變更,修改 manifests 下的 deploymeny.yaml 文件中的鏡像為 v2 版本,如下:
然后提交到倉庫。
這是到 ArgoCD 中可以看到狀態變成了 OutOfSync
這時候再手動 sync 一下,直到狀態都變正常。再訪問上面的應用。
可以看到應用已經更新部署了。
我們可以看到整個應用的關系狀態,如下:
還可以看到部署歷史。
也可以通過這個界面進行回滾。
關于怎樣在 K8S 中使用 Argo CD 做持續部署就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。