背景:
有时候我们创建的服务不想走 负载均衡,想直接通过 pod-ip 链接后端, 怎么办呢, 使用headless service接可以解决。
1.什么是headless service
headless service 是将service的发布文件中的clusterip=none ,不让其获取clusterip , DNS解析的时候直接走pod
2.实验
部署pod
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
部署常规service
apiVersion: v1
kind: Service
metadata:
name: nginx-service
labels:
app: nginx
spec:
ports:
- port: 88
targetPort: 80
selector:
app: nginx
type: NodePort
查看 部署的service
10.97.134.133是 clusterip
部署headlessservice
apiVersion: v1
kind: Service
metadata:
name: headless-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
clusterIP: None
查看详情
测试服务解析
service 的 FQDN: nginx-service.default.svc.cluster.local
headless service的FQDN: headless-service.default.svc.cluster.local
我们在容器里面ping FQDN , service解析出的地址是clusterip
headless service 解析出来的地址是 pod ip
所以在微服务相关场景 如果需要直通pod的时候 我们就可以使用headless service 绕过 k8s的转发机制,直接访问pod了。
参考资料
https://kubernetes.io/docs/concepts/services-networking/service/#headless-services