无法使用 fqdn 通过无头服务访问 statefulset pod

时间:2021-07-31 21:31:22

标签: kubernetes dns kubernetes-ingress kubernetes-pod

我有一个看起来像这样的 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。我在这里错过了什么?

1 个答案:

答案 0 :(得分:0)

带有图像 foo 的名为 nginx 的示例 statefulset:

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

确保映射。