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

时间:2017-08-21 16:59:46

标签: kubernetes

我使用以下配置设置了NodePort服务:

的wordpress-service.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。

3 个答案:

答案 0 :(得分:3)

  

对于GCE上的Kubernetes:

我们对NodePort类型的服务有同样的疑问:我们如何从我们自己的主机访问节点端口服务?

@ ivan.sim的答案(nodeIp:nodePort)已开启,但除非您添加防火墙入口(入站到Google云)流量规则,否则您仍然无法访问您的服务在VPC网络控制台上,以允许您的主机能够访问您的计算节点

enter image description here 上述规则很危险,只应在开发过程中使用

您可以使用Google Cloud控制台或运行后续kubectl命令找到节点端口,以找出运行包含容器的pod的节点。即kubectl get pods , kubectl describe pod your-pod-name, kubectl describe node node-that-runs-you-pod .status.addresses有你的ExternalIP

如果我们只使用label/selector和几行命令来提取在pod中运行我们容器的节点ip就会很棒,所以这就是我们所做的,在这种情况下我们的选择器是{{ 1}}:

app: your-label

通知:我们使用json路径提取我们想要的信息,有关json路径的更多信息,请参阅:json path

你当然可以将它变成一个脚本,它将标签/选择器作为输入并输出运行容器的节点的外部ip!

要获取nodeport,只需输入:

$ 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

PORT(S)列下,您会看到类似tagetPort:nodePort的内容。这个nodeport就是你想要的。

$ kubectl get services

答案 1 :(得分:2)

像这样定义的服务被分配了一个高端口号,并暴露在该端口上的所有集群节点上(可能类似于3xxxx)。如果没有正确了解群集的配置方式,很难告诉其他人。 kubectl get nodes应该为您提供有关您的节点的一些知识。

虽然我假设您想要将服务公开给外界。从长远来看,我建议熟悉LoadBalancer类型的服务和Ingress / IngressController

答案 2 :(得分:2)

当您将服务定义为NodeIP类型时,群集中的每个节点都会将该端口代理到您的服务。如果您可以从Kubernetes群集外部访问节点,则应该能够在nodeIP:nodePort访问该服务。

要确定特定节点的nodeIP,您可以使用kubectl get no <node> -o yamlkubectl describe no <node>status.Addresses字段将是您感兴趣的。通常,您会看到HostNameExternalIPInternalIP等字段。

要确定服务的nodePort,您可以使用kubectl get svc wordpress -o yamlkubectl describe svc wordpressspec.ports.nodePort是您需要的端口。