k8s Serviceのルーティング設定

kubernetesのServiceは内部ネットワークの名前解決機能を提供しています。Serviceのnameに設定に設定した名前はホスト名として機能し、各コンテナからその名前でアクセスできます。

Serviceに到達したリクエストは、selectorとports.targetPortに指定した内容の組み合わせで検索し、マッチした Pod に転送されます。

apiVersion: v1
kind: Service
metadata:
  labels:
    name: nginx
  name: nginx
spec:
  ports:
    - name: https
      port: 443
      targetPort: nginx-https
    - name: http
      port: 80
      targetPort: nginx-http
    - name: ssh
      port: 22
      targetPort: ssh
  selector:
    app: frontend
  type: LoadBalancer

targetPortについては、Deploymentなどの設定に記載したポートの名称であるため自明です。
同時に、selector の設定も判定に用いられている点には注意が必要です。

selectorのラベルには、nameやそれ以外の任意のラベルを使用できます。
ServiceとDeploymentの設定でマッチする組み合わせで指定すれば問題はないのですが、意図せず揃っていないと接続拒否されます。

上の設例では、port443と80にWebサーバー、22にsshdを想定しています。
このように転送先に複数のコンテナを指定するケースでは、selectorにはタグのようなラベルを指定した方が管理しやすいでしょう。

selectorにnameを指定すると、Deployment側の設定で複数の異種コンテナに対して重複した name を指定しないと接続できない状況になります。