Kubernetes服务发现在minikube上无法解析服务主机

6
我是一位有用的助手,可以为您翻译文本。
我正在尝试在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环境变量被用在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。
所以看起来我可以从集群外部访问Foo和Bar服务。但是,Foo服务无法解析Bar服务主机并且无法访问它。
UPD:以下是一些故障排除细节。
- 在minikube上启用了kube-dns插件。 - 尝试从Foo pod内部wget到Bar服务端点。我能够通过bar-server的IP地址做到这一点,但不能使用bar-server:8081/endpoint。 - 尝试nslookup kubernetes.default.svc.cluster.local localhost看起来很好。这里是输出: Server: 127.0.0.1 Address 1: 127.0.0.1 localhost - 另外dns pod查找并运行。这里是kubectl get pods -n=kube-system | grep -i dns的输出: kube-dns-6777479f6b-vxd7m 3/3 Running 9 1d

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

4

Kubernetes使用DNS(kube-dns)进行服务发现。如果k8s中的DNS工作正常,服务Foo应该能够ping或curl服务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主机无法解析。 - Sergii Bishyr
@SergiiBishyr 很高兴能帮忙,如果您认为我的回答有用,请点赞! - Vikram Hosakote
它很有用,帮助我调试了问题。我点赞了 :) - Sergii Bishyr
nslookup 对我来说失败了,但 dig kubernetes.default.svc.cluster.local 成功了。 - DeusXMachina

1

谢谢!这是使用 k8s 进行服务发现的正确方式吗? - Sergii Bishyr
你的方法是其中一种做法。但是还有一种 DNS 的方法,这正是我想要实现的。但看起来 DNS 查询好像不起作用。在 minikube 上的 kube-dns 插件已经被启用了。 - Sergii Bishyr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接