Slide 1

Slide 1 text

Kube API Server Kubernetes Meetup Tokyo #45(2021/09/28) @bells17

Slide 2

Slide 2 text

▶ @bells17 ▶ Software Engineer@IDC Frontier inc. ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ #kubenews ▶ @bells17_

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

毎週⾦曜⽇22:00~ k8s・Cloud Native関連のニュース紹介配信してます

Slide 5

Slide 5 text

今⽇話すこと ▶ Kubernetes Core Componentについての簡単な説明 ▶ Kube API Serverの⼤まかなアーキテクチャと⼀部機能の実装について

Slide 6

Slide 6 text

注意点 ▶ Kubernetes v1.21.2ベースでのお話になります ▶ KubernetesそのものやKubernetes Component全体の説明は簡単なものに なるかと思います ▶ あくまでKube API Serverの実装を追った結果での理解の説明になるので、 間違ってる箇所があったら教えて下さい

Slide 7

Slide 7 text

そもそもKubernetesとは?

Slide 8

Slide 8 text

Kubernetes とは? ▶ Kubernetesはコンテナオーケストレーターの1つ ▶ etcd/control plane/worker nodeによって構成されたクラスターを構築し、 様々なコンテナをKubernetes上のnodeで動作させたり、動作させてるコン テナとネットワークをいい感じに連携できるようにすることができる ▶ デプロイするコンテナなどをmanifestファイルで宣⾔的に記述することで、 宣⾔した状態になるようにKubernetesがいい感じに調整処理を⾏ってくれる ▶ Googleが内部で運⽤していたコンテナ基盤であるBorgをOSS向けに作り直 したコンテナオーケストレーター ▶ また、KubernetesはCloud Native Computing Foundation(CNCF)に寄贈さ れており、CNCFのGraduatedプロジェクトとしてコミュニティベースで管理 されている

Slide 9

Slide 9 text

manifestをKubernetesに適⽤することで 宣⾔されたmanifestの通りにコンテナが作成される

Slide 10

Slide 10 text

Kubernetes Core Component

Slide 11

Slide 11 text

https://github.com/kubernetes/website/blob/fb6364da0afd19e8a9515aaae2de9bc74a0a6abd/static/images/docs/components-of-kubernetes.png

Slide 12

Slide 12 text

Core Component ▶ etcd: API Serverのバックエンドで使⽤されている分散型のKVS ▶ Control Plane ▶ API Server: KubernetesのAPIリクエストを処理するサーバー ▶ Kube Controller Manager: Kubernetesの様々なリソースのためのロジックを動かす 様々なコントローラーを動作させるマネージャー ▶ Cloud Controller Manager: Kubernetesとクラウド(実⾏基盤)を連携するための コントローラーを動作させるマネージャー ▶ Scheduler: PodをどのWorker Nodeに配置するかを決める ▶ Worker Node ▶ Kubelet: Worker Nodeで実⾏するコンテナを管理するアプリケーション ▶ Kube Proxy: Serviceリソースに基づくネットワーク設定を⾏うアプリケーション

Slide 13

Slide 13 text

▶ Cloud Controller Manager Deep Dive ▶ Kubernetes Internal #2 Cloud Controller Managerについては以下のスライドで まとめてあるので参考にしてください

Slide 14

Slide 14 text

▶ Kubeletから読み解くKubernetesのコンテナ管理の裏側 ▶ Kubernetes Internal #4 ▶ Kubeletから読み解くKubernetesのコンテナ管理の裏側 Kubeletについても以前発表しているセッションや書籍が あるので良ければ参考にしてください

Slide 15

Slide 15 text

https://github.com/kubernetes/website/blob/fb6364da0afd19e8a9515aaae2de9bc74a0a6abd/static/images/docs/components-of-kubernetes.png

Slide 16

Slide 16 text

Kube API Serverとは?

Slide 17

Slide 17 text

Kube API Server ▶ Kubernetesの様々なデータ保存や取得、イベント通知を⾏うAPI Server ▶ Rest APIを中⼼としたAPI Serverを提供する ▶ API定義はProtocol Buffersによって⾏われる ▶ 定義したAPIはAPI Server側でOpenAPI形式に変換され、APIからスキーマ定義が 取得可能 ▶ etcdをデータ永続のためのデータストアとして使⽤ ▶ 独⾃リソース管理のための機能を提供 ▶ Extension API Server ▶ Custom Resource Definition(CRD)

Slide 18

Slide 18 text

まずはイメージを掴むために軽く触ってみる

Slide 19

Slide 19 text

Kube API Serverを触ってみる(まずはkubectlで) 1PEҰཡΛऔಘ͢Δ LVCFDUMOEFGBVMUHFUQPE /".&3&"%:45"5643&45"354"(& NZQPE3VOOJOHI

Slide 20

Slide 20 text

Kube API Serverを触ってみる(次にcurlで) LVCFQSPYZίϚϯυͰ"1*4FSWFSʹ௚઀DVSMͰϦΫΤετΛͰ͖ΔΑ͏ʹ LVCFDUMQSPYZŠQPSU DVSMͰEFGBVMUOBNFTQBDFʹ͋Δ1PEҰཡΛऔಘ DVSMIUUQMPDBMIPTUBQJWOBNFTQBDFTEFGBVMUQPET \ LJOE1PE-JTU BQJ7FSTJPOW NFUBEBUB\ SFTPVSDF7FSTJPO ^ JUFNT< \ NFUBEBUB\ OBNFNZQPE OBNFTQBDFEFGBVMU

Slide 21

Slide 21 text

どんなリソース定義があるのかを調べることができたり DVSMIUUQMPDBMIPTUBQJW \ LJOE"1*3FTPVSDF-JTU HSPVQ7FSTJPOW SFTPVSDFT< \ OBNFQPET TJOHVMBS/BNF OBNFTQBDFEUSVF LJOE1PE WFSCT< DSFBUF EFMFUF EFMFUFDPMMFDUJPO HFU MJTU QBUDI VQEBUF XBUDI > TIPSU/BNFT< QP > DBUFHPSJFT< BMM > TUPSBHF7FSTJPO)BTIY10X3;:IX ^

Slide 22

Slide 22 text

そもそもどんなパスがあるのかを調べたりすることもできる DVSMIUUQMPDBMIPTU \ QBUIT< XFMMLOPXOPQFOJEDPOpHVSBUJPO BQJ BQJW BQJT BQJT lIFBMUI[ "1*4FSWFSͷϔϧενΣοΫΤϯυϙΠϯτ ʜ lNFUSJDT "1*4FSWFSͷϝτϦΫεΛऔಘ lPQFOBQJW "1*4FSWFSʹ0QFO"1*εΩʔϚΛऔಘ ΊͬͪΌ௕͍ PQFOJEWKXLT lWFSTJPO"1*4FSWFSͷόʔδϣϯΛऔಘ > ^

Slide 23

Slide 23 text

こんな感じでcurlで叩いて⾒ると普通の API Serverっぽい感じを実感できる

Slide 24

Slide 24 text

API Serverにリクエストしたときに 起きてること ▶ http2によるリクエストをAPI Serverが受信 ▶ API ServerのServerChainにより様々な前処理を実⾏ + CORS/HSTSなど各種HTTPヘッダーを設定 + 認証/認可処理 + なりすまし機能によるユーザー情報の差し替え + etc ▶ 対象リソースの取得/作成など実⾏ + リソースの作成や更新時は各種Admission Controllerによる値の上書き やバリデーションを実⾏ + バリデーションなどでエラーが無ければetcdにデータを保存 ▶ レスポンスを返す

Slide 25

Slide 25 text

ということでKube API Serverの アーキテクチャを⾒ていく

Slide 26

Slide 26 text

Kube API Server Overview

Slide 27

Slide 27 text

ServerChain

Slide 28

Slide 28 text

ServerChain

Slide 29

Slide 29 text

ServerChain ServerChainは各リクエストの処理前に実⾏される前処理になる ▶ HSTS/CacheControl/CORSといったHTTP headerを設定 ▶ リクエスト処理時間を記録 ▶ リクエスト⽤のaudit eventレコーダーを⽣成 ▶ リクエスト情報を元にRequestInfoオブジェクトを⽣成 ▶ リクエストの種類を元にタイムアウト時間を設定 ▶ 認証 ▶ ユーザーのなりすまし設定 ▶ APIリクエストの優先度コントロール ▶ 認可 といったことを⾏なっている これらの前処理後に実際に要求した各種のリソース操作などの処理を⾏なっている

Slide 30

Slide 30 text

Kube API Serverのアーキテクチャ Kube API Serverは主に3つのコンポーネントによって構成されている ▶ API Extentions Server ▶ API Server ▶ Aggregator Server

Slide 31

Slide 31 text

API Extensions Server

Slide 32

Slide 32 text

API Extensions Server ▶ API Extentions Serverは、ユーザーが作成するCRDリソースの設定に 基づいてカスタムリソースを処理するためのhttp handlerを動的に提供する 機能を提供する ▶ そのため、CRDが作成されるとAPI Extentions Server内部で動いている Kubernetes Controller群によってバリデーションなどのチェックが⾏わ れ、問題無ければ動的にカスタムリソースを処理するエンドポイントが提供 される ▶ つまり、Kubernetesを使っててよくお世話になるKubernetes Operatorが 機能するのはこのAPI Extensions Serverのおかげ ▶ また、CRDリソースのCRUDエンドポイントを⽤意してるのもこのサーバー

Slide 33

Slide 33 text

API Server

Slide 34

Slide 34 text

API Server ▶ API Serverは、Kubernetes内部で定義済みのPodやConfigMapといった 各種リソースを処理するためのAPIサーバーを提供する ▶ なのでKubernetesがデフォルトで提供するリソースを処理するためのエン ドポイントはだいたいこのAPI Serverが提供してくれている ▶ ちなみに定義済みのAPIは⼤まかに以下のような感じで分類できるっぽい ▶ Core(Legacy) API: PodやConfigMapなど”v1”のAPI ▶ GroupVersion API:“batchv1”や”appsv1”などのグループに所属してるAPI ▶ その他のAPI: VersionやHealthzなどのAPI

Slide 35

Slide 35 text

Aggregator Server

Slide 36

Slide 36 text

Aggregator Server ▶ Aggregator Serverは初期化時にAPI ServerとAPI Extensions ServerのOpenAPIス キーマ定義を読み取り、APIServiceリソースを⽣成する ▶ Aggregator ServerではAPIServiceリソースを監視するKubernetes Controllerが動 作していて、APIServiceリソースの変更に基づいて、動的にリクエストを処理する ためのhttp handlerの設定が⾏われる ▶ また、ユーザーが⼿動で追加したExtension API Serverについては、ユーザーが⼿ 動でAPIServiceリソースを作成することにより、設定した条件に基づいてリクエス トがExtension API Serverにプロキシされる ▶ API Extentions ServerやAPI Serverは、実際にはAggregator Serverに組み込まれて 動作するので、複数のHTTPサーバーが起動するわけではない (それぞれが別々に⾃⽴して起動できるような実装にはなっているよう)

Slide 37

Slide 37 text

Extension API Server ▶ Kube API Serverには独⾃のAPI Serverを構築し、Kube API Serverと連携 する仕組みがある ▶ この独⾃に構築したAPI ServerのことをExtension API Serverと呼ぶ (少なくとも公式ドキュメントではそういう呼び⽅してる) ▶ API Extensions Servertと似たような名前でわかりづらい ▶ Extension API Serverを構築 → APIServiceを登録することで連携される ▶ Extension API Serverを構築する⽅法として以下のような⽅法が提供されて いる + https://github.com/kubernetes/sample-apiserver + https://github.com/kubernetes-sigs/apiserver-builder-alpha

Slide 38

Slide 38 text

Extension API Serverの利⽤例として カスタムメトリクスをAPI Serverとして提供する例などがある https://github.com/kubernetes-sigs/custom-metrics-apiserver

Slide 39

Slide 39 text

先程のcustom-metrics-apiserverを利⽤した例 LVCFDUMHFU1PE.FUSJDTNZQPEPZBNM BQJ7FSTJPONFUSJDTLTJPWCFUB DPOUBJOFST OBNFVCVOUV VTBHF DQV NFNPSZ,J LJOE1PE.FUSJDT NFUBEBUB DSFBUJPO5JNFTUBNQ5; MBCFMT BQQLVCFSOFUFTJPOBNFNZQPE OBNFNZQPE OBNFTQBDFEFGBVMU UJNFTUBNQ5; XJOEPXNT

Slide 40

Slide 40 text

Admission ControllerとAdmission Webhook

Slide 41

Slide 41 text

Admission Controller ▶ Kube API ServerにはAdmission ControllerというAPI Serverへのリソース の保存や更新時に、保存するデータを上書きしたり、バリデーションする 仕組みが存在する ▶ Admission ControllerはKube API Serverに組み込まれており、プラグイン という形でどのAdmission Controllerを利⽤するかを選択することができる ▶ この機能は、元々OpenShiftに実装されていたものが、Kubernetesに移植 される形で導⼊されたらしい

Slide 42

Slide 42 text

NamespaceLifecycle 削除中のNamespaceへのリソース作成を防⽌したり システム⽤のNamespaceの削除防⽌を⾏なったりする LimitRanger Namespace内のコンテナのリソースリミット/リクエストの設定を強制する Namespace内のPVCのリソースリミット/リクエストの設定を強制する、など TaintNodesByCondition 新しく追加されたNodeに対して”NotReady”や”NoSchedule”のtaintを⾃動で付与する PersistentVolume ClaimResize Volume拡張が許可されていないStorageClassを使ったPVCの容量アップを防⽌する Admission Pluginの例 その他にも合計で35種類ほどのPluginがあり、そのうち18種類がデフォルトで有効になってる

Slide 43

Slide 43 text

Admission Webhook ▶ Admission Pluginの⼀種である + ValidatingAdmissionWebhook + MutatingAdmissionWebhook ▶ の2つのpluginが提供する機能 ▶ それぞれ + MutatingWebhookConfiguration + ValidatingWebhookConfiguration ▶ というリソースを設定することで独⾃のWebhookサーバーを通してデータ の上書き/バリデーションを⾏うことが可能 ▶ データの上書き/バリデーションの機能が利⽤できるので、実質的に各種 Admission Pluginと同じ仕組みをKubernetesの外部から提供可能

Slide 44

Slide 44 text

Kubebuilderによる Admission Webhookの提供 ▶ KubebuilderはKubernetesコミュニティが提供する、Kubernetes Operator/ Admission Webhookを実装するためのフレームワーク ▶ Kubebuilderを利⽤することで、簡単にAdmission Webhookを実装~提供が 可能 ▶ Webhookサーバーのために⽣成する⾃⼰証明書の⽣成がcert-managerに依存 しているので、cert-managerのインストールが必要となっている点に注意

Slide 45

Slide 45 text

https://book.kubebuilder.io/cronjob-tutorial/webhook-implementation.html KubebuilderによるValidating Webhook実装例

Slide 46

Slide 46 text

etcdにデータが保存されるまで

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

etcdにデータが保存されるまで ▶ ServerChainによる前処理を実⾏ ▶ HTTP Bodyをデコードしてruntime.Objectを⽣成 ▶ オブジェクトにManagedFieldを設定 ▶ 各種MutatingAdmissionを実⾏ + 対象リソースを処理するMutatingWebhookが登録されている場合は実⾏ ▶ オブジェクトにOwnerReferenceを設定 ▶ 各種ValidatingAdmissionを実⾏ + 対象リソースを処理するValidatingAdmissionが登録されている場合は実⾏ ▶ 対象リソースに応じたTransformerを実⾏し、etcdに保存するデータを暗号化 + 暗号化にKMSプロバイダーを使⽤している場合には、unix domain socketとgRPCを通してKMS プラグインへリクエスト + KMSプラグインを通してKMSプロバイダーのAPIを呼び出し + リソースごとの暗号化設定はEncryptionConfigurationによって設定可 ▶ etcdへデータを保存 ▶ デコードしてクライアントへレスポンスを返す

Slide 49

Slide 49 text

Etcdのデータを⾒てみると実際に暗号化されてるのが確認できる LVCFDUMFYFDFUDEDPOUSPMQMBOFOLVCFTZTUFNJUTID&5$%$5-@"1*FUDEDUMDBDFSUFUDLVCFSOFUFTQLJFUDEDBDSUDFSUFUD LVCFSOFUFTQLJFUDETFSWFSDSULFZFUDLVCFSOFUFTQLJFUDETFSWFSLFZXpFMETHFUSFHJTUSZQPETLVCFTZTUFNFUDEDPOUSPMQMBOF $MVTUFS*% .FNCFS*% 3FWJTJPO 3BGU5FSN ,FZSFHJTUSZQPETLVCFTZTUFNFUDEDPOUSPMQMBOF $SFBUF3FWJTJPO .PE3FWJTJPO 7FSTJPO 7BMVFLTaYaOaUaOaYWaYaY1PEaYaYDBaOaYBaYaOaFUDEDPOUSPMQMBOFaYaYaYBaWLVCF TZTUFNaaYGDCED CCCDEFaYaY#aCaCaYGDaYBBaYCaYaYaYaY;aYaOaUDPNQPOFOUaYaYFUDE;aYaOaYUJFSaYaSDPOUSPM QMBOFC,aOLVCFBENLVCFSOFUFTJPFUDEBEWFSUJTFDMJFOUVSMTaYaYIUUQTCaOaYLVCFSOFUFTJPDPOpHIBTIaY CFEBBFGC⒎EEBC aOaYCLVCFSOFUFTJPDPOpHNJSSPSaYCFEBBFGC⒎EEBC aOaYLVCFSOFUFTJPDPOpHTFFOaYaYF5;CaOaYCLVCFSOFUFTJP DPOpHTPVSDFaYaYpMFK2aOaY/PEFaYBaYEDPOUSPMQMBOFazEFGCECGFD DGEFFGEaYWaY[aYaYBaYaYDaYaOaBLVCFMFUaYaY6QEBUFaYBaYWaaCaCaYaYBCaYCaYaYaYaYaC'JFME T7aYFaYaOaYEEaY ʜ

Slide 50

Slide 50 text

aws-encryption-providerの実装例 https://github.com/kubernetes-sigs/aws-encryption-provider/blob/959eca3a6354703db2529219bedeebee35599026/pkg/plugin/plugin.go

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

etcdからデータを取り出す際 ▶ ServerChainによる前処理を実⾏ ▶ HTTP queryをデコードしてOptionを⽣成 ▶ Optionの条件などを元にetcdからデータを取得 ▶ 対象リソースに応じたTransformerを実⾏し、etcdに保存するデータを暗号化 + 暗号化にKMSプロバイダーを使⽤している場合には、unix domain socketと gRPCを通してKMSプラグインへリクエスト + KMSプラグインを通してKMSプロバイダーのAPIを呼び出し ▶ デコードしてクライアントへレスポンスを返す

Slide 53

Slide 53 text

まとめ

Slide 54

Slide 54 text

まとめ ▶ Kube API ServerはAggregator Serverによって、対象のリソースを処理するAPI Serverへプロ キシを⾏い、リクエストを処理するというアーキテクチャになっていました ▶ APIServiceというリソースによってAPI Extention Server, API Server, ユーザー独⾃の Extention API Serverのどこにリクエストをプロキシするかを判定してます ▶ リクエストを受けるとServerChainという様々な前処理によって認証認可などの処理が⾏われ ています ▶ Admission Controller(Plugin)によってリクエストデータのMutating/Validatingを⾏う仕組み があり、どのPluginを有効/無効にするかを設定することができるようになっています ▶ Admission Webhookを利⽤することでユーザー独⾃のMutating/Validating処理が実⾏可能な 仕組みが⽤意されてます ▶ 実際にetcdにデータが保存される際にはEncryptionConfigurationに基づいた暗号化処理が⾏ われており、暗号化の際に外部のKMS Providerを利⽤するためにはKMS Pluginが必要でした

Slide 55

Slide 55 text

参考資料 ▶ Kubernetes v1.21.2: https://github.com/kubernetes/kubernetes/tree/v1.21.2 ▶ Kubebuilder Book: https://book.kubebuilder.io/ ▶ sample-controller: https://github.com/kubernetes/sample-controller ▶ apiserver-builder-alpha: https://github.com/kubernetes-sigs/apiserver-builder-alpha ▶ Custom Metrics Adapter Server Boilerplate: https://github.com/kubernetes-sigs/custom-metrics-apiserver ▶ Prometheus Adapter for Kubernetes Metrics APIs: https://github.com/kubernetes-sigs/prometheus-adapter ▶ metrics: https://github.com/kubernetes/metrics ▶ CRI Streaming Requests (exec/attach/port-forward): https://docs.google.com/document/d/1OE_QoInPlVCK9rMAx9aybRmgFiVjHpJCHI9LrfdNM_s/edit#heading=h.4yfjiw58o8d3 ▶ Using a KMS provider for data encryption: https://kubernetes.io/docs/tasks/administer-cluster/kms-provider/ ▶ Encrypting Secret Data at Rest: https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/ ▶ Adding custom resources to the Kubernetes API server: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/extending-api.md ▶ Use an HTTP Proxy to Access the Kubernetes API: https://kubernetes.io/docs/tasks/extend-kubernetes/http-proxy-access-api/ ▶ Control Plane-Node Communication: https://kubernetes.io/docs/concepts/architecture/control-plane-node-communication/ ▶ Dynamic Admission Control: https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/ ▶ Kubernetes Proposal - Admission Control: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/admission_control.md ▶ Extension of Admission Control via Initializers and External Admission Enforcement: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/ admission_control_extension.md ▶ Webhook Bootstrapping: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/admission-webhook-bootstrapping.md ▶ Webhooks Beta: https://github.com/kubernetes/community/blob/master/contributors/design-proposals/api-machinery/admission-control-webhooks.md ▶ Dynamic Admission Control: https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers ▶ Configure the Aggregation Layer: https://kubernetes.io/docs/tasks/extend-kubernetes/configure-aggregation-layer/ ▶ Set up an Extension API Server: https://kubernetes.io/docs/tasks/extend-kubernetes/setup-extension-api-server/ ▶ Vanilla CRD OpenAPI subset: structural schemas: https://github.com/kubernetes/enhancements/tree/master/keps/sig-api-machinery/2335-vanilla-crd-openapi-subset-structural-schemas ▶ The Kubernetes API: https://kubernetes.io/docs/concepts/overview/kubernetes-api/ ▶ Controlling Access to the Kubernetes API: https://kubernetes.io/docs/concepts/security/controlling-access/ ▶ Authenticating: https://kubernetes.io/docs/reference/access-authn-authz/authentication/ ▶ Authorization Overview: https://kubernetes.io/docs/reference/access-authn-authz/authorization/

Slide 56

Slide 56 text

まとめ資料 ▶ Zenn scrap: https://zenn.dev/bells17/scraps/81b6ade4cbd40d

Slide 57

Slide 57 text

概要に加えて実装についての説明 はこちらの本で⾏なってます ▶ 技術書典: https://bit.ly/tbf-kube-api-server ▶ Booth: https://bit.ly/booth-kube-api-server Kube API Serverの詳細が気になる⽅は 良ければ買ってください!

Slide 58

Slide 58 text

Thanks / Question? ▶ @bells17 ▶ Slide: https://speakerdeck.com/bells17 ▶ @bells17_