ポーリングの代わりにウェブフックを使用する
デフォルトでは、SUSE® Rancher Prime Continuous DeliveryはGitリポジトリからデータを取得するためにポーリング(デフォルトで15秒ごと)を使用します。 ポーリングは小規模なインストール(数十のリポジトリまで)には適しています。
大規模なデプロイメントの場合は、新しいコミットが到着したときにリコンシリエーションをトリガーするためにウェブフックを設定してください。これにより、GitプッシュとSUSE® Rancher Prime Continuous Deliveryが変更を処理するまでの遅延が減少します。
複数のコミットが短時間に到着した場合、SUSE® Rancher Prime Continuous Deliveryコントローラーは対応する`GitRepo`リソースを更新する際に通常の調整ループを通じてそれらを処理します。これにより、更新の競合を回避し、大規模なデプロイメントにおける信頼性が向上します。
多くのリポジトリを持つインストールや、GitプッシュとSUSE® Rancher Prime Continuous Deliveryの反応の間のレイテンシを減らしたい場合は、ポーリングの代わりにウェブフックを設定してください。
SUSE® Rancher Prime Continuous Deliveryは現在、以下のプロバイダーをサポートしています:
-
Azure DevOps
-
GitHub
-
GitLab
-
Bitbucket
-
Bitbucket Server
-
Gogs
1.Webhookサービスを設定する
SUSE® Rancher Prime Continuous Deliveryはウェブフックリクエストを処理するために`gitjob`サービスを使用します。 `gitjob`サービスを指すIngressを作成します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webhook-ingress
namespace: cattle-fleet-system
spec:
rules:
- host: your.domain.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: gitjob
port:
number: 80
Rancherや他のサービスと同じホスト名でウェブフックを利用可能にしたい場合は、以下のYAMLを使用してください。 この例では、NGINX Ingress Controllerを使用し、`http://your.domain.com/gitjob`でウェブフックを公開します。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/use-regex: "true"
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: webhook-ingress
namespace: cattle-fleet-system
spec:
rules:
- host: your.domain.com
http:
paths:
- path: /gitjob(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: gitjob
port:
number: 80
Ingress Nginxは 廃止されます。以下はTraefikを使用した例です:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
traefik.ingress.kubernetes.io/router.middlewares: cattle-fleet-system-gitjob-stripprefix@kubernetescrd
traefik.ingress.kubernetes.io/router.priority: '100'
name: webhook-ingress
namespace: cattle-fleet-system
spec:
ingressClassName: traefik
rules:
- host: your.domain.com
http:
paths:
- backend:
service:
name: gitjob
port:
number: 80
path: /gitjob(/|$)(.*)
pathType: ImplementationSpecific
|
2つのIngressリソースが競合する可能性がある場合のみ、アノテーション`traefik.ingress.kubernetes.io/router.priority: '100'`を使用してください。このアノテーションはGitJobルートに高い優先度を割り当てます。これは`pathType`プロパティに依存します。`pathType`がPrefixに設定されている場合、アノテーションは必須です。 |
この設定では、`gitjob`がルートパスから直接応答するため、URLから追加のパスを削除するミドルウェアが必要です。これはNginxの`nginx.ingress.kubernetes.io/rewrite-target`アノテーションと同等です:
apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: gitjob-stripprefix
namespace: cattle-fleet-system
spec:
stripPrefix:
prefixes:
- /gitjob
このアプローチは、アプリケーションの設定を変更せずにIngress NginxからTraefikへのスムーズな移行を可能にします。
|
Ingressで TLSを設定して、安全な通信を行うことができます。 |
2.WebhookコールバックURLを設定してください。
Gitプロバイダーに移動し、WebhookコールバックURLを設定してください。 以下の画像はGitHubからの例を示しています。
- image
-
../../images/webhook.png[]
シークレットの設定は任意です。 シークレットはWebhookペイロードを検証するために使用されます。ペイロードはデフォルトで信頼されるべきではありません。
Webhookエンドポイントが公開されている場合、シークレットを設定することを強くお勧めします。 シークレットを設定した場合は、ステップ3に進んでください。
|
Webhookライブラリの制限により、`application/json`のみがサポートされています。 |
|
Webhookが設定されると、ポーリング間隔は自動的に1時間に調整されます。 |
3.(任意)Webhookシークレットを設定してください。
Webhookシークレットは、Gitプロバイダーから送信されたペイロードを検証します。 各サポートされているプロバイダーは、Kubernetesシークレット内で特定のキー名を使用します。
| プロバイダ | Kubernetesシークレットキー |
|---|---|
GitHub |
|
GitLab |
|
Bitbucket |
|
Bitbucket Server |
|
Gogs |
|
Azure DevOps |
|
Azure DevOps |
|
オプション1:クラスター全体のシークレットを設定する
このアプローチでは、シークレットはクラスター全体に適用され、すべてのGitRepoが自動的に使用します。 個々のGitRepo定義で参照する必要はありません。
ペイロードが受信されると、SUSE® Rancher Prime Continuous Deliveryはシークレットが存在するかどうかを確認し(`gitjob-webhook`は`cattle-fleet-system`ネームスペース内)、検証のために適切なキーを使用します。
GitHubの場合:
kubectl create secret generic gitjob-webhook \
-n cattle-fleet-system \
--from-literal=github=webhooksecretvalue
Azure DevOpsの場合:
-
Azureで基本認証を有効にします。
-
資格情報を含むシークレットを作成します。
kubectl create secret generic gitjob-webhook \
-n cattle-fleet-system \
--from-literal=azure-username=user \
--from-literal=azure-password=pass123
オプション2:GitRepoごとにシークレットを設定する
各GitRepoのためにユニークなWebhookシークレットを定義できます。 GitRepoと同じネームスペースにシークレットを作成し、specの`webhookSecret`フィールドを使用して参照します。
例:
apiVersion: fleet.cattle.io/v1alpha1
kind: GitRepo
metadata:
name: simple
namespace: fleet-local
spec:
repo: "https://github.com/rancher/fleet-examples"
paths:
- simple
disablePolling: true
webhookSecret: webhook-secret-name
クラスター全体のシークレットとGitRepoごとのシークレットの両方が存在する場合、SUSE® Rancher Prime Continuous DeliveryはGitRepoごとのシークレットを使用します。