ArgoCDのRollBackを試してみる

こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

私はこの2,3日でmicrok8sベースのKubernetes上にArgoCDを使ったGitOps,CI/CD環境を構築し、色々勉強してみました。おかげで朧気ながらGitOpsやCI/CDの利便性や実現したいことが見えてきた気がしております。やはり技術は理論と実践に限ります。

https://qiita.com/ohtsuka-shota/items/a6b7a68150426011c7c1

https://qiita.com/ohtsuka-shota/items/8ba212cf5007ffebafb4

https://qiita.com/ohtsuka-shota/items/7508cc6e1cc2f766312b

今回はArgoCDの持つバージョン管理並びにRollBackについて実際に試してみたいと思います。

# 用語
## initContainer
アプリケーションを提供するコンテナを起動させる前に起動するコンテナで、前処理的な事をさせたい時に使います。
今回はhttpdのindex.htmlファイルを生成させるために使用しています。initContainerが生成したindex.htmlをアプリケーションを提供するコンテナに読み取らせています。

イメージとしては以下です。まずinitContainerが立ち上がり処理を開始します。イメージではApplication Containerも落とし込んでいますがこのタイミングでは存在しておりません。ここではindex.htmlファイルをk8sノードに出力しています。
![k8s_3-ページ6.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/3fe683fc-3aec-1804-f32c-0c23608309ef.png)

initContainerの処理が正常終了すると今度はApplication Containerが立ち上がり処理を開始します。この時initContainerは削除されていなくなります。Application ContainerはinitContainerがノード上に用意したindex.htmlをマウントして使用します。
![k8s_3-ページ6のコピー.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/d9781ef0-9855-4f75-20f3-4ceea69b7275.png)


以下公式サイトです。

https://kubernetes.io/ja/docs/concepts/workloads/pods/init-containers/

# 構築イメージ
基本的に前回と同じです。
今回はhttpdを使用し、htmlのファイルの中身をver1.0→ver2.0→ver3.0とアップデート的な事をAgroCDを通じて実施していきます。その後ver3.0からver2.0にどうやってRollBackするのかを確認していきたいと思います。

![k8s_3-ページ8.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/b264fc08-8592-5a7a-150f-ebbbb1ca7324.png)

# 構築
早速ですがVSCodeで検証に必要なyamlを2つ用意しました。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/7333ed76-840d-463b-a8f5-84f0074e3ce5)

内容は以下です。検証に使うhttpd pod（正確にはDeployment）とそれにクラスタ外部からアクセスする為のNodePortです。
```argo-httpd-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argo-httpd-deploy
  namespace: argo-app-ns
  labels:
    app: httpd
    version: "1.0"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      initContainers:
      - name: create-index
        image: ubuntu:latest
        args:
        - /bin/sh
        - -c
        - echo "Hello ArgoCD ver1.0" > /tmp/index.html
        volumeMounts:
        - mountPath: /tmp
          name: httpd-index
      containers:
      - name: httpd-container
        image: httpd:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/local/apache2/htdocs/
          name: httpd-index
      volumes:
      - name: httpd-index
        hostPath:
          path: /tmp
          type: Directory
```
```argo-httpd-nodeport.yaml
apiVersion: v1 
kind: Service 
metadata: 
  name: argo-httpd-nodeport
  namespace: argo-app-ns 
spec: 
  ports: 
  - name: for-httpd 
    port: 80 
    protocol: TCP 
    targetPort: 80 
    nodePort: 30002 
  selector: 
    app: httpd
  type: NodePort
```
これをGitLabにcommitしていきます。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/dc432f63-3909-437b-b34b-4d5249e3c676)

更新できていることをGitLabのWebUIから確認します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/ee292ff2-966d-49e7-abab-e352b7a52698)

ArgoCDがk8sクラスタにデプロイしてくれているかを確認します。出来ていそうですね。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/f42ee2c1-b637-47a9-8c27-dc630f903419)
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/2bd18391-5208-4083-b430-12f10dcadf31)

Webブラウザ経由でアクセス出来るか確認します。今回の場合http://(ノードのIPアドレス):30002でアクセス出来ます。initContainerが作成してくれたhtmlをApplication Containerがマウントして使用してくれています。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/e435103a-cef6-4dda-86d8-2d7fa2c13956)

この後、VSCodeでver2.0ようにyamlを更新します。
以下★の部分を修正しました。
```argo-httpd-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argo-httpd-deploy
  namespace: argo-app-ns
  labels:
    app: httpd
    version: "2.0"  ★
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      initContainers:
      - name: create-index
        image: ubuntu:latest
        args:
        - /bin/sh
        - -c
        - echo "Hello ArgoCD ver2.0" > /tmp/index.html  ★
        volumeMounts:
        - mountPath: /tmp
          name: httpd-index
      containers:
      - name: httpd-container
        image: httpd:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/local/apache2/htdocs/
          name: httpd-index
      volumes:
      - name: httpd-index
        hostPath:
          path: /tmp
          type: Directory
```

上記yamlをGitLabにcommit。ArgoCDが自動でデプロイしてくれるので、改めてWebブラウザでアクセスします。ver2.0となっていることが分かります。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/eae949c6-f760-481f-b1fc-b67e1b1bcf8f)

続いてver3.0にします。手順は上記と同じです。
```argo-httpd-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: argo-httpd-deploy
  namespace: argo-app-ns
  labels:
    app: httpd
    version: "3.0"  ★
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpd
  template:
    metadata:
      labels:
        app: httpd
    spec:
      initContainers:
      - name: create-index
        image: ubuntu:latest
        args:
        - /bin/sh
        - -c
        - echo "Hello ArgoCD ver3.0" > /tmp/index.html  ★
        volumeMounts:
        - mountPath: /tmp
          name: httpd-index
      containers:
      - name: httpd-container
        image: httpd:latest
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/local/apache2/htdocs/
          name: httpd-index
      volumes:
      - name: httpd-index
        hostPath:
          path: /tmp
          type: Directory
```
デプロイ後Webブラウザで確認した図です。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/182ea5d8-74a7-4ac8-b7b6-ba6301c4110a)
GitLab上でもver3.0となっていることが確認出来ます。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/4f23ae84-157a-4196-b6f6-e271a592b338)
この状態からArgoCDでRollBackを実行していきます。
赤枠内のHISTORY AND ROLLBACKを押下します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/659b098d-66e4-42d0-9d89-9211b5dee76c)
今までの更新履歴が確認出来るので、今回の目的であるver2.0のものを探します。
見つけましたらRollBackを押下します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/e23efe97-31d3-4edb-bb35-f5af45916c50)
以下の様なalertが出力されます。
どうやら「RollBackするんだったら自動同期を切る必要があるけど良いんか？」と言われていますね。
ここまで特に明記しておりませんでしたが、ArgoCDは3分ごとにGitLabと同期を取るようにしているのですがそれをOFFにするということです。
OKを押下します。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/b0a3c342-16da-48c9-b128-268c5eff850d)
RollBack処理が開始しステータスなどが正常になりましたらWebブラウザでアクセスしてみます。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/6d79044d-ebda-4d39-8cbd-f7eef1099ea1)
ver2.0になっていることが分かりますね。RollBackが成功しました。
![Image](https://github.com/ohtsuka-shota/ascii0-python-encrypt-decrypt/assets/127835743/22b061cf-53ce-411d-bb58-419e1ef8b214)

ただ、このタイミングで環境を見てみると、自動同期が出来なくなったり、ArgoCD/k8sではver2.0環境ではあるもののGitLabではver3.0環境のyamlが存在するようになり、GitOpsが実現できなくなっているような気がします。
ArgoCDでRollBackをするのは微妙な気がしました・・・
GitLab側からyaml修正していく方が良いような気がするのですがどうなんでしょう・・・？
![k8s_3-ページ10.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/2bb1bd24-c374-1bde-7a96-3068e64a2c0f.png)