tjtjtjのメモ

自分のためのメモです

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 allk8s の 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