Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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