Upgrade to Pro — share decks privately, control downloads, hide ads and more …

An incremental approach to implement an admission controller

An incremental approach to implement an admission controller

勉強会で発表した,Kubernetesのadmission webhookを実装する為の知識と,
実際にenvtestを使用するcontrollerの実装,
clusterが立っていない環境でtest clusterを立ち上げるDEMOを行った.
Kubebuilderを使わず,controller-runtimeを直に叩いて動かした.

Ec9465c5a5f2ea26a80db56f9d2f99b0?s=128

Drumato

May 14, 2021
Tweet

Transcript

  1. An incremental approach to implement an admission controller Drumato

  2. Index • Background ◦ Admission Controlとは • Admission Controllerを開発する上で気にしなければならないこと •

    速習envtest ◦ testを動かすDEMO • deployについて考える ◦ kubebuilder projectを解析して構成要素を抽出する
  3. Background

  4. Background • Kubernetesはいくつかのextension patternを用意している ◦ Kubernetes自体のrebuildやcluster re-constructionをしなくても拡張可能 • Patterns ◦

    kubelet plugins … network, device, storage, container runtime ◦ kubectl plugins … e.g. adding some CLI commands ◦ access control … 本発表の対象 ◦ operator ◦ custom API server ◦ scheduler … PFNの方が資料を公開していた ◦ authentication
  5. Admission control Source: https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/

  6. Admission control • Kubernetesで作成可能な,API requestに対するhook pointの一つ • k8s objectの作成/更新/削除で発火し,Webhook Requestを出してくれる

    ◦ Webhook Serverを立てて,決められたformatのResponseを返すよう実装 することでAdmission Controlを実現 • 以下の2種類が存在 ◦ Validation … object fieldsを検証する ◦ Mutation … object fieldsを変更する ▪ Validationより前にhandlerが呼び出される • topolvmでは最低限のvalidationみたいなのをやってる
  7. Admission Controllerを動かす

  8. Required works are so complicated... • manifests ◦ cert-manager ◦

    {Mutating, Validating}WebhookConfiguration ◦ service manifest ▪ WebhookConfiguration等はclientConfig.serviceを指定,webhook requestはそのsvcに向かって送信される ◦ manager deployment • CRDの場合はCRD manifestsも増える • 幸いKubebuilder等を使えば1から手書きしなくても良い • 一方,kustomizeのoverlaysを使ったり,詳細にconfigurationしようとすると 結局理解し,用意しなければならない
  9. manifestやcontroller実装やdeploy等 一度に多くのことを考えるのは大変

  10. {custom, admission} controller開発と cluster deploy settingを 分離して, まずはLogicだけを考えたい

  11. そこでenvtest

  12. 速習envtest • controller-runtimeが提供する,Custom Controllerのtest環境を作るpackage ◦ k8s control planeのうちapiserver/etcdを利用してtest用clusterを作ってくれる • BDD

    frameworkのginkgo/gomegaと連携することで快適にtest ◦ 全test specが走る前にinitializationを実行できる ▪ そこでTLS証明書を読み込んだりできる ▪ WebhookConfigurationのベタ書きもできる • cert-managerやmanifestsを用意せずに動く
  13. Core type admission controller on envtest • admission.Handler interfaceを実装する構造体を定義する ◦

    CREATE/UPDATE/DELETE が全部func Handle()にかかってくる • それぞれ実装したいlogicを追加する • cplane binariesを適当に落とす ◦ envtest.Environment.Start()によって起動される ◦ 今回はKubebuilderに同梱されているものを使います • openssl等で証明書を作成し,func BeforeSuite()で読み込む ◦ cert-managerを使わない為に必要
  14. envtest DEMO • admission control logicの紹介 • test codeの紹介 •

    make testの実行
  15. Deployについて考える `kustomize build config/default`の実行結果を 見よう kubebuilder init -> kubebuilder create

    api -> kubebuilder create webhook後
  16. 🙃 🙃

  17. kustomize build#Namespace • <project-dir>-system というNameを持つNamespaceができる • このnsにdeployされるresources ◦ {Webhook, Metrics}

    Service ◦ {Validating, Mutating}WebhookConfiguration ◦ Manager deployment ◦ Certificate, Issuer ◦ Role, RoleBind
  18. kustomize build#ClusterRole • Namescaped Scopeを持つRoleと異なり,cluster単位の権限管理に用いるRole • <proj-dir>-manager-roleを作り,default ServiceAccountにbindingす • Custom

    Resourcesに対する基本的な操作はすべてallowされる設定を注入
  19. kustomize build#Certificate, Issuer • Webhook serverにTLS証明書を配置するために使われる • managerと同じnsに所属 ◦ Issuerが証明書を発行し,Certificateがmanagerのsecretsに書き込む

  20. 所感

  21. 所感 • Core typesに対するAdmission controlに限って言えば,Kubebuilder無しでも 難しくない ◦ 実際にはdeployのことも考えると使ったほうが良い • k8s

    clusterに乗っけるsoftwareでも,envtestのようなpkgの利用 で"incremental approach"が可能 • kustomize buildを直で読んでいったり,kubectl describeすると何が起こって いるかわかって便利 • TLS何もわかってない
  22. ありがとうございました

  23. References • Programming Kubernetes • Dynamic Admission Control • The

    Kubebuilder book • kubernetes-sigs/controller-runtime