OpenShift GitOps (ArgoCD) は、OpenShift 上で GitOps を実現するためのツールです。前回の記事では CI/CD における CI 部分の OpenShift Pipelines (Tekton) のエラー通知機能を構築しました。同様に CD 部分である OpenShift GitOps にもエラー通知機能を実装したいと思います。OpenShift GitOps には ArgoCD Notificationsという通知機能が用意されているため、こちらを参考に実装してみました。
ArgoCD Notifications について
ArgoCD Notifications は ArgoCD アプリケーションを監視し、状態の変更についての通知を管理するカスタムリソース(CR)です。下記のようなテンプレート、トリガー、サービス、サブスクリプションといったリソースを設定します。
テンプレート | 通知テンプレートメッセージを定義します。 |
トリガー | ユーザーに通知が送信される条件と、メッセージを生成するために必要なテンプレートのリストを定義します。 |
サービス | メッセージをどこに配信するなどの設定を定義します。 |
サブスクリプション | 通知送信先などの設定をします。例えば Slack だと、どのチャンネルにどのトリガーを適用させるといった設定を定義します。Argo CD のアプリケーションの Annotations に定義します。 |
OpenShift GitOps では、通知を有効にして Red Hat OpenShift GitOps でクラスターを作成すると、デフォルトで default-notifications-configuration という名前の NotificationsConfiguration CR が作成されます。Argo CD では argocd-notifications-cm ConfigMap にリソースを定義しますが、OpenShift GitOps では default-notifications-configuration にカスタムリソース設定を記入します。ここに加えられた設定は Argo CD の Config Map に反映されますが、直接 Argo CD の Config Map を変更しても default-notifications-configuration で上書きされてしまう点に注意が必要です。
前提条件
- OpenShift 4 クラスターが構築済みであること
- OpenShift GitOps Operator がインストールされていること
- oc CLI がインストール済みであること
- Slack に通知を送信するワークスペース、チャンネルが用意されていること
事前準備
Gitリポジトリの用意
下記構成のプライベートなマニフェスト用 Git リポジトリを用意します。アプリケーションをデプロイするためのマニフェストファイルが格納されています。
app
├── deployment.yaml
├── kustomization.yaml
├── route.yaml
└── service.yaml
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox-deployment
spec:
replicas: 1
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- "while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; echo 'Hello from BusyBox'; } | nc -l -p 8080; done"
ports:
- containerPort: 8080
kustomization.yaml
resources:
- deployment.yaml
- service.yaml
- route.yaml
route.yaml
apiVersion: route.openshift.io/v1
kind: Route
metadata:
name: busybox-route
labels:
app: busybox
spec:
to:
kind: Service
name: busybox-service
port:
targetPort: 80
service.yaml
apiVersion: v1
kind: Service
metadata:
name: busybox-service
spec:
selector:
app: busybox
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: LoadBalancer
ArgoCD のデプロイ設定
OpenShift GitOps を構築してみたを参考にして下記手順を実施します。
Slack Web App の準備
通知をSlack に送信するためには、Slack App を作成し、適切な権限を付与する必要があります。前回の記事で Slack App を作成している場合は使いまわすことが出来るので、作成パートは飛ばしてもらって問題ありません。ややこしいのですが、OpenShift Pipelines (Tekton) では Webhook を使用しましたが、OpenShift GitOps ではSlack の OAuth Token を使用します。
Slack App のページから Create New App をクリックします。
From scratch をクリックします。
App Name を入力して、Slack App を追加するワークスペースを選択します。
Basic Information が表示されれば完了です。OAuth & PermissionsをクリックしてScopesを追加します。
Add an OAuth Scope をクリックして chat:write を追加します。
Install to ワークスペースをクリックしてワークスペースにアクセスする権限を許可します。
Slack に移動して通知を送信したいチャンネル名をクリックして、インテグレーションタブからアプリを追加します。
アプリ名を検索してアプリを追加します。
Slack のチャンネルにアプリが追加された旨のメッセージが表示されていることを確認して完了です。
OpenShift GitOps 通知設定
Argo CD インスタンスの通知を有効化
下記コマンドを実行して通知を有効化します。
$ oc patch argocd openshift-gitops -n openshift-gitops --type merge --patch '{"spec": {"notifications": {"enabled": true}}}'
argocd.argoproj.io/openshift-gitops patched
Slack App のトークンを持つシークレットを作成します。
$ oc apply -f secret.yaml
Bot User OAuth Token は Slack App の OAuth & Permissions から確認できます。
secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: argocd-notifications-secret
namespace: openshift-gitops
stringData:
slack-token: <Bot User OAuth Token>
下記コマンドを実行して spec.notifications.enabled フィールドの値が true になっていることを確認します。
$ oc get argocd openshift-gitops -n openshift-gitops -o yaml
apiVersion: argoproj.io/v1beta1
kind: ArgoCD
metadata:
creationTimestamp: "2024-11-21T01:26:00Z"
finalizers:
- argoproj.io/finalizer
generation: 2
name: openshift-gitops
namespace: openshift-gitops
︙
spec:
︙
notifications:
enabled: true
︙
Argo CD インスタンスの通知設定の追加
下記コマンドを実行してArgo CD インスタンスの通知設定の追加を行います。
$ oc edit notificationsconfiguration default-notifications-configuration -n openshift-gitops
テキストエディタが開いたら、spec以下に下記のようなservicesを追記します。templates,triggersはデフォルトのままで大丈夫です。
︙
spec:
services:
service.slack: |
token: $slack-token
templates:
︙
アプリケーションの作成
プロジェクトの作成
$ oc new-project sample-app
下記コマンドを実行してArgoCDの通知先が設定されたアプリケーションを作成します。
$ oc apply -f application.yaml
application
.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sample-app
namespace: openshift-gitops
annotations:
notifications.argoproj.io/subscribe.on-deployed.slack: webhook_test
notifications.argoproj.io/subscribe.on-sync-failed.slack: webhook_test
notifications.argoproj.io/subscribe.on-sync-succeeded.slack: webhook_test
notifications.argoproj.io/subscribe.on-health-degraded.slack: webhook_test
notifications.argoproj.io/subscribe.on-created.slack: webhook_test
notifications.argoproj.io/subscribe.on-sync-running.slack: webhook_test
notifications.argoproj.io/subscribe.on-deleted.slack: webhook_test
spec:
project: default
source:
repoURL: <マニフェスト用 Git リポジトリ(.gitで終わるURL)>
path: app
targetRevision: main
destination:
server: https://kubernetes.default.svc
namespace: sample-app
syncPolicy:
automated:
prune: true
selfHeal: true
アプリケーションがデプロイされていることを確認します。
動作確認
Slack の指定したチャンネルに通知が届いていることを確認して完了です。
まとめ
OpenShift GitOps のエラー通知を Slack に送信する機能を構築し、その手順をまとめました。OpenShift GitOps では、ArgoCD Notifications という既存の機能を有効にして通知を送信してみました。ArgoCD Notifications のハンズオンとしても参考になれば幸いです。
参考文献
https://argo-cd.readthedocs.io/en/stable/operator-manual/notifications/#notifications-overview