Kubernetes入門:仕組みを理解して「動かして学ぶ」最短ハンズオン

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


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

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