如何使用kubernetes NodePort从外部访问服务?

如何使用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 这足以从

我已使用以下配置设置了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

这足以从外部访问该服务吗?如果足够,我现在如何访问该服务?我需要什么样的详细信息?我如何确定它们?例如节点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、 e
kubectl获取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访问该服务