什么是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方式还有两种具体的处理方法:
- Normal Service。根据访问的DNS记录获取到Service的VIP,然后再按照VIP的流程处理。
- 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: nginxHeadless 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地址。