您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎樣在K8S中使用Argo CD做持續部署,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.
Argo CD是一個基于Kubernetes的聲明式的GitOps工具。
在說Argo CD之前,我們先來了解一下什么是GitOps。
GitOps是以Git為基礎,使用CI/CD來更新運行在云原生環境的應用,它秉承了DevOps的核心理念--“構建它并交付它(you built it you ship it)”。
概念說起來有點虛,我畫了張圖,看了你就明白了。
其中,目標狀態是Git中的狀態,現有狀態是集群的里的應用狀態。
不用GitOps可以么?
當然可以,我們可以使用kubectl、helm等工具直接發布配置,但這會存在一個很嚴重的安全問題,那就是密鑰共享。
為了讓CI系統能夠自動的部署應用,我們需要將集群的訪問密鑰共享給它,這會帶來潛在的安全問題。
Argo CD遵循GitOps模式,使用Git存儲庫存儲所需應用程序的配置。
Kubernetes清單可以通過以下幾種方式指定:
Argo CD實現為kubernetes控制器,它持續監視運行中的應用程序,并將當前的活動狀態與期望的目標狀態進行比較(如Git repo中指定的那樣)。如果已部署的應用程序的活動狀態偏離了目標狀態,則認為是OutOfSync。Argo CD報告和可視化這些差異,同時提供了方法,可以自動或手動將活動狀態同步回所需的目標狀態。在Git repo中對所需目標狀態所做的任何修改都可以自動應用并反映到指定的目標環境中。
Argo CD就處在如下位置:
它的優勢總結如下:
前提:有一個可用的Kubernetes集群。
實驗環境:
安裝很簡單,不過在實際使用中需要對數據進行持久化。
我這里直接使用官方文檔的安裝命令:
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進行管理。
通過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做持續部署就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。