从 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
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