做者 | 喬克git
持續部署這個詞對技術人員來講並不陌生,不少時候咱們都將CI和CD揉在一塊兒了,今天咱們將他們分開。github
什麼是ArgoCD
Argo CD is a declarative, GitOps continuous delivery tool for Kubernetes.web
Argo CD是一個基於Kubernetes的聲明式的GitOps工具。redis
在說Argo CD以前,咱們先來了解一下什麼是GitOps。json
什麼是GitOps
GitOps是以Git爲基礎,使用CI/CD來更新運行在雲原生環境的應用,它秉承了DevOps的核心理念--「構建它並交付它(you built it you ship it)」。api
概念提及來有點虛,我畫了張圖,看了你就明白了。安全
-
當開發人員將開發完成的代碼推送到git倉庫會觸發CI製做鏡像並推送到鏡像倉庫 -
CI處理完成後,能夠手動或者自動修改應用配置,再將其推送到git倉庫 -
GitOps會同時對比目標狀態和當前狀態,若是二者不一致會觸發CD將新的配置部署到集羣中
其中,目標狀態是Git中的狀態,現有狀態是集羣的裏的應用狀態。微信
不用GitOps能夠麼?session
固然能夠,咱們可使用kubectl、helm等工具直接發佈配置,但這會存在一個很嚴重的安全問題,那就是密鑰共享。app
爲了讓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.2 -
argo 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一下,直到狀態都變正常。再訪問上面的應用。
能夠看到應用已經更新部署了。
咱們能夠看到整個應用的關係狀態,以下:
還能夠看到部署歷史。
也能夠經過這個界面進行回滾。
不過這個回滾並不會回滾gitlab上的代碼哈。
我上面設置的是手動,你能夠設置爲自動,本身動手測試一番吧。
官方文檔:https://argoproj.github.io/argo-cd/#features
進羣請掃碼加青牛踏雪
本文分享自微信公衆號 - Kubernetes技術棧(k8stech)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。