OpenShift GitOps Lab - OpenShift GitOps

OpenShift GitOps

GitOpsは、Gitワークフローを活用してインフラストラクチャとアプリケーションの構成を管理する一連のプラクティスです。Gitリポジトリに置かれたコードをSingle Source of Truthとみなし、コードとインフラを常に同じ状態に保つ運用のベストプラクティスをGitOpsと呼びます。インフラストラクチャとアプリケーションの定義を「コード」として定義することで、インフラストラクチャとアプリケーションの構成変更を複数のクラスターに簡単に反映させます。

gitops 001
  • クラスタの構成を定期的に確認します。

  • クラスターを既知の状態から回復または再作成します。

  • 既知の状態でクラスターを作成します。

  • 構成の変更を複数のクラスターに適用または元に戻します。

  • テンプレート化された構成をさまざまな環境に関連付けます。

ArgoCD は、Kubernetes用のGitOps継続的デリバリーツールです。指定されたターゲット環境での望ましいアプリケーション状態を確認しデプロイを自動化します。アプリケーションのデプロイでは、ブランチ、タグ、または Gitコミットで特定のバージョンのマニフェストに固定された更新を追跡できます。

gitops 002

このセクションでは、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 を見つけることもできます。

gitops 017

アクセスすると「警告:将来の潜在的なセキュリティリスク(Firefoxの場合)」が表示されますが「詳細情報」をクリックして進みます。Argo CD のログイン画面が表示されます。

gitops 018

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 ツールは、デプロイされたアプリのデバッグやステータスを表示するのに役に立ちます。 ログインすると次のようなページが表示されます。

gitops 019

これは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が作成されて表示されます。

gitops 020

この "カード" をクリックすると概要ページに移動します。同期中または完全に同期してる状態です。

gitops 021
すべてを表示するためには 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をご指定ください。

アプリケーションは、次のような動く青い丸を表示するものです。

gitops 022

アプリケーションのマニュフェストを変更し、Gitリポジトリとは異なる状態としてみましょう。

  1. マニフェストにパッチを適用し、丸の色を青から緑に変更します。

    oc -n bgd patch deploy/bgd --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/env/0/value", "value":"green"}]'
  2. ロールアウトが行われるまで待ちます。

    oc rollout status deploy/bgd -n bgd
  3. 次のように表示されます。

deployment "bgd" successfully rolled out

アプリケーションが実行されているブラウザのタブを更新すると、丸の色が緑になっているはずです。

gitops 023

デプロイされているアプリケーションの状態とGitリポジトリの状態に差異が生まれたため、Argo CD Web UIを見るとアプリケーションを"Out of Sync"(非同期)として検出していることがわかります。

gitops 024

次の方法で、Argo CDを介してアプリを同期できます。

  1. 最初に SYNCをクリックします。

  2. 次に SYNCHRONIZEをクリックします。

gitops 025

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 はアプリケーションを同期済としてマークします。

gitops 026

アプリケーションが実行されているブラウザのタブを更新すると、丸の色が緑から青に戻っているはずです。

gitops 027

ここでは実行しませんが、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}}}}'

次のラボの準備

次のKustomizeのラボでも bgd-app アプリのデプロイを行うため、一旦 bgd-app を削除しておきましょう。

次のコマンドを入力します。削除確認が行われるので、 y で応答します。

argocd app delete bgd-app

次の出力が得られれば、削除は成功です。

application 'bgd-app' deleted

以上で本演習は終了です。