第19章 Extending the Kubernetes API with Custom Resources
Kubernetes API では、リソースは特定の種類の API オブジェクトのコレクションを保管するエンドポイントです。たとえば、ビルトインされた Pod リソースには Pod オブジェクトのコレクションが含まれます。
カスタムリソースは、Kubernetes API を拡張するか、またはプロジェクトまたはクラスターに独自の API を導入することを可能にするオブジェクトです。
カスタムリソース定義 (CRD) ファイルは、独自のオブジェクトの種類を定義し、API サーバーがライフサイクル全体を処理できるようにします。CRD をクラスターにデプロイすると、Kubernetes API サーバーは指定されたカスタムリソースを提供し始めます。
新規のカスタムリソース定義 (CRD) の作成時に、Kubernetes API サーバーは、クラスター全体または単一プロジェクト (namespace) でアクセスできる新規 RESTful リソースパスを作成することによって応答します。既存のビルトインオブジェクトの場合のように、プロジェクトを削除すると、そのプロジェクトのすべてのカスタムオブジェクトが削除されます。
19.1. Creating Custom Resource Definitions
To create a CRD, open a YAML file and enter the fields in the following example.
Example YAML file for a Custom Resource Definition
apiVersion: apiextensions.k8s.io/v1beta1 1 kind: CustomResourceDefinition metadata: name: crontabs.stable.example.com 2 spec: group: stable.example.com 3 version: v1 4 scope: Namespaced 5 names: plural: crontabs 6 singular: crontab 7 kind: CronTab 8 shortNames: - ct 9
- 1
apiextensions.k8s.io/v1beta1
API を使用します。- 2
- 定義の名前を指定します。これは
group
およびplural
フィールドの値を使用する <plural-name><group> 形式である必要があります。 - 3
- API のグループ名を指定します。API グループは、論理的に関連付けられるオブジェクトのコレクションです。たとえば、
Job
またはScheduledJob
などのすべてのバッチオブジェクトはバッチ API グループ (batch.api.example.com など) である可能性があります。組織の完全修飾ドメイン名を使用することが奨励されます。 - 4
- Specify a version name to be used in the URL. Each API Group can exist in multiple versions. For example:
v1alpha
,vibeta
,v1
. - 5
- カスタムオブジェクトがクラスター (
Cluster
) の 1 つのプロジェクト (Namespaced
) またはすべてのプロジェクトで利用可能であるかどうかを指定します。 - 6
- Specify the plural name to be used in the URL. The
plural
field is the same as a resource in an API URL. - 7
- Specify a singular name to be used as an alias on the CLI and for display.
- 8
- 作成できるオブジェクトの種類を指定します。タイプは CamelCase にすることができます。
- 9
- CLI でリソースに一致する短い文字列を指定します。
デフォルトで、カスタムリソース定義のスコープはクラスターに設定され、すべてのプロジェクトで利用可能です。
After configuring the definition file, create the object:
oc create -f <file-name>.yaml
新規の RESTful API エンドポイントは以下のように作成されます。
/apis/<spec:group>/<spec:version>/<scope>/*/<names-plural>/...
For example, using the example file, the following endpoint would be created:
/apis/stable.example.com/v1/namespaces/*/crontabs/...
This endpoint URL can then be used to create and manage custom objects. The kind of object is based on the spec.kind
field of the Custom Resource Definition object you created.
19.2. Create Custom Objects
After the custom resource definition object has been created, you can create custom objects.
Custom objects can contain custom fields. These fields can contain arbitrary JSON.
In the following example, the cronSpec
and image
custom fields are set in a custom object of kind CronTab
. The kind CronTab
comes from the spec.kind
field of the custom resource definition object you created above.
Example YAML file for a Custom Object
apiVersion: "stable.example.com/v1" 1 kind: CronTab 2 metadata: name: my-new-cron-object 3 spec: 4 cronSpec: "* * * * /5" image: my-awesome-cron-image
After configuring the object file, create the object:
oc create -f <file-name>.yaml
19.3. Manage Custom Objects
You can then manage your custom resources.
特定の種類のカスタムリソースについての情報を取得するには、以下を入力します。
oc get <kind>
例:
oc get crontab NAME KIND my-new-cron-object CronTab.v1.stable.example.com
リソース名では大文字と小文字が区別されず、CRD で定義される単数形または複数形のいずれか、および任意の短縮名を指定できることに注意してください。以下は例になります。
oc get crontabs oc get crontab oc get ct
You can also view the raw JSON data:
oc get <kind> -o yaml
You should see that it contains the custom <1> cronSpec
and <2> image
fields from the YAML you used to create it:
oc get ct -o yaml apiVersion: v1 items: - apiVersion: stable.example.com/v1 kind: CronTab metadata: clusterName: "" creationTimestamp: 2017-05-31T12:56:35Z deletionGracePeriodSeconds: null deletionTimestamp: null name: my-new-cron-object namespace: default resourceVersion: "285" selfLink: /apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object uid: 9423255b-4600-11e7-af6a-28d2447dc82b spec: cronSpec: '* * * * /5' 1 image: my-awesome-cron-image 2
19.4. Finalizers
Custom objects support finalizers, which allow controllers to implement conditions that must be completed before the object can be deleted.
You can add a finalizer to a custom object like this:
apiVersion: "stable.example.com/v1" kind: CronTab metadata: finalizers: - finalizer.stable.example.com
The first delete request on an object with finalizers sets a value for the metadata.deletionTimestamp
field instead of deleting the object. This triggers controllers watching the object to execute any finalizers they handle.
Each controller then removes the finalizer from the list and issues the delete request again. This request deletes the object only if the list of finalizers is empty, meaning all finalizers are done.