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
None-Selector Service
manifestのリソース指定:
kind: Service
spec.type: ClusterIP
None-Selectorは、PodのIPプール(Endpoints)を作って、ClusterIPのロードバランシング先をEndpointsにするServiceです。
このServiceは、自由に転送先PodをIPで指定できるServiceです。
その代わり、Selector(labelなどの条件で転送先Podを指定する方法)での指定ができなくなります。
Endpoints
manifestのリソース指定:
kind: Endpoints
EndpointsはPodのプールを作るリソースです。
ここでは、ロードバランシング先のメンバーを登録するために使います。
このリソースは実に、ClusterIPやLoadBalancerなどのServiceで自動的に作成してくれるものです。
自動作成で特に気にする必要はなかったですが、カスタマイズする時には、自分で作る必要があります。
None-SelectorとEndpointsを紐づく条件
- None-Selector(ClusterIP)の
metadata.name
が、Endpointsのmetadata.name
が一致であること
Endpoints + ClusterIP併用例
# ClusterIP作成
apiVersion: v1
kind: Service
metadata:
name: none-selector-service
spec:
ports:
- protocol: TCP
port: 8080 # ClusterIPの受付Port
targetPort: 80 # Podの受付Port
---
# Endpoints作成
apiVersion: v1
kind: Endpoints
metadata:
name: none-selector-service # 関連付け先のServiceのmetadata.nameと同じ値に指定する必要がある
subsets:
- addresses:
- ip: 192.0.2.42 # EndpointsのPodのIP
- ip: 192.0.2.43 # EndpointsのPodのIP
ports: # Pod受付Port指定
- protocol: TCP
- port: 80
最後に
一般的なシナリオで、None-Selector以外のServiceで要件を満たせることが可能なので、None-Selectorが使われるケースは少ないと思います。
知識として知っておいた方が、通信の転送の理解を深めることができるかと思います。
k8sのServiceについて、今回ですべてご紹介しました。
ここまで読んでいただいて、お疲れ様でした。
コメント