【问题标题】:Service creation loop using range function in Helm在 Helm 中使用 range 函数创建服务循环
【发布时间】:2021-10-04 15:32:35
【问题描述】:

我正在尝试使用 helm 中的范围循环创建类型为负载均衡器的 k8s 服务。我需要创建指向专用 POD 的 k8s 服务。我已经部署了 3 个 pod,并且正在运行。我正在尝试创建 3 个服务指向3 个不同的 pod。

{{- $replicas := .Values.replicaCount | int -}}
{{- $namespace := .Release.Namespace  }}
{{- range $i,$e := until $replicas }}
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: abc-svc
    statefulset.kubernetes.io/pod-name: abc-{{ $i }}
  name: service-{{ $i }}
  namespace: {{ $namespace  }}
spec:
  ports:
  - protocol: TCP
    targetPort: 2000
    port: {{  . | printf ".Value.ports.port_%d" | int }}
  selector:
    app: abc-svc
    statefulset.kubernetes.io/pod-name: abc-{{ $i }}
  type: LoadBalancer
{{- end }}

我的价值观.yaml

ports:
  port_1: 30001
  port_2: 30002
  port_3: 30003
replicaCount: 3

dry-run 在下面给出:

# Source: t1/templates/svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: abc-svc
    statefulset.kubernetes.io/pod-name: abc-0
  name: service-0
  namespace: xyz
spec:
  ports:
  - protocol: TCP
    targetPort: 2000
    port: 0
  selector:
    app: abc-svc
    statefulset.kubernetes.io/pod-name: abc-0
  type: LoadBalancer
---
# Source: t1/templates/svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: abc-svc
    statefulset.kubernetes.io/pod-name: abc-1
  name: service-1
  namespace: xyz
spec:
  ports:
  - protocol: TCP
    targetPort: 2000
    port: 0
  selector:
    app: abc-svc
    statefulset.kubernetes.io/pod-name: abc-1
  type: LoadBalancer
---
# Source: t1/templates/svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: abc-svc
    statefulset.kubernetes.io/pod-name: abc-2
  name: service-2
  namespace: xyz
spec:
  ports:
  - protocol: TCP
    targetPort: 2000
    port: 0
  selector:
    app: abc-svc
    statefulset.kubernetes.io/pod-name: abc-2
  type: LoadBalancer

我需要根据 values.yaml 文件指向正确端口的端口号。对于 service-0,service-1,service-2 我需要分配 30001,30002,30002 端口。请建议。谢谢!!

【问题讨论】:

    标签: kubernetes kubernetes-helm


    【解决方案1】:

    要在端口列表中进行动态查找,您需要使用index 函数。这是标准 Go text/template language 的一部分,而不是 Helm 扩展:

    port: {{ index .Values.ports (add $i 1 | printf "port_%d") }}
    

    如果您将端口列表更改为列表而不是地图,这可能会稍微简单一些:

    # values.yaml
    ports:
      - 30001
      - 30002
      - 30003
    replicaCount: 3
    
    port: {{ index .Values.ports $i }}
    

    如果您不需要从集群外部访问特定的 pod,请单独使用 a StatefulSet creates a cluster-internal DNS name for each pod,您可以完全避免此循环。

    【讨论】:

    • 嘿,我正在尝试面临问题的第二个选项。错误:模板:t1/templates/svc.yaml:17:26:在 <.values .ports>:无法评估 int 类型的字段值
    • range 循环中,. 是您正在迭代的当前值,因此您需要将.Values.ports 保存到循环外的局部变量中。
    猜你喜欢
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多