Kapitan 编译未将引用后端解析为 Helm 图表

问题描述 投票:0回答:1

我是 Kapitan、Helm 和 K8s 的新手。 这也是我在这里的第一个问题。

我在应用程序类中有 aws-load-balancer-controller.yml。 我正在尝试使用 gkms refs 来获取证书。请参阅 webhookTLS 部分。

---
parameters:
  apps:
    aws-load-balancer-controller:
      version: ${global_release}
      clusterName: ${cluster:cluster_name}
      ...
      webhookTLS:
        caCert: ?{gkms:certificates/aws_load_balancer_controller_webhook/${cluster:env_type}@ca_cert}
        cert: ?{gkms:certificates/aws_load_balancer_controller_webhook/${cluster:env_type}@cert}
        key: ?{gkms:certificates/aws_load_balancer_controller_webhook/${cluster:env_type}@key}

  kapitan:
    dependencies:
    - type: git
      source: [email protected]:container-ops/helm.git
      subdir: charts/aws-load-balancer-controller
      ref: ${apps:aws-load-balancer-controller:version}
      output_path: .charts/${apps:aws-load-balancer-controller:version}/aws-load-balancer-controller
    compile:
    - input_type: helm
      input_paths:
        - .charts/${apps:aws-load-balancer-controller:version}/aws-load-balancer-controller
      helm_values: ${apps:aws-load-balancer-controller}
      helm_params:
        namespace: ingress
        name: aws-load-balancer-controller
        output_file: aws-load-balancer-controller.yml
      output_path: apps/10-core/aws-load-balancer-controller/templates

编译期间 - ${cluster:env_type} 解析正常。但是 ?{} 不是,我在 diff 中看到它:

120,146         name: aws-load-balancer-webhook-service
@@ update validatingwebhookconfiguration/aws-load-balancer-webhook (admissionregistration.k8s.io/v1) cluster @@
  ...
103,103     clientConfig:
104     -     caBundle: LS0tLS1...
    104 +     caBundle: P3tna21zOmNlcnRpZmljYXRlcy9hd3NfbG9hZF9iYWxhbmNlcl9jb250cm9sbGVyX3dlYmhvb2svbGFiQGNhX2NlcnR9

这只是base64的值:

➜  ~ echo "P3tna21zOmNlcnRpZmljYXRlcy9hd3NfbG9hZF9iYWxhbmNlcl9jb250cm9sbGVyX3dlYmhvb2svbGFiQGNhX2NlcnR9" | base64 -d
?{gkms:certificates/aws_load_balancer_controller_webhook/lab@ca_cert}

参考路径是正确的,我可以透露一下:

$ kapitan refs --reveal --tag "?{gkms:certificates/aws_load_balancer_controller_webhook/lab}"
{
    "ca_cert": "LS0tLS1C...",
    "key": "LS0tL...",
    "cert": "LS0tLS1CRUd..."
}

图表中:

/charts/aws-load-balancer-controller/values.yaml

# webhookTLS specifies TLS cert/key for the webhook
webhookTLS:
  caCert:
  cert:
  key:

/charts/aws-load-balancer-controller/templates/webhook.yaml

webhooks:
- clientConfig:
    {{ if not $.Values.enableCertManager -}}
    caBundle: {{ $tls.caCert }}
    {{ end }}

/charts/aws-load-balancer-controller/templates/_helpers.tpl

{{/*
Generate certificates for webhook
*/}}
...
{{- if (and .Values.webhookTLS.caCert .Values.webhookTLS.cert .Values.webhookTLS.key) -}}
caCert: {{ .Values.webhookTLS.caCert | b64enc }}
clientCert: {{ .Values.webhookTLS.cert | b64enc }}
clientKey: {{ .Values.webhookTLS.key | b64enc }}
{{- else if and .Values.keepTLSSecret $secret -}}
... (generate by aws)

我尝试显式地将 helm 值添加到 kapitan 编译部分,但没有任何效果。 奇怪的是相同的语法适用于另一个应用程序 - f5:

f5-bigip-ctrl.yml

---
parameters:
  apps:
    f5_bigip_ctlr:
      secret:
        bigip_username: ?{gkms:passwords/f5/${cluster:env_type}@bigip_username}
        bigip_password: ?{gkms:passwords/f5/${cluster:env_type}@bigip_password}
      args:
        ipam : true
  kapitan:
    dependencies:
    - type: git
      source: [email protected]:container-ops/helm.git
      subdir: charts/f5-bigip-ctlr
      ref: ${apps:f5_bigip_ctlr:version}
      output_path: .charts/${apps:f5_bigip_ctlr:version}/f5-bigip-ctlr
    compile:
    - output_path: apps/
      input_type: helm
      input_paths:
      - .charts/${apps:f5_bigip_ctlr:version}/f5-bigip-ctlr
      helm_values:
        image:
          registry: ${cluster:registry}
        secret:
          bigip_username: ${apps:f5_bigip_ctlr:secret:bigip_username}
          bigip_password: ${apps:f5_bigip_ctlr:secret:bigip_password}
        ...
amazon-web-services kubernetes yaml kubernetes-helm aws-load-balancer-controller
1个回答
0
投票

我是kapitan创始人之一👋

不幸的是,在 kapitan 可以采取任何措施之前,helm 倾向于对值进行 base64 处理。

有多种方法可以解决该问题,特别是当 helm 图表提供传递秘密名称(可以使用 Kapitan 生成)而不是实际值时。

另一个解决方案是使用“突变”,允许 kapitan 操作 helm 对象,但另一个选项更容易。

如果您需要帮助,还可以考虑加入 kubernetes slack 上的 #kapitan 频道

© www.soinside.com 2019 - 2024. All rights reserved.