前: Deployment
K8s上に作成したPodは(永続的ではなく)比較的短命な存在であり、さまざまな理由で動的かつ頻繁に削除・再作成されます。 各Podは作成時にIPアドレスが動的に採番・割り当てされますが、このIPアドレスもPodの削除・再作成に合わせて変わります。
この仕組みだと、外部からPodにアクセスする際、Podに割り当てられたIPアドレスを毎回調査する必要があります。
この問題を解消するために用意されたAPIリソースがServiceです。
こちらはService APIsのカテゴリに所属します。
⚠️
Service APIsというカテゴリとAPIリソースのServiceは区別されますので注意してください。 APIリソース:Serviceはカテゴリ:Service APIsに所属するAPIリソースの1つです。
- Service APIs
- Service
- Ingress
- Endpoints
- ...
Serviceは単一のエンドポイントを提供し、受け取ったリクエストを指定したPodに転送してくれます。 Podへのアクセスを中継するL4ロードバランサのようなものです。
Serviceにはいくつかタイプがあり、代表的なものは次の通りです。
この章では基本となるCluster IPについて学びます。
- Cluster IP
- LoadBalancer
- NodePort
- ExternalName
Cluster IPはK8sクラスタ内部でのみ通信できるIPアドレスをエンドポイントとして設定するServiceです。
最も基本となるServiceとなります。
通信を転送するPodは、通常ラベルセレクターによって判別します。
以下はCluster IPのmanifestのサンプルです。
このサンプルでは、app: testというラベルを持ったPodやDeploymentに通信を転送します。(★印の部分)
kind: Service
apiVersion: v1
metadata:
name: test-svc
spec:
selector:
app: test ★
ports:
- protocol: TCP
port: 80
targetPort: 80※前章Deployment実施直後の状態から開始してください。
では実際にCluster IPを作成してみましょう。 次の操作を実施してください。
-
次のmanifestを使用して、Service:nginx-svcを作成する。
kind: Service apiVersion: v1 metadata: name: nginx-svc spec: selector: app: nginx ports: - protocol: TCP port: 80 targetPort: 80
-
作成したService:nginx-svcに設定されたIPアドレスを確認する。
-
Serviceを経由してDeploymentにアクセスする。 (宛先は先ほど確認した
Service:nginx-svcのIPアドレスを指定する)ℹ️
前述の通り、Cluster IPに外部から接続することはできません。 今回は接続確認のためにcurlコマンドが入ったコンテナを含むPodを作成し、このPodでcurlコマンドを打鍵します。具体的な操作方法は以下を確認してください。# curl の起動 kubectl run curl --image=appropriate/curl -- /bin/sh -c "sleep 3600"
-
Serviceを経由してDeploymentにアクセスする。 (宛先は
nginx-svcを指定する) -
2つあるPod:nginx-XXXXXそれぞれに含まれるコンテナに対して追加コマンドを発行し、コンテナ内の/usr/share/nginx/html/index.htmlを以下内容に修正する。
ℹ️
nginxのコンテナイメージにはvi、nanoといったeditorが含まれていません。
echo文字列> index.html などのコマンドで対象ファイルを修正しましょう。-
どちらかのコンテナ
watashi no sentouryoku ha -
もう一方のコンテナ
530000 desu
-
-
curlコマンドの宛先を
nginx-svcとし、Serviceを経由してDeploymentに複数回アクセスする。 (表示される結果がランダムで変わることを確認する) -
Service:nginx-svcのlabelSelectorを「app: nginx」から「
app: nginx2」に修正し、修正を適用する。 -
curlコマンドの宛先を
nginx-svcとし、Serviceを経由してDeploymentに複数回アクセスする。 (アクセスできないことを確認する) -
Deployment:nginx、Pod:curlおよびService:nginx-svcを削除する。
以上で本チュートリアルは終了です。
具体的な操作およびその結果に関する回答例はこちらにあります。 具体的な操作方法がわからなかった場合や、想定した結果にならなかった場合などに参照してください。
次: Pod-volume