OpenShift GitOps のエラー通知を Slack に送信してみた

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

https://docs.redhat.com/ja/documentation/red_hat_openshift_gitops/1.13/html/argo_cd_instance/notifications-configuration-custom-resource-properties_argo-cd-cr-component-properties#notifications-configuration-custom-resource-properties_argo-cd-cr-component-properties

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

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

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

コメントを残す

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