KubernetesのServiceリソースとは何か?

Serviceリソース

Serviceリソースは単一の変化しないIPアドレス、またはDNSを付与することができ、任意の対応するPodへ自動的にルーティングさせることが出来ます。

ServiceはWebプロキシやロードバランサのようなものと考えることができ、バックエンドであるPodのグループにリクエストを飛ばします。

Serviceリソースのコード例

次のプログラムは80番ポートへのアクセスをnginxコンテナの8080番に転送しています。 大部分がDeploymentリソースと似ていますが、kind: Serviceが異なっている点です。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: NodePort

Serviceの転送先Podが複数存在している場合、デフォルトではランダムに選択されたPodに送信することになります。 しかし、オプション次第でほかの接続方式もサポートすることが可能です。

nginxの8080ポートをServiceリソースを使用して80番へアタッチする

次のコードをnginx.deployment.ymlという名前で保存し、 コマンドkubectl create -f nginx.deployment.ymlを実行してください。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx  # または公式のNginxイメージを使用
        ports:
        - containerPort: 8080

この時点では8080ポートは公開されておらず、あくまでkubernetesの範囲でのみ公開されています。

そこで、次のServiceリソースのコードをnginx.service.yamlという名前で保存し、 kubectl apply -f .\nginx.service.yamlというコマンドでリソースを反映してください。

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
  type: NodePort

ここまで実行出来たら、次のリンクにアクセスしてnginxサービスが起動しているかどうか見てみましょう。

http://localhost/

もし動かない場合は次のコマンドを試してみてください。

kubectl port-forward service/nginx-service 80:80

まとめ

まとめると、 - 開発者が作成するアプリケーションを運用するPodの管理がDeployment - ユーザーがPodにアクセスするためのエントリーポイントを提供するのがService