#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
- Service : https://kubernetes.io/docs/concepts/services-networking/service/
- Kubernetes NodePort vs LoadBalancer vs Ingress? : https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0