Service 的作用

为什么要使用 service

首先需要理解一下集群里面的一些 IP 分类:

  • nodeIP: 集群当中会有许多的 node,每一个 node 都会有自己的 IP;包括 master 的 IP,因为 master 也是 node
  • podIP: 每一个 node 上面会有多个 pod,每一个 pod 也会有自己的 IP;
  • serviceIP: 是 pods 节点上层的一层抽象,这个 IP 是一个虚拟 IP,可以访问,但是 ping 不通

一个 node 上面的 pods 会被删除,新增,导致 IP 会存在变化,使用 service 可以进行统一封装,类似 nginx 做一层代理,service 做为统一的入口访问,可以做负载和转发,所以就有了上面的 serviceIP;

Service 的模式

  • NodePod:可以指定在集群内访问,同时也可以指定集群外的访问;只有一个局限,那便是端口号有一个范围 30000~32767,可以通过 http://<KUBERNETES_MASTER>:32600 进行访问
➜  k8s kubectl get svc -n idcos -o wide
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE   SELECTOR
cloud-act2-doc-srv   NodePort    10.233.33.230   <none>        80:32600/TCP   4s    app=cloud-act2-doc
  • ClusterIP:默认的 svc type,只能在集群内访问,会自动创建 endpoints 进行关联
➜  k8s kubectl get svc -n idcos -o wide
NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
cloud-act2-doc-srv   ClusterIP   10.233.43.198   <none>        80/TCP    9s    app=cloud-act2-doc
➜  k8s kubectl get endpoints -n idcos -o wide
NAME                 ENDPOINTS           AGE
cloud-act2-doc-srv   10.233.105.49:80    51s
  • LoadBalancer:会分配给 svc 一个虚拟的 CLUSTER_IP,同时也会暴露一个 NodePort 供外部进行访问;
➜  k8s kubectl get svc -n idcos
NAME                 TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
cloud-act2-doc-srv   LoadBalancer   10.233.38.230   <pending>     80:32077/TCP   8s

Headless Service

无 IP 的那些 service 称为 Headless Service ,用于那些不需要服务发现的 svc

参考