【问题标题】:Kubernetes service discovery doesn't resolve service host on minikubeKubernetes 服务发现无法解析 minikube 上的服务主机
【发布时间】:2018-07-19 04:35:37
【问题描述】:

我正在尝试使用在 minikube 安装上运行的 k8s 运行两个服务。 所以我有服务FooBar,所以当我访问服务Foo时,它必须触发服务Bar来获取数据。

这里是Foo服务的部署配置 foo-deployment.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: foo-server
  labels:
    app: foo-server
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: foo-server
        serving: "true"
    spec:
      containers:
      - name: foo-server
        image: foo-container
        env:
        - name: BAR_SERVICE_URL
          value: http://bar-server:8081
        ports:
        - containerPort: 8080
          name: http

foo-svc.yaml:

apiVersion: v1
kind: Service
metadata:
  name: foo-server
  labels:
    app: foo-server
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 8080
    name: http
  selector:
    app: foo-server
    serving: "true"

BAR_SERVICE_URL evn 变量在Foo 内部使用,因此服务知道Bar 的主机。 这是Bar服务的服务配置 bar-svc.yaml:

apiVersion: v1
kind: Service
metadata:
  name: bar-server
  labels:
    app: bar-server
spec:
  type: NodePort
  ports:
  - port: 8081
    targetPort: 8081
    name: http
  selector:
    app: bar-server

bar-deployment.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: bar-server-v1
  labels:
    app: bar-server
    version: "1.0"
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: bar-server
        version: "1.0"
        serving: "true"
    spec:
      containers:
      - name: bar-server
        image: bar-container
        ports:
        - containerPort: 8081
          name: http

当我使用 minikube ip 和暴露的服务端口访问 Foo 服务时,我在 pod 日志中收到以下错误:

2018-02-08 14:32:25.875 ERROR 1 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://bar-server:8081/endpoint": bar-server; nested exception is java.net.UnknownHostException: bar-server] with root cause

java.net.UnknownHostException: bar-server

但是,我可以使用 minikube ip 和暴露的端口访问bar-server/endpoint http://192.168.99.100:31168/endpoint

看来我可以从集群外部访问FooBar 服务。但是Foo服务无法解析Bar服务主机,无法访问。

UPD:以下是一些包含故障排除细节的更新。

  • minikube 上启用kube-dns 插件。
  • 尝试从Foo pod 到wgetBar 服务端点。我可以通过bar-server 的IP 地址来实现,但bar-server:8081/endpoint 不行。
  • 尝试nslookup kubernetes.default.svc.cluster.local localhost 看起来不错。这是输出:

    服务器:127.0.0.1 地址一:127.0.0.1 localhost

  • dns pod 也已启动并运行。这是kubectl get pods -n=kube-system | grep -i dns的输出

    kube-dns-6777479f6b-vxd7m 3/3 运行 9 1d

【问题讨论】:

  • 嗨,Sergii,你能解决这个问题吗?我在自己的 Minikube 部署中遇到了类似的问题。
  • 与最新的 Minikube 和 Core DNS 有同样的问题
  • @alexvicegrab 我的情况是我没有做minikube delete就更新了minikube,所以通过删除minikube集群并重新启动它来修复它
  • 感谢您的快速回答!在我自己的情况下,在使用 Minikube 时,Peer 如何与 K8S 上的服务交互似乎存在一些问题。当我在云上使用真正的 K8S 集群时,同样的事情完全可以正常工作。

标签: dns kubernetes service-discovery minikube kube-dns


【解决方案1】:

Kubernetes 使用 DNS (kube-dns) 进行服务发现。如果 k8s 中的 DNS 工作正常,服务Foo 应该能够pingcurl 服务Bar,反之亦然。

检查kube-dns 是否工作的一种方法是查看以下命令是否在任何 pod 内工作:

nslookup kubernetes.default.svc.cluster.local localhost
nslookup kubernetes.default localhost

kube-dns pod 的健康状况可以在以下输出中检查:

kubectl get pods -n=kube-system | grep -i dns

【讨论】:

  • 感谢您提供如何解决问题的建议。我已经用这些命令的结果更新了这个问题。 dnspod 已启动并运行,但 bar-server 主机未解析。
  • @SergiiBishyr 很高兴为您提供帮助,如果您认为我的回答有用,请点赞!
  • 它很有用,帮助我调试问题。我确实赞成:)
  • nslookup 对我来说失败了,但 dig kubernetes.default.svc.cluster.local 有效
【解决方案2】:

尝试环境变量 BAR_SERVER_SERVICE_HOST。不要注入,kubernetes 为同一个命名空间内的服务注入它

在此处了解服务发现选项: https://kubernetes.io/docs/concepts/services-networking/service/#discovering-services

【讨论】:

  • 谢谢!这是使用k8s 进行服务发现的正确方法吗?
  • 您的方法是一种方法。但也有一种 DNS 方法,这是我想要实现的。但看起来 DNS 查找不起作用。 minikube 上的 kube-dns 插件是 enabled
猜你喜欢
  • 1970-01-01
  • 2019-06-06
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多