はじめに
Kubernetes では、Pod は寿命が短く、いつでも終了して再作成される可能性があります。これはネットワーキングにおいて課題を提示します。なぜなら、Pod に直接接続することは困難だからです。この問題を解決するために、Kubernetes は Service と呼ばれるより高レベルの抽象化を提供します。Service は、一連の Pod に対して安定した IP アドレスと DNS 名を提供し、他のコンポーネントが簡単にそれらに接続できるようにします。この実験では、Kubernetes で Service を使って Pod をネットワーク化する方法を学びます。
Minikube クラスタを起動する
リソースを作成する前に、動作中の Kubernetes クラスタが必要です。Minikube は、ローカル マシン上で動作する軽量の Kubernetes 環境です。
作業ディレクトリに移動する:
ターミナルを開き、デフォルトのプロジェクト フォルダに移動します。
cd /home/labex/projectMinikube を起動する:
Minikube を起動して Kubernetes クラスタを初期化します。
minikube start- このコマンドは、ローカル マシン上に単一ノードの Kubernetes クラスタをセットアップします。
- Minikube は、システムの性能に応じて数分かかる場合があります。
Minikube が動作していることを確認する:
Minikube クラスタの状態を確認します。
minikube statuskubeletやapiserverなどのコンポーネントが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 に接続することができます。


