Topik temu duga representatif

Temu Duga Linux: Bagaimanakah Isyarat (Signals) dan Penutupan Anggun (Graceful Shutdown) Berfungsi?

UmumSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Satu perkhidmatan HTTP Linux berjalan dalam bekas Kubernetes. Semasa kemas kini bergulir (rolling update), ia menerima SIGTERM dengan tempoh ihsan 30 saat sementara 200 permintaan sedang diproses (in flight), dua pekerja anak sedang berjalan, dan satu pengguna tugas latar belakang (background-job consumer) sedang aktif. Reka bentuk protokol penutupannya dan terangkan cara anda mengesahkannya.

Prompt dan Konteks Berkenaan

Satu perkhidmatan HTTP Linux berjalan dalam bekas Kubernetes. Semasa kemas kini bergulir (rolling update), ia menerima SIGTERM dengan tempoh ihsan 30 saat sementara 200 permintaan sedang diproses (in flight), dua pekerja anak sedang berjalan, dan satu pengguna tugas latar belakang (background-job consumer) sedang aktif. Reka bentuk protokol penutupan daripada penghantaran isyarat sehinggalah proses keluar. Terangkan tingkah laku SIGTERM dan SIGKILL, keselamatan pengendali isyarat (signal-handler safety), penyaliran trafik (traffic draining), pengendalian tugas dan proses anak, tarikh akhir (deadlines), serta pengesahan.

30 saat dan 200 permintaan tersebut merupakan input senario temu duga. Kubernetes biasanya menggunakan tempoh ihsan penamatan Pod lalai selama 30 saat, namun nilai pengeluaran sebenar harus diperoleh daripada durasi permintaan yang diukur, masa pembersihan, semantik beban kerja, dan keperluan ketersediaan. Dalam senario ini, gunakan tarikh akhir penyaliran dalaman selama 25 saat dan simpan lima saat untuk pembersihan akhir dan varians penjadualan. Pembahagian tersebut merupakan pilihan kejuruteraan, bukannya jaminan platform.

Masalah terasnya ialah protokol kitaran hayat proses Linux. Kubernetes dan HTTP menyediakan konteks operasi. Jawapan yang mantap menjejaki isyarat daripada kernel ke proses yang disasarkan, mengubahnya menjadi peralihan keadaan yang selamat, mengawal kemasukan dan kerja yang sedang diproses, serta membuktikan bahawa penamatan kekal dalam tarikh akhir yang ditetapkan.

Perkara yang Dinilai oleh Penemu Duga

Pertama, penemu duga menyemak semantik isyarat. Suatu proses boleh menangkap, menyekat, atau mengabaikan SIGTERM; tindakan lalainya ialah penamatan. Sebaik sahaja aplikasi menangkapnya, aplikasi tersebut akhirnya mesti menamatkan dirinya sendiri. SIGKILL tidak boleh ditangkap, disekat, atau diabaikan, jadi ia tidak memberi peluang untuk pembersihan. Isyarat standard yang berulang bukan giliran yang tahan lama (durable queue): beberapa tika tertangguh bagi isyarat standard yang sama boleh bergabung (coalesce).

Kedua, penemu duga menyemak sama ada isyarat sampai ke perkhidmatan. Dalam bekas, titik masuk bentuk cangkerang (shell-form entry point) boleh menyebabkan /bin/sh -c kekal sebagai PID 1 dan menghalang fail boleh laksana (executable) daripada menerima SIGTERM yang dijangkakan. Perkhidmatan tersebut sepatutnya merupakan titik masuk bentuk exec, atau pembungkus (wrapper) perlu diakhiri dengan exec. Perkhidmatan yang mencipta proses anak juga mesti memajukan penamatan dan menuai (reap) mereka, atau dijalankan dengan init kecil (tiny init) yang sesuai apabila ia tidak dapat melaksanakan tugas PID 1 sendiri.

Ketiga, penemu duga mencari sempadan selamat-isyarat-tak-segerak (async-signal-safe boundary). Pengendali isyarat C mentah mengganggu pelaksanaan normal pada arahan arbitrari. Memanggil printf, memperuntukkan memori, mengambil mutex, menutup graf objek aplikasi, atau mengepam pustaka klien (flushing a client library) boleh menyebabkan kebuntuan (deadlock) atau merosakkan keadaan. Pengendali hanya perlu menerbitkan pemberitahuan minimum menggunakan operasi selamat-isyarat; laluan kawalan normal yang memegang tanggungjawab pembersihan.

Keempat, penemu duga menilai urutan penutupan. Perkhidmatan harus menjadi tidak sedia (unready) dan berhenti menerima kerja baharu, kemudian menyalirkan atau membatalkan kerja yang telah diterima di bawah tarikh akhir. Ia mesti menghentikan pengambilan tugas tanpa kehilangan pemilikan pajakan (lease ownership), membiarkan kebergantungan kongsi terbuka sehingga penggunanya selesai, menamatkan dan menuai proses anak, melaksanakan pengepaman telemetri terikat, dan keluar sebelum pengatur (orchestrator) meningkatkan tindakan kepada SIGKILL.

Akhir sekali, penemu duga mahukan bukti operasi. Ujian unit pengendali sahaja tidak dapat membuktikan susun atur PID bekas, penyingkiran titik akhir (endpoint removal), tingkah laku sambungan, penghantaran semula tugas, penuaian proses anak, atau pematuhan terhadap tempoh ihsan. Jawapan perlu merangkumi ujian peringkat bekas dan peringkat peluncuran (rollout) dengan kriteria lulus yang boleh diperhatikan.

Soalan untuk Dijelaskan Sebelum Menjawab

  • Siapakah yang menghantar isyarat, dan kepada PID yang mana? Sahkan masa jalan bekas (container runtime), isyarat henti yang dikonfigurasikan, titik masuk, pembungkus, dan sama ada aplikasi ialah PID 1.
  • Apakah yang menggunakan 30 saat tersebut? Cangkuk preStop Kubernetes berjalan dalam tempoh ihsan penamatan yang sama. Durasinya mengurangkan baki masa untuk penyaliran aplikasi.
  • Apakah yang dimaksudkan dengan "sedang diproses" (in flight)? Asingkan permintaan yang diterima, sambungan keep-alive tanpa permintaan, respons penstriman, sambungan yang dinaik taraf, dan kerja aplikasi yang beratur. Semuanya memerlukan dasar penyelesaian yang berbeza.
  • Bolehkah perkhidmatan menolak kerja baharu serta-merta? Kenal pasti prob kesediaan (readiness probe), pengimbang beban, pendengar (listener), jaring perkhidmatan (service mesh), dan sebarang pemanggil terus. Penyebaran kesediaan bukan berlaku serta-merta.
  • Apakah kontrak durasi permintaan dan percubaan semula? Bacaan idempoten yang pendek mungkin boleh selesai; muat naik yang panjang atau penulisan yang mempunyai kesan sampingan mungkin memerlukan pembatalan, penyerahan, atau kunci keidempotenan (idempotency key).
  • Bagaimanakah tugas latar belakang dimiliki? Jelaskan masa perakuan (acknowledgement timing), tamat masa keterlihatan atau pajakan (visibility timeout or lease), tingkah laku degupan jantung (heartbeat), penghantaran semula, dan keidempotenan. "Hentikan pekerja" adalah tidak selamat tanpa kontrak ini.
  • Siapakah yang memiliki pekerja anak? Tentukan sama ada proses induk boleh menghantar isyarat kepada kumpulan proses, sama ada pekerja anak mempunyai protokol penutupan mereka sendiri, dan siapa yang memanggil waitpid.
  • Masa jalan yang manakah mengendalikan isyarat? Benang sigwait khusus, panggilan balik gelung peristiwa (event-loop callback), dan pengendali C mentah mempunyai sempadan keselamatan yang berbeza. Nyatakan tingkah laku masa jalan yang sebenar.
  • Hasil apakah yang mentakrifkan kejayaan? Tetapkan had untuk kemasukan baharu, kerja yang diselesaikan dan dibatalkan, kesan sampingan pendua, proses zombi, masa keluar, dan kadar penamatan paksa.

Rangka Kerja Jawapan 30 Saat

"Saya mengesahkan bahawa titik masuk bentuk exec menghantar SIGTERM kepada aplikasi. Pengendali mentah hanya membangkitkan laluan kawalan normal. Laluan tersebut menggagalkan kesediaan, menghentikan kemasukan permintaan dan tugas, serta menyalirkan kerja yang diterima sehingga tarikh akhir dalaman 25 saat. Ia kemudian membatalkan baki kerja dengan selamat, menamatkan dan menuai kedua-dua pekerja anak, melaksanakan pengepaman akhir terikat, dan keluar sebelum tempoh ihsan 30 saat berakhir. SIGKILL tidak boleh menjalankan pembersihan. Saya menguji bekas yang dibina di bawah permintaan dan tugas serentak, menyemak pemotongan kemasukan, tingkah laku percubaan semula, penuaian anak, dan masa keluar."

Rangka kerja ini mewujudkan aliran kawalan. Jawapan terperinci juga mesti merangkumi penghantaran isyarat berbilang benang, panggilan sistem yang terganggu, permintaan penutupan berulang, dan perbezaan antara penyingkiran titik akhir dengan kemasukan pendengar.

Perbincangan Mendalam Langkah demi Langkah

Mulakan dengan laluan penghantaran. Gunakan bentuk boleh laksana bagi ENTRYPOINT atau CMD supaya aplikasi menerima isyarat henti masa jalan secara terus. Jika pembungkus diperlukan untuk persediaan, akhirinya dengan exec "$@". Periksa bekas yang sedang berjalan dan bukannya mempercayai Dockerfile semata-mata: sahkan PID 1, baris arahannya, hubungan induk-anak, dan isyarat henti yang dikonfigurasikan. Ujian peluncuran yang menghantar SIGTERM ke bekas merupakan semakan yang muktamad.

Mulakan mekanisme bangun sebelum memasang pengendali, dan pasang pengendali sebelum mengiklankan kesediaan. Lakaran berbentuk C boleh menggunakan self-pipe tidak menyekat (nonblocking self-pipe):

c
static volatile sig_atomic_t stop_requested = 0;
static int wake_fd; /* initialized as nonblocking before sigaction */

static void on_term(int signo) {
  int saved_errno = errno;
  stop_requested = 1;
  const unsigned char byte = 1;
  (void)write(wake_fd, &byte, sizeof byte);
  errno = saved_errno;
}

write adalah selamat-isyarat-tak-segerak. Deskriptor tidak menyekat menghalang pengendali daripada menunggu jika pemberitahuan telah memenuhi paip; bendera tersebut mengekalkan keadaan walaupun penulisan bangun tidak dapat menambah bait lain. Pengendali tidak melakukan log, memperuntukkan memori, mengunci, menunggu proses anak, atau memanggil klien aplikasi. Gelung peristiwa biasa menyalirkan paip dan memajukan mesin keadaan penutupan yang idempoten.

Alternatif untuk perkhidmatan berbilang benang adalah dengan menyekat isyarat penamatan sebelum mencipta benang pekerja, kemudian membiarkan satu benang khusus memanggil sigwait atau menggunakan signalfd pada Linux. Pelupusan isyarat (signal disposition) adalah di seluruh proses, manakala setiap benang mempunyai topeng isyaratnya (signal mask) sendiri. Isyarat yang ditujukan kepada proses boleh dihantar kepada mana-mana benang yang tidak menyekatnya. Pengendalian isyarat segerak berpusat mengeluarkan pengendali tak segerak daripada kod aplikasi, dengan syarat topeng isyarat ditetapkan secara konsisten sebelum benang bermula.

Jangan hanya bergantung pada panggilan sistem yang terganggu untuk membangkitkan perkhidmatan. Bergantung pada antara muka dan SA_RESTART, panggilan menyekat mungkin bersambung semula secara automatik atau mengembalikan EINTR. Self-pipe, deskriptor peristiwa, saluran isyarat masa jalan, atau benang isyarat khusus mewujudkan laluan bangun yang jelas. Setiap penantian menyekat dalam penutupan juga harus mempunyai tarikh akhir.

Pacu perkhidmatan melalui keadaan yang jelas:

text
RUNNING
  --SIGTERM--> QUIESCING
  --admission closed--> DRAINING
  --work finished or 25 s reached--> FINALIZING
  --children reaped and bounded flush complete--> EXITED

Peralihan daripada RUNNING mestilah atomik dan idempoten. SIGTERM pertama merekodkan masa mula dan tarikh akhir. SIGTERM kedua tidak sepatutnya memulakan graf pembersihan lain atau menutup sumber yang sama dua kali. Pasukan boleh memilih sama ada ia hanya merekodkan ulangan atau memendekkan penyaliran, tetapi tingkah laku tersebut mesti didokumenkan dan diuji.

Pada QUIESCING, buat kesediaan gagal dan segera hentikan kemasukan aplikasi baharu. Kubernetes menandakan titik akhir yang sedang ditamatkan sebagai tidak sedia, tetapi penyebaran satah kawalan dan proksi memerlukan masa. Tutup soket pendengar, lumpuhkan penerimaan (accepts), atau pastikan lapisan kemasukan mengembalikan respons yang boleh dicuba semula untuk permintaan yang belum melepasi sempadan kerja yang diterima. Sambungan diterima sedia ada boleh kekal terbuka untuk penyaliran. Kendalikan HTTP keep-alive secara eksplisit supaya sambungan lama yang melahu tidak boleh menghantar permintaan baharu tanpa had selepas penutupan bermula.

Hentikan pengguna latar belakang daripada mengambil tugas baharu pada sempadan yang sama. Untuk tugas yang telah dipajak, teruskan hanya apabila ia boleh selesai dengan selamat sebelum tarikh akhir. Jika tidak, hentikan degupan jantung atau lepaskan/nack pajakan menggunakan kontrak giliran supaya pekerja lain boleh mencuba semula. Perakuan mesti dibuat selepas penyelesaian yang tahan lama (durable completion). Kesan sampingan memerlukan kunci keidempotenan atau peralihan keadaan transaksi kerana penamatan paksa boleh berlaku selepas penulisan luaran dan sebelum perakuan.

Pada DRAINING, jejak kerja yang diterima dengan pembilang atau pendaftaran. Benarkan permintaan selesai sementara kebergantungannya kekal tersedia. Jangan tutup kolam pangkalan data, klien cache, atau pengeksport telemetri semasa pengendali permintaan masih menggunakannya. Pada tarikh akhir dalaman 25 saat, batalkan baki kerja mengikut protokol: hentikan penstriman, sebarkan pembatalan, kembalikan respons yang ditentukan jika boleh, dan biarkan keadaan yang boleh dicuba semula kekal konsisten. Simpan baki lima saat untuk panggilan balik pembatalan, penuaian proses anak, penulisan keadaan akhir, dan varians penjadualan masa jalan.

Bagi dua pekerja anak tersebut, hentikan input mereka terlebih dahulu, hantar isyarat penamatan yang dipersetujui, dan tunggu dengan tarikh akhir. Jika induk memiliki kumpulan proses khusus, ia boleh memberi isyarat kepada kumpulan tersebut sambil mengelakkan proses yang tidak berkaitan. Tuai setiap anak yang telah keluar dengan waitpid supaya tiada zombi yang tinggal. Init kecil boleh menyediakan pemajuan isyarat dan penuaian untuk bekas yang aplikasinya tidak dapat berbuat demikian, tetapi ia tidak mentakrifkan semantik tugas atau permintaan aplikasi.

Pada FINALIZING, pancarkan metrik penutupan akhir dan pam log atau surihan di bawah belanjawan masa yang ketat. Kebolehcerapan membantu menjelaskan penamatan paksa, namun bahagian belakang (backend) telemetri yang tidak tersedia tidak boleh menggunakan keseluruhan tempoh ihsan. Tutup baki sumber mengikut susunan kebergantungan dan kembalikan status keluar sifar untuk penutupan anggun yang selesai. Jika proses terlepas tarikh akhir platform, Kubernetes akhirnya meminta masa jalan menghantar SIGKILL; tiada pengendali, blok tertunda (deferred block), atau cangkuk penutupan yang berjalan selepas titik tersebut.

Gunakan isyarat sebagai pemberitahuan kawalan, bukan mesej kerja. Isyarat standard boleh bergabung, mengandungi muatan yang sedikit, dan mungkin tiba di lokasi kod yang tidak dijangka. Letakkan kerja, percubaan semula, dan pemilikan tahan lama dalam giliran atau stor keadaan. Isyarat hanya memulakan atau meningkatkan peralihan kitaran hayat tempatan.

Pengesahan harus menguji sempadan yang sama yang digunakan dalam pengeluaran:

  1. Bina imej sebenar, periksa PID 1, mulakan perkhidmatan, dan hantar SIGTERM ke bekas dan bukannya memanggil titik akhir penutupan dalaman.
  2. Pegang 200 permintaan dengan durasi bercampur, termasuk kerja yang selesai dalam masa 25 saat dan kerja yang mesti dibatalkan. Pastikan tiada permintaan baharu diterima selepas pemotongan dan setiap permintaan yang diterima mempunyai hasil akhir yang direkodkan.
  3. Sahkan kesediaan bertukar menjadi palsu dan Pod lama tidak menerima trafik peluncuran baharu selepas penyebaran titik akhir. Uji juga sambungan terus supaya kemasukan pendengar disahkan secara bebas.
  4. Jalankan tugas latar belakang yang dipajak merentasi penamatan. Sahkan kerja yang selesai diperakui sekali, kerja yang belum selesai layak untuk dicuba semula, dan penghantaran pendua tidak menduplikasi kesan perniagaan.
  5. Sahkan kedua-dua pekerja anak menerima penamatan, keluar mengikut tarikh akhir mereka, dan dituai. Periksa jadual proses untuk mengesan zombi.
  6. Hantar SIGTERM kedua dan buktikan pembersihan kekal idempoten. Hantar SIGKILL secara berasingan untuk membuktikan tiada pembersihan diandaikan dan kontrak pemulihan masih melindungi kerja yang tahan lama.
  7. Rekod shutdown_started, keadaan kemasukan, kiraan sedang diproses, pelanggaran tarikh akhir penyaliran, status anak, masa keluar, dan penamatan paksa. Gagalkan ujian jika keluar anggun mencapai 30 saat.

Contoh Jawapan Berkualiti Tinggi

"Saya akan bermula pada sempadan bekas. Saya akan menggunakan titik masuk bentuk exec dan memeriksa imej pada masa jalan untuk mengesahkan bahawa perkhidmatan HTTP ialah PID 1 atau berada di belakang init yang memajukan isyarat. Pembungkus cangkerang akan diakhiri dengan exec, jadi SIGTERM tidak akan berhenti pada cangkerang.

Sebelum kesediaan menjadi benar, perkhidmatan akan memasang laluan isyaratnya. Dalam pengendali C mentah, saya hanya akan menetapkan bendera sig_atomic_t dan menulis ke self-pipe tidak menyekat. Pengelogan, mutex, peruntukan memori, panggilan pangkalan data, dan penantian anak dijauhkan daripada pengendali tersebut. Dalam pelaksanaan berbilang benang, saya lebih suka menyekat isyarat penamatan sebelum mencipta pekerja dan menggunakannya daripada satu benang sigwait. Mana-mana reka bentuk ini membangkitkan gelung kawalan normal secara eksplisit dan bukannya bergantung pada EINTR.

SIGTERM pertama secara atomik memindahkan perkhidmatan daripada berjalan ke keadaan bertenang (quiescing) dan menetapkan tarikh akhir dalaman 25 saat kemudian. Perkhidmatan ini segera menggagalkan kesediaan, menutup atau melumpuhkan kemasukan baharu, menghalang sambungan keep-alive daripada memulakan lebih banyak permintaan, dan berhenti mengambil tugas latar belakang. Penyingkiran kesediaan dan penutupan kemasukan kedua-duanya perlu kerana penyebaran titik akhir adalah tak segerak.

200 permintaan yang diterima boleh diteruskan sementara pangkalan data dan klien cache mereka kekal terbuka. Saya menjejaki permintaan tersebut secara terus. Permintaan yang selesai sebelum 25 saat kembali seperti biasa. Pada tarikh akhir dalaman, saya membatalkan selebihnya melalui protokol aplikasi dan mengekalkan keadaan yang boleh dicuba semula. Bagi pengguna tugas, saya memperakui hanya penyelesaian yang tahan lama; tugas dipajak yang belum selesai dilepaskan atau dibiarkan tamat tempoh mengikut kontrak giliran, dan kesan sampingannya menggunakan kunci keidempotenan.

Saya kemudian menamatkan dua pekerja anak melalui laluan isyarat yang ditetapkan dan menuai mereka dengan penantian terikat. Hanya selepas pengguna permintaan dan pekerja anak tiada, barulah saya menutup klien yang dikongsi. Log dan surihan menerima belanjawan pengepaman terikat yang kecil. Laluan yang berjaya keluar dengan status sifar sebelum 30 saat. Jika tarikh akhir itu terlepas, SIGKILL boleh menamatkan proses dan tiada kod pembersihan akan dijalankan, jadi ketepatan yang tahan lama tidak boleh bergantung pada cangkuk akhir.

Untuk pengesahan, saya menjalankan bekas yang dibina dengan 200 permintaan serentak berdurasi bercampur dan tugas dipajak yang aktif, kemudian menghantar SIGTERM kepadanya. Saya memastikan proses sebenar menerima isyarat, kesediaan bertukar, tiada kerja baharu melepasi sempadan kemasukan, kerja yang diterima selesai atau dibatalkan secara eksplisit menjelang 25 saat, tugas yang belum selesai boleh dicuba semula tanpa kesan pendua, kedua-dua pekerja anak dituai, dan proses keluar sebelum 30 saat. Saya juga menguji SIGTERM berulang untuk keidempotenan dan SIGKILL untuk tingkah laku pemulihan. Papan pemuka peluncuran harus memaparkan durasi penutupan, kerja yang sedang diproses, pelanggaran tarikh akhir, dan penamatan paksa."

Kesilapan Lazim

  • Melakukan pembersihan di dalam pengendali mentah → Isyarat boleh mengganggu kod semasa kunci pustaka atau keadaan peruntuk sedang aktif → Terbitkan pemberitahuan selamat-isyarat yang minimum dan lakukan pembersihan pada laluan kawalan normal.
  • Mengandaikan aplikasi menerima SIGTERM Titik masuk bentuk cangkerang boleh mengekalkan cangkerang sebagai PID 1 → Gunakan bentuk exec atau pembungkus yang berakhir dengan exec, kemudian uji bekas yang dibina.
  • Menganggap kegagalan kesediaan sebagai penutupan kemasukan → Kemas kini titik akhir memerlukan masa dan sambungan terus atau sedia ada mungkin masih menghantar kerja → Gagalkan kesediaan dan kuasakan pemotongan pendengar/kemasukan aplikasi.
  • Menutup klien kongsi terlebih dahulu → Pengendali yang sedang diproses boleh gagal selepas kemasukan walaupun mereka mempunyai masa untuk selesai → Salirkan pengguna sebelum menutup sumber yang mereka perlukan.
  • Menghentikan pengguna tugas tanpa menyemak pajakan → Kerja mungkin kekal tidak kelihatan, diperakui terlalu awal, atau mengulangi kesan sampingan → Ikuti kontrak perakuan, pajakan, percubaan semula, dan keidempotenan secara eksplisit.
  • Menunggu selama-lamanya untuk penyaliran yang sempurna → Pengatur akhirnya akan menghantar SIGKILL dan membuang semua peluang pembersihan → Gunakan tarikh akhir dalaman dengan masa yang disimpan untuk pemuktamadan.
  • Melupakan pemilikan anak → Anak boleh hidup lebih lama daripada induk untuk seketika atau menjadi zombi apabila tidak dituai → Majukan penamatan secara sengaja dan gunakan gelung waitpid terikat.
  • Memulakan pembersihan dua kali pada isyarat berulang → Operasi tutup dan pam pendua boleh berlumba (race) atau ranap → Jadikan peralihan keadaan atomik dan pembersihan idempoten.
  • Menggunakan isyarat standard sebagai giliran arahan → Isyarat standard tertangguh yang serupa boleh bergabung dan tidak membawa pemilikan yang tahan lama → Simpan kerja dan percubaan semula dalam giliran; gunakan isyarat hanya untuk kawalan kitaran hayat.
  • Hanya menguji kaedah penutupan dalaman → Ia memintas susun atur PID, penghantaran isyarat masa jalan, dan tingkah laku orkestrasi → Hantar isyarat sebenar kepada imej pengeluaran di bawah beban kerja serentak yang realistik.

Soalan Susulan dan Maklum Balas

Susulan 1: Mengapakah pengendali isyarat tidak boleh memanggil fungsi penutupan normal?

Pengendali boleh mengganggu program semasa benang lain atau benang yang terganggu memegang kunci peruntuk, stdio, pengelogan, atau aplikasi. Kebanyakan fungsi pembersihan aplikasi bukan selamat-isyarat-tak-segerak. Memanggilnya boleh menyebabkan kebuntuan atau merosakkan keadaan dalaman. Pengendali harus menetapkan bendera dan menggunakan operasi bangun yang selamat-isyarat; gelung peristiwa atau benang isyarat khusus akan memanggil kod penutupan normal selepas itu.

Susulan 2: Bagaimanakah isyarat bertindak dalam proses berbilang benang?

Pelupusan isyarat dikongsi oleh proses, tetapi setiap benang mempunyai topeng isyaratnya sendiri. Isyarat yang ditujukan kepada proses boleh dihantar kepada mana-mana benang yang layak dan tidak disekat. Satu corak yang teguh menyekat isyarat penamatan sebelum pekerja dicipta dan membiarkan satu benang menerimanya secara segerak dengan sigwait atau signalfd. Satu lagi corak menggunakan pengendali seluruh proses yang minimum yang hanya menghantar pemberitahuan selamat. Topeng yang bercampur dan tidak konsisten menjadikan tingkah laku lebih sukar untuk dianalisis.

Susulan 3: Apakah perbezaan praktikal antara SIGTERM dan SIGKILL di sini?

SIGTERM meminta penamatan dan memberi peluang kepada aplikasi untuk menjalankan protokolnya kerana ia boleh ditangkap. Tindakan lalainya tetap menamatkan proses. SIGKILL ialah penamatan yang dikuatkuasakan oleh kernel: ia tidak boleh ditangkap, disekat, atau diabaikan, dan tiada pembersihan yang dijalankan. Tempoh ihsan hanya bernilai jika laluan SIGTERM boleh dicapai, selamat, dan terikat.

Susulan 4: Mengapa perlu menggagalkan kesediaan dan juga menutup kemasukan?

Perubahan kesediaan memberitahu Kubernetes dan proksinya untuk berhenti menghalakan trafik, tetapi kemas kini titik akhir dan penyaliran sambungan adalah tak segerak. Sambungan terus atau keep-alive sedia ada mungkin masih sampai ke proses. Pemotongan aplikasi mentakrifkan titik tepat selepas mana kerja baharu tidak boleh masuk, manakala kesediaan mengeluarkan Pod daripada penghalaan normal. Pengesahan perlu memerhatikan kedua-dua lapisan ini.

Susulan 5: Apakah yang patut berlaku kepada tugas yang separuh siap?

Gunakan kontrak pemilikan tugas tersebut. Teruskan hanya jika ia boleh selesai dengan selamat sebelum tarikh akhir dalaman. Jika tidak, hentikan atau lepaskan pajakannya supaya ia boleh dicuba semula, dan elakkan memperakuinya sebelum penyelesaian yang tahan lama dicapai. Kesan sampingan luaran memerlukan kunci keidempotenan atau peralihan keadaan transaksi kerana penamatan boleh berlaku antara kesan sampingan dan perakuan.

Susulan 6: Apakah yang berubah apabila cangkuk preStop wujud?

Cangkuk tersebut menggunakan tempoh ihsan penamatan Pod yang sama. Ukur durasi kes terburuknya dan tolak daripada belanjawan aplikasi. Pastikan cangkuk tersebut terikat dan elakkan menduplikasi pembersihan aplikasi dalam dua laluan yang bersaing. Aplikasi masih mesti mengendalikan SIGTERM, kerana cangkuk boleh gagal dan proses boleh menerima isyarat di luar peluncuran normal.

Susulan 7: Bagaimanakah anda menyiasat penamatan paksa dalam pengeluaran?

Hubung kaitkan sebab penamatan Pod dan cap masa dengan masa mula penutupan aplikasi, kiraan kerja yang sedang diproses, pajakan tugas, status anak, dan keadaan penutupan terakhir yang selesai. Asingkan penghantaran isyarat yang hilang daripada penyaliran yang perlahan, anak yang tersekat, atau pengepaman akhir yang disekat. Jejak durasi penutupan anggun dan kadar penamatan paksa mengikut versi supaya regresi dapat dikesan semasa peluncuran kenari (canary rollout).

Sumber awam

Soalan berkaitan