docker - Kubernetes 集群不会将外部 ip 公开为 <nodes>

标签 docker kubernetes cluster-computing devops amazon-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 显示为“节点”:
'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

请帮助我理解错误。

最佳答案

您的服务没有问题,您应该可以使用 <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

关于docker - Kubernetes 集群不会将外部 ip 公开为 <nodes>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53348677/

相关文章:

mysql - 如何使用 Entity Framework Core 正确运行迁移和播种 docker MySql DB

java - JKS 文件是否独立于创建它的计算机?

shell - 同时输入两个字母会导致 docker exec -it shell 突然退出

kubernetes - 如果另一个 Pod 重新启动,如何使部署重新启动

javascript - 将集群用于 Node.js Rest api

ubuntu - 为什么 Jenkins 不存储数据?

docker - 将 docker 容器添加到正在运行的 OpenShift pod

kubernetes - cluster-admin 和 admin Kubernetes ClusterRoles 之间的区别

hadoop - 运行 Hadoop wordcount 示例时找不到作业 token 文件

node.js - NodeJS集群全局变量