最終更新:

Kubernetes入門 — 練習用Webサーバーを2つ動かしてみよう


窓口と、2つのWebサーバー

🌐 Service:一定の窓口learning-webPod 1Pod 2NGINXNGINXDeployment:2つ欲しい資源や起動の状態も確認しよう
通常のクラスタ内接続のイメージ。本文のport-forwardは1つのPodへ転送する練習で、この分散を測る方法ではありません。
🎚 難易度 ★★☆ 中級者向け
⏱ 学習時間の目安 読むだけ10分程度。練習時間は環境で変わります。
📚 前提知識 docker-getting-started の基礎知識(必須)・linux-getting-started の基礎知識
✅ このガイドで学べること
  • 身近な例から役割をつかむ
  • 確認できる結果と成立条件を区別する
  • 次の学習や導入判断につなげる
ひよこ ひよこ
コンテナをたくさん動かすと、管理が大変そう。
ペンギン先生 ペンギン先生
Kubernetesは「このアプリを2つ動かしたい」などの希望を受け取り、その状態へ近づける仕組みだよ。まずは自分のPCの練習用環境でWebサーバーを2つ用意する流れを見よう。
ひよこ ひよこ
Dockerと同じものなの?
ペンギン先生 ペンギン先生
コンテナの実行環境と、その配置や運用を調整する仕組みは役割が違うんだ。Kubernetesが管理する最小の配置単位はPodで、1つ以上のコンテナをまとめられるよ。
ひよこ ひよこ
Podを2つ、自分で作るの?
ペンギン先生 ペンギン先生
今回はDeploymentに2つ欲しいと伝えるよ。DeploymentとReplicaSetがPodの数などを調整するんだ。ただし、計算資源の不足やイメージの取得失敗があれば、すぐ希望どおりにはならないよ。
ひよこ ひよこ
どのPodにアクセスすればいい?
ペンギン先生 ペンギン先生
Serviceという一定の窓口を作ると、ラベルに合うPodへ接続できるよ。今回のClusterIPはクラスタ内向け。自分のブラウザーからはport-forwardで練習するんだ。
ひよこ ひよこ
Namespaceがあれば完全に隔離できる?
ペンギン先生 ペンギン先生
名前や管理範囲を分けるのに役立つけど、それだけで通信や権限が遮断されるわけではないよ。ここでは練習用の名前で、操作する対象を見分けやすくしよう。
ひよこ ひよこ
設定ファイルを送れば成功?
ペンギン先生 ペンギン先生
送れたことと、アプリがReadyになったことは別だよ。rollout statusとPodの表示を確かめよう。画像の取得や起動に時間がかかる場合もあるんだ。
ひよこ ひよこ
3つに増やすのも試せる?
ペンギン先生 ペンギン先生
scaleで希望数を3へ変えられるよ。ただし、元のYAMLを再適用すると、そのreplicasの値へ戻ることがあるんだ。後片付けも練習用の対象に限定しよう。
ひよこ ひよこ
最初の覚え方は?
ペンギン先生 ペンギン先生
「Kubernetes」って出てきたら「コンテナの配置や状態を、宣言した希望に近づける仕組み」と思えばだいたいOK!まずはPodがReadyかを読めるようになろう。

最初のゴールと準備

今回はminikubeの練習用プロファイルlearning-shopだけを操作します。Docker入門が次の準備に役立ちます。

  • 公式手順でminikubeとkubectlをOSに合わせてインストールします。
  • Docker driverを使うため、DockerのLinuxコンテナ環境を起動しておきます。
  • minikubeの最低条件はCPU 2個、空きメモリ2GB、空きディスク20GBなどです。OSや他のアプリの分も含めて余裕を見てください。

練習用のクラスタを起動する

minikube start -p learning-shop --driver=docker
minikube -p learning-shop status
kubectl --context learning-shop get nodes
kubectl --context learning-shop create namespace learning-shop

NodeがReadyになったら次へ進みます。以降も--context learning-shopで操作先を指定します。本番クラスタの設定と取り違えないためです。既にこの名前の環境がある場合は、新規の練習用か確認してください。

「2つ欲しい」と窓口をYAMLで伝える

learning.yamlに保存します。nginx:stableは安定系列の更新に伴って中身が変わるタグです。運用では確認した版やdigestへの固定と更新手順を検討してください。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: learning-web
  namespace: learning-shop
spec:
  replicas: 2
  selector:
    matchLabels:
      app: learning-web
  template:
    metadata:
      labels:
        app: learning-web
    spec:
      containers:
        - name: web
          image: nginx:stable
          ports:
            - containerPort: 80
          readinessProbe:
            httpGet:
              path: /
              port: 80
---
apiVersion: v1
kind: Service
metadata:
  name: learning-web
  namespace: learning-shop
spec:
  type: ClusterIP
  selector:
    app: learning-web
  ports:
    - port: 80
      targetPort: 80

DeploymentのラベルとServiceのselectorが一致することが大切です。readinessProbeはHTTPで応答できるかを確かめますが、アプリ全体の正しさを保証するテストではありません。

kubectl --context learning-shop apply -f learning.yaml
kubectl --context learning-shop -n learning-shop rollout status deployment/learning-web
kubectl --context learning-shop -n learning-shop get pods

完了後にPodが2件、各READYが1/1、STATUSがRunningなら次へ進みます。待ち続ける場合はdescribe pod Pod名やlogs Pod名を同じcontext・namespace指定で実行し、イメージ取得、資源不足、起動エラーを調べます。

ブラウザーから表示する

別のターミナルで次を実行したまま、http://127.0.0.1:8080/を開きます。

kubectl --context learning-shop -n learning-shop port-forward service/learning-web 8080:80 --address 127.0.0.1

NGINXのWelcomeページが表示されれば成功です。このport-forwardはServiceに対応する1つのPodへ転送します。ブラウザーを更新しても、2つのPodへの負荷分散を確認する実験にはなりません。外部向けの公開には、環境に応じてIngressやLoadBalancerなど別の設定が必要です。

数を変え、練習環境を片付ける

kubectl --context learning-shop -n learning-shop scale deployment/learning-web --replicas=3で希望数を変え、get podsで状態を確認します。YAMLは2のままなので、再適用すると希望数も2へ戻り得ます。

表示用ターミナルはCtrl+Cで終了します。今回の2種類のリソースだけを消すには、同じファイルでkubectl --context learning-shop delete -f learning.yamlを使います。その後minikube stop -p learning-shopで練習環境を停止できます。名前だけで他の環境をまとめて削除しないでください。

次はKubernetesとDocker Composeの比較で、用途に合わせた選び方を考えましょう。

参考資料

次に学ぶなら