これまなんとなく雰囲気でサービス・ロードバランサを作っていた。serviceはたぶん pod/deployment の前段にあたる概念だよなーと考えていた。
Serviceとは?
K8sのサービスは、論理的なPodのセットとそれと通信するためのポリシーを定義する抽象的なものです。これはマイクロサービスと呼ばれることもあります。 サービスを介して通信する一連のポッドは、通常、ラベル・セレクタによって決定されます。
https://kubernetes.io/docs/concepts/services-networking/service/ https://qiita.com/kouares/items/94a073baed9dffe86ea0
なるほど、大体間違っていなかったようだ。そして「ラベル・セレクタ」などによってターゲットpodsを指定すると。
雰囲気で作っていた
いままで、なんとなくこんな感じでロードバランサを作成していた。
kubectl expose deployment kbhello-deployment --type=LoadBalancer --name=kbhello-service
残骸serviceが残っていたので yaml を確認してみる。
$ kubectl get service kbhello-service -o yaml
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2019-03-04T12:14:50Z"
name: kbhello-service
namespace: default
resourceVersion: "2306882"
selfLink: /api/v1/namespaces/default/services/kbhello-service
uid: 1c5a9ac4-3e77-11e9-8f5d-9ca3ba319985
spec:
clusterIP: 10.98.159.32
externalTrafficPolicy: Cluster
ports:
- nodePort: 31872
port: 8080
protocol: TCP
targetPort: 8080
selector:
app: kbhello
sessionAffinity: None
type: LoadBalancer
status:
loadBalancer: {}
お掃除
kubectl get all で k8s の ClusterIP しかない状態にする。そう、この ClusterIP ってなんだろとは思っていた。
$ kubectl delete service quarkusstarted-service service "quarkusstarted-service" deleted $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40d $ kubectl get all NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40d
続けてテキトーなdeployment作成。
$ kubectl apply -f kbhello-deployment.yaml deployment.apps/kbhello-deployment created $ kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES kbhello-deployment-7cd47cbb58-4dlk8 1/1 Running 0 84s 10.244.1.89 kb2 <none> <none> kbhello-deployment-7cd47cbb58-jxjsx 1/1 Running 0 84s 10.244.1.88 kb2 <none> <none> $ curl 10.244.1.89:8080 Hello Docker World $ curl 10.244.1.88:8080 Hello Docker World
ClusterIP 作成
Service にはいくつか種類があるが、ClusterIP を作ってみる。
selector=app:kbhello って感じか。
kbhello-service-cip.yaml
apiVersion: v1
kind: Service
metadata:
name: kbhello-service-cip
spec:
selector:
app: kbhello
type: ClusterIP
ports:
- port: 8080
apply して get。表示されたip にcurl。なるほど。クラスタ内通信ならLoadBalancerでなく、外部ipが不要なClusterIPで十分ってことか。LoadBalancer の EXTERNAL-IPが pending になっていたのはipが取得できなかったのだ。
$ kubectl apply -f kbhello-service-cip.yaml service/kbhello-service-cip created $ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbhello-service-cip ClusterIP 10.104.228.167 <none> 8080/TCP 6s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40d $ curl 10.104.228.167:8080 Hello Docker World