You need to enable JavaScript to run this app. Helm chart模板中如何获取NodePort服务的NodePort与外部访问IP?
优惠活动
大模型
产品
解决方案
定价
更多

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/list Service、Node资源的权限,Rancher默认的流水线内置服务账号已经覆盖这类基础权限,不需要额外授权
  • 适配性:后续集群节点扩容、Service重建导致端口/IP变化时,这套动态获取逻辑会自动适配,不需要手动修改Chart配置
  • 多端口场景:如果你的Service配置了多个端口,在匹配nodePort的时候要记得对应上Web服务的targetPort,不要误取到其他业务的端口

内容的提问来源于stack exchange,提问作者Romulus Urakagi Ts'ai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 18:36:00