使用 NodePort 测试对应用程序的访问权
虚拟私有云 经典基础架构 Satellite
通过使用 Kubernetes 集群中任何工作程序节点的公共 IP 地址并公开 NodePort,使容器化应用程序可通过因特网访问。 此选项可用于在 IBM Cloud® Kubernetes Service 中进行测试以及用于短期公共访问权。
关于 NodePorts
在工作程序节点上公开一个公共端口,并使用该工作程序节点的公共 IP 地址通过因特网来公共访问集群中的服务。
通过创建类型为 NodePort 的 Kubernetes 服务来公开应用程序时,将为该服务分配 30000-32767 范围内的 NodePort 以及内部集群 IP 地址。 NodePort 服务充当应用程序入局请求的外部入口点。 分配的 NodePort 在集群中每个工作程序节点的 kubeproxy
设置中公共公开。 每个工作程序节点都会在分配的 NodePort 上开始侦听该服务的入局请求。 要从互联网访问服务,可以使用创建群集时分配的任何工作节点的公共
IP 地址和格式为 <IP_address>:<nodeport>
的NodePort。 如果要访问专用网络上的服务,请使用任何工作程序节点的专用 IP 地址,而不要使用公共 IP 地址。
下图显示配置 NodePort 服务后,如何将通信从因特网定向到应用程序。
-
使用工作程序节点的公共 IP 地址和工作程序节点上的 NodePort,将请求发送到应用程序。
-
请求会自动转发到 NodePort 服务的内部集群 IP 地址和端口。 该内部集群 IP 地址只能在集群内部访问。
-
kube-proxy
将请求路由到应用程序的 Kubernetes NodePort 服务。 -
该请求会转发到部署了应用程序的 pod 的专用 IP 地址。 如果集群中部署了多个应用程序实例,那么 NodePort 服务会在应用程序 pod 之间路由请求。
工作程序节点的公共 IP 地址不是永久固定的。 除去或重新创建工作程序节点时,将为该工作程序节点分配新的公共 IP 地址。 在测试应用程序的公共访问权时,或者仅在短时间内需要公共访问权时,可以使用 NodePort 服务。 如果需要服务具有稳定的公共 IP 地址和更高可用性,请使用网络负载均衡器 (NLB) 服务或 Ingress 来公开应用程序。
使用 NodePort 服务来启用对应用程序的访问权
将应用程序公开为 Kubernetes NodePort 服务。
由于 VPC 集群中的工作者节点没有公共 IP 地址,因此只有在连接到私有 VPC 网络(如通过 VPN 连接)的情况下,才能通过NodePort访问应用程序。 要从因特网访问应用程序,必须改为使用 VPC 负载均衡器 或 Ingress 服务。
如果您还没有准备好应用程序,可以使用Kubernetes一个名为 Guestbook 的示例应用程序。
准备工作
要使用 NodePort,
-
在应用程序的配置文件中,定义一个 服务部分。
对于 Guestbook 示例,配置文件中已存在前端服务部分。 要使 Guestbook 应用程序在外部可用,请向前端服务部分添加 NodePort 类型以及范围为 30000-32767 的 NodePort。
示例
apiVersion: v1 kind: Service metadata: name: <my-nodeport-service> labels: <my-label-key>: <my-label-value> spec: selector: <my-selector-key>: <my-selector-value> type: NodePort ports: - port: <8081> # nodePort: <31514>
了解 NodePort 服务的组成部分 组件 描述 name
将 <my-nodeport-service>
替换为NodePort服务的名称。 使用 Kubernetes 资源时,请了解有关确保个人信息安全的更多信息。labels
将 <my-label-key>
和<my-label-value>
替换为您希望用于服务的标签。selector
将 <my-selector-key>
和<my-selector-value>
替换为部署 YAML 中spec.template.metadata.labels
部分使用的键/值对。 要将服务与部署相关联,选择器必须与部署标签相匹配。port
将 <8081>
替换为服务监听的端口。nodePort
可选:用 30000 - 32767 范围内的NodePort替换 <31514>
。 不要指定其他服务已经在使用的 NodePort。 如果未分配 NodePort,系统将为您分配随机的 NodePort。
要指定一个NodePort并查看哪些NodePorts已被使用,请运行kubectl get svc
命令。 所有已在使用的 NodePort 都会显示在端口字段下。 -
保存已更新的配置文件。
-
应用程序部署后,可以使用任何工作程序节点的公共 IP 地址和 NodePort 来构成公共 URL,以用于在浏览器中访问该应用程序。 如果工作程序节点仅连接到专用 VLAN,那么会创建专用 NodePort 服务,并且可以通过工作程序节点的专用 IP 地址对其进行访问。
-
获取集群中工作程序节点的公共 IP 地址。 如果要访问私有网络上的工作节点或 VPC 集群,请获取私有 IP 地址。
ibmcloud ks worker ls --cluster <cluster_name>
输出
ID Public IP Private IP Size State Status prod-dal10-pa215dcf5bbc0844a990fa6b0fcdbff286-w1 192.0.2.23 10.100.10.10 u3c.2x4 normal Ready prod-dal10-pa215dcf5bbc0844a990fa6b0fcdbff286-w2 192.0.2.27 10.100.10.15 u3c.2x4 normal Ready
-
如果分配了随机 NodePort,请了解分配的是哪个 NodePort。
kubectl describe service <service_name>
输出
NAME: <service_name> Namespace: default Labels: run=<deployment_name> Selector: run=<deployment_name> Type: NodePort IP: 10.10.10.8 Port: <unset> 8080/TCP NodePort: <unset> 30872/TCP Endpoints: 172.30.171.87:8080 Session Affinity: None No events.
在此示例中,NodePort 为
30872
。如果端点部分显示
<none>
,请检查NodePort服务spec.selector
部分中使用的<selectorkey>
和<selectorvalue>
。 确保它与您在部署 YAML 的spec.template.metadata.labels
部分中使用的_键/值_对相同。 -
使用其中一个工作程序节点 IP 地址和 NodePort 来构成 URL。 Example:
http://192.0.2.23:30872
. 对于 VPC 集群,必须连接到专用网络 (例如,通过 VPN 连接) 才能访问工作程序节点专用 IP 地址和 NodePort。
-