Slide 1

Slide 1 text

Kube API Server[完全版] July Tech Festa(2021/07/18) @bells17

Slide 2

Slide 2 text

▶ @bells17 ▶ Software Engineer@IDC Frontier inc. ▶ 普段やってること: + Kubernetes 関連コンポーネントの開発 + Kubernetes as a Serviceの開発 + 最近マネジメント業が追加されました ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ #kubenews ▶ @bells17_

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

注意点 ▶ Kubernetes v1.21.2ベースでのお話になります ▶ KubernetesそのものやKubernetes Component全体の説明は簡単なものに なるかと思います ▶ あくまでKube API Serverの実装を追った結果での理解の説明になるので、 ところどころ間違いが含まれている可能性があります ▶ 基本Kube API Serverのアーキテクチャや実装の概要を淡々と⾏なっていく 感じなので、あっさりめのセッションになると思います

Slide 5

Slide 5 text

そもそもKubernetesとは?

Slide 6

Slide 6 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 7

Slide 7 text

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

Slide 8

Slide 8 text

Kubernetesコントローラー

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

基本パターン ▶ Managerプロセス全体の中で1つ、または複数のコントローラーが実⾏ される ▶ コントローラーは1つにつき、1種類のKubernetesリソースのみに対す る調整ループ(Reconciliation Loop)が実⾏される + 調整ループ: リソースのあるべき状態(Desired State)と実際の状態 (Actual State)を⽐較~あるべき状態になるように調整処理を⾏うもの + なので、2種類のリソースに対しては、最低2コントローラー以上が あるのが基本

Slide 12

Slide 12 text

調整ループ ▶ 主に以下の2種類の⽅法で実⾏される + Event Handlers: 監視対象のKubernetes Resourceの更新といった、 なんらかのイベントを元に実⾏される + 無限ループによる定期実⾏: 設定値に基づいて数秒毎などの間隔で定 期実⾏が⾏われる

Slide 13

Slide 13 text

https://github.com/kubernetes/sample-controller/blob/master/docs/images/client-go-controller-interaction.jpeg

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

▶ Kubernetesのコードリーディングをする上で知っておくと良さそうなこと ▶ Kubernetes Internal #1 こういったKubernetesコントローラー実装周りについてはコード リーディングについての記事の中で書いたので良ければ⾒てください

Slide 16

Slide 16 text

Kubernetes Core Component

Slide 17

Slide 17 text

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

Slide 18

Slide 18 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 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

Kube API Serverとは?

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 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 27

Slide 27 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 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Kube API Server Overview

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

API Extensions Server

Slide 35

Slide 35 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 36

Slide 36 text

API Server

Slide 37

Slide 37 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 38

Slide 38 text

Aggregator Server

Slide 39

Slide 39 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 40

Slide 40 text

Kube API Serverのアーキテクチャ このように、Kube API Serverのアーキテクチャは ▶ Aggregator Serverが前段にいてリクエストを受け付ける ▶ リクエストを受け付けると認証/認可などの様々な前処理を⾏う ▶ 前処理が終わると、リクエストパスなどに基づき、API (Extentions) Serverのhttp handlerを呼び出したり、ユーザーが⼿動で登録した Extension API Serverにリクエストをプロキシすることで処理を⾏い、 レスポンスを返す というものになっている

Slide 41

Slide 41 text

ServerChain

Slide 42

Slide 42 text

ServerChain

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

Extension API Server

Slide 45

Slide 45 text

Extension API Server

Slide 46

Slide 46 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 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

Admission ControllerとAdmission Webhook

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

No content

Slide 57

Slide 57 text

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

Slide 58

Slide 58 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 59

Slide 59 text

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

Slide 60

Slide 60 text

No content

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

kubectl watchの際 ▶ ServerChainによる前処理を実⾏ ▶ HTTP queryをデコードしてOptionを⽣成 ▶ Watcherを⽣成 + startWatching: etcdからgRPCのwatch streamによってデータを取得 + processEvent: startWatchingから受信したデータをtransformerを通して 復号化~Option条件を元にフィルタリング ▶ WatchServerを⽣成 + processEventから受信したデータを必要に応じて加⼯ + デコードしてクライアントへレスポンスを返す

Slide 64

Slide 64 text

kubectl exec/attach/log/portforward 実⾏時に起きていること

Slide 65

Slide 65 text

Pod Connect

Slide 66

Slide 66 text

Pod Connect ▶ exec/attach/log/portforwardは全てKube API Serverから対象のKubelet にリクエストをプロキシする ▶ Kubeletはリクエストされると、CRIを通してRuntime Shimへ対象コンテナ へのexecなどを⾏うコネクションを作成 ▶ コネクション作成後、このコネクションへ接続するためのURLを発⾏して リダイレクト ▶ Kube API Serverはリダイレクト先に再接続を⾏う ▶ 再接続するとKubelet - Runtime Shim - コンテナという経路を通して、対象 のコンテナへと接続できる

Slide 67

Slide 67 text

▶ CRIの仕様とdockershimの実装について調べてみた Pod Connect周りの挙動については以前Docker Shimについて 調べた際のセッションでも書いているので参考にしてください

Slide 68

Slide 68 text

まとめ

Slide 69

Slide 69 text

まとめ ▶ Kube API Server全体のアーキテクチャと、例えばetcdへのデータ保存までがどのように なっているのか?などKube API Serverの主だった処理などについて紹介しました ▶ Kube API ServerはAggregator Serverによって独⾃のAPI Serverを追加して連携できたり、 カスタムリソースの作成に応じてHTTPハンドラーを動的に⽣成することで、動的に追加さ れるリソースの処理を⾏うことができる仕組みになっています ▶ データ保存の際は、ユーザーも独⾃のAdmission Webhookを構築することで、データの 動的なMutating/Validatingが追加可能です ▶ kubectl execなどKube API Serverからコンテナに接続する際は、対象NodeのKubeletや Runtime Shimをプロキシすることでコンテナに接続する仕組みになっていました

Slide 70

Slide 70 text

感想 ▶ コードを追ってみて、例えばすでに読んだことのあるKubeletと⽐べると、アプリケーション 全体の複雑度はKube API Serverの⽅が低いので読みやすかったと思います ▶ ⼀⽅でコンポーネントの依存度を下げるためか、実際にKube API Serverが動くまで、あるい はリクエストを処理するハンドラーにたどり着くまでに様々なConfigを⾊んな箇所で⽣成し ていて、それらの⼊れ⼦構造がかなりの多重構造だったのは複雑だなと思いました ▶ Webアプリケーションサーバーでハンドラーを動的に⽣成して処理させるようなパターンは 作ったことがなかったので、読んでて新鮮な気分になりました

Slide 71

Slide 71 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 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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