Skip to content

Helm upgrade states secret patching during upgrade but its behavior is not matching with behavior of kubectl patch command #338

Open
@rohitsharma382

Description

@rohitsharma382
  1. Create sample helm chart having one secret template like below:
$ cat nginx/templates/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: data-test-secret
  labels:
    app.kubernetes.io/name: nginx
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
  annotations:
    test.com/product-name: "Test"
type: Opaque
data:
  testkey: "dGVzdAo="

  1. Run helm install command to deploy secret

$ helm install nginxrs nginx

  1. After helm install observe secret data.
$ kubectl get secret data-test-secret -o yaml
apiVersion: v1
data:
  testkey: dGVzdAo=
kind: Secret
metadata:
  annotations:
    meta.helm.sh/release-name: nginxrs
    meta.helm.sh/release-namespace: test-system
    test.com/product-name: Test
  creationTimestamp: "2024-03-15T09:12:39Z"
  labels:
    app.kubernetes.io/instance: nginxrs
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: nginx
  name: data-test-secret
  namespace: test-system
  resourceVersion: "595791560"
  uid: 60a740ab-6e91-49c0-8a00-8ccabf36c18e
type: Opaque
$
  1. Now create new template of secret with new data in helm chart.
$ cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: data-test-secret
  labels:
    app.kubernetes.io/name: nginx
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
  annotations:
    test.com/product-name: "Test"
type: Opaque
data:
  newtestkey: "dGVzdAo="
  1. Now perform helm upgrade and observe helm is confirming that it is doing Secret patching.

[Output truncated ]

$ helm upgrade nginxrs nginx --debug

upgrade.go:153: [debug] preparing upgrade for nginxrs
upgrade.go:161: [debug] performing update for nginxrs
upgrade.go:354: [debug] creating upgraded release for nginxrs
client.go:393: [debug] checking 6 resources for changes
client.go:684: [debug] Looks like there are no changes for ServiceAccount "web-usr"
client.go:693: [debug] **Patch Secret "data-test-secret"** in namespace test-system
  1. After upgrade check secret result and observed that old secret data was overrided by new data.
$ kubectl get secret data-test-secret -o yaml
apiVersion: v1
data:
  newtestkey: dGVzdAo=
kind: Secret
metadata:
  annotations:
    meta.helm.sh/release-name: nginxrs
    meta.helm.sh/release-namespace: test-system
    test.com/product-name: Test
  creationTimestamp: "2024-03-15T09:17:00Z"
  labels:
    app.kubernetes.io/instance: nginxrs
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: nginx
  name: data-test-secret
  namespace: test-system
  resourceVersion: "595807504"
  uid: b51f2fc7-4eda-4386-8ece-486f0ca07bc8
type: Opaque
$

  1. Above behavior of secret patching via helm upgrade is different if we do manually via kubectl patch command.

For eg: In below we can see old key i.e testkey and new key i.e newtestkey both are present.

$ kubectl patch secret data-test-secret --patch-file 2data-test-secrets.yaml
secret/data-test-secret patched
$
$ kubectl get secret data-test-secret -o yaml
apiVersion: v1
data:
  newtestkey: dGVzdAo=
  testkey: dGVzdAo=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"testkey":"dGVzdAo="},"kind":"Secret","metadata":{"annotations":{},"name":"data-test-secret","namespace":"test-system"},"type":"Opaque"}
  creationTimestamp: "2024-03-15T07:49:39Z"
  name: data-test-secret
  namespace: test-system
  resourceVersion: "595595966"
  uid: d2580400-fe78-44b2-bfa8-68672e403eaf
type: Opaque
$

  1. However if perform kubectl apply command then old data will be removed and replaced by new data.

For eg: In below we can see old key i.e testkey and new key i.e newtestkey both are present.

$ kubectl apply -f 2data-test-secrets.yaml
secret/data-test-secret configured

$ kubectl get secret -o yaml data-test-secret

apiVersion: v1
data:
  newtestkey: dGVzdAo=
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"newtestkey":"dGVzdAo="},"kind":"Secret","metadata":{"annotations":{},"name":"data-test-secret","namespace":"test-system"},"type":"Opaque"}
  creationTimestamp: "2024-03-10T10:22:37Z"
  name: data-test-secret
  namespace: test-system
  resourceVersion: "578975054"
  uid: 1849763a-3296-4fd8-8462-ec411b09a7a3
type: Opaque

Hence, it seems like helm is stating that its doing patching while in actual it seems doing applying which is like wrong information presentation of actual behavior.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions