Kubernetes基礎(5):Service-ClusterIP, NodePort, LoadBalancer


Serviceの特徴

Serviceは基本的に自分のCluster IPを持っています。
ServiceをPodに接続しておけばService IPでPodへのアクセスが可能になります。

Podは性能障害またはKubernetes障害などに、いつでも再生成することができるように設計されているObjectです。Podが再生成されると、PodのIPアドレスも変わるため、PodのIPは外部からの接続には使えません。
ところがServiceはユーザーが削除しない限り、再生成されてIPアドレスが変わることがないため、Serviceにアクセスをすると常にServiceと連携されているPodにアクセスすることができます。
Serviceの種類はいくつかあり、種類に毎にPodにアクセスする方法が違います。

1. ClusterIP


Cluster内でアクセス可能なIPで外部からのアクセスはできません。
Serviceは1つ以上のPodへ接続できます。
複数のPodに接続している場合、ServiceはTrafficを分散してPodに配信をします。

1-1) Pod

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
     app: pod
spec:
  nodeSelector:
    kubernetes.io/hostname: k8s-node1
  containers:
  - name: container
    image: <image file name>
    ports:
    - containerPort: 8080

1-2) Service

apiVersion: v1
kind: Service
metadata:
  name: svc-1
spec:
  selector:
    app: pod
  ports:
  - port: 9000
   type: ClusterIP  ←省略可能
    targetPort: 8080

2. NodePort


ServiceをNodePort Typeで生成しても、基本的にClusterIPは割り当てられます。
NodePortはKubernetes Clusterの全てのNodeに同じPortを割り当てて、外部からどのNodeのPortに接続をしても
該当Serviceに接続され、またServiceに接続されているPodにtrafficが配信されるのが特徴です。
注意すべき点は、Podが属しているNodeのみPortが設定されるのではなく、全てのNodeに同じPortが設定されるのが大きな特徴です。

2-1) Service

apiVersion: v1
kind: Service
metadata:
  name: svc-2
spec:
  selector:
    app: pod
  ports:
  - port: 9000
    targetPort: 8080
    nodePort: 30000
  type: NodePort
  externalTrafficPolicy: Local

※nodePort:30000から32767まで設定が可能です。(Port値を設定をしないと上記の範囲で自動に設定される)
※externalTrafficPolicy:Local:特定のNode IPでアクセスしたtrafficは、ServiceがそのNodeに属しているPodにtrafficを配信します。(Node1のURIからアクセスした場合はNode1のPodにtrafficを配信し、Node2のPodには配信しない)

3. Load Balancer


Node Portの全ての機能を持っており、さらにLoad Balancerの機能が追加されてそれぞれのNodeにtrafficを分散させます。
注意すべき点は、Load balancerにアクセスするためのIPアドレスは、自動に生成されません。
別途、外部接続のIPアドレスを割り当てるPluginをインストールしないといけませんが
Cloud Platformを使用するときは、独自のPluginがインストールされていて、Load Balancer TypeのServiceを作成すると、自動に外部接続のIPアドレスを作ってくれるので、アクセスが可能となります。

Referenece