Kubernetes集群未公开外部IP作为<节点>。

5

这是我的 service.yaml 代码:

kind: Service
apiVersion: v1
metadata:
  name: login
spec:
  selector:
    app: login
  ports:
  - protocol: TCP
    name: http
    port: 5555
    targetPort: login-http
  type: NodePort

我将服务类型写成了:
type: NodePort

但是当我按下面的命令时,它并没有显示外部IP作为“节点”:
'kubectl get svc'

这里是输出:

NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.100.0.1     <none>        443/TCP          7h
login        NodePort    10.100.70.98   <none>        5555:32436/TCP   5m

请帮我理解这个错误。

1个回答

8

你的服务没有问题,你应该可以使用 <your_vm_ip>:32436 访问它。

NodePort,顾名思义,在所有节点(VM)上打开一个特定的端口,任何发送到该端口的流量都会被转发到服务。因此,在你的节点上,端口32436是开放的,并且将接收所有外部流量并将其转发到登录服务。

编辑:

nodePort是集群外客户端"看到"的端口。通过kube-proxy在您的集群中的每个节点上打开nodePort。通过iptables魔法,Kubernetes (k8s)将流量从该端口路由到匹配的服务pod(即使该pod在完全不同的节点上运行)。

nodePort是唯一的,因此不能将相同的nodePort分配给2个不同的服务。一旦声明,k8s master就为该服务保留了该nodePort。然后,在每个节点(master和worker)上打开nodePort-即使那些不运行该服务的pod的节点-k8s iptables magic负责路由。这样,您可以从k8s集群外部的任何节点的nodePort请求您的服务,而不必担心是否在那里调度了一个pod。

请参阅以下文章,它展示了不同的暴露服务的方式:

https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0


你能用简单的语言详细解释一下吗? - aac
修改了答案。希望能有所帮助。 :) - Prafull Ladha
是的,已经明白了。谢谢 :) - aac

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