我部署了一堆服务,所有这些我都遇到了同样的问题:定义的端口(例如 80
和 443
)不可访问,但无论如何自动分配节点端口。
以下服务定义是从第一个服务导出的:
{
"kind": "Service",
"apiVersion": "v1",
"metadata": {
"name": "traefik",
"namespace": "kube-system",
"selfLink": "/api/v1/namespaces/kube-system/services/traefik",
"uid": "70df3a55-422c-11e8-b7c0-b827eb28c626",
"resourceVersion": "1531399",
"creationTimestamp": "2018-04-17T10:45:27Z",
"labels": {
"app": "traefik",
"chart": "traefik-1.28.1",
"heritage": "Tiller",
"release": "traefik"
}
},
"spec": {
"ports": [
{
"name": "http",
"protocol": "TCP",
"port": 80,
"targetPort": "http",
"nodePort": 31822
},
{
"name": "https",
"protocol": "TCP",
"port": 443,
"targetPort": "httpn",
"nodePort": 32638
}
],
"selector": {
"app": "traefik",
"release": "traefik"
},
"clusterIP": "10.109.80.108",
"type": "LoadBalancer",
"sessionAffinity": "None",
"externalTrafficPolicy": "Cluster"
},
"status": {
"loadBalancer": {}
}
}
知道如何使用 http://node-ip-addr:80
访问此服务以及使用 http://node-ip-addr:443
?
最佳答案
您为服务定义的端口(在本例中为 443 和 80)只能从集群内访问。您可以尝试使用 curl http://traefik.kube-system.svc.cluster.local 从另一个 pod(例如运行繁忙的盒子)调用您的服务或 http://。
如果您想从集群外部访问您的服务(这是您的用例,您需要将您的服务公开为以下之一
- 节点端口
- 负载均衡器
- 外部名称
您选择了 NodePort,这意味着集群的每个节点都会在特定端口上监听请求(在您的示例中,31822 用于 http,32638 用于 https),然后这些请求将被委托(delegate)给您的服务。这就是为什么 http://node-ip-addr:31822应该适用于您提供的服务配置。
要根据您的要求调整您的配置,您必须设置“nodePort”:80,这将在每个集群节点上保留端口 80 以委托(delegate)给您服务。这通常不是最好的主意。您宁愿保留当前定义的端口,并在集群前面添加代理服务器或负载均衡器,然后监听端口 80 并将其中一个节点转发到端口 31822 以供您使用。
有关发布服务的更多信息,请参阅 Kubernetes docs 上的文档
关于linux - Kubernetes 节点无法在端口 80 和 443 上访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49876141/