如何使用kubernetes NodePort从外部访问服务?
我已使用以下配置设置了NodePort服务: wordpress服务.yaml如何使用kubernetes NodePort从外部访问服务?,kubernetes,Kubernetes,我已使用以下配置设置了NodePort服务: wordpress服务.yaml apiVersion: v1 kind: Service metadata: labels: app: wordpress name: wordpress spec: type: NodePort ports: - port: 80 targetPort: 80 protocol: TCP selector: app: wordpress 这足以从
apiVersion: v1
kind: Service
metadata:
labels:
app: wordpress
name: wordpress
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
app: wordpress
这足以从外部访问该服务吗?如果足够,我现在如何访问该服务?我需要什么样的详细信息?我如何确定它们?例如节点IP。这样定义的服务被指定为高端口号,并在该端口上的所有群集节点上公开(可能类似3xxx)。如果不知道集群是如何配置的,很难告诉其他人
kubectl get nodes
应该会让您了解一些有关节点的知识
尽管我假设您希望将服务公开给外部世界。从长远来看,我建议您熟悉LoadBalancer类型的服务和Ingress/IngressController,当您将服务定义为type
NodeIP
时,集群中的每个节点都将代理该端口到您的服务。如果可以从Kubernetes群集外部访问节点,则应该能够访问nodeIP:nodePort
处的服务
要确定特定节点的nodeIP
,可以使用kubectl get no-o yaml
或kubectl description no
。status.Addresses
字段将是感兴趣的。通常,您会在那里看到像HostName
、ExternalIP
和InternalIP
这样的字段
要确定服务的nodePort
,您可以使用kubectl get svc wordpress-o yaml
或kubectl descripe svc wordpress
。spec.ports.nodePort是您需要的端口
对于GCE上的Kubernetes:
关于NodePort类型的服务,我们有同样的问题:我们如何从自己的主机访问节点端口服务
@ivan.sim的答案(nodeIp:nodePort)是正确的,但是,除非您在VPC网络控制台上添加防火墙入口(入站到谷歌云)流量规则,允许您的主机访问您的计算节点,否则您仍然无法访问您的服务
上述规则是危险的,只能在开发过程中使用
您可以使用googlecloud控制台或通过运行后续的kubectl命令来查找节点端口,以查找运行您的pod的节点,其中包含您的容器。i、 ekubectl获取pod,kubectl描述pod您的pod名称,kubectl描述运行您的pod的节点
。status.addresses有您的ExternalIP
如果我们只需使用标签/选择器
和几行命令就可以提取pod中运行容器的节点ip,那就太好了。下面是我们所做的,在本例中,我们的选择器是应用程序:您的标签
:
$ nodename=$(kubectl get pods -o jsonpath='{.items[?(@.metadata.labels.app=="your-label")].spec.nodeName}')
$ nodeIp=$(kubectl get nodes -o jsonpath='{.items[?(@.metadata.name=="'$(echo $nodename)'")].status.addresses[?(@.type=="ExternalIP")].address}')
$ echo nodeIp
注意:我们使用json路径提取所需信息,有关json路径的更多信息,请参阅:
您当然可以将其转换为一个脚本,以标签/选择器作为输入,并输出运行容器的节点的外部ip
要获取节点端口,只需键入:
$ kubectl get services
在端口列下,您将看到类似tagetPort:nodePort的内容。这个节点端口就是你想要的
nodeIp:nodePort
是的,我想从外部访问它。不幸的是,这不适用于负载平衡器服务。为什么它不适用于LB服务?我的“结束游戏”方法是使用LB服务类型部署向世界公开的Ingress Controller(通常获得自己的FQDN,您可以将其用作您想要的内容的CNAME目标),然后在集群上使用Ingress公开任何内容,可以在IngressControllerApologies的LB服务上找到。我的意思是我的用例需要NodePort而不是LoadBalancer。由于LB服务是NodePort服务,我假设您在k8s设置中没有对LB的工作支持。要在低标准端口上公开内容,您可能需要使用hostNetwork:true
或hostPort
集运行IC或其他公开服务的方式(即)。但是,如果不深入了解您的设置/使用情况,就很难提出建议LoadBalancer假定您的流量是HTTP或他们支持的其他无状态协议。如果您在TCP之上使用有状态协议,那么负载平衡器将无法工作。我甚至不知道如果你尝试这样做会发生什么。对于测试和开发来说,这应该是好的。运行kubectl get svc
wordpress,您可以看到节点端口号。然后您可以使用NodeIP:NodePort访问该服务