開運研修kubernetes入門2026

159 Views

August 13, 26

スライド概要

2026年エンジニア新人研修の資料です。

profile-image

サイボウズ株式会社の主に開発本部の資料を公開するアカウントです。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

ダウンロード

関連スライド

各ページのテキスト
1.

Kubernetes入門 2026年度 開運研修 1

2.

この講義の目的 ▌サイボウズの新インフラ基盤Necoで使われているKuberenetesの技術について学ぶ ⚫Kubernetesについて ⚫Kubernetesの仕組み ⚫基本的なリソース ▌関連講義 ⚫Docker入門・・・コンテナの詳しい仕組みについてはこちらで ⚫Neco入門・・・Necoの詳細はこちらで 2

3.

Kubernetesとは ▌コンテナを複数のサーバー上で協調動作、管理するためのシステム(=コンテナオーケストレーション) 主要な機能 ⚫ 宣言的な構成の管理 ⚫ 「あるべき状態」を定義する ⚫ スケジューリング ⚫ アプリケーションを複数のサーバーに適切にスケジュールする ⚫ サービスディスカバリーと負荷分散 ⚫ アプリケーション間の通信を容易にし、負荷分散を可能にする ⚫ セルフヒーリング ⚫ コンテナに障害が発生した際の自動回復 3

4.

なぜKubernetesが必要なのか ▌コンテナ1個を動かすだけならDockerだけでできる ▌実際の運用では ⚫ コンテナは複数個 ⚫ 落ちた時に自動で復旧したい ⚫ サービスを止めずにアップデートしたい ⚫ 負荷分散したい などの要件が必要となってくる ▌こうしたコンテナの管理を行うシステム→コンテナオーケストレーションシステム ▌Kubernetesはそのうちの一つ 4

5.

サイボウズとKubernetes ▌cybozu.comの新基盤「Neco」はKubernetesベース ⚫ 旧基盤からNeco基盤への移行が進行中 ⚫ ※詳しくはNeco入門の講義で説明 ▌運用チームはアプリケーションをデプロイするプラットフォームを提供 ▌開発チームはそのプラットフォーム上にアプリケーションを構築し運用する ⚫ →アプリケーション開発者もKubernetesの知識が必要 開発チームがデプロイする 運用チームが提供 アプリケーション アプリケーション オブザーバービ リティ基盤 ミドルウェア ストレージ Kubernetes サーバー・ネットワーク 5

6.

Kubernetesの基本的な概念 6

7.

Kubernetesクラスタの概要 ▌Kubernetesは複数のサーバーで構成されるクラスタ ▌クラスタ上にPodと呼ばれる単位でコンテナをデプロイする ▌Kubernetes上に作成するものをリソースという ⚫ Pod、Deployment, Service…etc Kubernetesクラスタ ノード1 Pod コンテナ Pod ノード2 Pod コンテナ ノード3 Pod Pod Pod コンテナ コンテナ コンテナ Pod Pod コンテナ コンテナ コンテナ Pod コンテナ Pod コンテナ 7

8.

Kubernetesのmanifest ▌Kubernetesはリソースの「あるべき状態」をmanifestで定義し、システムはそれを満たすように動作する (=reconcile) 例: Podのmanifest apiVersion: v1 kind: Pod metadata: name: my-first-pod labels: component: nginx spec: containers: - name: nginx image: nginx:latest Podの定義 • • 名前はmy-first-pod component:nginxと いうラベルを付与 ◼ 宣言的 ◼ 手順ではなく、状態を記述する ◼ 何度実行しても結果が同じになる コンテナの定義 Nginxのコンテナを使う 8

9.

Reconcileループ ▌あるべき状態と現在の状態を比較し、差分を無くすように処理を行う ▌結果があるべき状態に自動的に収束する 定義 変更 diff あるべき状態 システム コントローラ 実際の状態 観測 例: 3つのPodがある状態が「あるべき状態」 • 現在のPodの数を観測して • 3個未満ならPodを増やす • 4個以上ならPodを削除する 9

10.

Podの概要 10

11.

Podの構造 ▌アプリケーションをデプロイするための最小単位 ⚫ 1個以上のコンテナをまとめたもの ▌Pod毎にIPアドレスが付与され、各コンテナはnetwork namespaceを共有する ▌ファイルシステムはコンテナ毎に別々 10.0.0.1 Podのmanifest(例) apiVersion: v1 kind: Pod metadata: name: my-first-pod labels: component: nginx spec: containers: - name: nginx image: nginx:latest Pod Podの定義 • • 名前はmy-first-pod component:nginxと いうラベルを付与 veth Network namespace コンテナ コンテナ プロセス プロセス FileSystem FileSystem コンテナの定義 Nginxのコンテナを使う 11

12.

Pod内のネットワーク ▌同じPodのコンテナはnetwork namespaceを共有し、そのnetwork namespaceにveth(仮想ネットワークデバイス) が付与され、PodのIPアドレスがセットされる • コンテナ1で:3000 • コンテナ2で:8000 で待ち受けていた場合、 • 10.0.0.1:3000宛はコンテナ1 • 10.0.0.1:8000宛はコンテナ2 にパケットが流れる client curl 10.0.0.1:3000 Pod veth 10.0.0.1 Network namespace コンテナ1 コンテナ2 :3000 :8000 FileSystem FileSystem 12

13.

クラスタ内の通信 ▌PodはIPアドレスを持ち、クラスタ内のすべてのPodとNATなしでお互いに通信できる (Kubernetesのネットワーク要件) ⚫ 実現する方法は実装による(CNI Plugin) ⚫ Flannel(VXLAN), Calico(BGP), Cilium(eBPF) Node Network Pod Network NIC 疎通可能 Pod Pod コンテナ コンテナ 10.0.0.1 10.0.0.2 ノード1 NIC NIC Pod Pod Pod コンテナ コンテナ コンテナ 10.0.0.3 10.0.0.4 10.0.0.5 ノード2 ノード3 13

14.

クラスタ外との通信 ▌PodのIPアドレスはクラスタ内でしか疎通性がない Internet ▌クラスタ外→Podの通信はロードバランサーで受け取る ⚫ ロードバランサーを表すKubernetesリソースが用意されている ▌Pod→クラスタ外の通信はNATやProxyなどで外に出る NAT LoadBalancer Proxy ▌実現方法は実装による Pod Pod コンテナ コンテナ ノード1 Pod Pod Pod コンテナ コンテナ コンテナ ノード2 ノード3 14

15.

Kubernetesクラスタの構造 15

16.

Kubernetesの構造 control-plane etcd kubeapiserver kube-scheduler kube-controllermanager kubectl Node node Node Pod コンテナ Pod Pod コンテナ コンテナ kubelet コンテナランタイム kube-proxy Linuxネットワーク Node ・・・ Pod Pod コンテナ kubelet コンテナランタイム kube-proxy Linuxネットワーク コンテナ ・・・ Pod コンテナ kubelet コンテナランタイム kube-proxy Linuxネットワーク 16

17.

Kubernetesの構造 control-plane control-plane クラスタを管理するための領域 • etcd • kube-apiserver • kube-scheduler • kube-controller-manager etcd kubeapiserver kube-scheduler kube-controllermanager kubectl CLIツールやプログ ラム等からの操作 Node node Node Pod コンテナ Pod Pod コンテナ コンテナ kubelet コンテナランタイム kube-proxy Linuxネットワーク Node ・・・ kubelet kube-proxy Pod コンテナ Pod コンテナ Pod コンテナ ・・・ kubelet コンテナランタイム Node Podを動かすためのサーバー(数台~数千台) kube-proxy Linuxネットワーク Linuxネットワーク • kubelet • kube-proxy コンテナランタイム 17

18.

コントロールプレーン control-plane control-plane クラスタを管理するための領域 • etcd • kube-apiserver • kube-scheduler • kube-controller-manager etcd kubeapiserver kube-scheduler kube-controllermanager kubectl Node node Node Pod コンテナ Pod Pod コンテナ コンテナ kubelet コンテナランタイム kube-proxy Linuxネットワーク Node ・・・ Pod Pod コンテナ kubelet コンテナランタイム kube-proxy Linuxネットワーク コンテナ ・・・ Pod コンテナ kubelet コンテナランタイム kube-proxy Linuxネットワーク

19.

コントロールプレーンコンポーネント ▌ etcd • 分散KVS(Key-Value Store) • リソースの情報が保存されるデータベースのようなもの ▌ kube-apiserver • リソースにアクセスするためのAPIサーバ • ユーザーや各コンポーネントからの操作はすべてkube-apiserverを経由する • etcdに保存された情報を用いる ▌ kube-scheduler • 作成されたPodをどのNodeに配置するかを決定する • 配置には様々な条件式や設定が存在する ▌ kube-controller-manager • リソースを管理するコンポーネント • リソースの状態を監視し、あるべき状態になるように操作する control-plane kubeapiserver etcd kube-scheduler kube-controllermanager 19

20.

ノード control-plane etcd kubeapiserver kube-scheduler kube-controllermanager kubectl Node node Node Pod コンテナ Pod Pod コンテナ コンテナ kubelet コンテナランタイム kube-proxy Linuxネットワーク Node ・・・ Pod コンテナ Pod コンテナ Pod コンテナ ・・・ kubelet Node コンテナランタイム コンテナランタイム Podを動かすためのサーバー(数台~数千台) kube-proxy • kubelet kube-proxy Linuxネットワーク Linuxネットワーク • kube-proxy kubelet 20

21.

ノードコンポーネント ▌kubelet ⚫ Node上のコンテナを管理する ⚫ スケジュールされたPodの作成や死活監視などを行う ⚫ コンテナランタイムのインタフェース(CRI)を通じてコンテナの操作を行う ▌kube-proxy ⚫ Podへの通信の設定を行うコンポーネント ⚫ Linuxのネットワーク機能を用いてパケットの転送を行う Pod コンテナ Pod コンテナ ⚫ CNIの選択によってはkube-proxyが無く別の仕組みの場合もある kubelet コンテナランタイム kube-proxy Linuxネットワーク 21

22.

Podが作られるまで 22

23.

Podが作られるまで 1. manifestを適用するとetcdにPodのmanifestが保存される 2. kube-schedulerが新しいPodの作成を検知し、スケジューリングする ⚫ Podのmanifestにスケジュールしたノードが書かれる 3. 各ノードのkubeletが、自分のノードにPodがスケジュールされたことを検知し、コンテナランタイムを通じてコンテナを作成 する control-plane etcd ②ノードにスケジュール Pod コンテナ kubectl Podのmanifestを適用 kubeapiserver watch kube-scheduler ①Podの作成を検知 ③Kubeletが自分のノードにスケジュールされたことを検知 kubelet コンテナランタイム ④コンテナランタイムを通じてコンテナ作成 23

24.

Kubernetesの代表的なリソース 24

25.

Pod(再掲) ▌アプリケーションをデプロイするための最小単位 ⚫ 1個以上のコンテナをまとめたもの ▌Pod毎にIPアドレスが付与され、各コンテナはnetwork namespaceを共有する ▌ファイルシステムはコンテナ毎に別々 10.0.0.1 Podのmanifest(例) apiVersion: v1 kind: Pod metadata: name: my-first-pod labels: component: nginx spec: containers: - name: nginx image: nginx:latest Pod Podの定義 • • 名前はmy-first-pod component:nginxと いうラベルを付与 veth Network namespace コンテナ コンテナ プロセス プロセス FileSystem FileSystem コンテナの定義 Nginxのコンテナを使う 25

26.

ReplicaSet ・ Deployment ▌ReplicaSet ⚫ Podをテンプレートで複数作成するリソース ⚫ ※Replicaset単体で使う事はほぼない ▌Deployment ⚫ ステートレスなアプリケーションをデプロイする際 に使うリソース ⚫ ReplicaSetを用いてローリングアップデートの 機能などを提供する Deployment ReplicaSet Pod Pod Pod apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment labels: component: nginx spec: # Podの数 replicas: 3 selector: matchLabels: component: nginx template: # 作成するPodのテンプレート metadata: labels: component: nginx spec: containers: - name: nginx image: nginx:1.20 26

27.

ReplicaSetのセルフヒーリング ▌ReplicaSetは指定した数のPodが動作することを保証する ▌Node故障などで動いているPodが減ると、新しくPodを作り直す ReplicaSet Pod Pod コンテナ コンテナ Pod コンテナ replica=3 ノード1 Pod Pod コンテナ ノード2 コンテナ 故障 Pod コンテナ ノード1 ノード2 Nodeの故障でPodを作り直す例 27

28.

Deploymentのローリングアップデート ▌コンテナのアップデートなど、再起動を伴う場合に提供しているサービスが止まらないように、一気に更新するのではなく少し づづ更新を行う仕組み ▌ReplicaSetを新旧で用意しreplica数を変えることで実現する old Pod v1 Pod v1 Pod v1 new Pod v1 Pod v2 Pod v1 Pod v1 Pod v2 Pod v2 Pod v1 Pod v1 Pod v2 Pod v2 1. 新しいReplicaSetを作る 2. 新しいReplicaSetの方に新しいPodを1個作る 3. 古いReplicaSetのPodを1個消す 4. 繰り返す 新しいのを増やしてから古いのを消すか、古いのを消してから 新しいのを増やすか、また1度にどれぐらいの量行うかと言っ た戦略は調整可能 28

29.

Service ▌Podとの通信を抽象化する ▌負荷分散とサービスディスカバリの機能を持つ ▌4つのタイプがある ⚫ ClusterIP: クラスタ内のみでアクセスできる ⚫ NodePort: 各Nodeの指定したポートに来たトラフィックをPodに転送する ⚫ LoadBalancer: 外部のロードバランサーを利用してトラフィックを転送する ⚫ ExternalName:クラスタ外のドメインをServiceのCNAMEに登録する 29

30.

クラスタ内アクセスのためのService ▌type: ClusterIPはクラスタ内でアクセスするためのService ⚫ 作成するとServiceのIPアドレスが作成される。PodからはDNS名で引ける ⚫ ServiceのバックエンドとなるPodはServiceのmanifest上のSelectorで指定する ⚫ Podの名前やIPアドレスはPodが作り直されるたびに変わるので、Pod間で通信をする際は基本的にClusterIPを挟んで通信する apiVersion: v1 kind: Service metadata: name: example spec: type: CluterIP selector: component: nginx ports: - protocol: TCP port: 80 targetPort: 80 10.64.0.1 Service:ClusterIP curl example.defualt.svc.cluster.local Deployment # バックエンドとなるPodを指定する Pod Pod Pod 10.0.0.1 10.0.0.2 10.0.0.3 Pod client 30

31.

クラスタ外アクセスのためのService ▌type: LoadBalancer ▌クラスタ外からのアクセスを受け付けるためのService クラスタ外 ▌作成するとServiceにクラスタ外から疎通可能なIPアドレスが振られる ▌リソースとしてはKubernetes側で用意されているが、実装はCNIによる ⚫ L2、 BGP、eBPF・・・ apiVersion: v1 kind: Service metadata: name: example spec: type: LoadBalancer selector: component: nginx ports: - protocol: TCP port: 80 targetPort: 80 Service: LoadBalancer Pod Pod Pod Deployment 31

32.

その他のType ▌Serviceはその他のTypeもありますがここでは省略します。 ⚫ ClusterIP: クラスタ内のみでアクセスできる ⚫ NodePort: 各Nodeの指定したポートに来たトラフィックをPodに転送する ⚫ LoadBalancer: 外部のロードバランサーを利用してトラフィックを転送する ⚫ ExternalName:クラスタ外のドメインをServiceのCNAMEに登録する 32

33.

簡単なアプリケーションのデプロイ ▌例: ⚫ WebアプリケーションをKubernetes上でデプロイして外部からアクセスしたい ⚫ Webアプリケーションは:3000で待ち受ける クラスタ外 ▌アプリケーションはDeploymentで作成 Service: LoadBalancer ▌Serviceを作成して外部からアクセスできるようにする Pod Pod Pod Deployment Node Node 33

34.

manifest apiVersion: apps/v1 kind: Deployment metadata: name: web-app-deployment labels: component: web-app spec: replicas: 3 selector: matchLabels: component: web-app template: metadata: labels: component: web-app spec: containers: - name: web-app image: web-app:1.0 apiVersion: v1 kind: Service metadata: name: web-app-svc spec: type: LoadBalancer selector: component: web-app ports: - protocol: TCP port: 80 targetPort: 3000 #Podに付与したラベルを選択 #公開するPort #PodのPort クラスタ外 #Podに付与するラベル Service: LoadBalancer Pod Pod Pod Deployment 34

35.

ローカルで動くKubernetesクラスタ ▌kindというソフトウェアで、ローカル環境にKubernetesクラスタを作ることができる ▌DockerコンテナでKubernetesノードを動かし、その中でPodが動作する ⚫ Docker in Docker ▌Dockerで動くため、LoadBalancerを使うには工夫が必要 ⚫ https://kind.sigs.k8s.io/docs/user/loadbalancer/ https://kind.sigs.k8s.io/ 35

36.

Kubernetesクラスタにデプロイしてみる apiVersion: apps/v1 kind: Deployment metadata: name: web-app-deployment labels: component: web-app spec: replicas: 3 selector: matchLabels: component: web-app template: metadata: labels: component: web-app spec: containers: - name: web-app image: web-app:1.0 ❯ kubectl apply -f manifest.yaml deployment.apps /web-app-deployment created service/web-app-svc created apiVersion: v1 kind: Service metadata: name: web-app-svc spec: type: LoadBalancer selector: component: web-app ports: - protocol: TCP port: 80 targetPort: 3000 kubectl apply –f でmanifestを適用できる 36

37.

Kubernetesクラスタにデプロイしてみる ❯ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE web-app-deployment 3/3 3 3 3m52s ❯ kubectl get pod –o wide NAME READY STATUS RESTARTS AGE web-app-deployment-6466b654cd-dbblx 1/1 Running 0 web-app-deployment-6466b654cd-hqcx2 1/1 Running 0 web-app-deployment-6466b654cd-rrmnw 1/1 Running 0 IP NODE NOMINATED NODE READINESS GATES 5m8s 10.244.0.20 kind-control-plane <none> <none> 5m8s 10.244.0.19 kind-control-plane <none> <none> 5m8s 10.244.0.18 kind-control-plane <none> <none> ❯ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 257d web-app-svc LoadBalancer 10.96.255.234 172.18.0.3 80:31129/TCP 3m58s 外部からアクセスできるIPアドレス ❯ curl -I 172.18.0.3 HTTP/1.1 200 OK Content-Type: text/html Date: Tue, 31 Mar 2026 01:30:49 GMT Content-Length: 1174 37

38.

まとめ ▌Kubernetesの概要、仕組み、代表的なリソースについて紹介しました ⚫ Kubernetesの概要 ⚫ Kubernetesクラスタの内部構成 ⚫ manifestとReconcileループの概念 ⚫ 代表的なリソース: Pod・Deployment・Service ▌ここまでで、簡単なアプリケーションであればデプロイできるようになりました 38

39.

参考文献 ▌より詳しいことを学びたい場合、以下の情報をお勧めしています。 ⚫ 全般 ⚫ 公式ドキュメント https://kubernetes.io/docs/concepts/overview/ ⚫ Kubernetes完全ガイド https://book.impress.co.jp/books /1119101148 ⚫ ネットワーク ⚫ 今こそ学びたいKubernetesネットワーク ~CNIが繋ぐNWとプラットフォームの「フラッと」な対話 ⚫ https://speakerdeck.com/logica0419/kubernetes-network-janog57 ⚫ Kubernetesネットワーク 徹底解説 ⚫ https://zenn.dev/taisho6339/books/fc6facfb640d242dc7ec ⚫ Kubernetesのコントローラーについて ⚫ つくって学ぶKubebuilder https://zoetrope.github.io/kubebuilder-training/ 39