OpenShift GitOps Lab - OpenShift GitOps
OpenShift GitOps
GitOpsは、Gitワークフローを活用してインフラストラクチャとアプリケーションの構成を管理する一連のプラクティスです。Gitリポジトリに置かれたコードをSingle Source of Truthとみなし、コードとインフラを常に同じ状態に保つ運用のベストプラクティスをGitOpsと呼びます。インフラストラクチャとアプリケーションの定義を「コード」として定義することで、インフラストラクチャとアプリケーションの構成変更を複数のクラスターに簡単に反映させます。
-
クラスタの構成を定期的に確認します。
-
クラスターを既知の状態から回復または再作成します。
-
既知の状態でクラスターを作成します。
-
構成の変更を複数のクラスターに適用または元に戻します。
-
テンプレート化された構成をさまざまな環境に関連付けます。
ArgoCD は、Kubernetes用のGitOps継続的デリバリーツールです。指定されたターゲット環境での望ましいアプリケーション状態を確認しデプロイを自動化します。アプリケーションのデプロイでは、ブランチ、タグ、または Gitコミットで特定のバージョンのマニフェストに固定された更新を追跡できます。
このセクションでは、OpenShiftのGitOpsについて説明します。
Argo CD サーバーへの接続
Argo CDインスタンスにCLIとGUIを用いて接続します。Argo CDのAPIサーバーのURLを見つけるためには、次のコマンドを実行します。
export ARGOCD_SERVER_URL=$(oc get routes -n openshift-gitops | grep openshift-gitops-server | awk '{print $2}')
Argo CDサーバのURLが取得できたことを確認するために、次のコマンドを実行します。
echo $ARGOCD_SERVER_URL
次のように出力されます(値は環境ごとに異なるので、出力結果をコピーしてください)
openshift-gitops-server-openshift-gitops.crc-dzk9v-master-0.crc.ohwkzih58pxs.instruqt.io
adminアカウントのデフォルトのパスワードを出力します。
oc extract secret/openshift-gitops-cluster -n openshift-gitops --to=-
次のように出力されます(値は環境ごとに異なるので、出力結果をコピーしてください)
# admin.password
rfUb1WOyaLipTnkA8c93GNZtuJ5RBQlH
ターミナルからログインするためには以下のコマンドを実行します。
argocd login $ARGOCD_SERVER_URL
ログインアカウントは admin
、パスワードは先程 oc extract
を実行して得られた値です。
-
Username: admin
-
Password: oc extractの結果
自己署名証明書を利用しているため、ログイン処理を継続するか確認されますが y
を選択して続けます。
WARNING: server certificate had error: x509: certificate is valid for openshift-gitops, openshift-gitops-grpc, openshift-gitops.openshift-gitops.svc.cluster.local, not openshift-gitops-server-openshift-gitops.crc-dzk9v-master-0.crc.ohwkzih58pxs.instruqt.io. Proceed insecurely (y/n)? y
Username: admin
Password:
'admin:login' logged in successfully
Context 'openshift-gitops-server-openshift-gitops.crc-dzk9v-master-0.crc.ohwkzih58pxs.instruqt.io' updated
OpenShift Web コンソールの Application Launcher タブからショートカットをクリックして Argo CD を見つけることもできます。
アクセスすると「警告:将来の潜在的なセキュリティリスク(Firefoxの場合)」が表示されますが「詳細情報」をクリックして進みます。Argo CD のログイン画面が表示されます。
GUIにログインする場合も、先程のユーザー名とパスワードを入力します。
パスワードはプラットフォームに保存されます。 |
一旦ターミナルに戻ります。Argo CD APIサーバーに接続していることを確認するために、次のコマンドを実行します
argocd cluster list
次のような出力が得られます。
SERVER NAME VERSION STATUS MESSAGE
https://kubernetes.default.svc in-cluster Unknown Cluster has no applications and is not being monitored.
この出力には Argo CDが管理するクラスター一覧が表示されます。この場合では、NAMEフィールドのin-clusterはArgo CDがインストール先のクラスターを管理していることを示しています。
複数のクラスターに接続して、管理することができます。 |
bashの補完を有効にするために、次のコマンドを実行します。
source <(argocd completion bash)
argocd CLI ツールは、デプロイされたアプリのデバッグやステータスを表示するのに役に立ちます。 ログインすると次のようなページが表示されます。
これはArgo CDのWeb UIです。次の演習のために、このタブを開いたままにしておいてください。
サンプルアプリケーションのデプロイ
この演習では、GitOpsサンプル用のレポジトリ sample GitOps repoから取得したマニフェストを利用します。これらのマニフェストは次のものを含みます。
-
Namespace: bgd-ns.yaml
-
Deployment: bgd-deployment.yaml
-
Service: bgd-svc.yaml
-
Route: bgd-route.yaml
これらはArgo CD内ではまとめてApplicationとなります。これらのマニフェストをクラスターに適用するには、そのように定義する必要があります。 Argo CD のApplication マニフェス: bgd-app.yamlを確認します。
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: bgd-app
namespace: openshift-gitops
spec:
destination:
namespace: bgd
server: https://kubernetes.default.svc
project: default
source:
path: apps/bgd/overlays/bgd
repoURL: https://github.com/redhat-developer-demos/openshift-gitops-examples
targetRevision: main
syncPolicy:
automated:
prune: true
selfHeal: false
syncOptions:
- CreateNamespace=true
-
Argo CD の Project の概念はOpenShiftのプロジェクトとは異なります。
-
Argo CD の default project (.spec.project).にアプリケーションをインストールします。 OpenShift のdefault projectではありません。
-
宛先サーバーは、 Argo CD をインストールしたサーバーです。 (.spec.destination.serverと記されています)
-
マニフェストレポジトリとYAMLを探すパスは.spec.sourceの下です。
-
.spec.syncPolicyは automatedで、自動的に同期します。selfHealは falseに設定されており、クラスターに加えられた変更は自動同期をトリガーしません。
Application CR (CustomResource) は次のコマンドを実行することで適用できます。
oc apply -f https://raw.githubusercontent.com/redhat-developer-demos/openshift-gitops-examples/main/components/applications/bgd-app.yaml
このコマンドによってArgo CD UIに bgd-appが作成されて表示されます。
この "カード" をクリックすると概要ページに移動します。同期中または完全に同期してる状態です。
すべてを表示するためには show hidden resources をクリックする必要がある場合があります。 |
この時点で、アプリケーションが稼働しているはずです。次のコマンドで、作成されたすべてのリソースを確認できます。
oc get pods,svc,route -n bgd
出力は次のようになります。
NAME READY STATUS RESTARTS AGE
pod/bgd-788cb756f7-kz448 1/1 Running 0 10m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/bgd ClusterIP 172.30.111.118 <none> 8080/TCP 10m
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
route.route.openshift.io/bgd bgd-bgd.apps.example.com bgd 8080 None
まず、ロールアウトが完了するまで待ちます。以下のコマンドを実行します。
oc rollout status deploy/bgd -n bgd
以下のように出力されます。
deployment "bgd" successfully rolled out
次に、アプリのrouteを表示するコマンドで、routeを表示します。
oc get route -n bgd
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
bgd bgd-bgd.crc-dzk9v-master-0.crc.ohwkzih58pxs.instruqt.io bgd 8080 None
「HOST/PORT」列の下の URLをコピーしてブラウザでアプリケーションにアクセスします。 本アプリケーションはHTTP接続のみとなるため、ブラウザへの貼り付け時には http://bgd-bgd.~ でURLをご指定ください。
アプリケーションは、次のような動く青い丸を表示するものです。
アプリケーションのマニュフェストを変更し、Gitリポジトリとは異なる状態としてみましょう。
-
マニフェストにパッチを適用し、丸の色を青から緑に変更します。
oc -n bgd patch deploy/bgd --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/env/0/value", "value":"green"}]'
-
ロールアウトが行われるまで待ちます。
oc rollout status deploy/bgd -n bgd
-
次のように表示されます。
deployment "bgd" successfully rolled out
アプリケーションが実行されているブラウザのタブを更新すると、丸の色が緑になっているはずです。
デプロイされているアプリケーションの状態とGitリポジトリの状態に差異が生まれたため、Argo CD Web UIを見るとアプリケーションを"Out of Sync"(非同期)として検出していることがわかります。
次の方法で、Argo CDを介してアプリを同期できます。
-
最初に SYNCをクリックします。
-
次に SYNCHRONIZEをクリックします。
GUIではなく、CLIによっても可能です。
argocd app sync bgd-app
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
2022-09-14T02:50:21+00:00 Namespace bgd Synced
2022-09-14T02:50:21+00:00 Service bgd bgd Synced Healthy
2022-09-14T02:50:21+00:00 apps Deployment bgd bgd OutOfSync Healthy
2022-09-14T02:50:21+00:00 route.openshift.io Route bgd bgd Synced Healthy
2022-09-14T02:50:22+00:00 Namespace bgd bgd Running Synced namespace/bgd unchanged
2022-09-14T02:50:22+00:00 Service bgd bgd Synced Healthy service/bgd unchanged
2022-09-14T02:50:22+00:00 apps Deployment bgd bgd OutOfSync Healthy deployment.apps/bgd configured
2022-09-14T02:50:22+00:00 route.openshift.io Route bgd bgd Synced Healthy route.route.openshift.io/bgd unchanged
2022-09-14T02:50:22+00:00 apps Deployment bgd bgd Synced Progressing deployment.apps/bgd configured
Name: bgd-app
Project: default
Server: https://kubernetes.default.svc
Namespace: bgd
URL: https://openshift-gitops-server-openshift-gitops.crc-dzk9v-master-0.crc.ohwkzih58pxs.instruqt.io/applications/bgd-app
Repo: https://github.com/redhat-developer-demos/openshift-gitops-examples
Target: main
Path: apps/bgd/overlays/bgd
SyncWindow: Sync Allowed
Sync Policy: Automated (Prune)
Sync Status: Synced to main (85d6cc5)
Health Status: Progressing
Operation: Sync
Sync Revision: 85d6cc5540cd74514e447aa74c403dce98f8bbed
Phase: Succeeded
Start: 2022-09-14 02:50:21 +0000 UTC
Finished: 2022-09-14 02:50:22 +0000 UTC
Duration: 1s
Message: successfully synced (all tasks run)
GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
Namespace bgd bgd Running Synced namespace/bgd unchanged
Service bgd bgd Synced Healthy service/bgd unchanged
apps Deployment bgd bgd Synced Progressing deployment.apps/bgd configured
route.openshift.io Route bgd bgd Synced Healthy route.route.openshift.io/bgd unchanged
Namespace bgd Synced
同期プロセスが完了すると、Argo CD UI はアプリケーションを同期済としてマークします。
アプリケーションが実行されているブラウザのタブを更新すると、丸の色が緑から青に戻っているはずです。
ここでは実行しませんが、Application マニフェストを設定することで、クラスターの状態が Git で定義された状態から逸脱したときに自動的に修正するようにArgo CDを設定できます。
spec:
syncPolicy:
automated:
prune: true
selfHeal: true
次のコマンドを実行することで、設定できます。(ここでは実行しません)
oc patch application/bgd-app -n openshift-gitops --type=merge -p='{"spec":{"syncPolicy":{"automated":{"prune":true,"selfHeal":true}}}}'