Kubernetes(K8s)は、コンテナアプリを“安全に・賢く・自動で”運用するための仕組みです。Dockerで1台のマシンにコンテナを立ち上げるだけなら十分でも、実運用では「台数を増やしたい」「落ちたら復旧したい」「更新で止めたくない」「設定や秘密情報を分離したい」などの要件が出ます。Kubernetesはこれを 宣言的(こうあるべき、を指定) に実現します。
この記事では、Kubernetesの基本概念を押さえつつ、手を動かして以下を完成させます。
- ローカルにKubernetesクラスタを用意(kind)
- Deploymentでアプリを起動
- Serviceで外部公開
- スケール(台数変更)
- ローリングアップデート&ロールバック
- ConfigMap/Secretで設定分離
- よくあるトラブルシュート
Kubernetesの全体像(超ざっくり)
- クラスタ:複数ノード(サーバ群)をまとめた実行基盤
- Node:Podを動かすマシン(仮想でもOK)
- Pod:コンテナの実行単位(基本は1アプリ=1 Pod)
- Deployment:Podを望む数・状態で維持し、更新も管理
- Service:Podへの安定した入口(IP/名前)を提供
- Ingress:HTTP/HTTPSの入口(ドメイン/パスでルーティング)
- ConfigMap / Secret:設定・機密情報をアプリと分離
Kubernetesは「Podを直接いじる」のではなく、Deploymentなどの“コントローラ”に“あるべき姿”を宣言し、K8sが差分を埋めてくれます。
ハンズオン環境(ローカルでOK:kind推奨)
ここでは kind(Kubernetes IN Docker) を使います。Dockerが入っていれば動くので最短です。
前提
- Docker
- kubectl
- kind
インストール(目安)
- macOS: Homebrewで
kubectl,kind - Windows: winget / choco などで
kubectl,kind - Linux: 各ディストリの手順 or バイナリ
(インストール方法は環境差が大きいので、ここでは省略。既に入っている前提で進めます。)
1. kindでクラスタ作成
kind create cluster --name k8s-handson
kubectl cluster-info
kubectl get nodes
nodesが1つ表示されればOKです。
2. まずは「動いた」を作る:DeploymentでPod起動
KubernetesはYAMLで宣言します。deployment.yaml を作成してください。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-deploy
spec:
replicas: 2
selector:
matchLabels:
app: hello
template:
metadata:
labels:
app: hello
spec:
containers:
- name: web
image: nginxdemos/hello:plain-text
ports:
- containerPort: 80
適用:
kubectl apply -f deployment.yaml
kubectl get deploy
kubectl get pods -l app=hello
ポイント:
replicas: 2でPodが2つ動く- Podが落ちてもDeploymentが復旧させる
3. Serviceで公開(まずはPort Forwardで確認)
Serviceを作る前に、動いているかだけ確認します。
kubectl port-forward deploy/hello-deploy 8080:80
ブラウザで http://localhost:8080 を開いて表示されればOK。
4. Serviceを作成して“入口”を固定する
service.yaml を作成:
apiVersion: v1
kind: Service
metadata:
name: hello-svc
spec:
selector:
app: hello
ports:
- port: 80
targetPort: 80
適用:
kubectl apply -f service.yaml
kubectl get svc
kubectl get endpoints hello-svc
kindでは外部LoadBalancerがそのまま使えないことが多いので、ここでは Serviceに対してport-forward します:
kubectl port-forward svc/hello-svc 8080:80
5. スケール(台数を増やす)
kubectl scale deploy/hello-deploy --replicas=4
kubectl get pods -l app=hello
Podが4つになればOK。これがKubernetesの強みのひとつで、負荷に応じて台数を増減できます(自動化も可能)。
6. ローリングアップデート(無停止更新)&ロールバック
更新してみる(別のタグへ)
kubectl set image deploy/hello-deploy web=nginxdemos/hello:latest
kubectl rollout status deploy/hello-deploy
kubectl get pods -l app=hello
Kubernetesは新旧Podを入れ替える ローリングアップデート を行い、止めずに更新できます。
履歴を見る
kubectl rollout history deploy/hello-deploy
ロールバック
kubectl rollout undo deploy/hello-deploy
kubectl rollout status deploy/hello-deploy
「更新したら壊れた!」に強いのがKubernetesの運用メリットです。
7. ConfigMapで設定を外出しする
アプリ設定をイメージに埋め込むと、変更のたびにビルドが必要になります。Kubernetesでは ConfigMap で外出しできます。
作成(例:環境変数として渡す):
kubectl create configmap hello-config --from-literal=MESSAGE="Hello from ConfigMap"
kubectl get configmap hello-config -o yaml
Deploymentを更新して env を追加します(既存deployment.yamlを編集して再applyでもOK):
- name: web
image: nginxdemos/hello:plain-text
ports:
- containerPort: 80
env:
- name: MESSAGE
valueFrom:
configMapKeyRef:
name: hello-config
key: MESSAGE
適用:
kubectl apply -f deployment.yaml
kubectl rollout status deploy/hello-deploy
※このデモイメージが MESSAGE を表示に使わない場合もありますが、“設定を外出しして注入する” というやり方自体が重要です(実アプリではよく使います)。
8. Secret(機密情報)を扱う基本
例としてSecretを作成:
kubectl create secret generic hello-secret --from-literal=API_KEY="dummy-key"
kubectl get secret hello-secret -o yaml
Podへ環境変数で渡すなら secretKeyRef を使います(ConfigMapとほぼ同じ形)。
注意:Secretは“平文よりはマシ”ですが、環境によっては追加対策(暗号化設定、外部Secret管理など)が必要です。
9. よく使うデバッグコマンド(詰まったらここ)
何が起きてる?(イベント確認)
kubectl get events --sort-by=.metadata.creationTimestamp
Podの詳細(落ちてる理由が出る)
kubectl describe pod <POD_NAME>
ログを見る
kubectl logs <POD_NAME>
# Deployment配下のどれかに当てたい時
kubectl logs -l app=hello --tail=100
Pod内に入る
kubectl exec -it <POD_NAME> -- sh
片付け(クラスタ削除)
kind delete cluster --name k8s-handson
まとめ:入門で押さえるべき“運用の型”
Kubernetes入門で大事なのは「YAMLを覚える」よりも、次の型を体に入れることです。
- Podは直接触らず、Deploymentに“あるべき姿”を宣言
- Serviceで入口を固定して、Podが入れ替わっても接続先を変えない
- スケール/更新/ロールバックが標準機能
- ConfigMap/Secretで設定と機密を分離し、運用変更に強くする
- 困ったら
describe/logs/events
コメントを残す