$30 off During Our Annual Pro Sale. View Details »

Kubernetesに対する理解を高めてKubernetesの「わからない」を減らそう

bells17
December 21, 2023

 Kubernetesに対する理解を高めてKubernetesの「わからない」を減らそう

bells17

December 21, 2023
Tweet

More Decks by bells17

Other Decks in Programming

Transcript

  1. ▶ @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
  2. 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台のノードを起動する
  3. 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
  4. apiVersion: v 1 kind: Service metadata: name: example spec: type:

    ClusterIP selector: app: example ports: - protocol: TCP port: 8 0 Service
  5. $ 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 <none> 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 動作確認
  6. 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を中⼼として機能を実現している
  7. ServerChain ServerChain͸֤ϦΫΤετͷॲཧલʹ࣮ߦ͞ΕΔલॲཧʹͳΔ ▶ HSTS/CacheControl/CORSͱ͍ͬͨHTTP headerΛઃఆ ▶ ϦΫΤετॲཧ࣌ؒΛه࿥ ▶ ϦΫΤετ༻ͷaudit eventϨίʔμʔΛੜ੒

    ▶ ϦΫΤετ৘ใΛݩʹRequestInfoΦϒδΣΫτΛੜ੒ ▶ ϦΫΤετͷछྨΛݩʹλΠϜΞ΢τ࣌ؒΛઃఆ ▶ ೝূ ▶ ϢʔβʔͷͳΓ͢·͠ઃఆ ▶ APIϦΫΤετͷ༏ઌ౓ίϯτϩʔϧ ▶ ೝՄ ͱ͍ͬͨ͜ͱΛߦͳ͍ͬͯΔ ͜ΕΒͷલॲཧޙʹ࣮ࡍʹཁٻ֤ͨ͠छͷϦιʔεૢ࡞ͳͲͷॲཧΛߦͳ͍ͬͯΔ
  8. etcdʹσʔλ͕อଘ͞ΕΔ·Ͱ ▶ ServerChainʹΑΔલॲཧΛ࣮ߦ ▶ HTTP BodyΛσίʔυͯ͠runtime.ObjectΛੜ੒ ▶ ΦϒδΣΫτʹManagedFieldΛઃఆ ▶ ֤छMutatingAdmissionΛ࣮ߦ

    + ର৅ϦιʔεΛॲཧ͢ΔMutatingWebhook͕ొ࿥͞Ε͍ͯΔ৔߹͸࣮ߦ ▶ ΦϒδΣΫτʹOwnerReferenceΛઃఆ ▶ ֤छValidatingAdmissionΛ࣮ߦ + ର৅ϦιʔεΛॲཧ͢ΔValidatingAdmission͕ొ࿥͞Ε͍ͯΔ৔߹͸࣮ߦ ▶ ର৅ϦιʔεʹԠͨ͡TransformerΛ࣮ߦ͠ɺetcdʹอଘ͢ΔσʔλΛ҉߸Խ + ҉߸ԽʹKMSϓϩόΠμʔΛ࢖༻͍ͯ͠Δ৔߹ʹ͸ɺunix domain socketͱgRPCΛ௨ͯ͠KMSϓϥά Πϯ΁ϦΫΤετ + KMSϓϥάΠϯΛ௨ͯ͠KMSϓϩόΠμʔͷAPIΛݺͼग़͠ ▶ etcd΁σʔλΛอଘ ▶ σίʔυͯ͠ΫϥΠΞϯτ΁ϨεϙϯεΛฦ͢
  9. iptablesの基本 ▶ 外部ネットワークからパケットを受信した際にテーブルと 
 テーブル内のチェインの設定に応じてパケットのフィルタリングなどの 
 処理を⾏うことができる ▶ iptablesではnetlinkを介してカーネルのnet fi

    lterの設定を⾏うことが可能で、 
 net fi lterはネットワークパケット処理の各段階でフックを使ってコールバック関数を実⾏す ることで各種操作を実現してるらしい ▶ nftablesというiptablesの後継があるらしい ざっくりこんな感じという理解です
  10. 主なテーブルとチェイン ▶ 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
  11. 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
  12. まとめ ▶ 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などのリソースに応じた名前解決が⾏われる仕組みになっていえる
  13. 今⽇のセッションの詳しい内容はこのあたりの資料をご確認ください! ▶ kube-proxy⼊⾨ ▶ kube-controller-manager⼊⾨ ▶ Kube API Server ▶

    KubernetesとCoreDNSについて理解する ▶ CSI⼊⾨ ▶ Cloud Controller Manager Deep Dive ▶ kubeadmに学 ぶ クラスター構築 ▶ Kubeletから読み解くKubernetesの 
 コンテナ管理の裏側 ▶ CRIの仕様とdockershimの実装について 
 調 べ てみた
  14. 参考資料 ▶ 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