Slide 1

Slide 1 text

Kubernetesに対する理解を⾼めて 
 Kubernetesの「わからない」を減らそう Kubernetes Novice Tokyo # 2 9 ( 2 0 2 3 / 1 2 / 2 1 ) @bells 1 7

Slide 2

Slide 2 text

▶ @bells 1 7 ▶ Software Engineer@ 3 -shake inc. ▶ kubernetes & kubernetes-csi member ▶ Kubernetes Internal Organizer ▶ Kubernetes Novice Tokyo Organizer ← New! ▶ #kubenews ▶ X(Twitter): @bells 1 7 _ ▶ GitHub: @bells 1 7

Slide 3

Slide 3 text

本来このセッションではCNIについて話す 予定だったんですが、間に合いませんで した 🙇

Slide 4

Slide 4 text

なので代わりにKubernetesの全体像につ いて改めて知ることで解像度をあげよう という話をしたいと思います

Slide 5

Slide 5 text

ということは今回はKubernetesを実際に 動かしながらその裏側の動作を紹介して いきます

Slide 6

Slide 6 text

まずは環境構築

Slide 7

Slide 7 text

kind-con fi g.yaml kind: Cluster apiVersion: kind.x-k 8 s.io/v 1 alpha 4 nodes: - role: control-plane - role: worker - role: worker # クラスター起動コマンド $ kind create cluster \ --name kube-overview-example \ --con fi g kind-con fi g.yaml control-plane: 1 worker: 2 合計3台のノードを起動する

Slide 8

Slide 8 text

apiVersion: apps/v 1 kind: Deployment metadata: name: example spec: replicas: 2 selector: matchLabels: app: example template: metadata: labels: app: example spec: a ffi nity: podAntiA ff i nity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 podA ff i nityTerm: labelSelector: matchExpressions: - key: app operator: In values: - nginx topologyKey: "kubernetes.io/hostname" containers: - name: nginx image: nginx ports: - containerPort: 8 0 2台をpreferredDuringSchedulingIgnoredDuringExecutionで分散配置してるのでworkerノードに1台ずつ配置されるはず Deployment

Slide 9

Slide 9 text

apiVersion: v 1 kind: Service metadata: name: example spec: type: ClusterIP selector: app: example ports: - protocol: TCP port: 8 0 Service

Slide 10

Slide 10 text

$ kubectl get rs NAME DESIRED CURRENT READY AGE example- 7 f 6 fdd 7 b 8 b 2 2 2 2 d 1 8 h $ kubectl get pod NAME READY STATUS RESTARTS AGE example- 7 f 6 fdd 7 b 8 b-scgjp 1 / 1 Running 0 2 d 1 8 h example- 7 f 6 fdd 7 b 8 b-zggwf 1 / 1 Running 0 2 d 1 8 h $ kubectl get svc example NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE example ClusterIP 1 0 . 9 6 . 1 . 6 4 8 0 /TCP 2 d 1 8 h $ kubectl get endpointslice -l "kubernetes.io/service-name=example" NAME ADDRESSTYPE PORTS ENDPOINTS AGE example-dmh 5 n IPv 4 8 0 1 0 . 2 4 4 . 2 . 3 , 1 0 . 2 4 4 . 1 . 3 2 d 1 8 h $ kubectl exec -it $(kubectl get pod -l app=example -o=jsonpath='{.items[ 0 ].metadata.name}') -- bash # curl example.default.svc.cluster.local -o /dev/null -w '%{http_code}\n' -s 2 0 0 動作確認

Slide 11

Slide 11 text

ここまででどんなことが起こっていたのかを 
 これから解説していきます

Slide 12

Slide 12 text

https://github.com/kubernetes/website/blob/fb6364da0afd19e8a9515aaae2de9bc74a0a6abd/static/images/docs/components-of-kubernetes.png まずはKubernetesのアーキテクチャ全体像から

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

https://github.com/kubernetes/website/blob/fb 6 3 6 4 da 0 afd 1 9 e 8 a 9 5 1 5 aaae 2 de 9 bc 7 4 a 0 a 6 abd/static/images/docs/components-of-kubernetes.png kube-api-server以外のConponentは Controllerを中⼼として機能を実現している

Slide 16

Slide 16 text

API Server

Slide 17

Slide 17 text

API Server͕Ϧιʔεͷ࡞੒ͳͲͷΤϯυϙΠϯτΛఏڙ 今回作成したDeploymentやServiceの場合は図の”API Server”によって処理が⾏われる

Slide 18

Slide 18 text

ServerChain

Slide 19

Slide 19 text

ServerChain ServerChain͸֤ϦΫΤετͷॲཧલʹ࣮ߦ͞ΕΔલॲཧʹͳΔ ▶ HSTS/CacheControl/CORSͱ͍ͬͨHTTP headerΛઃఆ ▶ ϦΫΤετॲཧ࣌ؒΛه࿥ ▶ ϦΫΤετ༻ͷaudit eventϨίʔμʔΛੜ੒ ▶ ϦΫΤετ৘ใΛݩʹRequestInfoΦϒδΣΫτΛੜ੒ ▶ ϦΫΤετͷछྨΛݩʹλΠϜΞ΢τ࣌ؒΛઃఆ ▶ ೝূ ▶ ϢʔβʔͷͳΓ͢·͠ઃఆ ▶ APIϦΫΤετͷ༏ઌ౓ίϯτϩʔϧ ▶ ೝՄ ͱ͍ͬͨ͜ͱΛߦͳ͍ͬͯΔ ͜ΕΒͷલॲཧޙʹ࣮ࡍʹཁٻ֤ͨ͠छͷϦιʔεૢ࡞ͳͲͷॲཧΛߦͳ͍ͬͯΔ

Slide 20

Slide 20 text

etcdʹσʔλ͕อଘ͞ΕΔ·Ͱͷϑϩʔ

Slide 21

Slide 21 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 22

Slide 22 text

kube-controller-manager

Slide 23

Slide 23 text

kube-controller-manager ▶ (ओʹ)cloud-controller-manager͕࣮ߦ͢ΔҎ֎ͷ֤छControllerΛ
 ·ͱΊ࣮ͯߦ~؅ཧ͢Δ΍ͭ ▶ ࣮ࡍʹ͸ͦͷଞͷComponentͰ΋͍ͭ͘΋ControllerΛ࣋ͬͯ͸͍Δ ▶ ઃఆʹΑͬͯىಈ͢ΔController਺͸લޙ͢Δ͕ɺ
 େମ30-40छྨͷControllerΛ࣮ߦ ▶ ؀ڥʹΑͬͯ͸cloud-controller-managerͷControllerΛ࣮ߦΛߦ͏

Slide 24

Slide 24 text

kube-controller-managerの全体像

Slide 25

Slide 25 text

Pod関連Controller

Slide 26

Slide 26 text

Pod関連Controller

Slide 27

Slide 27 text

Endponts & EndpointSlice関連Controller

Slide 28

Slide 28 text

schedulerがPodを起動するNodeを決定する流れ

Slide 29

Slide 29 text

Schedulerは様々なプラグインの組み合わせによる 
 フィルタリング‧スコアリングなどによってPodを実⾏するNodeを選定 https://kubernetes.io/images/docs/scheduling-framework-extensions.png

Slide 30

Slide 30 text

kubeletがコンテナを起動するまでの流れ

Slide 31

Slide 31 text

kubeletの全体像

Slide 32

Slide 32 text

コンテナ起動までの流れ

Slide 33

Slide 33 text

API Serverからのイベント受信まで

Slide 34

Slide 34 text

メインループからのPodの処理フロー

Slide 35

Slide 35 text

Podの起動処理

Slide 36

Slide 36 text

RuntimeManagerのPodの起動処理

Slide 37

Slide 37 text

kube-proxyによるiptables設定

Slide 38

Slide 38 text

kube-proxyの全体像はだいたいこんなん

Slide 39

Slide 39 text

iptablesの基本 ▶ 外部ネットワークからパケットを受信した際にテーブルと 
 テーブル内のチェインの設定に応じてパケットのフィルタリングなどの 
 処理を⾏うことができる ▶ iptablesではnetlinkを介してカーネルのnet fi lterの設定を⾏うことが可能で、 
 net fi lterはネットワークパケット処理の各段階でフックを使ってコールバック関数を実⾏す ることで各種操作を実現してるらしい ▶ nftablesというiptablesの後継があるらしい ざっくりこんな感じという理解です

Slide 40

Slide 40 text

主なテーブルとチェイン ▶ fi lter: パケットフィルタリングに使われるテーブル + 主なチェイン: INPUT, FORWARD, OUTPUT ▶ nat: NAT処理に使われるテーブル + 主なチェイン: PREROUTING, OUTPUT, POSTROUTING ▶ mangle: パケットのTTL設定など、特定のパケットのヘッダー情報を変更する際に使⽤ + 主なチェイン: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING ▶ raw: パケットがコネクショントラッキングシステムをバイパスすることを許可するために使⽤ + 主なチェイン: PREROUTING, OUTPUT ▶ security: SELinux ルールの適⽤に使⽤される + INPUT, OUTPUT, FORWARD

Slide 41

Slide 41 text

https://stu ff philwrites.com/wp-content/uploads/ 2 0 1 4 / 0 9 /FW-IDS-iptables-Flowchart- 2 0 1 4 - 0 9 - 2 5 .png

Slide 42

Slide 42 text

NodePortとCluster IPのServiceの場合は下記のようなフローでパケットが処理される

Slide 43

Slide 43 text

CoreDNSによるクラスター内ドメインの名前解決

Slide 44

Slide 44 text

KubernetesがService/Podの名前解決する全体像はこんな感じ

Slide 45

Slide 45 text

CoreDNSによるService/Podの名前解決はKubernetesプラグインによって実現 https://github.com/coredns/coredns/tree/v 1 . 1 1 . 1 /plugin/kubernetes

Slide 46

Slide 46 text

Kubernetes DNS-Based Service Discovery Speci fi cationに沿って実装されているよう https://github.com/kubernetes/dns/blob/ 1 . 2 2 . 2 8 /docs/speci fi cation.md

Slide 47

Slide 47 text

まとめ

Slide 48

Slide 48 text

まとめ ▶ KubernetesはReconciliation Loopがベースとなるアーキテクチャとなっており、 
 多くのコンポーネントはこの仕組みによって宣⾔的APIが実現されている ▶ API Serverではリソース別に処理を⾏うコンポーネントが分割されており、対象コンポーネントによっ てAdmission Pluginや暗号化のプロセスを経てetcdにデータが保存される ▶ (kube|cloud)-controller-managerでは多数のコントローラーの実⾏を管理しており、これらのコント ローラーの組み合わせによって様々な機能を実現している ▶ kube-schedulerは主にScheduing Frameworkとして実装されたプラグインの組み合わせによって Nodeのフィルタリング‧スコアリングなどを⾏い、Podを実⾏するNodeを決定している ▶ kubeletはAPI Serverやコンテナの実⾏状況チェックなどの様々なイベントからイベント駆動でコンテ ナの実⾏を管理しており、コンテナランタイムとCRIを通してコンテナの実⾏などを⾏う ▶ kube-proxyはServiceやEndpointSliceなどを元にiptablesなどの利⽤してクラスター内のネットワー ク接続を可能にしている ▶ CoreDNSにはKubernetesプラグインが組み込まれており、プラグインによってServiceや EndpointSliceなどのリソースに応じた名前解決が⾏われる仕組みになっていえる

Slide 49

Slide 49 text

今⽇のセッションの詳しい内容はこのあたりの資料をご確認ください! ▶ kube-proxy⼊⾨ ▶ kube-controller-manager⼊⾨ ▶ Kube API Server ▶ KubernetesとCoreDNSについて理解する ▶ CSI⼊⾨ ▶ Cloud Controller Manager Deep Dive ▶ kubeadmに学 ぶ クラスター構築 ▶ Kubeletから読み解くKubernetesの 
 コンテナ管理の裏側 ▶ CRIの仕様とdockershimの実装について 
 調 べ てみた

Slide 50

Slide 50 text

参考資料 ▶ https://github.com/kubernetes/kubernetes/tree/v 1 . 2 8 . 4 ▶ https://github.com/coredns/coredns/tree/v 1 . 1 1 . 1 ▶ https://github.com/coredns/example ▶ https://github.com/coredns/coredns/blob/v 1 . 1 1 . 1 /plugin/kubernetes/README.md ▶ https://github.com/kubernetes/dns/blob/ 1 . 2 2 . 2 8 /docs/speci fi cation.md ▶ https://github.com/kubernetes/cri-api/blob/v 0 . 2 8 . 4 /pkg/apis/runtime/v 1 /api.proto ▶ https://coredns.io/ 2 0 1 7 / 0 3 / 0 1 /how-to-add-plugins-to-coredns/ ▶ https://coredns.io/ 2 0 1 6 / 1 2 / 1 9 /writing-plugins-for-coredns/ ▶ https://github.com/coredns/example ▶ https://github.com/coredns/coredns/blob/v 1 . 1 1 . 1 /plugin.md

Slide 51

Slide 51 text

画像引⽤元 ▶ https://github.com/kubernetes/community/tree/master/icons ▶ https://github.com/kubernetes/kubernetes/tree/master/logo ▶ https://github.com/cncf/artwork/tree/master/projects/kubernetes ▶ https://github.com/kubernetes/kubeadm/tree/main/logos

Slide 52

Slide 52 text

Thanks / Question? ▶ @bells 1 7 ▶ Slide: https://speakerdeck.com/bells 1 7 ▶ @bells 1 7 _