Helm chart模板中如何获取NodePort服务的NodePort与外部访问IP?
实现动态获取节点IP+NodePort组装扫描地址的方案
核心逻辑拆解
要生成目标访问地址,需要在webinspect-runner.yaml模板中通过Helm原生的lookup函数,在渲染阶段从集群API实时拉取两类关键值,再拼接成符合要求的URL,全程不需要依赖自定义Ingress域名。
步骤1:拉取已创建的NodePort Service的实际端口值
如果NodePort不手动指定固定端口,K8s控制平面会在Service创建完成后自动分配端口,Chart渲染阶段硬编码无法拿到真实分配值,必须通过lookup实时查询集群中已存在的Service资源获取:
# webinspect-runner.yaml 开头加变量定义 {{- /* 拉取当前Release部署的目标Service */}} {{- $svc := lookup "v1" "Service" .Release.Namespace (include "web.fullname" .) }} {{- $nodePort := "" }} {{- /* 遍历Service的端口列表,匹配Web服务对应的端口条目,把匹配条件改成你实际Service里的targetPort值 */}} {{- range $svc.spec.ports }} {{- if eq .targetPort "http" }} {{- $nodePort = .nodePort }} {{- end }} {{- end }}
注意:你的Job是
post-install/post-upgrade类钩子,执行时机是主业务资源(Service、Deployment)全部创建完成后才会进入Job创建流程,这时候查询到的Service是真实运行态,能拿到准确的NodePort值。
步骤2:拉取集群的可访问节点IP
同样用lookup查询集群节点资源,匹配可用于NodePort访问的节点IP(通常是InternalIP类型,对应你举例的10.50.40.99这类私网节点地址):
{{- /* 拉取集群所有节点资源,Node是集群级资源,namespace参数留空即可 */}} {{- $nodes := lookup "v1" "Node" "" "" }} {{- $nodeIP := "" }} {{- range $node := $nodes.items }} {{- range $node.status.addresses }} {{- /* 优先匹配ExternalIP,没有的话fallback到InternalIP */}} {{- if or (eq .type "ExternalIP") (eq .type "InternalIP") }} {{- if not $nodeIP }} {{- $nodeIP = .address }} {{- end }} {{- end }} {{- end }} {{- end }}
补充说明:NodePort类型的Service会在集群所有节点上监听对应端口,任意一个可访问的节点IP都能正常连通服务,不需要特殊指定某一个节点。如果有节点筛选需求(比如只取worker节点的IP),可以在lookup函数最后加标签选择器,只查询打了
node-role.kubernetes.io/worker=true标签的节点。
步骤3:组装inspect_url并加兜底校验
把拿到的IP和端口拼接成地址,加上异常判断,避免因为值为空导致扫描任务无意义执行:
# 渲染兜底校验,值为空时直接中断部署流程,不创建无效Job {{- if not $nodeIP }} {{- fail "无法从集群节点中获取可访问IP,检查Node资源状态" }} {{- end }} {{- if not $nodePort }} {{- fail "无法从目标Service中获取NodePort端口,检查Service类型配置" }} {{- end }} # Job容器的环境变量配置 env: - name: inspect_url value: "http://{{ $nodeIP }}:{{ $nodePort }}"
实际使用注意事项
- 权限要求:Rancher流水线执行helm命令使用的账号,需要有
get/listService、Node资源的权限,Rancher默认的流水线内置服务账号已经覆盖这类基础权限,不需要额外授权 - 适配性:后续集群节点扩容、Service重建导致端口/IP变化时,这套动态获取逻辑会自动适配,不需要手动修改Chart配置
- 多端口场景:如果你的Service配置了多个端口,在匹配nodePort的时候要记得对应上Web服务的targetPort,不要误取到其他业务的端口
内容的提问来源于stack exchange,提问作者Romulus Urakagi Ts'ai
相关产品推荐
相关产品推荐

