広告

kubernetes – NodePort 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

NodePort Service

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

NodePortはExternalIPと似ています。どれもNodeのIPアドレスを受付に、トラフィックを内部に転送するServiceです。
ただ、NodePortはさらに使いやすく、NodeのIPを指定しなくても、すべてNodeへの通信は内部に転送されます。

では、イメージ図を...

NodePort
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を使用時に、ほぼ作成が必須となります。

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

コメント

  1. Art より:

    原来k8s infra这么高深。赞!

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