Slide 1

Slide 1 text

AWS CDK との比較で見る cdk8s / cdk8s+ の現在地 チェシャ猫 (@y_taka_23) Kubernetes Meetup Tokyo #33 (26th Aug. 2020) #k8sjp

Slide 2

Slide 2 text

#k8sjp 例:静的 Web ホスティング

Slide 3

Slide 3 text

#k8sjp 例:静的 Web ホスティング serviceName servicePort selector --from-file volume Selector port 表からは見えないが一貫性がないと動かない

Slide 4

Slide 4 text

\Manifest の Boilerplate 多過ぎ/ #k8sjp

Slide 5

Slide 5 text

#k8sjp https://github.com/awslabs/cdk8s シーディーケイツ!

Slide 6

Slide 6 text

YAML 嫌いのための cdk8s ● 高級プログラミング言語で記述 ○ 型検査、IDE、ライブラリ管理などが利用可能 ○ 基本は TypeScript、その他 Python、Java、.NET ● ビルドすると YAML を生成 ○ コマンドを直接実行するわけではない(宣言的) ● AWS Cloud Development Kit (CDK) 派生 ○ リソースを Construct としてカプセル化 #k8sjp

Slide 7

Slide 7 text

export class MyChart extends Chart { constructor(scope: Construct, name: string) { super(scope, name); new Service(this, ‘mysvc’, { spec: { selector: { app: ‘myapp’ }, ports: [{ port: 80, targetPort: 8080 }] } }); } } #k8sjp

Slide 8

Slide 8 text

export class MyChart extends Chart { constructor(scope: Construct, name: string) { super(scope, name); new Service(this, ‘mysvc’, { spec: { selector: { app: ‘myapp’ }, ports: [{ port: 80, targetPort: 8080 }] } }); } } #k8sjp this (= MyChart) を親要素として 参照を貼っている YAML: MyChart Service: mysvc scope

Slide 9

Slide 9 text

(たいして YAML と変わらない?) #k8sjp

Slide 10

Slide 10 text

#k8sjp cdk8s/packages/cdk8s-plus cdk8s+

Slide 11

Slide 11 text

Layer 1 / Layer 2 Construct ● L1 Construct ○ 生 YAML のリソースと原則 1 : 1 で対応 ○ cdk8s に相当、AWS SDK では通常使用しない ● L2 Construct ○ 内部的に L1 を呼び出して Boilerplate を隠蔽 ○ AWS CDK では通常こちらのレイヤを触る ○ cdk8s+ として API 策定中(一部仮実装済み) #k8sjp

Slide 12

Slide 12 text

import { Deployment } from ‘cdk8s-plus’; export class MyChart extends Chart { constructor(scope: Construct, name: string) { super(scope, name); const deploy = new Deployment(this, ‘mydeploy’) { spec: { ... } } deploy.expose({ port: 80 }); } } #k8sjp 子要素が一つのみの

Slide 13

Slide 13 text

import { Deployment } from ‘cdk8s-plus’; export class MyChart extends Chart { constructor(scope: Construct, name: string) { super(scope, name); const deploy = new Deployment(this, ‘mydeploy’) { spec: { ... } } deploy.expose({ port: 80 }); } } #k8sjp 子要素が一つのみの deploy に対応する selector / port を 内部的に生成して対応づけてくれる

Slide 14

Slide 14 text

サポート外のリソースは自前で実装? #k8sjp

Slide 15

Slide 15 text

cdk8s のコード生成ツール ● cdk8s import ○ CRD の YAML を取り込んで Construct に変換 ○ 必要な Construct は imports 以下に出力 ● jsii ○ TypeScript の実装を他言語に変換する謎技術 ○ もともと CDK 用だったツールを cdk8s も踏襲 ○ 自作 Construct を多言語でライブラリ登録できる #k8sjp

Slide 16

Slide 16 text

プログラミング言語だから 単体テストも書ける #k8sjp

Slide 17

Slide 17 text

AWS CDK のテスト ● Snapshot Test ○ 生成される YAML が変化していないことを確認 ● Fine-Grained Assertion ○ 単なる等価性以上も判定できる専用ライブラリ ○ YAML の部分一致、リソースの個数指定など ● Validation ○ Construct 生成時にパラメータをチェック #k8sjp

Slide 18

Slide 18 text

cdk8s のサポート状況 ● Snapshot Test(利用可能) ○ 生成される YAML が変化していないことを確認 ● Fine-Grained Assertion(Roadmap のみ) ○ 単なる等価性以上も判定できる専用ライブラリ ○ YAML の部分一致、リソースの個数指定など ● Validation(利用可能) ○ Construct 生成時にパラメータをチェック #k8sjp

Slide 19

Slide 19 text

#k8sjp \CNCF Sandbox 申請予定/

Slide 20

Slide 20 text

まとめ ● Kubernetes Manifest 書きたくない ○ YAML は「実装の詳細」が露出し過ぎている ● cdk8s による YAML 生成 ○ 言語機能やエコシステムに乗ることができる ● AWS CDK より未成熟だが使用感は近い ○ L2 Construct と テストの充実が今後の課題か #k8sjp

Slide 21

Slide 21 text

DEMO:静的 Web ホスティング #k8sjp https://github.com/y-taka-23/cdk8s-hosting

Slide 22

Slide 22 text

Construct Your Cool Constructs! Presented by チェシャ猫 (@y_taka_23) #k8sjp