什么是Service

首先,Service是k8s项目中用来将一组Pod暴露给外界访问的一种机制。例如一个Deployment由3个Pod,那么就可以定义Service,用户只要能够访问到这个Service,那么它就能访问到某个具体的Pod。

因为对于k8s集群来说,应用的部署在哪台机器上是k8s项目根据实际情况和设置决定的,并且这些应用会发生重启,扩容等,也就是说没有固定的对外IP地址,Serivce解决的就是这个问题,对外提供了一个固定的访问入口。

Service的两种工作方式

第一种就是使用VIP,即虚拟IP(Virtaul IP)。Service具有一个VIP,当访问Service的IP地址的时候,Service就会把请求转发到其所代理的某一个Pod上。

VIP的原理待补充 TODO

第二种方式就是Service的DNS方式。比如:这时候,只要我访问“my-svc.my-namespace.svc.cluster.local”这条 DNS 记录,就可以访问到名叫 my-svc 的 Service 所代理的某一个 Pod。DNS方式还有两种具体的处理方法:

  1. Normal Service。根据访问的DNS记录获取到Service的VIP,然后再按照VIP的流程处理。
  2. Headless Service不需要通过VIP,而是直接以DNS记录的方式解析出被代理的Pod的IP地址

Headless Service的设计的作用如何? 一个标准的Headless Service的YAML文件如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx

Headless Service仍然是一个标准Service的YAML文件,不过它的clusterIP字段是None,没有分配VIP。 这里是通过Label Selector机制来选择代理的对象的,这个Service会将所有携带了app=nginx标签的Pod代理起来

创建的Headless Service其所代理的Pod的IP地址将会绑定这样的DNS记录:

DNS格式

<pod-name>.<svc-name>.<namespace>.svc.cluster.local

因此,只要知道了一个Pod的名字以及它对应的Service的名字,那么就可以通过这条DNS记录访问到Pod的IP地址。


tags: 容器编排 k8s