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

时间:2018-02-08 14:54:23

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

我正在尝试使用在minikube安装上运行的k8运行两个服务。 所以我有服务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窗格到wget的旁边到Bar服务端点尝试。我可以通过bar-server的IP地址进行,但不能使用bar-server:8081/endpoint
  • 尝试nslookup kubernetes.default.svc.cluster.local localhost看起来不错。这是ouptput:

    服务器:127.0.0.1 地址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

2 个答案:

答案 0 :(得分:3)

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

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

nslookup kubernetes.default.svc.cluster.local localhost
nslookup kubernetes.default localhost
可以在输出中检查

kube-dns pod的运行状况:

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

答案 1 :(得分:1)

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

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