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

Chr*_*ski 7 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
Run Code Online (Sandbox Code Playgroud)

这足以从外部访问该服务吗?如果可以,我现在如何访问该服务?我需要哪些详细信息 - 以及如何确定它们 - 例如节点 IP。

M.H*_*ris 7

对于 GCE 上的 Kubernetes:

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

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

在此输入图像描述 上述规则是危险的,只能在开发过程中使用

您可以使用 Google Cloud 控制台查找节点端口,也可以通过运行后续 kubectl 命令来查找运行包含容器的 pod 的节点。即kubectl get pods , kubectl describe pod your-pod-name, kubectl describe node node-that-runs-you-pod.status.addresses 有你的外部IP

label/selector如果我们能够仅使用一行和几行命令来提取在 pod 中运行容器的节点 ip,那就太好了,所以这就是我们所做的,在本例中我们的选择器是app: your-label

$ 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
Run Code Online (Sandbox Code Playgroud)

注意:我们使用 json 路径来提取我们想要的信息,有关 json 路径的更多信息请参阅:json 路径

您当然可以将其转换为一个脚本,该脚本将标签/选择器作为输入并输出运行容器的节点的外部 IP!

要获取节点端口,只需键入:

$ kubectl get services
Run Code Online (Sandbox Code Playgroud)

在PORT(S)列下,您将看到类似 tagetPort:nodePort 的内容。这个节点端口就是你想要的。

nodeIp:nodePort
Run Code Online (Sandbox Code Playgroud)


iva*_*sim 5

当您将服务定义为 type 时NodePort,集群中的每个节点都会将该端口代理到您的服务。如果您的节点可以从 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 wordpress。这spec.ports.nodePort是您需要的端口。