OpenShift GitOps を構築してみた

以前の記事では、CI 部分を担う OpenShift Pipelines の構築を行いました。続いて、本記事では実際に CD 部分となる OpenShift GitOps を構築して デプロイ先の状態変化を検知してマニフェストファイルの状態を保ち続ける pull 型のデプロイを実装してみたいとおもいます。

構築の概要

前回構築したCIパイプラインと組み合わせて図のような CI/CD パイプラインを OpenShift 上に構築します。OpenShift GitOps ハンズオンの一部を参考にしています。前回と同様にチュートリアルではパブリックリポジトリを利用していますが、実際構築する際はプライベートリポジトリであるケースが多いため、プライベートリポジトリで構築してみます。CD 部分の動作については OpenShift GitOps がクラスター内のリソースとマニフェストリポジトリを監視しており、マニフェストを正として常にクラスター内のリソースとの同期をとります。必要な作業としては OpenShift GitOps のインストール、マニフェストリポジトリの登録、マニフェストを OpenShift 上にデプロイするためのアプリケーション設定になります。

事前準備

下記構成のプライベートなマニフェスト用Git リポジトリを用意します。アプリケーションをデプロイするためのマニフェストファイルが格納されています。

app
├── deployment.yaml
├── kustomization.yaml
├── route.yaml
└── service.yaml

deployment.yaml 内の image tag には アプリケーションGitリポジトリ側のコミットIDを参照します。コミットIDは git側でも確認が可能ですが、CI パイプライン実行後に下記コマンドを実行して image stream の tag を参照する方が簡単です。

$ oc get imagestream -n pipelines-tutorial
NAME IMAGE REPOSITORY TAGS UPDATED
ocp-cicd-appli-ui image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/ocp-cicd-appli-ui 974d59ed90012de8d19e47a5e74807018d08c5ae 26 minutes ago

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: ocp-cicd-appli-ui
  name: ocp-cicd-appli-ui
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ocp-cicd-appli-ui
  template:
    metadata:
      labels:
        app: ocp-cicd-appli-ui
    spec:
      containers:
        - image: image-registry.openshift-image-registry.svc:5000/ci-pipeline/ocp-cicd-appli-ui:<image tag>
          imagePullPolicy: Always
          name: ocp-cicd-appli-ui
          ports:
            - containerPort: 8080
              protocol: TCP

kustomization.yaml

resources:
- deployment.yaml
- service.yaml
- route.yaml

route.yaml

apiVersion: route.openshift.io/v1
kind: Route
metadata:
  labels:
    app: ocp-cicd-appli-ui
  name: ocp-cicd-appli-ui
spec:
  port:
    targetPort: 8080-tcp
  to:
    kind: Service
    name: ocp-cicd-appli-ui
    weight: 100

service.yaml

apiVersion: v1
kind: Service
metadata:
  labels:
    app: ocp-cicd-appli-ui
  name: ocp-cicd-appli-ui
spec:
  type: NodePort
  ports:
    - name: 8080-tcp
      port: 8080
      targetPort: 8080
      protocol: TCP
  selector:
    app: ocp-cicd-appli-ui

前提条件

  • OpenShift クラスターが構築済みであること
  • oc CLI がインストール済みであること
  • 前回の記事でCIパイプラインが実行されており、imageがopenshift-image-registryにプッシュされていること

OpenShift GitOps をインストール

  1. OpenShift OperatorHub で Administrator のパースペクティブにいることを確認します。
  2. Web コンソールで[Operators] > [OperatorHub]に移動します。
  3. 検索バーに「OpenShift GitOps」と入力して、 OpenShift GitOps をクリックして Install をクリックします。
  4. デフォルトのまま Install をクリックします。

OpenShift GitOps のログイン

下記コマンドを実行してArgo CD へアクセスする URLを確認します。

$ oc get route openshift-gitops-server -o jsonpath='{.spec.host}' -n openshift-gitops

取得した URL に Web ブラウザからアクセスします。

下記コマンドを実行して admin ユーザでログインするためのパスワードを確認します。

$ oc extract secret/openshift-gitops-cluster --to=- -n openshift-gitops
# admin.password
<password>

Usernameに admin と Password に上記のコマンドで取得したパスワードを入力し、Argo CD にログインします。
ArgoCD の ホーム画面が表示されれば完了です。

OpenShift GitOps 構築

Argo CD へのデプロイ権限の付与

下記コマンドを実行して Argo CD の Service Account (openshift-gitops-argocd-application-controller) に対して、対象の Project に対する edit 権限を付与します。

$ oc adm policy add-cluster-role-to-user edit system:serviceaccount:openshift-gitops:openshift-gitops-argocd-application-controller

プライベートリポジトリの登録

  1. Github で Personal access token の発行をします。
  2. Settings -> Developer Settings -> Personal access tokens にいき、Generate new token をクリック(Personal access tokens (classic) を選択)します。




  3. Personal access tokenが発行されるのでそれをメモしておきます。
  4. ArgoCD ダッシュボードから Settings -> Repositories にいき、Connect Repo をクリックします。

  5. 下記パラメータを入力して [CONNECT] をクリックします。登録したリポジトリに対する CONNECTION STATUS が Successful になったら完了です。
    • Choose your connection method: VIA HTTPS
    • Project: default
    • Repository URL: GitHubリポジトリのURL(末尾が .git で終わるURL)
    • Username: 任意
    • Password:上記でメモしたPersonal access token

アプリケーションのデプロイ(GUI操作)

GUI か CLI いずれかでアプリケーションのデプロイを行います。

Argo CD ダッシュボードから [+ NEW APP] ボタンをクリックし、以下の内容を入力し Argo CD アプリケーションを作成します。

  • Application Name: sample-app
  • Project: default
  • Sync Policy: Automatic
  • Repository URL: GitHubリポジトリのURL(末尾が .git で終わるURL)
  • Revision: HEAD
  • Path: app
  • Destination: https://kubernetes.default.svc
  • Namespace: pipelines-tutorial

Sync Policy は Manual と Automatic を選択できます。今回はクラスターへのマニフェストリポジトリの反映を自動で行うために Automatic に設定します。クラスターへの反映にワンクッション(SYNCボタンを押す動作を)挟みたい本番環境などのユースケースでは Manual を選択します。

ダッシュボードにアプリケーションが作成されていれば成功です。

アプリケーションのデプロイ(CLI操作)

下記コマンドを実行してアプリケーションのデプロイを行います。ダッシュボードにアプリケーションが作成されていれば成功です。 

$ oc apply -f application.yaml
application.argoproj.io/sample-app created

application.yaml

application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sample-app
  namespace: openshift-gitops
spec:
  project: default
  source:
    repoURL: GitHubリポジトリのURL(末尾が .git で終わるURL)
    path: app
    targetRevision: HEAD
  destination:
    server: https://kubernetes.default.svc
    namespace: pipelines-tutorial
# Sync Policy を Manual にする場合は下記を削除
  syncPolicy:
    automated: {}

動作テスト

マニフェストの変更とデプロイ

マニフェストファイルを編集します。
deployment.yaml のレプリカ数を変更 (1->3) します。

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: ocp-cicd-appli-ui
  name: ocp-cicd-appli-ui
spec:
  # replicas: 1
  replicas: 3
  selector:
    matchLabels:
      app: ocp-cicd-appli-ui
  template:
    metadata:
      labels:
        app: ocp-cicd-appli-ui
    spec:
      containers:
        - image: image-registry.openshift-image-registry.svc:5000/ci-pipeline/ocp-cicd-appli-ui:<image tag>
          imagePullPolicy: Always
          name: ocp-cicd-appli-ui
          ports:
            - containerPort: 8080
              protocol: TCP

ダッシュボード上を確認して、Pod が3つデプロイされていれば成功です。

OpenShift 上のリソースが削除された場合のセルフヒーリングの確認

下記コマンドを実行して、OpenShift 上のリソースを削除します。 

$ oc delete route ocp-cicd-appli-ui -n pipelines-tutorial
route.route.openshift.io "ocp-cicd-appli-ui" deleted

[DETAILS] ボタンより [SYNC POLICY] > [SELF HEAL] の [ENABLE] ボタンを押します。

Argo CD が Git リポジトリと OpenShift の状態の差異を検知し、自動的にリソースが復旧されることを確認します。

他にも以下のコマンドを実行して、OpenShift 上のリソースが自動的に復元されることをダッシュボード上で確認します。

$ oc delete svc ocp-cicd-appli-ui -n pipelines-tutorial
service "ocp-cicd-appli-ui" deleted
$ oc delete deployment ocp-cicd-appli-ui -n pipelines-tutorial
deployment.apps "ocp-cicd-appli-ui" deleted

リソース削除時の挙動の確認

Git リポジトリから route.yaml ファイルを削除し、kustomization.yaml から route.yaml の行をコメントアウトします。

kustomization.yaml

resources:
- deployment.yaml
- service.yaml
# - route.yaml

[DETAILS] ボタンより [SYNC POLICY] > [PRUNE RESOURCES] の [ENABLE] ボタンをおします。

Route のリソースが OpenShift 上から削除されることを確認します。

まとめ

本記事では実際に OpenShift GitOps のハンズオンを参考にしてOpenShift Pipelines の CI 部分に連携する CD 部分を構築してみました。これでビルドの自動化からアプリケーションのデプロイまでの CI/CD パイプラインを実現できました。

参考文献

https://github.com/mamoru1112/openshift-gitops-handson

 

 

 

 

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です