这是我的 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 已打开,并将接收该端口上的所有外部流量并将其转发到登录服务。
EDIT:
nodePort 是集群外部的客户端将“看到”的端口。 nodePort 通过 kube-proxy 在集群中的每个节点上打开。借助 iptables magic,Kubernetes (k8s) 将流量从该端口路由到匹配的服务 Pod(即使该 Pod 运行在完全不同的节点上)。
nodePort 是唯一的,因此 2 个不同的服务不能分配相同的 nodePort。一旦声明,k8s master 就会为该服务保留该 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 https://medium.com/google-cloud/kubernetes-nodeport-vs-loadbalancer-vs-ingress-when-should-i-use-what-922f010849e0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)