Kubernetes入門:コンテナを“群れ”で動かすための最短ルート(Pod/Service/Deploymentからはじめる)

はじめに

Dockerでアプリを動かせるようになると、次にぶつかる壁はだいたい同じです。
「コンテナは起動できる。でも落ちたら?台数を増やしたら?更新したら?ネットワークは?設定値は?ログは?」――この“運用の壁”を越えるために登場するのが Kubernetes(K8s)です。

Kubernetesは、雑に言えば「コンテナ運用のためのOSっぽいもの」です。
コンテナを一個動かすだけなら docker run で十分ですが、複数のコンテナを、複数台のマシンにまたがって、落ちても自動で復旧し、段階的に更新し、外部に公開し、設定を分離し、監視しやすくする……という要求が増えるほど、Kubernetesの価値が大きくなります。

この記事では、入門として「Kubernetesの最小コア」を押さえます。
焦点は、Pod / Deployment / Service / ConfigMap / Secret
難しい話(CNI、CSI、スケジューラ深掘り、複雑なマニフェスト設計)はやりません。まずは「Kubernetesが何をしてくれて、何を宣言すれば動くのか」を体に入れるのが目的です。


座学

1) Kubernetesが解決する“運用あるある”

Kubernetesはアプリのコードを賢くしてくれるわけではなく、運用の面倒を標準化してくれます。代表例は次の通りです。

  • 落ちたら自動復旧:コンテナが死んでも再起動して“期待する状態”に戻す
  • 台数調整:レプリカ数を宣言して増減できる
  • 更新の安全性:一気に全部切り替えず、段階的に入れ替える(ローリングアップデート)
  • 名前解決・通信:Podは増減してIPが変わるが、Serviceが安定した入口を作る
  • 設定の分離:環境変数や設定ファイルをイメージから分離(ConfigMap/Secret)
  • リソース管理:CPU/メモリの上限・要求値を宣言して、同居させても破綻しにくくする

ここで大事なのは、Kubernetesが基本的に**宣言型(Desired State)**だということです。
「これを起動して」と命令するより、「こういう状態にしたい」と宣言して、システムがそこに寄せ続けます。


2) “クラスタ”と“ノード”と“コントロールプレーン”

Kubernetesの単位をざっくり整理します。

  • クラスタ:Kubernetes全体。複数のノード(マシン)をまとめたもの
  • ノード:コンテナが動くワーカー(VMや物理)
  • コントロールプレーン:クラスタの脳みそ。状態を管理して指示を出す

入門段階では「クラスタという箱の中に、ノードという実行環境があって、そこでPodが動く」くらいでOKです。


3) まず覚えるKubernetesの主要オブジェクト

Pod

Kubernetesで動く最小単位。**コンテナの“実行枠”**です。
1 Pod に 1 コンテナが多いですが、サイドカー(例:ログ転送、プロキシ)で複数コンテナを同居させることもあります。

Deployment

「Podを何個、どんなイメージで、どう更新するか」を管理します。
現場の多くは、直接Podを作らずDeploymentを作って運用します。

Service

Podは増減・再生成でIPが変わります。そこで、**変わらない入口(名前/仮想IP)**を提供するのがServiceです。

  • クラスタ内部向け(ClusterIP)
  • 外部公開(NodePort / LoadBalancer)
    入門では「Service = 安定した窓口」と覚えるのが早いです。

ConfigMap / Secret

  • ConfigMap:設定値(DBホスト、フラグ、設定ファイルなど)
  • Secret:パスワードやトークンなど(※本当に安全にするには別設計が必要だが、まずは用途の違いを理解)
    アプリの設定をイメージに焼き込まず、環境ごとに差し替える発想が重要です。

4) kubectlとマニフェスト(YAML)の考え方

Kubernetes操作は kubectl が基本です。
入門で覚えるコマンドの軸は3つだけに絞ると理解が進みます。

  • 適用kubectl apply -f xxx.yaml
  • 観察kubectl get ... / kubectl describe ... / kubectl logs ...
  • 片付けkubectl delete -f xxx.yaml

そして、YAMLは「動かしたい状態の宣言書」です。
慣れるまで苦痛ですが、**“この宣言書がある限り同じ環境を再現できる”**のが強みになります。


ハンズオン

ここでは ローカルKubernetes(kind) を使って、最小のWebアプリを動かします。
Dockerが入っている前提で進めます。

0) kindでローカルクラスタを作る

kindが未導入ならインストール(公式の手順に従ってください)。導入済みなら以下だけでOK。

kind create cluster --name k8s-intro
kubectl cluster-info
kubectl get nodes

get nodes でノードが Ready になれば準備完了です。


1) DeploymentでNginxを動かす

deploy.yaml を作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80

適用して状態を見ます。

kubectl apply -f deploy.yaml
kubectl get deploy
kubectl get pods -o wide

ここで見たいポイントはこれです。

  • replicas=2 なのでPodが2つできる
  • Pod名は毎回変わる(固定じゃない)
  • ノード上にスケジュールされて動いている

2) Serviceで“安定した入口”を作る

次に svc.yaml を作成します。kind環境では NodePort が手軽です。

apiVersion: v1
kind: Service
metadata:
name: web-svc
spec:
type: NodePort
selector:
app: web
ports:
- port: 80
targetPort: 80
nodePort: 30080

適用して確認します。

kubectl apply -f svc.yaml
kubectl get svc

ブラウザで http://localhost:30080 にアクセスするとNginxのページが出ます。
(環境によっては kind のネットワーク都合で kubectl port-forward の方が確実なこともあります。その場合は次で。)


3) port-forwardでローカルにトンネルする(確実)

NodePortがうまくいかない場合、Serviceに対してポートフォワードします。

kubectl port-forward svc/web-svc 8080:80

別ターミナルで http://localhost:8080 を開けばOKです。


4) ConfigMapで“設定を分離”して反映する

NginxのトップページをConfigMapで差し替えて、設定分離を体験します。
cm.yaml を作ります。

apiVersion: v1
kind: ConfigMap
metadata:
name: web-content
data:
index.html: |
<html>
<body>
<h1>Hello Kubernetes</h1>
<p>ConfigMapから配信しています。</p>
</body>
</html>

Deployment側を少し変え、ConfigMapをマウントして index.html を置き換えます。deploy.yaml を次のように編集します(volume追加がポイント)。

apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- containerPort: 80
volumeMounts:
- name: content
mountPath: /usr/share/nginx/html/index.html
subPath: index.html
volumes:
- name: content
configMap:
name: web-content

適用します。

kubectl apply -f cm.yaml
kubectl apply -f deploy.yaml
kubectl rollout status deploy/web

アクセスすると「Hello Kubernetes」に変わります。
ここでの学びは、イメージを作り直さずに設定だけ差し替えられることです。


5) 片付け(削除)

最後にリソースを消します。

kubectl delete -f svc.yaml
kubectl delete -f deploy.yaml
kubectl delete -f cm.yaml
kind delete cluster --name k8s-intro

まとめ

Kubernetes入門で最初に掴むべきことは、複雑な機能ではなく、以下の“型”です。

  • Pod:コンテナを動かす枠
  • Deployment:Podの数・更新・復旧を面倒見てくれる
  • Service:Podが増減しても変わらない入口を作る
  • ConfigMap/Secret:設定や機密をイメージから分離する
  • 宣言型:望む状態をYAMLで書き、Kubernetesがそこへ寄せ続ける

この型が体に入ると、次に学ぶべきもの(Ingress、HPA、RBAC、監視、GitOps…)が全部“積み木”として理解できるようになります。
逆に、ここが曖昧なまま進むと、単語だけ増えて詰みやすいです。今回のハンズオンを何度か繰り返して、apply -> get/describe/logs -> delete を自然に回せるようにするのが最短ルートです。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です