ApiServerSourceオブジェクトの作成¶
このトピックでは、ApiServerSourceオブジェクトを作成する方法について説明します。
始める前に¶
ApiServerSourceオブジェクトを作成する前に
- クラスターにKnative Eventingがインストールされている必要があります。
kubectl
CLIツールをインストールする必要があります。- オプション:
kn
コマンドを使用する場合は、kn
ツールをインストールします。
ApiServerSourceオブジェクトを作成する¶
-
オプション:次のコマンドを実行して、APIサーバーソースインスタンスのネームスペースを作成します。
ここで、kubectl create namespace <namespace>
<namespace>
は作成するネームスペースの名前です。注意
ApiServerSourceおよび関連コンポーネントのネームスペースを作成すると、これらのコンポーネントが
default
ネームスペースに存在する可能性のある他のコンポーネントから分離されるため、このワークフローの変更とイベントをより簡単に表示できます。
また、ネームスペースを削除してすべてのリソースを削除できるため、ソースの削除も簡単になります。 -
ServiceAccountを作成する
-
次のテンプレートを使用してYAMLファイルを作成します。
ここでapiVersion: v1 kind: ServiceAccount metadata: name: <service-account> namespace: <namespace>
<service-account>
は、作成するServiceAccountの名前です。<namespace>
は、手順1で先に作成したネームスペースです。
-
次のコマンドを実行して、YAMLファイルを適用します。
ここで、kubectl apply -f <filename>.yaml
<filename>
は前の手順で作成したファイルの名前です。
-
-
ロールを作成する
-
次のテンプレートを使用してYAMLファイルを作成します。
ここでapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: <role> namespace: <namespace> rules: <rules>
<role>
は、作成するロールの名前です。<namespace>
は、手順1で先に作成したネームスペースの名前です。-
<rules>
は、APIServerSourceオブジェクトに付与する権限のセットです。この権限のセットは、イベントを受信するリソースと一致する必要があります。たとえば、events
リソースに関連するイベントを受信するには、次の権限のセットを使用します。- apiGroups: - "" resources: - events verbs: - get - list - watch
注意
必要な動詞は、
get
、list
、watch
のみです。
-
次のコマンドを実行して、YAMLファイルを適用します。
ここで、kubectl apply -f <filename>.yaml
<filename>
は前の手順で作成したファイルの名前です。
-
-
RoleBindingを作成する
-
次のテンプレートを使用してYAMLファイルを作成します。
ここでapiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: <role-binding> namespace: <namespace> roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: <role> subjects: - kind: ServiceAccount name: <service-account> namespace: <namespace>
<role-binding>
は、作成するRoleBindingの名前です。<namespace>
は、手順1で先に作成したネームスペースの名前です。<role>
は、手順3で先に作成したロールの名前です。<service-account>
は、手順2で先に作成したServiceAccountの名前です。
-
次のコマンドを実行して、YAMLファイルを適用します。
ここで、kubectl apply -f <filename>.yaml
<filename>
は前の手順で作成したファイルの名前です。
-
-
シンクを作成します。独自のシンクがない場合は、次の例のサービスを使用して、着信メッセージをログにダンプできます。
-
以下のYAMLをファイルにコピーします。
apiVersion: apps/v1 kind: Deployment metadata: name: event-display namespace: <namespace> spec: replicas: 1 selector: matchLabels: &labels app: event-display template: metadata: labels: *labels spec: containers: - name: event-display image: gcr.io/knative-releases/knative.dev/eventing/cmd/event_display --- kind: Service apiVersion: v1 metadata: name: event-display namespace: <namespace> spec: selector: app: event-display ports: - protocol: TCP port: 80 targetPort: 8080
ここで、
<namespace>
は上記の手順1で作成したネームスペースの名前です。 -
次のコマンドを実行して、YAMLファイルを適用します。
ここで、kubectl apply -f <filename>.yaml
<filename>
は前の手順で作成したファイルの名前です。
-
-
ApiServerSourceオブジェクトを作成する
-
ApiServerSourceを作成するには、次のコマンドを実行します。
ここでkn source apiserver create <apiserversource> \ --namespace <namespace> \ --mode "Resource" \ --resource "Event:v1" \ --service-account <service-account> \ --sink <sink-name>
<apiserversource>
は、作成するソースの名前です。<namespace>
は、手順1で先に作成したネームスペースの名前です。<service-account>
は、手順2で先に作成したServiceAccountの名前です。<sink-name>
は、シンクの名前です(例:http://event-display.pingsource-example.svc.cluster.local
)。
使用可能なオプションの一覧については、Knativeクライアントのドキュメントを参照してください。
-
次のテンプレートを使用してYAMLファイルを作成します。
ここでapiVersion: sources.knative.dev/v1 kind: ApiServerSource metadata: name: <apiserversource-name> namespace: <namespace> spec: serviceAccountName: <service-account> mode: <event-mode> resources: - apiVersion: v1 kind: Event sink: ref: apiVersion: v1 kind: <sink-kind> name: <sink-name>
<apiserversource-name>
は、作成するソースの名前です。<namespace>
は、手順1で先に作成したネームスペースの名前です。<service-account>
は、手順2で先に作成したServiceAccountの名前です。<event-mode>
は、Resource
またはReference
のいずれかです。Resource
に設定すると、イベントペイロードには、イベントが対象とするリソース全体が含まれます。Reference
に設定すると、イベントペイロードには、イベントが対象とするリソースへの参照のみが含まれます。デフォルトはReference
です。<sink-kind>
は、シンクとして使用する、サポートされているAddressableオブジェクト(例:Service
またはDeployment
)です。<sink-name>
は、シンクの名前です。
ApiServerSourceオブジェクトに構成できるフィールドの詳細については、ApiServerSourceリファレンスを参照してください。
-
次のコマンドを実行して、YAMLファイルを適用します。
ここで、kubectl apply -f <filename>.yaml
<filename>
は前の手順で作成したファイルの名前です。
-
ApiServerSourceオブジェクトを確認する¶
-
Kubernetes APIサーバーでイベントを作成させるには、次のコマンドを実行して、ネームスペースにテストPodを起動します。
ここで、kubectl run busybox --image=busybox --namespace=<namespace> --restart=Never -- ls
<namespace>
は、手順1で先に作成したネームスペースの名前です。 -
次のコマンドを実行して、テストPodを削除します。
ここで、kubectl --namespace=<namespace> delete pod busybox
<namespace>
は、手順1で先に作成したネームスペースの名前です。 -
次のコマンドを実行して、Knative EventingシステムによってKubernetesイベントがシンクに送信されたことを確認するためにログを表示します。
ここでkubectl logs --namespace=<namespace> -l app=<sink> --tail=100
<namespace>
は、手順1で先に作成したネームスペースの名前です。<sink>
は、手順5でシンクとして使用したPodSpecableオブジェクトの名前です。
ログ出力の例
☁️ cloudevents.Event Validation: valid Context Attributes, specversion: 1.0 type: dev.knative.apiserver.resource.update source: https://10.96.0.1:443 subject: /apis/v1/namespaces/apiserversource-example/events/testevents.15dd3050eb1e6f50 id: e0447eb7-36b5-443b-9d37-faf4fe5c62f0 time: 2020-07-28T19:14:54.719501054Z datacontenttype: application/json Extensions, kind: Event name: busybox.1626008649e617e3 namespace: apiserversource-example Data, { "apiVersion": "v1", "count": 1, "eventTime": null, "firstTimestamp": "2020-07-28T19:14:54Z", "involvedObject": { "apiVersion": "v1", "fieldPath": "spec.containers{busybox}", "kind": "Pod", "name": "busybox", "namespace": "apiserversource-example", "resourceVersion": "28987493", "uid": "1efb342a-737b-11e9-a6c5-42010a8a00ed" }, "kind": "Event", "lastTimestamp": "2020-07-28T19:14:54Z", "message": "Started container", "metadata": { "creationTimestamp": "2020-07-28T19:14:54Z", "name": "busybox.1626008649e617e3", "namespace": "default", "resourceVersion": "506088", "selfLink": "/api/v1/namespaces/apiserversource-example/events/busybox.1626008649e617e3", "uid": "2005af47-737b-11e9-a6c5-42010a8a00ed" }, "reason": "Started", "reportingComponent": "", "reportingInstance": "", "source": { "component": "kubelet", "host": "gke-knative-auto-cluster-default-pool-23c23c4f-xdj0" }, "type": "Normal" }
ApiServerSourceオブジェクトを削除する¶
ApiServerSourceオブジェクトと関連するすべてのリソースを削除するには
-
次のコマンドを実行して、ネームスペースを削除します。
ここで、kubectl delete namespace <namespace>
<namespace>
は、手順1で先に作成したネームスペースの名前です。