Slide 1

Slide 1 text

An incremental approach to implement an admission controller Drumato

Slide 2

Slide 2 text

Index ● Background ○ Admission Controlとは ● Admission Controllerを開発する上で気にしなければならないこと ● 速習envtest ○ testを動かすDEMO ● deployについて考える ○ kubebuilder projectを解析して構成要素を抽出する

Slide 3

Slide 3 text

Background

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Admission control Source: https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/

Slide 6

Slide 6 text

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みたいなのをやってる

Slide 7

Slide 7 text

Admission Controllerを動かす

Slide 8

Slide 8 text

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しようとすると 結局理解し,用意しなければならない

Slide 9

Slide 9 text

manifestやcontroller実装やdeploy等 一度に多くのことを考えるのは大変

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

そこでenvtest

Slide 12

Slide 12 text

速習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を用意せずに動く

Slide 13

Slide 13 text

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を使わない為に必要

Slide 14

Slide 14 text

envtest DEMO ● admission control logicの紹介 ● test codeの紹介 ● make testの実行

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

🙃 🙃

Slide 17

Slide 17 text

kustomize build#Namespace ● -system というNameを持つNamespaceができる ● このnsにdeployされるresources ○ {Webhook, Metrics} Service ○ {Validating, Mutating}WebhookConfiguration ○ Manager deployment ○ Certificate, Issuer ○ Role, RoleBind

Slide 18

Slide 18 text

kustomize build#ClusterRole ● Namescaped Scopeを持つRoleと異なり,cluster単位の権限管理に用いるRole ● -manager-roleを作り,default ServiceAccountにbindingす ● Custom Resourcesに対する基本的な操作はすべてallowされる設定を注入

Slide 19

Slide 19 text

kustomize build#Certificate, Issuer ● Webhook serverにTLS証明書を配置するために使われる ● managerと同じnsに所属 ○ Issuerが証明書を発行し,Certificateがmanagerのsecretsに書き込む

Slide 20

Slide 20 text

所感

Slide 21

Slide 21 text

所感 ● Core typesに対するAdmission controlに限って言えば,Kubebuilder無しでも 難しくない ○ 実際にはdeployのことも考えると使ったほうが良い ● k8s clusterに乗っけるsoftwareでも,envtestのようなpkgの利用 で"incremental approach"が可能 ● kustomize buildを直で読んでいったり,kubectl describeすると何が起こって いるかわかって便利 ● TLS何もわかってない

Slide 22

Slide 22 text

ありがとうございました

Slide 23

Slide 23 text

References ● Programming Kubernetes ● Dynamic Admission Control ● The Kubebuilder book ● kubernetes-sigs/controller-runtime