6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

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

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

用語

initContainer

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

イメージとしては以下です。まずinitContainerが立ち上がり処理を開始します。イメージではApplication Containerも落とし込んでいますがこのタイミングでは存在しておりません。ここではindex.htmlファイルをk8sノードに出力しています。
k8s_3-ページ6.drawio.png

initContainerの処理が正常終了すると今度はApplication Containerが立ち上がり処理を開始します。この時initContainerは削除されていなくなります。Application ContainerはinitContainerがノード上に用意したindex.htmlをマウントして使用します。
k8s_3-ページ6のコピー.drawio.png

以下公式サイトです。

構築イメージ

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

k8s_3-ページ8.drawio.png

構築

早速ですがVSCodeで検証に必要なyamlを2つ用意しました。
Image

内容は以下です。検証に使う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

更新できていることをGitLabのWebUIから確認します。
Image

ArgoCDがk8sクラスタにデプロイしてくれているかを確認します。出来ていそうですね。
Image
Image

Webブラウザ経由でアクセス出来るか確認します。今回の場合http://(ノードのIPアドレス):30002でアクセス出来ます。initContainerが作成してくれたhtmlをApplication Containerがマウントして使用してくれています。
Image

この後、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

続いて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
GitLab上でもver3.0となっていることが確認出来ます。
Image
この状態からArgoCDでRollBackを実行していきます。
赤枠内のHISTORY AND ROLLBACKを押下します。
Image
今までの更新履歴が確認出来るので、今回の目的であるver2.0のものを探します。
見つけましたらRollBackを押下します。
Image
以下の様なalertが出力されます。
どうやら「RollBackするんだったら自動同期を切る必要があるけど良いんか?」と言われていますね。
ここまで特に明記しておりませんでしたが、ArgoCDは3分ごとにGitLabと同期を取るようにしているのですがそれをOFFにするということです。
OKを押下します。
Image
RollBack処理が開始しステータスなどが正常になりましたらWebブラウザでアクセスしてみます。
Image
ver2.0になっていることが分かりますね。RollBackが成功しました。
Image

ただ、このタイミングで環境を見てみると、自動同期が出来なくなったり、ArgoCD/k8sではver2.0環境ではあるもののGitLabではver3.0環境のyamlが存在するようになり、GitOpsが実現できなくなっているような気がします。
ArgoCDでRollBackをするのは微妙な気がしました・・・
GitLab側からyaml修正していく方が良いような気がするのですがどうなんでしょう・・・?
k8s_3-ページ10.drawio.png

6
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?