Lab 3: Service

このラボでは、Serviceリソースを使ってPodへの安定したネットワークアクセスを提供し、負荷分散が行われることを確認します。

1. Deploymentの準備

まずServiceの対象となるDeploymentを作成します。

cat << 'EOF' > whoami-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  labels:
    app: whoami
spec:
  replicas: 3
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami
        image: containous/whoami
        ports:
        - containerPort: 80
EOF

kubectl apply -f whoami-deployment.yaml

2. ClusterIP Serviceの作成

ClusterIPはクラスタ内部からのみアクセスできるServiceタイプです(デフォルト)。

cat << 'EOF' > whoami-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: whoami-svc
spec:
  selector:
    app: whoami
  ports:
  - port: 80
    targetPort: 80
  type: ClusterIP
EOF

kubectl apply -f whoami-service.yaml

3. Serviceの確認

# Service一覧
kubectl get services

# Serviceの詳細(Endpoints を確認)
kubectl describe service whoami-svc
💡 ポイント: Endpoints にPodのIPアドレスが表示されます。Serviceは selector に一致するPodを自動的に検出し、トラフィックを振り分けます。

4. クラスタ内からのアクセス確認

一時的なPodを起動して、Service経由でアクセスしてみます。

# curlが使えるPodを起動してService名でアクセス
kubectl run curl-test --image=curlimages/curl --rm -it -- sh

# Pod内で以下を実行(何度か実行して異なるPodに振り分けられることを確認)
curl http://whoami-svc
curl http://whoami-svc
curl http://whoami-svc
exit
💡 DNS解決: クラスタ内では サービス名 でアクセスできます。完全修飾名は whoami-svc.default.svc.cluster.local です。

5. NodePort Serviceへの変更

NodePortはノードのIPアドレスとポート番号で外部からアクセスできるようにするServiceタイプです。

cat << 'EOF' > whoami-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
  name: whoami-nodeport
spec:
  selector:
    app: whoami
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30080
  type: NodePort
EOF

kubectl apply -f whoami-nodeport.yaml

6. NodePort経由のアクセス確認

# Service確認
kubectl get service whoami-nodeport

# ノードのIPでアクセス(何度かcurlして負荷分散を確認)
curl http://localhost:30080
curl http://localhost:30080
curl http://localhost:30080

レスポンスの Hostname が毎回異なるPod名になることを確認してください。これがServiceによる負荷分散です。

7. クリーンアップ

kubectl delete -f whoami-nodeport.yaml
kubectl delete -f whoami-service.yaml
kubectl delete -f whoami-deployment.yaml

📝 練習問題

課題: nginxのDeploymentとServiceを作成してみましょう。
  1. nginx イメージで web という名前のDeployment(レプリカ数2)を作成する
  2. NodePort タイプのService web-svc を作成し、nodePort 30088 で公開する
  3. curl http://localhost:30088 でnginxの応答を確認する
  4. すべてのリソースを削除する

解答例

# 1. Deployment作成
kubectl create deployment web --image=nginx --replicas=2

# 2. Service作成
kubectl expose deployment web --type=NodePort --port=80 --name=web-svc
# もしくはYAMLで nodePort: 30088 を指定

# もしくはYAMLで作成:
cat << 'EOF' | kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
  name: web-svc
spec:
  selector:
    app: web
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30088
  type: NodePort
EOF

# 3. アクセス確認
curl http://localhost:30088

# 4. クリーンアップ
kubectl delete service web-svc
kubectl delete deployment web

次のラボへ → Lab 4: ローリングアップデート