Mulai ulang pod saat configmap diupdate di Kubernetes?

121

Bagaimana cara saya secara otomatis memulai ulang pod dan pod Kubernetes yang terkait dengan penerapan ketika configmapnya diubah / diperbarui?


Saya tahu telah ada pembicaraan tentang kemampuan untuk secara otomatis memulai ulang pod ketika peta konfigurasi berubah tetapi sepengetahuan saya ini belum tersedia di Kubernetes 1.2.

Jadi yang (menurut saya) ingin saya lakukan adalah "memulai ulang secara bergulir" dari sumber daya penerapan yang terkait dengan pod yang menggunakan peta konfigurasi. Apakah mungkin, dan jika demikian bagaimana, untuk memaksa restart bergulir dari penerapan di Kubernetes tanpa mengubah apapun di template sebenarnya? Apakah saat ini cara terbaik untuk melakukannya atau apakah ada pilihan yang lebih baik?

Johan
sumber
$ kubectl set env deployment my deployment --env="LAST_RESTART=$(date)" --namespace ...lakukan pekerjaan untuk saya
maciek

Jawaban:

60

Memberi sinyal pada pod pada update config map adalah fitur yang sedang dikerjakan ( https://github.com/kubernetes/kubernetes/issues/22368 ).

Anda selalu dapat menulis pid1 khusus yang memperhatikan bahwa confimap telah berubah dan memulai ulang aplikasi Anda.

Anda juga dapat misalnya: memasang config map yang sama dalam 2 kontainer, mengekspos health check http di kontainer kedua yang gagal jika hash konten config map berubah, dan mendorongnya sebagai probe liveness dari kontainer pertama (karena kontainer dalam pod berbagi namespace jaringan yang sama). Kubelet akan memulai ulang container pertama Anda saat probe gagal.

Tentu saja jika Anda tidak peduli pada node mana pod tersebut berada, Anda dapat dengan mudah menghapusnya dan pengontrol replikasi akan "memulai ulang" untuk Anda.

Prashanth B
sumber
Yang dimaksud dengan "menghapus pod" adalah: Mengumpulkan semua nama pod, menghapus satu, menunggu hingga diganti, menghapus yang kedua, menunggu hingga diganti, dll. Benar?
Torsten Bronger
6
menggunakan penerapan, saya akan menurunkannya dan kemudian naik. Anda masih akan memiliki sedikit waktu istirahat. Anda dapat melakukannya dalam satu baris untuk mengurangi itu ... kubectl scale deployment/update-demo --replicas=0; kubectl scale deployment/update-demo --replicas=4;
Nick H
Jika Anda tidak ingin menemukan semua pod, dan tidak peduli dengan waktu henti - cukup hapus RC lalu buat ulang RC.
Drew
1
Apakah ini berarti volume tempat pemasangannya diperbarui dan Anda hanya perlu membaca ulang file di dalam pod tanpa memulai ulang seluruh pod?
Matt Williamson
@NickH Cepat dan kotor, untungnya waktu henti dapat diterima dalam kasus saya dan ini berfungsi dengan baik, terima kasih!
ChocolateAndCheese
129

Solusi terbaik saat ini untuk masalah ini (dirujuk jauh di https://github.com/kubernetes/kubernetes/issues/22368 ditautkan dalam jawaban saudara) adalah dengan menggunakan Deployments, dan menganggap ConfigMaps Anda tidak dapat diubah.

Jika Anda ingin mengubah konfigurasi, buat ConfigMap baru dengan perubahan yang ingin Anda buat, dan arahkan penerapan Anda ke ConfigMap baru. Jika konfigurasi baru rusak, Deployment akan menolak untuk menurunkan ReplicaSet Anda yang berfungsi. Jika konfigurasi baru berfungsi, maka ReplicaSet lama Anda akan diskalakan menjadi 0 replika dan dihapus, dan pod baru akan dimulai dengan konfigurasi baru.

Tidak secepat hanya mengedit ConfigMap di tempatnya, tetapi jauh lebih aman.

Simetris
sumber
2
Ini adalah pendekatan yang kami ambil juga
Johan
5
Perlu disebutkan bahwa alat eksperimental baru kustomizemendukung pembuatan hash configmap deterministik secara otomatis, yang berarti Anda tidak perlu membuat configmap baru secara manual: github.com/kubernetes-sigs/kustomize/blob/…
Symmetric
Inilah yang dilakukan Spinnaker di belakang layar, jadi jika Anda menggunakannya, Anda tidak perlu khawatir tentang ini.
Gus
32

Cara terbaik yang saya temukan untuk melakukannya adalah dengan berlari Reloader

Ini memungkinkan Anda untuk menentukan configmaps atau rahasia yang harus diperhatikan, ketika diperbarui, pembaruan berkelanjutan dari penerapan Anda dilakukan. Berikut contohnya:

Anda memiliki penerapan foodan ConfigMap dipanggil foo-configmap. Anda ingin menggulung pod penerapan setiap kali configmap diubah. Anda perlu menjalankan Reloader dengan:

kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

Kemudian tentukan anotasi ini dalam penerapan Anda:

kind: Deployment
metadata:
  annotations:
    configmap.reloader.stakater.com/reload: "foo-configmap"
  name: foo
...
George Miller
sumber
Reloader kompatibel dengan kubernetes> = 1.9
jacktrade
31

https://github.com/kubernetes/helm/blob/master/docs/charts_tips_and_tricks.md#user-content-automatically-roll-deployments-when-configmaps-or-secrets-change

Sering kali configmaps atau rahasia dimasukkan sebagai file konfigurasi di container. Bergantung pada aplikasinya, restart mungkin diperlukan jika mereka diperbarui dengan yang berikutnyahelm upgrade , tetapi jika spesifikasi penerapan itu sendiri tidak mengubah aplikasi tetap berjalan dengan konfigurasi lama yang mengakibatkan penerapan tidak konsisten.

The sha256sumfungsi dapat digunakan bersama-sama dengan includefungsi untuk memastikan penyebaran bagian template diperbarui jika perubahan spesifikasi lain:

kind: Deployment
spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ include (print $.Template.BasePath "/secret.yaml") . | sha256sum }}
[...]

Dalam kasus saya, karena beberapa alasan, $.Template.BasePathtidak berfungsi tetapi berfungsi $.Chart.Name:

spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: admin-app
      annotations:
        checksum/config: {{ include (print $.Chart.Name "/templates/" $.Chart.Name "-configmap.yaml") . | sha256sum }}
kuanta
sumber
8
Tidak berlaku untuk penggunaan Kubernetes umum, hanya berlaku untuk Helm
Emii Khaos
2
Jawabannya membantu tetapi mungkin tidak relevan dengan pertanyaan ini
Anand Singh Kunwar
helm3 dirilis baru-baru ini. Dengan demikian, tautannya sudah usang. Itu menunjuk ke mastercabang. URL berikut akan mengarah ke (saat ini) helm2 dokumen terbaru : github.com/helm/helm/blob/release-2.16/docs/…
Marcel Hoyer
Solusi keren. Saya beralih ke sha1sum, seperti dalam kasus saya sha256sum memiliki 65 karakter yang menghasilkan Deployment.apps "xxx" is invalid: metadata.labels: Invalid value: "xxx": must be no more than 63 characters. Alternatifnya adalah | trunc 63, tapi sha1sum harus "lebih unik".
iptizer
11

Anda dapat memperbarui label metadata yang tidak relevan untuk penerapan Anda. itu akan memicu pembaruan berkelanjutan

sebagai contoh:

metadata:
  labels:
    configmap-version: 1
Maoz Zadok
sumber
Saya mencari dokumen tentang metadata: labels: configmap-version: 1
c4f4t0r
7
perubahan label metadata tidak memicu restart pod
dan carter
Jawaban ini memiliki upwote jadi saya perlu bertanya. Jika kami memperbarui metadata, apakah cluster Kubernetes akan memicu pembaruan berkelanjutan? @ maoz-zadok
titus
1
Saya yakin ini berfungsi selama label metadata di bawahtemplate.spec
Saikiran Yerram
1

Mengalami masalah saat Deployment berada di sub-diagram dan nilai yang mengendalikannya ada di file nilai diagram induk. Inilah yang kami gunakan untuk memicu restart:

spec:
  template:
    metadata:
      annotations:
        checksum/config: {{ tpl (toYaml .Values) . | sha256sum }}

Jelas ini akan memicu restart pada setiap perubahan nilai tetapi berfungsi untuk situasi kita. Apa yang awalnya di bagan anak hanya akan berfungsi jika config.yaml di bagan anak itu sendiri berubah:

    checksum/config: {{ include (print $.Template.BasePath "/config.yaml") . | sha256sum }}
Bryji
sumber
0

Saya melakukan solusi dari quanta "s dan bekerja dengan sempurna. Tetapi yang tidak saya mengerti adalah bahwa pod sebenarnya tidak restart ... Pod masih sama tetapi ada perubahan!

Sebagai contoh: Pod berjalan sejak 50 menit dan saya mengubah sesuatu dan mengubahnya online. Saya dapat melihatnya di browser saya dan pod masih berjalan + 50 menit !! Saya menggunakan Helm3 ... Tahukah Anda apa yang membuat hal ini mungkin terjadi tanpa memperbarui configmap?

Ibrahim Yesilay
sumber
1
Baik! Saya menemukannya ... Karena kami memasang configmap kami sebagai volume dan diperbarui secara dinamis ... Itulah mengapa ketika saya melakukan "'checksum' 'ini maka pod saya tidak restart tetapi ada perubahan! Saya sarankan sebagai a solusi yang baik :)
Ibrahim Yesilay
-1

Cara lain adalah dengan memasukkannya ke bagian perintah Deployment:

...
command: [ "echo", "
  option = value\n
  other_option = value\n
" ]
...

Atau, untuk membuatnya lebih mirip ConfigMap, gunakan Deployment tambahan yang hanya akan menghosting konfigurasi itu di commandbagian dan menjalankannya kubectl createsambil menambahkan 'versi' unik ke namanya (seperti menghitung hash konten) dan memodifikasi semua penerapan yang menggunakan konfigurasi itu:

...
command: [ "/usr/sbin/kubectl-apply-config.sh", "
  option = value\n
  other_option = value\n
" ]
...

Saya mungkin akan memposting kubectl-apply-config.sh jika akhirnya berhasil.

(jangan lakukan itu; itu terlihat terlalu buruk)

Velkan
sumber