【问题标题】:Can't ping other pods by hostname on minikube无法通过 minikube 上的主机名 ping 其他 pod
【发布时间】:2019-03-10 17:06:24
【问题描述】:

我有一个有两个副本的 statefulSet。 它的无头服务名称是 "gov-svc" 这是->

  1. .metadata.name: sts
  2. .metadata.namespace:默认
  3. .spec.serviceName: gov-svc
  4. .spec.template.spec.subdomain: gov-svc
  5. .spec.replicas: 2

在运行 statefulSet 之前

kubectl get pods --all-namespaces
NAMESPACE     NAME                                    READY   STATUS             RESTARTS   AGE
kube-system   coredns-99b9bb8bd-qdnsb                 1/1     Running            0          4h
kube-system   etcd-minikube                           1/1     Running            0          4h
kube-system   kube-addon-manager-minikube             1/1     Running            0          4h
kube-system   kube-apiserver-minikube                 1/1     Running            0          4h
kube-system   kube-controller-manager-minikube        1/1     Running            1          4h
kube-system   kube-proxy-b9np6                        1/1     Running            0          4h
kube-system   kube-scheduler-minikube                 1/1     Running            0          4h
kube-system   kubernetes-dashboard-7db4dc666b-bsk8k   1/1     Running            0          4h
kube-system   storage-provisioner

在运行这个 statefulSet 的两个 pod 之后,来自 pod sts-0ping 结果:

$ ping  sts-0.gov-svc.default.svc.cluster.local
PING sts-0.gov-svc.default.svc.cluster.local (172.17.0.11): 56 data bytes
64 bytes from 172.17.0.11: seq=0 ttl=64 time=0.051 ms
64 bytes from 172.17.0.11: seq=1 ttl=64 time=0.444 ms
^C
--- redis-cluster-exp-0-0.redis-cluster-exp.default.svc.cluster.local ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.051/0.247/0.444 ms

但是当我尝试从sts-0ping sts-1 时,它说:

$ ping sts-1.gov-svc.default.svc.cluster.local
ping: bad address 'sts-1.gov-svc.default.svc.cluster.local'

我需要通过主机名成功 ping 其他 pod。我该怎么做?

【问题讨论】:

  • 你的 kubernetes 版本是什么
  • 我的 kubernetes 版本:1.11.3
  • @ShudiptaSharma 嗨。我知道,这个问题已经有一年了,但我今天也面临这个问题。你能告诉我,你是怎么解决这个问题的?这真的很有帮助。我的 statefulset pod 无法使用 fqdn 相互 ping,但通过 IP ping 正在发生。我也有无头服务,它正在工作。
  • @Nish 您的无头服务是否有任何选择器来选择 pod?或者它只是一个将.spec.clusterIP 设置为"None" 的服务,用作Statefulset 的要求?
  • @ShudiptaSharma,以下是我的情况。我有三个有状态的 pod,用于三个不同的任务,每个有三个正常的服务。这些服务具有选择器来选择相应的 pod。除了这 3 个服务之外,还有一个无头服务,我在 3 个 staefulset pod 下都给出了参考,使用 serviceName 属性。另一件事是我使用了一个选择器,它在所有 pod 和无头服务中都很常见tier: backend

标签: kubernetes minikube kube-dns kubernetes-pod kubernetes-statefulset


【解决方案1】:

您需要创建headless service 才能在StatefulSet 内相互ping 副本。比如:

apiVersion: v1
kind: Service
metadata:
  name: gov-svc-headless
  labels:
    your_label: your_value
spec:
  selector:
    your_label: your_value
  ports:
  - port: your_port
    name: transport
    protocol: TCP
  clusterIP: None <---

注意:

使用选择器对于定义选择器的无头服务, endpoints 控制器在 API 中创建 Endpoints 记录,并且 修改 DNS 配置以返回 A 记录(地址) 直接指向支持服务的 Pod。

注意:

或没有定义选择器的无头服务,端点 控制器不创建端点记录。但是,DNS 系统 查找并配置:

外部名称类型服务的 CNAME 记录。任何记录 与服务共享名称的端点,适用于所有其他类型。

更多信息:https://kubernetes.io/docs/concepts/services-networking/service/#headless-services

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多