Kubernetes サービスを使った Pod の接続

KubernetesBeginner
オンラインで実践に進む

はじめに

Kubernetes では、Pod は寿命が短く、いつでも終了して再作成される可能性があります。これはネットワーキングにおいて課題を提示します。なぜなら、Pod に直接接続することは困難だからです。この問題を解決するために、Kubernetes は Service と呼ばれるより高レベルの抽象化を提供します。Service は、一連の Pod に対して安定した IP アドレスと DNS 名を提供し、他のコンポーネントが簡単にそれらに接続できるようにします。この実験では、Kubernetes で Service を使って Pod をネットワーク化する方法を学びます。

Minikube クラスタを起動する

リソースを作成する前に、動作中の Kubernetes クラスタが必要です。Minikube は、ローカル マシン上で動作する軽量の Kubernetes 環境です。

  1. 作業ディレクトリに移動する:

    ターミナルを開き、デフォルトのプロジェクト フォルダに移動します。

    cd /home/labex/project
    
  2. Minikube を起動する:

    Minikube を起動して Kubernetes クラスタを初期化します。

    minikube start
    
    • このコマンドは、ローカル マシン上に単一ノードの Kubernetes クラスタをセットアップします。
    • Minikube は、システムの性能に応じて数分かかる場合があります。
  3. Minikube が動作していることを確認する:

    Minikube クラスタの状態を確認します。

    minikube status
    
    • kubeletapiserver などのコンポーネントが Running と表示されていることを確認します。
    • クラスタが動作していない場合は、minikube start を再度実行します。

Minikube の起動に問題がある場合は、必要に応じて minikube delete を使用して環境をリセットします。

Pod を作成する

最初のステップは、簡単な Pod を作成することです。次の内容を持つ /home/labex/project/myapp-pod.yaml という名前のファイルを作成します。

apiVersion: v1
kind: Pod
metadata:
  name: my-pod-1
  labels:
    app: nginx
spec:
  containers:
    - name: my-container
      image: nginx

ファイルを保存し、次のコマンドを実行して Pod を作成します。

kubectl apply -f /home/labex/project/myapp-pod.yaml

これにより、Nginx イメージを実行する単一のコンテナを持つ my-pod-1 という名前の Pod が作成されます。

サービスを作成する

2 番目のステップは、前のステップで作成した Pod を対象とするサービスを作成することです。次の内容を持つ /home/labex/project/service.yaml という名前のファイルを作成します。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80

ファイルを保存し、次のコマンドを実行してサービスを作成します。

kubectl apply -f /home/labex/project/service.yaml

これにより、app=nginx というラベルが付いた Pod を対象とし、ポート 80 を公開する my-service という名前のサービスが作成されます。

サービスをテストする

3 番目のステップは、別の Pod からサービスにアクセスしてテストすることです。次の内容を持つ /home/labex/project/test-pod-1.yaml という名前のファイルを作成します。

apiVersion: v1
kind: Pod
metadata:
  name: test-pod-1
spec:
  containers:
    - name: my-container
      image: nginx
      command:
        - sleep
        - "3600"

ファイルを保存し、次のコマンドを実行してテスト用の Pod を作成します。

kubectl apply -f /home/labex/project/test-pod-1.yaml

これにより、Busybox イメージを実行する単一のコンテナを持つ test-pod-1 という名前の Pod が作成されます。

次に、コンテナ内に入り、curl を使ってサービスにアクセスします。コンテナ内に入るには、次のコマンドを実行します。

kubectl exec -it test-pod-1 -- sh

これにより、コンテナ内にシェルが開きます。シェルから、サービスにアクセスするには、次のコマンドを実行します。

curl http://my-service

これにより、デフォルトの Nginx ページが返され、サービスが正常に動作していることが示されます。

サービスを更新する

4 番目のステップは、サービスを更新して異なるセットの Pod を対象とするようにすることです。/home/labex/project/service.yaml ファイルの selector フィールドを次のように更新します。

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: busybox
  ports:
    - name: http
      port: 80
      targetPort: 8

ファイルを保存し、次のコマンドを実行してサービスを更新します。

kubectl apply -f service.yaml

これにより、app=busybox というラベルが付いた Pod を対象とするようにサービスが更新されます。

更新されたサービスをテストする

5 番目のステップは、別の Pod からアクセスして、更新された Service をテストすることです。以下のコマンドを使用して、新しいテスト Pod を作成します。

kubectl run my-pod-2 --image=busybox --restart=Never -- sleep 3600

これにより、Busybox イメージを実行する単一のコンテナを持つ my-pod-2 という名前の新しい Pod が作成されます。

コンテナ内で exec し、Step 3 で行ったように curl を使用して Service にアクセスします。コンテナ内で exec するには、次のコマンドを実行します。

kubectl exec -it my-pod-2 -- sh

今回は、接続が拒否されたことを示すエラーが表示されるはずです。

これは、Service が、テスト Pod が実行している Pod とは異なる Pod のセットをターゲットにしているためです。これを修正するには、Pod のラベルを更新して、Service の新しいセレクターと一致させます。

テスト Pod のラベルを更新するには、次のコマンドを実行します。

kubectl label pod my-pod-2 app=busybox

これにより、app=busybox ラベルがテスト Pod に追加されます。

これで、curl コマンドを再度実行すると、デフォルトの Nginx ページが表示され、Service が正しく動作していることが示されます。

まとめ

この実験では、Kubernetes で Pod とサービスをネットワーク接続する方法を学びました。Nginx イメージを実行する単純な Pod を作成し、その Pod を対象とするサービスを作成し、別の Pod からサービスにアクセスしてテストしました。また、サービスを更新して異なるセットの Pod を対象とする方法と、サービスの新しいセレクターと一致させるために Pod のラベルを更新する方法も学びました。サービスは、Kubernetes のネットワーク接続に不可欠なコンポーネントであり、信頼性の高く拡張性のある方法で Pod に接続することができます。