Kubernetes集群未将外部IP公开为<nodes>

时间:2018-11-17 06:04:15

标签: docker kubernetes cluster-computing devops aws-eks

这是我的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显示为'nodes':

'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 个答案:

答案 0 :(得分:7)

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

顾名思义,

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

编辑:

nodePort是集群外部的客户端将“看到”的端口。 nodePort通过kube-proxy在集群中的每个节点上打开。然后使用iptables magic Kubernetes(k8s)将流量从该端口路由到匹配的服务Pod(即使该Pod运行在完全不同的节点上)。

nodePort是唯一的,因此2个不同的服务不能分配相同的nodePort。声明后,k8s主服务器将为该服务保留该nodePort。然后,在每个节点(主节点和工作节点)上打开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