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