kubernetes 学習 service/ClusterIP
これまなんとなく雰囲気でサービス・ロードバランサを作っていた。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