无法使用 fqdn 通过无头服务访问 statefulset pod
Not able to access statefulset pod via headless service using fqdn
我的 k8 设置如下所示
ingress -> headless service (k8 service with clusterIp: none) -> statefulsets ( 2pods)
Fqdn 看起来像这样:
nslookup my-service
Server: 100.4.0.10
Address: 100.4.0.10#53
Name: my-service.my-namespace.svc.cluster.local
Address: 100.2.2.8
Name: my-service.my-namespace.svc.cluster.local
Address: 100.1.4.2
我正在尝试使用以下 fqdn 通过服务直接访问其中一个 pod,但无法这样做。
curl -I my-pod-0.my-service.my-namespace.svc.cluster.local:8222
curl: (6) Could not resolve host: my-pod-0.my-service.my-namespace.svc.cluster.local
如果我尝试直接访问该服务,那么它会正常工作(作为负载均衡器)
curl -I my-service.my-namespace.svc.cluster.local:8222
HTTP/1.1 200 OK
Date: Sat, 31 Jul 2021 21:24:42 GMT
Content-Length: 656
如果我尝试使用它的集群 ip 直接访问 pod,它也能正常工作
curl -I 100.2.2.8:8222
HTTP/1.1 200 OK
Date: Sat, 31 Jul 2021 21:29:22 GMT
Content-Length: 656
Content-Type: text/html; charset=utf-8
但我的用例要求我能够使用 fqdn 即 my-pod-0.my-service.my-namespace.svc.cluster.local
访问 statefulset pod。我在这里错过了什么?
名为 foo
的状态集示例,图像 nginx
:
k get statefulsets.apps
NAME READY AGE
foo 3/3 8m55s
此有状态集在 pods(foo-0,foo-1,foo-2
) 之后创建:
k get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 1 3h47m 10.1.198.71 ps-master <none> <none>
foo-0 1/1 Running 0 12m 10.1.198.121 ps-master <none> <none>
foo-1 1/1 Running 0 12m 10.1.198.77 ps-master <none> <none>
foo-2 1/1 Running 0 12m 10.1.198.111 ps-master <none> <none>
现在创建一个无头服务(clusterIP is none
)如下:(确保使用正确的选择器与你的statefulset相同)
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: foo
spec:
type: ClusterIP
clusterIP: None
ports:
- port: 80
name: web
selector:
app: foo
现在,执行 nslookup
以查看适用于该服务的 dns
分辨率。(可选步骤)
k exec -it busybox -- nslookup nginx.default.svc.cluster.local
Server: 10.152.183.10
Address 1: 10.152.183.10 kube-dns.kube-system.svc.cluster.local
Name: nginx.default.svc.cluster.local
Address 1: 10.1.198.77 foo-1.nginx.default.svc.cluster.local
Address 2: 10.1.198.111 foo-2.nginx.default.svc.cluster.local
Address 3: 10.1.198.121 foo-0.nginx.default.svc.cluster.local
现在验证每个 pod 的单独分辨率是否有效:
k exec -it busybox -- nslookup foo-1.nginx.default.svc.cluster.local
Server: 10.152.183.10
Address 1: 10.152.183.10 kube-dns.kube-system.svc.cluster.local
Name: foo-1.nginx.default.svc.cluster.local
Address 1: 10.1.198.77 foo-1.nginx.default.svc.cluster.local
更多信息:Here
注意:在这种情况下,OP 对 headless
服务和 statefulset
的映射不正确,可以使用以下命令进行验证:
k get statefulsets.apps foo -o jsonpath="{.spec.serviceName}{'\n'}"
nignx
确保映射。
原回答没有说明 OP 是如何解决这个问题的,问题出在 serviceName
属性 statefulset 实现下。
我的 k8 设置如下所示
ingress -> headless service (k8 service with clusterIp: none) -> statefulsets ( 2pods)
Fqdn 看起来像这样:
nslookup my-service
Server: 100.4.0.10
Address: 100.4.0.10#53
Name: my-service.my-namespace.svc.cluster.local
Address: 100.2.2.8
Name: my-service.my-namespace.svc.cluster.local
Address: 100.1.4.2
我正在尝试使用以下 fqdn 通过服务直接访问其中一个 pod,但无法这样做。
curl -I my-pod-0.my-service.my-namespace.svc.cluster.local:8222
curl: (6) Could not resolve host: my-pod-0.my-service.my-namespace.svc.cluster.local
如果我尝试直接访问该服务,那么它会正常工作(作为负载均衡器)
curl -I my-service.my-namespace.svc.cluster.local:8222
HTTP/1.1 200 OK
Date: Sat, 31 Jul 2021 21:24:42 GMT
Content-Length: 656
如果我尝试使用它的集群 ip 直接访问 pod,它也能正常工作
curl -I 100.2.2.8:8222
HTTP/1.1 200 OK
Date: Sat, 31 Jul 2021 21:29:22 GMT
Content-Length: 656
Content-Type: text/html; charset=utf-8
但我的用例要求我能够使用 fqdn 即 my-pod-0.my-service.my-namespace.svc.cluster.local
访问 statefulset pod。我在这里错过了什么?
名为 foo
的状态集示例,图像 nginx
:
k get statefulsets.apps
NAME READY AGE
foo 3/3 8m55s
此有状态集在 pods(foo-0,foo-1,foo-2
) 之后创建:
k get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
busybox 1/1 Running 1 3h47m 10.1.198.71 ps-master <none> <none>
foo-0 1/1 Running 0 12m 10.1.198.121 ps-master <none> <none>
foo-1 1/1 Running 0 12m 10.1.198.77 ps-master <none> <none>
foo-2 1/1 Running 0 12m 10.1.198.111 ps-master <none> <none>
现在创建一个无头服务(clusterIP is none
)如下:(确保使用正确的选择器与你的statefulset相同)
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: foo
spec:
type: ClusterIP
clusterIP: None
ports:
- port: 80
name: web
selector:
app: foo
现在,执行 nslookup
以查看适用于该服务的 dns
分辨率。(可选步骤)
k exec -it busybox -- nslookup nginx.default.svc.cluster.local
Server: 10.152.183.10
Address 1: 10.152.183.10 kube-dns.kube-system.svc.cluster.local
Name: nginx.default.svc.cluster.local
Address 1: 10.1.198.77 foo-1.nginx.default.svc.cluster.local
Address 2: 10.1.198.111 foo-2.nginx.default.svc.cluster.local
Address 3: 10.1.198.121 foo-0.nginx.default.svc.cluster.local
现在验证每个 pod 的单独分辨率是否有效:
k exec -it busybox -- nslookup foo-1.nginx.default.svc.cluster.local
Server: 10.152.183.10
Address 1: 10.152.183.10 kube-dns.kube-system.svc.cluster.local
Name: foo-1.nginx.default.svc.cluster.local
Address 1: 10.1.198.77 foo-1.nginx.default.svc.cluster.local
更多信息:Here
注意:在这种情况下,OP 对 headless
服务和 statefulset
的映射不正确,可以使用以下命令进行验证:
k get statefulsets.apps foo -o jsonpath="{.spec.serviceName}{'\n'}"
nignx
确保映射。
原回答没有说明 OP 是如何解决这个问题的,问题出在 serviceName
属性 statefulset 实现下。