勉強会で発表した,Kubernetesのadmission webhookを実装する為の知識と, 実際にenvtestを使用するcontrollerの実装, clusterが立っていない環境でtest clusterを立ち上げるDEMOを行った. Kubebuilderを使わず,controller-runtimeを直に叩いて動かした.
An incremental approach toimplement an admissioncontrollerDrumato
View Slide
Index● Background○ Admission Controlとは● Admission Controllerを開発する上で気にしなければならないこと● 速習envtest○ testを動かすDEMO● deployについて考える○ kubebuilder projectを解析して構成要素を抽出する
Background
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
Admission controlSource: https://kubernetes.io/blog/2019/03/21/a-guide-to-kubernetes-admission-controllers/
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みたいなのをやってる
Admission Controllerを動かす
Required works are so complicated...● manifests○ cert-manager○ {Mutating, Validating}WebhookConfiguration○ service manifest■ WebhookConfiguration等はclientConfig.serviceを指定,webhookrequestはそのsvcに向かって送信される○ manager deployment● CRDの場合はCRD manifestsも増える● 幸いKubebuilder等を使えば1から手書きしなくても良い● 一方,kustomizeのoverlaysを使ったり,詳細にconfigurationしようとすると結局理解し,用意しなければならない
manifestやcontroller実装やdeploy等一度に多くのことを考えるのは大変
{custom, admission} controller開発とcluster deploy settingを分離して,まずはLogicだけを考えたい
そこでenvtest
速習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を用意せずに動く
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を使わない為に必要
envtest DEMO● admission control logicの紹介● test codeの紹介● make testの実行
Deployについて考える`kustomize build config/default`の実行結果を見ようkubebuilder init -> kubebuilder create api -> kubebuilder create webhook後
🙃🙃
kustomize build#Namespace● -system というNameを持つNamespaceができる● このnsにdeployされるresources○ {Webhook, Metrics} Service○ {Validating, Mutating}WebhookConfiguration○ Manager deployment○ Certificate, Issuer○ Role, RoleBind
kustomize build#ClusterRole● Namescaped Scopeを持つRoleと異なり,cluster単位の権限管理に用いるRole● -manager-roleを作り,default ServiceAccountにbindingす● Custom Resourcesに対する基本的な操作はすべてallowされる設定を注入
kustomize build#Certificate, Issuer● Webhook serverにTLS証明書を配置するために使われる● managerと同じnsに所属○ Issuerが証明書を発行し,Certificateがmanagerのsecretsに書き込む
所感
所感● Core typesに対するAdmission controlに限って言えば,Kubebuilder無しでも難しくない○ 実際にはdeployのことも考えると使ったほうが良い● k8s clusterに乗っけるsoftwareでも,envtestのようなpkgの利用で"incremental approach"が可能● kustomize buildを直で読んでいったり,kubectl describeすると何が起こっているかわかって便利● TLS何もわかってない
ありがとうございました
References● Programming Kubernetes● Dynamic Admission Control● The Kubebuilder book● kubernetes-sigs/controller-runtime