在K8S中使用Argo CD作持續部署


做者 | 喬克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

概念提及來有點虛,我畫了張圖,看了你就明白了。安全

image.png
  • 當開發人員將開發完成的代碼推送到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就處在以下位置:

image.png

它的優點總結以下:

  • 應用定義、配置和環境信息是聲明式的,而且能夠進行版本控制;
  • 應用部署和生命週期管理是全自動化的,是可審計的,清晰易懂;
  • 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訪問頁面,以下:

image.png

登陸帳號爲admin,密碼經過如下命令獲取。

kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2

而後進入以下界面。

image.png

建立應用

這裏僅僅是爲了測試argo,因此並無作ci部分。

我在gitlab上準備了一個倉庫,倉庫裏的文件很簡單,以下:

image.png

其中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 按鈕:

image.png

填入如下信息。

image.png

驗證經過後顯示以下:

image.png

(2)建立應用

image.png
image.png

建立完成後以下所示:

image.png

因爲我設置的是手動SYNC,因此須要點一下下面的SYNC進行同步。

而後能夠看到狀態都變成正常。

image.png

這時候咱們在集羣裏能夠看到建立了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

這時候訪問應用,以下:

image.png

配置變動

接下來我手動進行配置變動,修改manifests下的deploymeny.yaml文件中的鏡像爲v2版本,以下:

image.png

而後提交到倉庫。

這是到ArgoCD中能夠看到狀態變成了OutOfSync

image.png

這時候再手動sync一下,直到狀態都變正常。再訪問上面的應用。

image.png
image.png

能夠看到應用已經更新部署了。

咱們能夠看到整個應用的關係狀態,以下:

image.png

還能夠看到部署歷史。

image.png

也能夠經過這個界面進行回滾。

image.png

不過這個回滾並不會回滾gitlab上的代碼哈。

我上面設置的是手動,你能夠設置爲自動,本身動手測試一番吧。

官方文檔:https://argoproj.github.io/argo-cd/#features



 

進羣請掃碼加青牛踏雪



本文分享自微信公衆號 - Kubernetes技術棧(k8stech)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索