Skip to content

Latest commit

 

History

History
133 lines (98 loc) · 4.8 KB

Service-ClusterIP.md

File metadata and controls

133 lines (98 loc) · 4.8 KB

前: Deployment


Serviceとは?

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

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

チュートリアル: Serviceを作成する

※前章Deployment実施直後の状態から開始してください。

では実際にCluster IPを作成してみましょう。 次の操作を実施してください。

  1. 次のmanifestを使用して、Service:nginx-svcを作成する。

    kind: Service
    apiVersion: v1
    metadata:
      name: nginx-svc
    spec:
      selector:
        app: nginx
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
  2. 作成したService:nginx-svcに設定されたIPアドレスを確認する。

  3. Serviceを経由してDeploymentにアクセスする。 (宛先は先ほど確認したService:nginx-svcのIPアドレスを指定する)

    ℹ️
    前述の通り、Cluster IPに外部から接続することはできません。 今回は接続確認のためにcurlコマンドが入ったコンテナを含むPodを作成し、このPodでcurlコマンドを打鍵します。具体的な操作方法は以下を確認してください。

    # curl の起動
    kubectl run curl --image=appropriate/curl -- /bin/sh -c "sleep 3600"
  4. Serviceを経由してDeploymentにアクセスする。 (宛先はnginx-svcを指定する)

  5. 2つあるPod:nginx-XXXXXそれぞれに含まれるコンテナに対して追加コマンドを発行し、コンテナ内の/usr/share/nginx/html/index.htmlを以下内容に修正する。

    ℹ️
    nginxのコンテナイメージにはvi、nanoといったeditorが含まれていません。
    echo 文字列 > index.html などのコマンドで対象ファイルを修正しましょう。

    • どちらかのコンテナ

      watashi no sentouryoku ha
      
    • もう一方のコンテナ

      530000 desu
      
  6. curlコマンドの宛先をnginx-svcとし、Serviceを経由してDeploymentに複数回アクセスする。 (表示される結果がランダムで変わることを確認する)

  7. Service:nginx-svcのlabelSelectorを「app: nginx」から「app: nginx2」に修正し、修正を適用する。

  8. curlコマンドの宛先をnginx-svcとし、Serviceを経由してDeploymentに複数回アクセスする。 (アクセスできないことを確認する)

  9. Deployment:nginx、Pod:curlおよびService:nginx-svcを削除する。

以上で本チュートリアルは終了です。

具体的な操作およびその結果に関する回答例はこちらにあります。 具体的な操作方法がわからなかった場合や、想定した結果にならなかった場合などに参照してください。


次: Pod-volume