Kubernetes 集群未将外部 IP 公开为 <nodes>
Kubernetes cluster is not exposing external ip as <nodes>
这是我的 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
请帮助我理解错误。
您的服务没有问题,您应该可以使用 <your_vm_ip>:32436
访问它。
NodePort,顾名思义,在所有节点(虚拟机)上打开一个特定的端口,任何发送到这个端口的流量都会被转发到服务。因此,在您的节点上,端口 32436 已打开,并将在此端口上接收所有外部流量并将其转发到登录服务。
编辑:
nodePort 是集群外的客户端将 "see" 的端口。 nodePort 通过 kube-proxy 在集群中的每个节点上打开。使用 iptables magic Kubernetes (k8s) 然后将流量从该端口路由到匹配的服务 pod(即使该 pod 运行ning 在一个完全不同的节点上)。
nodePort 是唯一的,因此 2 个不同的服务不能分配相同的 nodePort。声明后,k8s master 会为该服务保留该节点端口。然后在每个节点(master 和 worker)上打开 nodePort——还有那些没有 运行 该服务的 pod 的节点——k8s iptables magic 负责路由。这样你就可以从你的 k8s 集群外部向 nodePort 上的任何节点发出你的服务请求,而不用担心 pod 是否被安排在那里。
请参阅以下文章,它展示了公开服务的不同方式:
这是我的 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
请帮助我理解错误。
您的服务没有问题,您应该可以使用 <your_vm_ip>:32436
访问它。
NodePort,顾名思义,在所有节点(虚拟机)上打开一个特定的端口,任何发送到这个端口的流量都会被转发到服务。因此,在您的节点上,端口 32436 已打开,并将在此端口上接收所有外部流量并将其转发到登录服务。
编辑:
nodePort 是集群外的客户端将 "see" 的端口。 nodePort 通过 kube-proxy 在集群中的每个节点上打开。使用 iptables magic Kubernetes (k8s) 然后将流量从该端口路由到匹配的服务 pod(即使该 pod 运行ning 在一个完全不同的节点上)。
nodePort 是唯一的,因此 2 个不同的服务不能分配相同的 nodePort。声明后,k8s master 会为该服务保留该节点端口。然后在每个节点(master 和 worker)上打开 nodePort——还有那些没有 运行 该服务的 pod 的节点——k8s iptables magic 负责路由。这样你就可以从你的 k8s 集群外部向 nodePort 上的任何节点发出你的服务请求,而不用担心 pod 是否被安排在那里。
请参阅以下文章,它展示了公开服务的不同方式: