以前の記事では、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 をインストール
- OpenShift OperatorHub で Administrator のパースペクティブにいることを確認します。
- Web コンソールで[Operators] > [OperatorHub]に移動します。
- 検索バーに「OpenShift GitOps」と入力して、 OpenShift GitOps をクリックして Install をクリックします。
- デフォルトのまま 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
プライベートリポジトリの登録
- Github で Personal access token の発行をします。
- Settings -> Developer Settings -> Personal access tokens にいき、Generate new token をクリック(Personal access tokens (classic) を選択)します。
- Personal access tokenが発行されるのでそれをメモしておきます。
- ArgoCD ダッシュボードから Settings -> Repositories にいき、Connect Repo をクリックします。
- 下記パラメータを入力して [CONNECT] をクリックします。登録したリポジトリに対する CONNECTION STATUS が Successful になったら完了です。
アプリケーションのデプロイ(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