11.3. ApiServerSource の使用
ApiServerSource は、Knative サービスなどのイベントシンクを Kubernetes API サーバーに接続するために使用できるイベントソースです。ApiServerSource は Kubernetes イベントを監視し、それらを Knative Eventing ブローカーに転送します。
以下の手順では、どちらの場合も YAML ファイルを作成する必要があります。
サンプルで使用されたもので YAML ファイルの名前を変更する場合は、必ず対応する CLI コマンドを更新する必要があります。
11.3.1. Knative CLI (kn
) での ApiServerSource の使用
以下のセクションでは、kn
コマンドを使用して ApiServerSource を作成するために必要な手順を説明します。
前提条件
-
OpenShift Serverless、Knative Serving および Eventing コンポーネント、および
kn
CLI がインストールされている。
手順
ApiServerSource のサービスアカウント、ロール、およびロールバインディングを作成します。
authentication.yaml
という名前のファイルを作成し、以下のサンプルコードをこれにコピーして、これを実行できます。apiVersion: v1 kind: ServiceAccount metadata: name: events-sa namespace: default 1 --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: event-watcher namespace: default 2 rules: - apiGroups: - "" resources: - events verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: k8s-ra-event-watcher namespace: default 3 roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: event-watcher subjects: - kind: ServiceAccount name: events-sa namespace: default 4
注記適切なパーミッションを持つ既存のサービスアカウントを再利用する必要がある場合、そのサービスアカウントの
authentication.yaml
を変更する必要があります。サービスアカウント、ロールバインディング、およびクラスターバインディングを作成します。
$ oc apply -f authentication.yaml
ブローカーをイベントシンクとして使用する ApiServerSource を作成します。
$ kn source apiserver create <event_source_name> --sink broker:<broker_name> --resource "event:v1" --service-account <service_account_name> --mode Resource
ApiServerSource が正しく設定されていることを確認するには、受信メッセージをログにダンプする Knative サービスを作成します。
$ kn service create <service_name> --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
default
ブローカーからサービスにイベントをフィルターするトリガーを作成します。$ kn trigger create <trigger_name> --sink svc:<service_name>
デフォルト namespace で Pod を起動してイベントを作成します。
$ oc create deployment hello-node --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
以下のコマンドを入力し、生成される出力を検査して、コントローラーが正しくマップされていることを確認します。
$ kn source apiserver describe <source_name>
出力例
Name: mysource Namespace: default Annotations: sources.knative.dev/creator=developer, sources.knative.dev/lastModifier=developer Age: 3m ServiceAccountName: events-sa Mode: Resource Sink: Name: default Namespace: default Kind: Broker (eventing.knative.dev/v1alpha1) Resources: Kind: event (v1) Controller: false Conditions: OK TYPE AGE REASON ++ Ready 3m ++ Deployed 3m ++ SinkProvided 3m ++ SufficientPermissions 3m ++ EventTypesProvided 3m
検証手順
メッセージダンパー機能ログを確認して、Kubernetes イベントが Knative に送信されていることを確認できます。
Pod を取得します。
$ oc get pods
Pod のメッセージダンパー機能ログを表示します。
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.apiserver.resource.update datacontenttype: application/json ... Data, { "apiVersion": "v1", "involvedObject": { "apiVersion": "v1", "fieldPath": "spec.containers{hello-node}", "kind": "Pod", "name": "hello-node", "namespace": "default", ..... }, "kind": "Event", "message": "Started container", "metadata": { "name": "hello-node.159d7608e3a3572c", "namespace": "default", .... }, "reason": "Started", ... }
11.3.2. Knative CLI (kn
) を使用した ApiServerSource の削除
本セクションでは、kn
コマンドおよび oc
コマンドを使用して ApiServerSource、トリガー、サービス、サービスアカウント、クラスターロール、およびクラスターバインディングを削除するために使用される手順について説明します。
前提条件
-
kn
CLI がインストールされていること。
手順
トリガーを削除します。
$ kn trigger delete <trigger_name>
サービスを削除します。
$ kn service delete <service_name>
イベントソースを削除します。
$ kn source apiserver delete <source_name>
- サービスアカウント、クラスターロール、およびクラスターバインディングを削除します。
$ oc delete -f authentication.yaml
11.3.3. YAML メソッドでの ApiServerSource の使用
以下では、YAML ファイルを使用して ApiServerSource を作成するために必要な手順を説明します。
前提条件
- Knative Serving および Eventing のインストールが必要です。
-
default
ブローカーは、ApiServerSource YAML ファイルで定義されるものと同じ namespace に作成している必要があります。
手順
ApiServerSource のサービスアカウント、ロールおよびロールバインディングを作成するには、
authentication.yaml
という名前のファイルを作成し、以下のサンプルコードをこれにコピーします。apiVersion: v1 kind: ServiceAccount metadata: name: events-sa namespace: default 1 --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: event-watcher namespace: default 2 rules: - apiGroups: - "" resources: - events verbs: - get - list - watch --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: k8s-ra-event-watcher namespace: default 3 roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: event-watcher subjects: - kind: ServiceAccount name: events-sa namespace: default 4
注記適切なパーミッションを持つ既存のサービスアカウントを再利用する必要がある場合、そのサービスアカウントの
authentication.yaml
を変更する必要があります。authentication.yaml
ファイルを作成した後に、これを適用します。$ oc apply -f authentication.yaml
ApiServerSource イベントソースを作成するには、
k8s-events.yaml
という名前のファイルを作成し、以下のサンプルコードをこれにコピーします。apiVersion: sources.knative.dev/v1alpha1 kind: ApiServerSource metadata: name: testevents spec: serviceAccountName: events-sa mode: Resource resources: - apiVersion: v1 kind: Event sink: ref: apiVersion: eventing.knative.dev/v1beta1 kind: Broker name: default
k8s-events.yaml
ファイルを作成した後に、これを適用します。$ oc apply -f k8s-events.yaml
ApiServerSource が正しく設定されていることを確認するには、受信メッセージをログにダンプする Knative サービスを作成します。
以下のサンプル YAML を
service.yaml
という名前のファイルにコピーします。apiVersion: serving.knative.dev/v1 kind: Service metadata: name: event-display namespace: default spec: template: spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:v0.13.2
service.yaml
ファイルを作成した後に、これを適用します。$ oc apply -f service.yaml
イベントを直前の手順で作成したサービスにフィルターする
default
ブローカーからトリガーを作成するには、trigger.yaml
という名前のファイルを作成し、以下のサンプルコードをこれにコピーします。apiVersion: eventing.knative.dev/v1alpha1 kind: Trigger metadata: name: event-display-trigger namespace: default spec: subscriber: ref: apiVersion: serving.knative.dev/v1 kind: Service name: event-display
trigger.yaml
ファイルを作成した後に、これを適用します。$ oc apply -f trigger.yaml
イベントを作成するには、デフォルト namespace で Pod を起動します。
$ oc create deployment hello-node --image=quay.io/openshift-knative/knative-eventing-sources-event-display
コントローラーが正しくマップされていることを確認するには、以下のコマンドを入力し、出力を検査します。
$ oc get apiserversource.sources.knative.dev testevents -o yaml
apiVersion: sources.knative.dev/v1alpha1 kind: ApiServerSource metadata: annotations: creationTimestamp: "2020-04-07T17:24:54Z" generation: 1 name: testevents namespace: default resourceVersion: "62868" selfLink: /apis/sources.knative.dev/v1alpha1/namespaces/default/apiserversources/testevents2 uid: 1603d863-bb06-4d1c-b371-f580b4db99fa spec: mode: Resource resources: - apiVersion: v1 controller: false controllerSelector: apiVersion: "" kind: "" name: "" uid: "" kind: Event labelSelector: {} serviceAccountName: events-sa sink: ref: apiVersion: eventing.knative.dev/v1beta1 kind: Broker name: default
検証手順
Kubernetes イベントが Knative に送信されていることを確認するには、メッセージダンパー機能ログを確認します。
Pod を取得します。
$ oc get pods
Pod のメッセージダンパー機能ログを表示します。
$ oc logs $(oc get pod -o name | grep event-display) -c user-container
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.apiserver.resource.update datacontenttype: application/json ... Data, { "apiVersion": "v1", "involvedObject": { "apiVersion": "v1", "fieldPath": "spec.containers{hello-node}", "kind": "Pod", "name": "hello-node", "namespace": "default", ..... }, "kind": "Event", "message": "Started container", "metadata": { "name": "hello-node.159d7608e3a3572c", "namespace": "default", .... }, "reason": "Started", ... }
11.3.4. ApiServerSource の削除
本セクションでは、YAML ファイルを削除して、ApiServerSource、トリガー、サービス、サービスアカウント、クラスターロール、およびクラスターバインディングを削除する方法について説明します。
手順
トリガーを削除します。
$ oc delete -f trigger.yaml
サービスを削除します。
$ oc delete -f service.yaml
イベントソースを削除します。
$ oc delete -f k8s-events.yaml
サービスアカウント、クラスターロール、およびクラスターバインディングを削除します。
$ oc delete -f authentication.yaml