Helm: Nilai `null` bertingkat tidak menghapus kunci seperti yang diharapkan

Dibuat pada 18 Jan 2019  ·  36Komentar  ·  Sumber: helm/helm

https://github.com/helm/helm/pull/2648 memungkinkan penghapusan kunci dengan menyetel null nilai dalam file values.yaml . Namun itu tidak berfungsi untuk nilai bertingkat, misalnya:

web:
  livenessProbe:
    httpGet: null
    exec:
      command:
      - curl
      - -f
      - http://localhost:8080/api/v1/info

Tidak akan menghapus web.livenessProbe.httpGet dari nilai aslinya, melainkan hanya mengganti nilai dengan null dan mencetak peringatan:

2019/01/18 11:30:07 Warning: Merging destination map for chart 'concourse'. Cannot overwrite table item 'httpGet', with non table value: map[path:/api/v1/info port:atc]

Ironisnya, di atas adalah varian kecil pada contoh yang diberikan di dokumen, yang saya cukup yakin tidak benar-benar melakukan apa yang diklaimnya: https://docs.helm.sh/chart_template_guide/#deleting-a-default-key

Saya menduga bahwa karena rendering template tampaknya tidak banyak membedakan antara nilai null dan nilai yang tidak ditentukan, maka peringatan ini diabaikan dan tidak banyak berpengaruh.

Output dari helm version :

Client: &version.Version{SemVer:"v2.12.1", GitCommit:"02a47c7249b1fc6d8fd3b94e6b4babf9d818144e", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.12.1", GitCommit:"02a47c7249b1fc6d8fd3b94e6b4babf9d818144e", GitTreeState:"clean"}

Output dari kubectl version :

Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9ba98609a46fee712359c7b5b365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:39:04Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"11+", GitVersion:"v1.11.5-eks-6bad6d", GitCommit:"6bad6d9c768dc0864dab48a11653aa53b5a47043", GitTreeState:"clean", BuildDate:"2018-12-06T23:13:14Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}

Penyedia / Platform Cloud (AKS, GKE, Minikube, dll.):

EKS

bug

Komentar yang paling membantu

Kami juga mengalami masalah ini (mirip dengan yang dijelaskan oleh @vbuciuc) dengan tidak berfungsi "null" untuk penggantian nilai ketika subchart terdaftar sebagai dependensi di requirement.yaml dengan 3.2.x. Versi sebelumnya (3.1.x) berfungsi seperti yang diharapkan.

Semua 36 komentar

@scottrigby , apakah Anda kebetulan ingin melihat yang ini?

Menandai sebagai pertanyaan / dukungan hingga dipastikan bahwa ini memang bug menurut penulis aslinya.

Saya melihat ini juga di 2.12.3. Saya melihat ketika mencoba mengatur nilai ke null melalui -f dan --set. Apa pun itu, itu hanya menetapkannya ke "null" sebagai string (tanpa tanda kutip) daripada menghapus nilai default.
Situasi saya:

> helm get values grafana
admin:
  existingSecret: ""
chownDataImage:
  pullPolicy: null
  repository: null
  tag: null
<...>

> helm upgrade grafana stable/grafana --tls --reuse-values --set chownDataImage.pullPolicy=null
<output indicating it works>

> helm get values grafana
admin:
  existingSecret: ""
chownDataImage:
  pullPolicy: null
  repository: null
  tag: null
<...>

Use case adalah untuk mengatur ulang nilai-nilai ini untuk menggunakan default dari template alih-alih default yang sekarang terjebak di kemudi.

stabil / filebeat

Dengan null atau nil Saya melihat hal yang sama ... kunci tidak dihapus ... itu ditimpa sebagai null/nil tetapi tidak dihapus dan ketika Anda mengganti itu dengan kunci yang berbeda itu menyebabkan masalah:

---values.yml in the Chart
output.file:
  path: /var/log/foo.log

`` yaml
--- override saya
output.elasticsearch:
tuan rumah:
- ' http: // localhost : 9200'
output.file: null

or
```yaml
---my overrides
output:
  elasticsearch:
     host:
      - 'http://localhost:9200'
  file: null

atau

---my overrides
output:
  elasticsearch:
     hosts:
      - 'http://localhost:9200'
output.file: null
» k get secret filebeat -o jsonpath="{.data.filebeat\.yml}" | base64 -D
    filebeat.config:
      modules:
        path: ${path.config}/modules.d/*.yml
        reload.enabled: false
      prospectors:
        path: ${path.config}/prospectors.d/*.yml
        reload.enabled: false
    filebeat.prospectors:
    - enabled: true
      fields:
        apenv: dev
        app: kubernetes
        log_category: kubernetes
      fields_under_root: true
      paths:
      - /var/log/*.log
      - /var/log/messages
      - /var/log/syslog
      type: log
    - containers.ids:
      - '*'
      fields:
        apenv: dev
        app: kubernetes
        log_category: kubernetes
      fields_under_root: true
      processors:
      - add_kubernetes_metadata:
          in_cluster: true
      - drop_event:
          when:
            equals:
              kubernetes.container.name: filebeat
      type: docker
    http.enabled: true
    http.port: 5066
    output:
      elasticsearch:
        hosts:
        - http://localhost9200
    output.file: null
    processors:
    - add_cloud_metadata: null

kesalahan pod sebagai:

Exiting: error unpacking config data: more than one namespace configured accessing 'output' (source:'filebeat.yml')

Saya juga mengalami masalah yang sama persis dengan bagan filebeat.

@cdenneen Anda dapat menggunakan output file secara khusus dengan config.output.file.enabled=false .

Saya mengalami masalah di mana saya ingin menggunakan kunci inputs untuk pemukulan file tetapi tidak dapat menghapus kunci prospectors .

Nilai yang ada:

config:
  filebeat.prospectors:
    - type: log
      enabled: true
      paths:
        - /var/log/*.log
        - /var/log/messages
        - /var/log/syslog

Penimpaan saya: --set config.filebeat.prospectors=null

Hasil: (config digunakan untuk mengatur nilai Rahasia)

filebeat:
  prospectors: null

Saya juga mengalami masalah ini dengan stable/kibana dan stable/filebeat kunci akan default ke nilai grafik bahkan ketika !!null ditentukan.

@aeijdenberg yakin PR Anda hanya membutuhkan label yang diperbarui untuk ditinjau

Hai @bacongobbler, maaf, saya melewatkan pertanyaan Anda di https://github.com/helm/helm/issues/5184#issuecomment -456138448. Saya dapat memverifikasi bahwa ini adalah bug. Dalam # 2648 saya benar-benar harus menambahkan tes yang cocok dengan contoh yang didokumentasikan. Tadinya saya bermaksud untuk kembali ke ini, tetapi # 5185 tampak menjanjikan! 👏 akan merespon di sana

Hai @scottby . Bolehkah saya tahu rilis mana yang akan menyertakan perbaikan # 5185? Saya baru saja mengalami masalah ini ketika mencoba menghapus definisi sumber daya pada bagan istio.

Ini seharusnya di 2.14.2 - tapi saya tidak bisa membuatnya bekerja.

Saya mengikuti contoh yang sangat mirip dengan yang ada di bagian atas masalah - satu-satunya perbedaan yang dapat saya lihat adalah bahwa saya mencoba menghapus nilai yang ditetapkan dalam subchart (dalam kasus saya, logstash).

Saya telah mencoba:

  • pengaturan logstash.livenessProbe.httpDapatkan ke null , ~ dan {} di values.yaml grafik utama, atau pada baris perintah. Dalam kedua kasus, "template helm" menunjukkan bahwa nilai aslinya masih ada (yaitu, saya masih mendapatkan set httpGet) - dan ini konsisten dengan apa yang saya lihat untuk "pemasangan helm"
  • pengaturan logstash.livenessProbe.httpGet ke "nil" - dalam hal ini nilainya ditimpa, tetapi ke string "nil" yang bukan nilai valid untuk digunakan di sini, jadi kubernetes menolak template.

Apakah saya salah paham dan ini tidak berhasil menjadi 2.14.2 - atau apakah masih ada masalah?

(Bagan menunjukkan ini: demo.zip )

Patch itu dipilih menjadi 2.14.2 menurut catatan rilis sehingga harus tersedia.

Dalam hal ini, saya tidak yakin bug ini telah diperbaiki - haruskah dibuka kembali atau muncul masalah baru? Dapatkah orang lain melihat bagan yang saya lampirkan di atas dan melihat apakah mereka melihatnya berbeda?

@ cc-stjm @bacongobbler - Saya dapat mereproduksi masalah tersebut, dan menurut saya tes ini menunjukkannya:

func TestSubchartCoaleseWithNullValue(t *testing.T) {
    v, err := CoalesceValues(&chart.Chart{
        Metadata: &chart.Metadata{Name: "demo"},
        Dependencies: []*chart.Chart{
            {
                Metadata: &chart.Metadata{Name: "logstash"},
                Values: &chart.Config{
                    Raw: `livenessProbe: {httpGet: {path: "/", port: monitor}}`,
                },
            },
        },
        Values: &chart.Config{
            Raw: `logstash: {livenessProbe: {httpGet: null, exec: "/bin/true"}}`,
        },
    }, &chart.Config{})
    if err != nil {
        t.Errorf("Failed with %s", err)
    }
    result := v.AsMap()
    expected := map[string]interface{}{
        "logstash": map[string]interface{}{
            "global": map[string]interface{}{},
            "livenessProbe": map[string]interface{}{
                "exec": "/bin/true",
            },
        },
    }
    if !reflect.DeepEqual(result, expected) {
        t.Errorf("got %+v, expected %+v", result, expected)
    }
}

Masalahnya, sejauh yang saya tahu, adalah bahwa CoalesceValues() menghasilkan lebih dari satu panggilan ke fungsi dasar yang menggabungkan nilai:
https://github.com/helm/helm/blob/e04fa72f6f211cae68c362f9b7c62f06dc51493e/pkg/chartutil/values.go#L164 -L180

yaitu baris 173 di atas dipanggil dengan httpGet disetel ke null , tetapi nilai yang dikembalikannya telah menghapus kunci itu dari peta (seperti yang diinginkan). Tapi kemudian output itu diteruskan untuk kedua kalinya sebagai input ke set penggabungan ke-2 (baris 179), dan kemudian karena kunci tidak lagi ada, defaultnya ke nilai dalam bagan.

Sayangnya saya tidak mungkin memiliki waktu yang tersedia dalam waktu dekat untuk melangkah lebih jauh - saya telah berganti peran dan saat ini saya tidak menggunakan Helm, dan jawaban tentang cara menyelesaikannya tidak jelas bagi saya. Semoga hal di atas bermanfaat dalam penyelesaiannya.

Sebenarnya, saya baru saja meningkatkan versi 2.14.0 => 2.14.2. Kunci null ed tidak hanya masih ada, tetapi juga berisi nilai sebelumnya. Perilaku sebelumnya baru saja membuatnya menjadi nol, jadi saya yakin ini sebenarnya telah mengalami kemunduran.

@aeijdenberg dapatkah Anda memeriksa pertanyaan @sgillespie ? Jika ada regresi, maka mungkin lebih aman untuk membatalkan PR itu kecuali Anda dapat menentukan perbaikannya. Jika Anda tidak dapat membantu, mungkin lebih aman untuk mengembalikan komitmen Anda dan kembali ke titik awal 1. Beri tahu saya cara Anda ingin melanjutkan.

@bacongobbler , meskipun saya belum menguji 2.14.0 secara gamblang, @sgillespie apa yang cocok dengan perilaku yang saya sebutkan di https://github.com/helm/helm/issues/5184#issuecomment-517059748 . Sayangnya saya pikir ini adalah kasus pengujian unit yang lulus, tetapi ujung ke ujung gagal - karena masing-masing komponen digunakan secara seri, yang membuat pelepasan kunci di tahap sebelumnya membuatnya tidak berpengaruh di tahap selanjutnya (dan itulah sebabnya nilai asli datang melalui).

Saya setuju ini regresi, meskipun mundur juga merupakan regresi bagi siapa pun yang mengandalkan perilaku baru.

Saya telah mencoba tambalan yang relatif kecil dengan cepat yang menurut saya akan mengurangi dampaknya (dan memperbaiki pengujian yang saya tambahkan di atas) di # 6146 - Maaf, kami melakukan kesalahan ini pada upaya terakhir.

Ini mungkin telah diperbaiki di https://github.com/helm/helm/pull/6080. PR tersebut memperbaiki kasus di mana coalesceDeps dipanggil dua kali. Bisakah seseorang mengkonfirmasi dengan master?

Jika demikian, dapatkah # 6146 ditutup, atau apakah ini mencoba untuk memperbaiki masalah terpisah? Saya mencoba memahami kepalaku di sekitar ruang masalah di sini tetapi tidak jelas apa yang coba dipecahkan oleh PR ini. Maaf.

Ini memang tampaknya memperbaiki masalah. Tes naif cepat:

Nilai sub-bagan:

prop:
  nested:
    val: true

Nilai diagram induk:

sub:
  prop:
    nested: null

Output seperti yang diharapkan adalah {}

Hai,

Saya menggunakan helm 2.15.0 dan saya masih menemui masalah ini.

Diberikan subchart dengan nilai:

securityContext:
  runAsUser: 65534
  fsGroup: 65534

Dimana nilainya digunakan dengan toYaml

Dan dalam nilai bagan induk:

sub:
  securityContext:
  runAsUser: null

Maka keluaran sebenarnya adalah:

securityContext:
  runAsUser: 65534
  fsGroup: 65534

Padahal seharusnya:

securityContext:
  fsGroup: 65534

Tidak mencoba menghujani parade Anda, tapi saya masih melihat ini dengan helm v3.0.1

version.BuildInfo {Versi: "v3.0.1", GitCommit: "7c22ef9ce89e0ebeb7125ba2ebf7d421f3e82ffa", GitTreeState: "clean", GoVersion: "go1.13.4"}

Ketika mencoba menginstal stable / ignite saya harus menghapus nilai, tetapi helm tampaknya hanya mengatur nilai ke null / nil, menyebabkan k8s terhenti dalam langkah validasi.

Untuk mereproduksi, simpan ini sebagai bug5184-ignite.yaml (untuk mengganti nilai dari default grafik: https://github.com/helm/charts/blob/master/stable/ignite/values.yaml):

persistence:
  enabled: true   # <-- without this, the keys in question are ignored
  persistenceVolume:
    provisionerParameters:
      type: null  # <-- I want to unset this key
  walVolume:
    provisionerParameters:
      type: null  # <-- I want to unset this key

Kemudian gunakan sebagai file nilai untuk instalasi ignite:

helm install runtimedb stable/ignite --version 1.0.1 --values bug5184-ignite.yaml --debug --dry-run | less

Hasil yang saya dapatkan adalah pesan kesalahan ini, menunjukkan bahwa nilai yang ingin saya hapus telah disetel ke nil :

install.go:148: [debug] Original chart version: ""
install.go:165: [debug] CHART PATH: /home/creinig/.cache/helm/repository/ignite-1.0.1.tgz

Error: unable to build kubernetes objects from release manifest: error validating "": error validating data: unknown object type "nil" in StorageClass.parameters.type
helm.go:76: [debug] error validating "": error validating data: unknown object type "nil" in StorageClass.parameters.type
helm.sh/helm/v3/pkg/kube.scrubValidationError
        /home/circleci/helm.sh/helm/pkg/kube/client.go:520
helm.sh/helm/v3/pkg/kube.(*Client).Build
        /home/circleci/helm.sh/helm/pkg/kube/client.go:135
helm.sh/helm/v3/pkg/action.(*Install).Run
        /home/circleci/helm.sh/helm/pkg/action/install.go:229
[...]

Apa yang saya juga coba:

  • Menyetel nilai menjadi sesuatu yang berbeda / tidak menimpanya sama sekali

    • => PersistentVolumeClaim terhenti di "Tertunda" karena ada opsi "jenis" tambahan yang tidak didukung oleh penyedia

    • => sudah pasti nilai itulah yang menyebabkan masalah

  • Menyetel nilai menjadi null melalui --set

    • Perilaku yang sama seperti saat menyetelnya di file

Ketika hanya menetapkan satu nilai menjadi null melalui baris perintah, sementara pada saat yang sama tetap menonaktifkan persistensi ignite (sehingga template penyimpanan kelas tidak dibuat dan parameter yang dimaksud diabaikan) ...

helm install myignite stable/ignite --version 1.0.1 --set persistence.persistenceVolume.provisionerParameters.type=null --debug --dry-run | less

... ada keluaran debug yang tepat, bukan kesalahan, tetapi ini menunjukkan bahwa nilainya hanya disetel ke null (komentar ditambahkan oleh saya):

NAME: myignite
LAST DEPLOYED: Tue Dec 10 09:43:40 2019
NAMESPACE: default
STATUS: pending-install
REVISION: 1
TEST SUITE: None
USER-SUPPLIED VALUES:
persistence:
  persistenceVolume:
    provisionerParameters:
      type: null   # <-- Set via the command line

COMPUTED VALUES:
affinity: {}
dataStorage:
  config: ""
env:
  IGNITE_QUIET: "false"
  JVM_OPTS: -Djava.net.preferIPv4Stack=true
  OPTION_LIBS: ignite-kubernetes,ignite-rest-http
fullnameOverride: ""
image:
  pullPolicy: IfNotPresent
  repository: apacheignite/ignite
  tag: 2.7.6
nameOverride: ""
nodeSelector: {}
peerClassLoadingEnabled: false
persistence:
  enabled: false
  persistenceVolume:
    provisioner: kubernetes.io/aws-ebs
    provisionerParameters:
      fsType: ext4
      type: null  # <-- Set to null instead of removed
    size: 8Gi
  walVolume:
    provisioner: kubernetes.io/aws-ebs
    provisionerParameters:
      fsType: ext4
      type: gp2  # <-- This is what the default looks like
    size: 8Gi
rbac:
  create: true
replicaCount: 2
resources: {}
serviceAccount:
  create: true
  name: null
tolerations: []

Saya mengalami masalah yang sama persis menggunakan 3.0.1 , mungkin ada baiknya untuk membuka kembali masalah ini?

Setelah berpindah dari helm v2.16.1 ke v3.0.2. Saya mengalami masalah ini dengan pengumuman tidak disetel dan batas cpu.

Saya baru saja mengalami masalah ini di 2.14.1 dan 3.0.2 . Ada pembaruan tentang ini?

Dalam kasus di mana saya tahu bagan helm hanya menggunakan dan benar / salah jika tes, saya mengganti nilai dengan nilai non-tabel seperti 0. Saya mendapatkan banyak peringatan seperti Overwriting table item 'x', with non table value: 0 , tapi setidaknya saya mendapatkan solusi jika saya tidak ingin menyertakan bait. Preferensi saya adalah agar null berfungsi, tetapi ini adalah solusi yang buruk.

Saya telah menetapkan nilai ke nol (dan membiarkannya nol di file nilai saya) dan mengabaikan daftar panjang peringatan tabel yang OK untuk saat ini tetapi saya benar-benar hanya ingin melakukan pembersihan satu kali dari nilai lama yang salah yang disimpan di kubernetes. Sampai bug penghapusan nilai ini diperbaiki, apakah ada cara manual untuk mengedit nilai pada penerapan yang ada tanpa waktu henti?

Mengalami masalah yang sama dengan probe liveness dan readiness .
Menghapus Kunci Default dari panduan template tidak berfungsi.

Silakan coba # 7743. Sepertinya komitmen yang dibuat pada Helm 2 tidak dialihkan ke Helm 3, itulah sebabnya banyak pengguna akan melihat perilaku ini di sana.

Masih melihat masalah ini dengan helm 2.16.3 tetapi hanya jika ada requirement.yaml mencantumkan subchart sebagai dependency.

boo adalah subchart dan foo adalah diagram induk:

vibu@item-ax35755:~/work$ cat boo/values.yaml 
object:
  fromSubchart:
    hello: from boo
vibu@item-ax35755:~/work$ cat foo/values.yaml 
boo:
  object:
    fromParent:
      hello: from foo
    fromSubchart: null
vibu@item-ax35755:~/work$ cat boo/templates/test.yaml 
{{ toYaml .Values.object }}
vibu@item-ax35755:~/work$ cat foo/requirements.yaml 
dependencies:
- name: boo
  repository: file://../boo
  version: 0.1.0
vibu@item-ax35755:~/work/foo$ helm version -c
Client: &version.Version{SemVer:"v2.16.3", GitCommit:"1ee0254c86d4ed6887327dabed7aa7da29d7eb0d", GitTreeState:"clean"}
vibu@item-ax35755:~/work/foo$ helm dep up
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "incubator" chart repository
...Successfully got an update from the "stable" chart repository
Update Complete.
Saving 1 charts
Deleting outdated charts

vibu@item-ax35755:~/work/foo$ helm template .
---
# Source: foo/charts/boo/templates/test.yaml
fromParent:
  hello: from foo
fromSubchart:
  hello: from boo


vibu@item-ax35755:~/work/foo$ mv requirements.yaml{,.bak}
vibu@item-ax35755:~/work/foo$ helm template .
---
# Source: foo/charts/boo/templates/test.yaml
fromParent:
  hello: from foo

Kedua grafik di sini:

helm_5184.zip

@bacongobbler apakah ada niat untuk membahas hal ini lebih lanjut di 2.x?

Kami juga mengalami masalah ini (mirip dengan yang dijelaskan oleh @vbuciuc) dengan tidak berfungsi "null" untuk penggantian nilai ketika subchart terdaftar sebagai dependensi di requirement.yaml dengan 3.2.x. Versi sebelumnya (3.1.x) berfungsi seperti yang diharapkan.

@bacongobbler @technosophos Saya mengalami masalah ini juga dengan Helm 3.3.4 , dapatkah Anda membuka kembali;

Saya dapat mengonfirmasi bahwa ini berfungsi di 3.1.2 dan berhenti berfungsi setelah 3.2.x seperti yang disebutkan @paleg . Untuk saat ini, tampaknya solusi @ tuzla0autopilot4 untuk menyetelnya ke nilai non-peta seperti false akan menghasilkan perilaku yang diinginkan tetapi memberikan peringatan keluaran saat hal itu dilakukan.

@ Chili-Man, Saya baru saja mencoba dengan 3.1.3 dan sepertinya tidak berhasil. Ini akan berlaku dengan null tetapi saya mendapat peringatan dan tidak melakukan apa-apa. Dengan hal lain ( false , 0 , [] ) ia menolak (misalnya,)

`` `` coalesce.go: 196: peringatan: tidak dapat menimpa tabel dengan non tabel untuk sumber daya (peta [permintaan: peta [cpu: 250m memori: 256Mi]])
Kesalahan: UPGRADE GAGAL: nilai tidak memenuhi spesifikasi skema di bagan berikut:
postgresql:

  • resource: Jenis tidak valid. Diharapkan: objek, diberikan: boolean
    `` (or what the type that I try that is not a dict/hash). With 3.3.4 I get just silence and it does nothing with null` dan juga yang lainnya menolak untuk diterapkan. Paling menyebalkan ...

Saya masih mengalami masalah ini di 3.4.2.

Masalahnya masih ada di 3.4.2, tetapi hanya dalam situasi tertentu.
Saya memiliki grafik dengan beberapa sub-grafik.
Saat meletakkan default ke dalam sub bagan, nilai null override tidak berfungsi. Jika Anda memindahkan nilai yang sama ke dalam nilai bagan induk, ini berfungsi seperti yang diharapkan.
Ini hanya dapat direproduksi dengan sub-bagan. Saat Anda memasukkannya ke dalam satu bagan (datar), semuanya berfungsi dengan baik.

Saya mengalami masalah yang sama dengan 3.4.2 saat menggunakan subchart (seperti yang dijelaskan oleh @BohdanKalytka di atas).
Dalam kasus saya, saya ingin menimpa securityContext saat menggunakan bagan helm ElasticSearch di kluster OpenShift.
Apakah masalah ini akan dibuka kembali, atau haruskah kita membuat yang baru?

Mengangkat # 9136

Apakah halaman ini membantu?
0 / 5 - 0 peringkat