Setting caBundle in MutatingWebhookConfiguration with Helm chart

12/26/2019

The caBundle for MutatingWebhookConfiguration is defined here as:

caBundle is a PEM encoded CA bundle which will be used to validate the webhook's server certificate. If unspecified, system trust roots on the apiserver are used.

I am getting the PEM encoded CA bundle with this command.

kubectl config view --raw --minify --flatten \ 
-o jsonpath='{.clusters[].cluster.certificate-authority-data}'

The resulting value is saved in a variable that is used in a sed command to replace the CA_BUNDLE string in a 'template' YAML as shown below.

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: WEBHOOK_APP
  labels:
    app: WEBHOOK_APP
webhooks:
  - name: com.demo.NAMESPACE.WEBHOOK_APP
    sideEffects: None
    admissionReviewVersions: ["v1", "v1beta1"]
    matchPolicy: Equivalent
    failurePolicy: Fail
    clientConfig:
      caBundle: CA_BUNDLE
      service:
        name: WEBHOOK_APP
        namespace: NAMESPACE
        path: "/mutate"
    rules:
      - operations: [ "CREATE", "UPDATE" ]
        apiGroups: [""]
        apiVersions: ["v1"]
        resources: ["pods"]
        scope: "*"

What is the way in Helm chart to pass on the CA_BUNDLE?

-- cogitoergosum
ca
installation
kubernetes
kubernetes-helm
yaml

1 Answer

12/27/2019

Reading variable dirctly from env variable in your helm chart is not possible due to security reasons and this functionality was not implemented as states in this document.

In helm chart you can always create a variable e.g. myCAbundleVariable in values.yaml file that will be holding your PEM encoded CA and then use value from this variable in chart like this:

webhooks:
  - ...
    clientConfig:
      caBundle: {{ .myCAbundleVariable }}

If you want to pass the value 'in runtime' when running helm command you can use --set parameter.

So your helm command would look like this:

helm install ... --set myCAbundleVariable=$(kubectl config view --raw --minify --flatten \
-o jsonpath='{.clusters[].cluster.certificate-authority-data}')`

Let me know if it was helpful.

-- HelloWorld
Source: StackOverflow