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において、使用頻度が一番多いといっても過言でもないと思います。
ここまで読んでいただいて、お疲れ様でした。
コメント