こんにちは。
株式会社クラスアクト インフラストラクチャ事業部の大塚です。
私はこの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ノードに出力しています。
initContainerの処理が正常終了すると今度はApplication Containerが立ち上がり処理を開始します。この時initContainerは削除されていなくなります。Application ContainerはinitContainerがノード上に用意したindex.htmlをマウントして使用します。
以下公式サイトです。
構築イメージ
基本的に前回と同じです。
今回はhttpdを使用し、htmlのファイルの中身をver1.0→ver2.0→ver3.0とアップデート的な事をAgroCDを通じて実施していきます。その後ver3.0からver2.0にどうやってRollBackするのかを確認していきたいと思います。
構築
早速ですがVSCodeで検証に必要なyamlを2つ用意しました。
内容は以下です。検証に使うhttpd pod(正確にはDeployment)とそれにクラスタ外部からアクセスする為のNodePortです。
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
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のWebUIから確認します。
ArgoCDがk8sクラスタにデプロイしてくれているかを確認します。出来ていそうですね。
Webブラウザ経由でアクセス出来るか確認します。今回の場合http://(ノードのIPアドレス):30002でアクセス出来ます。initContainerが作成してくれたhtmlをApplication Containerがマウントして使用してくれています。
この後、VSCodeでver2.0ように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となっていることが分かります。
続いてver3.0にします。手順は上記と同じです。
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ブラウザで確認した図です。
GitLab上でもver3.0となっていることが確認出来ます。
この状態からArgoCDでRollBackを実行していきます。
赤枠内のHISTORY AND ROLLBACKを押下します。
今までの更新履歴が確認出来るので、今回の目的であるver2.0のものを探します。
見つけましたらRollBackを押下します。
以下の様なalertが出力されます。
どうやら「RollBackするんだったら自動同期を切る必要があるけど良いんか?」と言われていますね。
ここまで特に明記しておりませんでしたが、ArgoCDは3分ごとにGitLabと同期を取るようにしているのですがそれをOFFにするということです。
OKを押下します。
RollBack処理が開始しステータスなどが正常になりましたらWebブラウザでアクセスしてみます。
ver2.0になっていることが分かりますね。RollBackが成功しました。
ただ、このタイミングで環境を見てみると、自動同期が出来なくなったり、ArgoCD/k8sではver2.0環境ではあるもののGitLabではver3.0環境のyamlが存在するようになり、GitOpsが実現できなくなっているような気がします。
ArgoCDでRollBackをするのは微妙な気がしました・・・
GitLab側からyaml修正していく方が良いような気がするのですがどうなんでしょう・・・?