从 Service 访问 pod localhost

Access pod localhost from Service

Kubernetes 新手。

我在 Kubernetes 实例上部署了私有 dockerhub 映像。当我执行到 pod 时,我可以 运行 以下内容,所以我知道我的 docker 图像是 运行ning:

root@private-reg:/# curl 127.0.0.1:8085
Hello world!root@private-reg:/# 

从仪表板我可以看到我的服务有一个以端口 8085 结尾的外部端点。当我尝试加载它时我得到 404。我的服务 YAML 如下:

{
  "kind": "Service",
  "apiVersion": "v1",
  "metadata": {
    "name": "test",
    "namespace": "default",
    "selfLink": "/api/v1/namespaces/default/services/test",
    "uid": "a1a2ae23-339b-11e9-a3db-ae0f8069b739",
    "resourceVersion": "3297377",
    "creationTimestamp": "2019-02-18T16:38:33Z",
    "labels": {
      "k8s-app": "test"
    }
  },
  "spec": {
    "ports": [
      {
        "name": "tcp-8085-8085-7vzsb",
        "protocol": "TCP",
        "port": 8085,
        "targetPort": 8085,
        "nodePort": 31859
      }
    ],
    "selector": {
      "k8s-app": "test"
    },
    "clusterIP": "******",
    "type": "LoadBalancer",
    "sessionAffinity": "None",
    "externalTrafficPolicy": "Cluster"
  },
  "status": {
    "loadBalancer": {
      "ingress": [
        {
          "ip": "******"
        }
      ]
    }
  }
}

任何人都可以指出正确的方向。

检查一下 kuberntes 上的服务,有几种类型:

https://kubernetes.io/docs/concepts/services-networking/service/

ClusterIP:仅在集群内部创建对服务的访问。

NodePort:通过节点上的给定端口访问服务。

LoadBalancer:可通过 LB 从外部访问服务。

我假设您 运行 使用 GKE。

推出的是什么服务?

以下命令的输出是什么

卷曲cluzterIP:8085

如果您收到 Hello world 消息,则表示该服务正在将流量正确路由到后端 pod。

curl HostIP:NODEPORT 也应该有效

很可能该服务未绑定到后端 pod。您是否在 pod 上定义了以下标签?

labels: {
      "k8s-app": "test"
    }

您没有提到您使用的是什么类型的负载均衡器或云提供商,但如果您的负载均衡器配置正确(您应该能够在 kube-controller-manager 日志中看到),那么您应该能够使用您在此处看到的内容访问您的服务:

"status": {
  "loadBalancer": {
    "ingress": [
      {
      "ip": "******"
      }
    ]
  }

然后你可以通过运行:

查看
$ curl <ip>:<whatever external port your lb is fronting>

如果像其他答案中描述的那样有效,这可能没有提供:

$ curl <clusterIP for svc>:8085

$ curl <NodeIP>:31859 # NodePort