Slide 1

Slide 1 text

Recap SIG API Machinery Deep Dive Kubernetes meetup Tokyo #11 Aya Igarashi @ladicle

Slide 2

Slide 2 text

@Ladicle Aya Igarashi Software Engineer - Z Lab Corp. Who am I?

Slide 3

Slide 3 text

Custom Resources Demo https://github.com/Ladicle/crd-sample

Slide 4

Slide 4 text

Outline of the Talk ★ DeepDive Stefan Schimanski Senior Software Engineer at Red Hat ○ api-serverがapiextensions-apierverに委譲する流れ ○ CRDを生成する流れと, raceするbugの紹介 ○ spec+ statusパターンの推奨 (for subresource) ○ structuredなclientコード生成のすゝめ ○ OpenAPI v3 schemaによるvalidationの紹介 ○ 上記のvalidationを利用したpruning (schema外のfieldがあった場合は除去 ) ○ Subresourceの /scaleと /status の紹介 ○ Versioning, Pruning/Defaulting, Graceful Deletion, Server Side Printing Columns, Subresources ★ Custom Resources 1.11+ (1.12+) https://www.youtube.com/watch?v=XsFH7OEIIvI

Slide 5

Slide 5 text

Versioning & Validation DEEP DIVE

Slide 6

Slide 6 text

CRD versioning (nop conversion) v1.11 ○ Design: https://github.com/kubernetes/community/pull/2054/files ○ Pull-Request: https://github.com/kubernetes/kubernetes/pull/63830 #ONGOING type CustomResourceDefinitionSpec struct { ... // 将来的にDeprecatedになる. Version string // 対応するVersionリスト. // StoredVersionsリストに含まれているものは削除できない. Versions []CustomResourceDefinitionVersion } type CustomResourceDefinitionVersion struct { // v2beta1などのバージョン名. Name string // REST APIから指定できるようにするかのフラグ. Served Boolean // Storage(etcd)に保存する時のVersionであるかのフラグ. // Versionリストの中で1つのみTrueにする. Storage Boolean } type CustomResourceDefinitionStatus struct { ... // Storageに保存されているCRのVersionリスト. // migrationが完了したらリストから除く. StoredVersions []string }

Slide 7

Slide 7 text

CRD versioning v1.12+ ○ Design: https://github.com/kubernetes/community/pull/2026/files #ONGOING type CustomResourceDefinitionVersion struct { ... Conversion CustomResourceConversion } // 変更するpathごとにconversion resourceを作成する type CustomResourceConversion struct { Declarative map[string]CustomResourceDeclarativeConversion } type CustomResourceDeclarativeConversion struct { Rename RenameConversion // 右のWebhook用の設定 External CustomResourceConversionWebhook } // JsonPath(例: .spec.hoge)形式で指定 type RenameConversion struct { From JsonPath To JsonPath } type CustomResourceExternalConversion struct { // 変換先のVersion名リスト. To []string Webhook ConversionWebhook } type ConversionWebhook struct { // clientとどう通信するかを定義するもの. // WebhookのService等を指定する ClientConfig WebhookClientConfig } // 各VersionのValidationにも対応するようだが // これの詳細はまだ未定

Slide 8

Slide 8 text

Validation OpenAPI v3 schema & Admission Controllers

Slide 9

Slide 9 text

Validation using OpenAPI v3 schema apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: meetups.kube.tokyo ... validation: openAPIV3Schema: properties: spec: properties: eventName: type: string pattern: '^KubernetesMeetup#\d+$' theme: type: string enum: - normal - recap speakerNames: type: array items: type: string capacity: type: integer default: 10 minimum: 10 apiVersion: kube.tokyo/v1 kind: Meetup metadata: name: meetup11 namespace: default spec: eventName: Kubernetes Meetup Tokyo #11 theme: recap speakerNames: - lanMLewis - amsy810 - ladicle - nasa9085 - jyoshise - rafiror - dtan4 capacity: 200

Slide 10

Slide 10 text

Validation using Admission Controllers --enable-admission-plugins=DefaultStorageClass,DefaultTolerationSeconds,Mutating AdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota ● ValidatingAdmissionWebhook ○ リソースをValidationするためのWebhook (変更はできない) ● MutatingAdmissionWebhook ○ リソースのチェックや変更をするための Webhook ● Initializers ○ リソースを初期化するための metadata.initializers.pendingリストを付与する ○ 全ての初期化が終わるまでリソースが作成されない etc...

Slide 11

Slide 11 text

What should I use to validate resources?

Slide 12

Slide 12 text

WE ARE HIRING!

Slide 13

Slide 13 text

THANK YOU For your time & we’ll see you soon ladicle