AWS CDK との比較で見る cdk8s / cdk8s+ の現在地 #k8sjp / Kubernetes Meetup Tokyo 33rd

332f89cc697355902a817506b6995f2b?s=47 y_taka_23
August 26, 2020

AWS CDK との比較で見る cdk8s / cdk8s+ の現在地 #k8sjp / Kubernetes Meetup Tokyo 33rd

Kubernetes Meetup Tokyo #33 で使用したスライドです。

332f89cc697355902a817506b6995f2b?s=128

y_taka_23

August 26, 2020
Tweet

Transcript

  1. AWS CDK との比較で見る cdk8s / cdk8s+ の現在地 チェシャ猫 (@y_taka_23) Kubernetes

    Meetup Tokyo #33 (26th Aug. 2020) #k8sjp
  2. #k8sjp 例:静的 Web ホスティング <html>

  3. #k8sjp 例:静的 Web ホスティング <html> serviceName servicePort selector --from-file volume

    Selector port 表からは見えないが一貫性がないと動かない
  4. \Manifest の Boilerplate 多過ぎ/ #k8sjp

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

  6. YAML 嫌いのための cdk8s • 高級プログラミング言語で記述 ◦ 型検査、IDE、ライブラリ管理などが利用可能 ◦ 基本は TypeScript、その他

    Python、Java、.NET • ビルドすると YAML を生成 ◦ コマンドを直接実行するわけではない(宣言的) • AWS Cloud Development Kit (CDK) 派生 ◦ リソースを Construct としてカプセル化 #k8sjp
  7. 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
  8. 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
  9. (たいして YAML と変わらない?) #k8sjp

  10. #k8sjp cdk8s/packages/cdk8s-plus cdk8s+

  11. Layer 1 / Layer 2 Construct • L1 Construct ◦

    生 YAML のリソースと原則 1 : 1 で対応 ◦ cdk8s に相当、AWS SDK では通常使用しない • L2 Construct ◦ 内部的に L1 を呼び出して Boilerplate を隠蔽 ◦ AWS CDK では通常こちらのレイヤを触る ◦ cdk8s+ として API 策定中(一部仮実装済み) #k8sjp
  12. 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 子要素が一つのみの
  13. 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 を 内部的に生成して対応づけてくれる
  14. サポート外のリソースは自前で実装? #k8sjp

  15. cdk8s のコード生成ツール • cdk8s import ◦ CRD の YAML を取り込んで

    Construct に変換 ◦ 必要な Construct は imports 以下に出力 • jsii ◦ TypeScript の実装を他言語に変換する謎技術 ◦ もともと CDK 用だったツールを cdk8s も踏襲 ◦ 自作 Construct を多言語でライブラリ登録できる #k8sjp
  16. プログラミング言語だから 単体テストも書ける #k8sjp

  17. AWS CDK のテスト • Snapshot Test ◦ 生成される YAML が変化していないことを確認

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

    Fine-Grained Assertion(Roadmap のみ) ◦ 単なる等価性以上も判定できる専用ライブラリ ◦ YAML の部分一致、リソースの個数指定など • Validation(利用可能) ◦ Construct 生成時にパラメータをチェック #k8sjp
  19. #k8sjp \CNCF Sandbox 申請予定/

  20. まとめ • Kubernetes Manifest 書きたくない ◦ YAML は「実装の詳細」が露出し過ぎている • cdk8s

    による YAML 生成 ◦ 言語機能やエコシステムに乗ることができる • AWS CDK より未成熟だが使用感は近い ◦ L2 Construct と テストの充実が今後の課題か #k8sjp
  21. DEMO:静的 Web ホスティング #k8sjp https://github.com/y-taka-23/cdk8s-hosting

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