Kubernetes 解体新書Part 4 インターフェース

この機能はどのインターフェース?

起動しない、つながらない、ディスクが付かない。症状と担当をクイズで結び付け、確認先を早見表で整理します。

  • L1 Web ターミナル
  • 更新 2026年10月6日

コンテナが起動しない、ディスクが付かない、外部アドレスが決まらない。 調べるときは、それぞれの仕事を担当するプログラムから見ていくと、確認先を絞れます。

この章では、ここまでの担当分けをクイズで確かめます。 後半の早見表では、症状から最初に見るリソースやログを探せます。

GOAL この章のゴール

  • コンテナの起動やディスクの接続など、仕事ごとの担当を選べる
  • Docker と Kubernetes の担当分けの違いを説明できる
  • 症状に応じて、最初に見るリソースやログを選べる

クイズ: 機能からインターフェースへ

10 問あります。 選ぶとすぐ答えと理由が出ます。

0 / 10 問正解 0

Q1この機能を担うインターフェースは? Pod に IP アドレスが割り当てられる

選んでください

Docker が全部と被っていた

Part 3 と Part 4 を通じて、dockershim の削除がなぜ「ランタイムの差し替え」以上の意味を持ったかが見えてきます。

Docker は Kubernetes の 4 つの仕事と被っていたDocker Engine はランタイム (containerd)、ネットワーク (docker network)、ボリューム (docker volume)、クラスタ管理 (Swarm mode) を一体で持つ。Kubernetes はそのうちランタイムだけを dockershim 経由で使い、ネットワークは CNI、ボリュームは CSI、クラスタ管理は本体の scheduler と controller (クラウドとの接点は CPI) で別に持っていた。Docker Engine (一体)ランタイムcontainerd + runcネットワークdocker network / docker0ボリュームdocker volume / volume driverクラスタ管理Swarm modeKubernetes (仕事ごとに別のプログラム)CRIdockershim → containerdCNICilium / Calico / VPC CNICSIEBS / Ceph / kubevirt-csischeduler / controller + CPIcloud-provider-aws など使う (shim 経由)使わない使わない使わない4 層のうち 1 層しか使わないのに、4 層分のデーモンを動かしていた
図 1Docker Engine はランタイム、ネットワーク、ボリューム、クラスタ管理を一体で持つ。Kubernetes はランタイムだけを使い、残りは CNI / CSI と本体の controller で別に持っていた。

Docker Engine は、コンテナの実行のほかに、ネットワーク (既定の bridge ネットワーク docker0 と、host / overlay / macvlan などのドライバー)、ボリューム (docker volume と volume driver のプラグイン)、クラスタ管理 (Swarm mode) を 1 つのデーモンに持っています。 Kubernetes は同じ 4 つの仕事を、ランタイムは CRI、ネットワークは CNI、ボリュームは CSI、クラスタ管理は本体の scheduler と controller (クラウドとの接点は CPI) で、それぞれ別に持ちます。 両者を同じノードで動かすと、Kubernetes が使うのはコンテナの実行だけで、docker network も docker volume も Swarm も、ただ存在するだけになります。 dockershim は、kubelet の CRI の呼び出しを Docker Engine の API に変換して、その 1 つの仕事だけを使うためのプログラムでした。 1.24 でそれを外したあとは、kubelet が containerd と直接話すので、変換のための 1 段が要りません。

全体図をもう一度

Kubernetes の主要インターフェースの全体図kube-apiserver と kubelet を中心に、CRI / CNI / CSI / CPI / Device Plugin と DRA / Gateway API / CRD が放射状に並ぶ。ノード側のものは kubelet から、クラスタ側のものは apiserver から線が出る。kube-apiserverクラスタ側の中心: watch で動くkubeletノード側の中心: gRPC / exec で呼ぶPod spec / statusCRIコンテナランタイムCNIPod のネットワークランタイム経由CSI (Node)マウントDevice Plugin / DRAGPU などのデバイスCPI / CCMクラウド APICSI (Controller)sidecar が watchGateway APIL4 / L7 の入口CRD / 集約 API自作の APIkubelet が直接呼ぶ (gRPC / exec)apiserver を watch する controller が動く
図 21 章の全体図。ノード側は kubelet が呼び、クラスタ側は controller が apiserver を watch する。
インターフェースの 4 つの呼び方gRPC over UNIX socket (CRI / CSI / Device Plugin)、バイナリの exec と JSON (CNI)、sidecar と gRPC (CSI controller)、apiserver を watch する controller (CPI / Gateway API / CRD) の 4 種類。1. gRPC over UNIX socketkubelet.sockcontainerdCRI / CSI node / Device Plugin。常駐デーモン2. バイナリを exec + JSONcontainerdstdin JSONcilium-cniCNI。呼ばれたら終わる使い捨てプロセス3. sidecar が翻訳する gRPCapiserverwatch PVCprovisionersidecarCreateVolumeCSI driverCSI controller。driver はKubernetes を知らなくてよい4. apiserver を watch する controllerapiserverwatch ServiceCCMRESTクラウド APICPI / Gateway API / CRD。kubelet も apiserver も相手を知らない
図 3運び方は 4 種類。gRPC socket、exec と JSON、sidecar の翻訳、apiserver の watch。
インターフェース 呼ぶ側 呼ばれる側 運び方 2026 年の状態
CRI kubelet containerd / CRI-O gRPC over UNIX socket v1 のみ (1.26 から)。dockershim は 1.24 で削除
CNI ランタイム /opt/cni/bin のバイナリ exec + 環境変数 + stdin JSON spec 1.1.0。Cilium / Calico / VPC CNI
CSI kubelet と sidecar CSI driver gRPC over UNIX socket in-tree プラグイン削除済み (1.31 まで)
CPI CCM クラウド API Go interface + REST in-tree プロバイダー削除済み (1.31)
Device Plugin kubelet ベンダー plugin gRPC over UNIX socket 1.26 GA、CDI 対応は 1.31 GA
DRA scheduler と kubelet DRA driver API オブジェクト + gRPC 1.34 GA、resource.k8s.io/v1
Gateway API Gateway controller データプレーン API オブジェクト (CRD) v1.6 系。ingress-nginx は 2026 年 3 月に退役
CRD / 集約 API 自作 controller apiserver REST / watch 拡張の標準手段

症状から疑う場所へ

障害のときに最初に見る場所を、症状ごとに並べます。

症状 疑う場所 最初に見るもの
Pod が ContainerCreating で FailedCreatePodSandBox CRI → CNI kubectl describe pod のメッセージ。crictl info の NetworkReady、CNI プラグインのログ
Pod が ErrImagePull CRI (ImageService) レジストリの認証、crictl pull で再現
Node が NotReady で network plugin is not ready CNI /etc/cni/net.d の有無、CNI の DaemonSet (cilium など) の状態
PVC が Pending CSI (provision) kubectl describe pvc のイベント、external-provisioner のログ、StorageClass の volumeBindingMode
Pod が FailedAttachVolume / FailedMount CSI (attach / mount) VolumeAttachment、external-attacher と Node plugin のログ
新しい Node に Pod が乗らない、uninitialized taint CPI (Node controller) CCM の Pod とログ、kubelet の --cloud-provider
EXTERNAL-IP が <pending> CPI (Service controller) CCM が居るか、Service のイベントにロードバランサー同期の失敗が出ているか
GPU の Pod が Unschedulable Device Plugin / DRA Node の capacity、ResourceSlice、plugin の DaemonSet
Gateway が Programmed: False Gateway API GatewayClass の controller が動いているか、Gateway の status

実機: 4 つのインターフェースの実装を確かめる

この Part で使ったコマンドを 1 セットにまとめました。 順に流すと、自分のクラスタでそれぞれの仕事を担当しているプログラムが分かります。

4 つのインターフェースの実装を一度に見る
echo "== CRI"; kubectl get node -o jsonpath='{.items[0].status.nodeInfo.containerRuntimeVersion}{"\n"}'
echo "== CNI"; kubectl -n kube-system get ds cilium -o jsonpath='{.spec.template.spec.containers[0].image}{"\n"}'
echo "== CSI"; kubectl get csidrivers -o name
echo "== CPI"; kubectl get node -o jsonpath='{.items[0].spec.providerID}{"\n"}'
echo "== DRA"; kubectl api-resources --api-group=resource.k8s.io -o name
echo "== Gateway"; kubectl get gatewayclasses -o name

出力例

== CRI
containerd://2.4.x
== CNI
quay.io/cilium/cilium:v1.20.2
== CSI
csidriver.storage.k8s.io/csi.kubevirt.io
== CPI
kubevirt://<vm 名>
== DRA
deviceclasses.resource.k8s.io
resourceclaims.resource.k8s.io
...
== Gateway
gatewayclass.gateway.networking.k8s.io/cilium

containerd、Cilium、kubevirt-csi、kubevirt CCM、Cilium の Gateway。 それぞれ別のプロジェクトが、同じインターフェースの規約に合わせて作ったものです。 EKS なら containerd、VPC CNI、EBS CSI、cloud-provider-aws、AWS Load Balancer Controller に置き換わりますが、kubelet や controller が頼む相手の種類と、頼み方は変わりません。 Part 5 では、その「クラウド側の実装」を見ていきます。

ふりかえり

Qdockershim の削除で実際に変わったことは?

Kubernetes が Docker から使っていたのはランタイムの層だけで、ネットワークとボリュームは最初から CNI と CSI でした。イメージは OCI 形式なので影響を受けません。

QPVC が Pending、Pod のイベントに FailedAttachVolume。この 2 つで疑う段は?

PVC の Bound までが provision (external-provisioner)、VolumeAttachment が true になるまでが attach (external-attacher)、その後が mount (kubelet と Node plugin) です。

QEKS でこの Part の 4 つのインターフェースの実装を並べると?

EKS のノードは containerd、ネットワークは amazon-vpc-cni-k8s、ボリュームは aws-ebs-csi-driver、クラウド連携は cloud-provider-aws (CCM) です。2 つ目は in-tree 時代の構成で、今は全て置き換わっています。

参考

読み切ると称号を獲得

境界線を引く者

この Part を読み切りました。

称号一覧