什么是 headless service
headless service 是配合 statefulset 控制器使用的,就是一个没有 ip 地址的普通 service
yml 配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| apiVersion: v1 kind: Service metadata: name: zk-hs labels: app: zookeeper spec: ports: - name: tcp-client protocol: TCP port: 2181 targetPort: 2181 - name: tcp-follower port: 2888 targetPort: 2888 - name: tcp-election port: 3888 targetPort: 3888 selector: app: zookeeper clusterIP: None type: ClusterIP
|
在 statefulset 里指定 service 名字:
如果这里不设置 serviceName
的话,service 还是可以通的,但是 pod 就没有固定的域名了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| apiVersion: apps/v1 kind: StatefulSet metadata: name: zookeeper labels: app: zookeeper spec: replicas: 3 selector: matchLabels: app: zookeeper serviceName: zk-hs template: metadata: name: zookeeper labels: app: zookeeper
|
用处
比如说一个 statefulset 控制器运行的 zookeeper 集群,就可以在配置文件中配置:
1 2 3 4 5 6 7 8 9 10
| env: - name: ZOO_ENABLE_AUTH value: "no" - name: ALLOW_ANONYMOUS_LOGIN value: "yes" - name: ZOO_SERVERS value: > zookeeper-0.zk-hs.default.svc.cluster.local:2888:3888 zookeeper-1.zk-hs.default.svc.cluster.local:2888:3888 zookeeper-2.zk-hs.default.svc.cluster.local:2888:3888
|
其中,这 3 个 pod 的域名是不会变的。
一些测试
ping 的效果
10.1.0.119、10.1.0.137、10.1.0.124 对应的正好是 Pod IP
使用 dig 来解析
反向解析 pod ip
headless service
的 pod ip
可以反向解析,并且解析到的域名是个固定值(不会随着 pod 销毁重建而变化)
看看另一个服务,创建了两个 Service,一个普通的 service,一个 headless service,那么这个 pod 的域名是什么: