広告

kubernetes – ClusterIP Service

infrastructure as code

Service 概要

  • Service
    • ClusterIP:k8s内部ロードバランサー
    • ExternalIP(ClusterIPに属する):指定のNodeのIPを使って、外部と通信可能なClusterIP
    • NodePort:任意NodeのIPを使って、外部からk8s内部への通信を可能にするリソース
    • LoadBalancer:外部ロードバランサー + NodePort + ClusterIP
    • Headless(None)(ClusterIPに属する):主にStatefulSetのためのClusterIP
    • ExternalName:k8sのCNAME変換用リソース
    • None-Selector(ClusterIPに属する):Endpointsをカスタマイズ可能なClusterIP

ClusterIP Service

manifestのリソース指定:
kind: Service
spec.type: ClusterIP

ClusterIPは簡単にいうと、k8sクラスタ内部のロードバランサーです。内部Pod間の通信は基本ClusterIPを使います。
ClusterIPのServiceを作成すると、クラスタのネットワークの内部IPを割り振られます。
ClusterIPへの通信は、各ノード上で実行しているシステムコンポーネントのkube-proxyが条件の合うPodに転送を行います。

ちょっとイメージ付きにくいかと思いますので、図で説明します。


k8s内のリソース(この図ではPod)から、ClusterIPへPort:8080でアクセスすると、
ClusterIPが条件にあったPodへPort:80で転送されます。

特徴:

  • 一つのClusterIPは複数のルールを指定可能(ClusterIP port → Pod port)
    • spec.ports[].port:ClusterIPの受け付けport。※[]はyamlの配列記法を意味する。
    • spec.prots[].targetPort:転送先のコンテナのport
  • ClusterIPはk8sの内部DNSで名前解決可能
    • IPを固定にすることも可能
    • 固定IPの指定はリソース作成時のみ可能、後で変更したい場合、削除してから作り直す必要がある
    • spec.clusterIPで指定する

ClusterIP manifest例

ServiceのデフォルトtypeはClusterIPのため、ClusterIPを作成する際は、spec.type: ClusterIPの指定は省略可能です。

apiVersion: v1
kind: Service
metadata:
  name: my-service  # ClusterIP名
spec:
  selector:  # 転送先の指定、labelが一致するものに転送される
    app: MyApp
  ports:  # 転送ルール定義、複数指定可能
    - name: http  # ルール名
      protocol: TCP  # プロトコル
      port: 80  # ClusterIPが受け付けるPort番号
      targetPort: 9376  # 転送先のPort番号(コンテナの受付Port番号)
    - name: https
      protocol: TCP
      port: 443
      targetPort: 9377

最後に

今回はClusterIPについてご紹介しました。
ClusterIPはk8sのServiceにおいて、使用頻度が一番多いといっても過言でもないと思います。

ここまで読んでいただいて、お疲れ様でした。

コメント

タイトルとURLをコピーしました