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
NodePort Service
manifestのリソース指定:
kind: Service
spec.type: NodePort
NodePortはExternalIPと似ています。どれもNodeのIPアドレスを受付に、トラフィックを内部に転送するServiceです。
ただ、NodePortはさらに使いやすく、NodeのIPを指定しなくても、すべてNodeへの通信は内部に転送されます。
では、イメージ図を...
k8sクラスタ外部から、任意NodeのIP:NodePortのPortに対しての通信が、ClusterIPへ転送され、やがって各Podへ転送されます。
特徴:
- k8sクラスタ外部から、任意NodeのIPへの通信は内部へ転送可能
- 外部からの通信ポートはNodePortで指定したPortを使う必要がある
spec.ports[].nodePort
で指定
- NodePortのPort範囲は30000~32767
- 指定しない場合は範囲内ランダムのportを使う
- 内部の通信が必要なため、自動的にClusterIPが作成される
- 複数のNodePortで同じポートを利用できない。バッティングする。
- Node間の通信は排除可能(Nodeをまたいだロードバランシングの排除):※使用を推奨しない
spec.externalTrafficPolicy: Local
:Nodeに到達したら、他Nodeへの転送はしない。- 到達したNodeに該当Podがない場合、ロストするので注意が必要。
spec.externalTrafficPolicy: Cluster
:デフォルト。指定しないのと同じ
- GCPのグローバルIPアドレスは利用可能(試したところ、ダメだった。不明)
これはExternalIPよりはちょっと使えそうですが、それでもなんか微妙な感じはしますよね。
どれもNodeのIPを使っているので、指定したNodeがダウンしたら、通信が切れてしまいます。(単一障害点)
NodePort manifest例
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: NodePort
selector:
app: MyApp
ports:
- port: 8080 # ClusterIPの受付Port
targetPort: 80 # 宛先の受付Port。指定しない場合、portと同じものを使用される
nodePort: 30080 # NodePortのPort、範囲は30000~32767
最後に
NodePortはExternalIPと似ていますが、全く別物です。
NodePortはそのまま使うことはほとんどないですが、k8sのロードバランシングにおいて、とても大事なリソースです。
特にIngressを使用時に、ほぼ作成が必須となります。
ここまで読んでいただいて、お疲れ様でした。
コメント
原来k8s infra这么高深。赞!
www 互相学习,互相学习。