Setelah menambahkan aplikasi ke instance Service Mesh (ASM), proxy sidecar disuntikkan ke dalam pod aplikasi. Proxy ini mengintersep semua permintaan yang dikirim ke aplikasi. Jika Anda mengaktifkan pemeriksaan kesehatan HTTP atau TCP, pemeriksaan tersebut mungkin tidak berfungsi sebagaimana mestinya, misalnya selalu gagal. Topik ini menjelaskan cara mengonfigurasi pengalihan permintaan pemeriksaan kesehatan HTTP atau TCP untuk aplikasi dalam instance ASM.
Informasi latar belakang
Pemeriksaan kesehatan TCP atau HTTP untuk aplikasi dalam instance ASM dapat mengalami masalah tertentu. Untuk menyelesaikan masalah ini, Anda perlu mengonfigurasi pengalihan permintaan pemeriksaan kesehatan menggunakan anotasi.
Tipe | Deskripsi |
Permintaan pemeriksaan kesehatan HTTP | Layanan kubelet mengirimkan permintaan pemeriksaan kesehatan ke pod dalam kluster Kubernetes. Jika Anda mengaktifkan keamanan transport layer mutual (mTLS) untuk instance ASM, aplikasi dalam instance ASM harus menggunakan TLS untuk berkomunikasi satu sama lain. Layanan kubelet bukan bagian dari instance ASM. Akibatnya, layanan kubelet tidak dapat menyediakan sertifikat TLS yang diterbitkan oleh ASM. Dalam kasus ini, semua permintaan pemeriksaan kesehatan HTTP ditolak oleh aplikasi, dan pemeriksaan kesehatan selalu gagal. Catatan Jika Anda tidak mengaktifkan mTLS untuk instance ASM, pemeriksaan kesehatan HTTP dapat berhasil dilakukan pada pod aplikasi. Dalam kasus ini, Anda dapat mengaktifkan pemeriksaan kesehatan HTTP untuk aplikasi tanpa perlu mengonfigurasi pengalihan permintaan pemeriksaan kesehatan. |
Permintaan pemeriksaan kesehatan TCP | Proxy sidecar mendengarkan semua port pod dalam instance ASM untuk mengintersep permintaan. Jika Anda mengaktifkan pemeriksaan kesehatan TCP untuk aplikasi, layanan kubelet memeriksa apakah port tertentu dari pod didengarkan oleh aplikasi. Jika ya, pemeriksaan kesehatan berhasil. Jika proxy sidecar disuntikkan ke dalam pod dan bekerja seperti yang diharapkan, pemeriksaan kesehatan selalu berhasil terlepas dari apakah aplikasi sehat. Sebagai contoh, jika Anda mengonfigurasi port yang tidak valid untuk aplikasi, pemeriksaan kesehatan seharusnya gagal, dan pod seharusnya tidak siap. Namun, pemeriksaan kesehatan selalu berhasil untuk pod tersebut. |
Secara default, panggilan permintaan pemeriksaan kesehatan untuk aplikasi dalam instance ASM ditampilkan dalam topologi mesh. Namun, jika pemeriksaan kesehatan tidak berfungsi dengan benar, statistik lalu lintas dapat menjadi tidak akurat. Untuk memastikan statistik lalu lintas tetap akurat, konfigurasikan pengalihan permintaan pemeriksaan kesehatan.
Konfigurasikan pengalihan permintaan pemeriksaan kesehatan HTTP
Dalam contoh ini, aplikasi NGINX digunakan. Setelah mengaktifkan mTLS untuk instance ASM tempat aplikasi NGINX berada, pemeriksaan kesehatan HTTP untuk aplikasi NGINX selalu gagal. Dalam kasus ini, Anda dapat mengonfigurasi pengalihan permintaan pemeriksaan kesehatan untuk aplikasi NGINX. Kemudian, periksa peristiwa pod aplikasi NGINX. Jika tidak ada peristiwa yang menunjukkan pemeriksaan kesehatan gagal dan pod siap, pengalihan permintaan pemeriksaan kesehatan berhasil diterapkan.
Langkah 1: Aktifkan mode mTLS global untuk instance ASM
Masuk ke Konsol ASM.
Di panel navigasi di sebelah kiri, pilih .
Pada halaman Mesh Management, temukan instance ASM yang ingin dikonfigurasi. Klik nama instance ASM atau pilih Manage di kolom Actions.
Pada halaman detail instance ASM, pilih di panel navigasi di sebelah kiri.
Di bagian atas halaman PeerAuthentication, pilih namespace dari daftar drop-down Namespace dan klik Configure Global mTLS Mode.
Pada halaman Configure Global mTLS Mode, pilih STRICT -Strictly Enforce mTLS untuk parameter mTLS Mode (Namespace-wide) dan klik Create.
Langkah 2: Deploy aplikasi NGINX
Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.
Deploy aplikasi NGINX.
Buat file http-liveness.yaml dengan konten berikut:
Bidang httpGet dalam bidang readinessProbe ditentukan untuk mengaktifkan pemeriksaan kesehatan HTTP untuk aplikasi NGINX.
Jalankan perintah berikut untuk mendeploy aplikasi NGINX:
kubectl apply -f http-liveness.yaml
Lihat hasil pemeriksaan kesehatan aplikasi NGINX.
Jalankan perintah berikut untuk melihat nama pod yang menjalankan aplikasi NGINX:
kubectl get pod| grep nginxJalankan perintah berikut untuk melihat peristiwa pod:
kubectl describe pod <Nama Pod>Output yang Diharapkan:
Warning Unhealthy 45s kubelet Readiness probe failed: Get "http://172.23.64.22:80/index.html": read tcp 172.23.64.1:54130->172.23.64.22:80: read: connection reset by peerOutput tersebut menunjukkan bahwa pemeriksaan kesehatan HTTP untuk pod gagal. Dalam kasus ini, pod tidak siap.
Langkah 3: Konfigurasikan pengalihan permintaan pemeriksaan kesehatan untuk aplikasi NGINX
Jalankan perintah berikut untuk membuka file http-liveness.yaml:
vim http-liveness.yamlTambahkan konten berikut ke bidang
template:annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true"Kode berikut menunjukkan contoh file http-liveness.yaml setelah menambahkan anotasi:
Jalankan perintah berikut untuk mendeploy aplikasi NGINX:
kubectl apply -f http-liveness.yaml
Langkah 4: Verifikasi bahwa hasil pemeriksaan kesehatan sesuai dengan harapan Anda
Lihat hasil pemeriksaan kesehatan pod.
Jalankan perintah berikut untuk melihat nama pod yang menjalankan aplikasi NGINX:
kubectl get pod| grep nginxJalankan perintah berikut untuk melihat peristiwa pod:
kubectl describe pod <Nama Pod>Dalam output perintah, tidak ada peristiwa yang menunjukkan pemeriksaan kesehatan gagal untuk pod. Pod siap, menunjukkan bahwa pengalihan permintaan pemeriksaan kesehatan HTTP berhasil diterapkan.
Jalankan perintah berikut untuk melihat file YAML pod setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan:
kubectl get pod nginx-deployment-676f85f66b-7vxct -o yamlSetelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, port pemeriksaan kesehatan diubah dari port 80 menjadi port 15020, dan jalur pemeriksaan kesehatan diubah dari /index.html menjadi /app-health/nginx/readyz. Selain itu, variabel lingkungan bernama
ISTIO_KUBE_APP_PROBERSditambahkan ke kontainer sidecar pod. Nilai variabel lingkungan ini diserialisasi dari konfigurasi pemeriksaan kesehatan asli dalam format JSON.Untuk aplikasi yang diterapkan dalam ASM, port 15020 digunakan secara eksklusif untuk observabilitas ASM. Permintaan yang dikirim ke port 15020 tidak diintersep oleh proxy sidecar. Oleh karena itu, permintaan pemeriksaan kesehatan tidak terpengaruh oleh persyaratan mode mTLS. Setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, layanan pilot-agent yang berjalan di kontainer sidecar mendengarkan port 15020. Layanan pilot-agent menerima permintaan pemeriksaan kesehatan dari layanan kubelet dan mengarahkan ulang permintaan ini ke kontainer aplikasi berdasarkan nilai variabel lingkungan
ISTIO_KUBE_APP_PROBERS. Ini memastikan bahwa pemeriksaan kesehatan HTTP berfungsi sesuai harapan.
Konfigurasikan pengalihan permintaan pemeriksaan kesehatan TCP
Dalam contoh ini, aplikasi NGINX digunakan, dan port yang tidak valid dikonfigurasi untuk aplikasi NGINX. Jika Anda mengaktifkan pemeriksaan kesehatan TCP untuk aplikasi NGINX, pemeriksaan kesehatan TCP yang seharusnya gagal selalu berhasil untuk aplikasi. Setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, pemeriksaan kesehatan TCP untuk pod gagal. Ini menunjukkan bahwa pengalihan permintaan pemeriksaan kesehatan TCP berhasil diterapkan untuk aplikasi NGINX.
Langkah 1: Deploy aplikasi NGINX
Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.
Deploy aplikasi NGINX.
Buat file tcp-liveness.yaml dengan konten berikut:
Port 2940 dikonfigurasi sebagai port pemeriksaan kesehatan untuk aplikasi NGINX. Namun, aplikasi NGINX tidak mendengarkan port 2940. Dalam kondisi normal, pemeriksaan kesehatan gagal untuk aplikasi NGINX, dan pod tidak siap.
Bidang tcpSocket dalam bidang readinessProbe ditentukan untuk mengaktifkan pemeriksaan kesehatan TCP untuk aplikasi NGINX.
Jalankan perintah berikut untuk mendeploy aplikasi NGINX:
kubectl apply -f tcp-liveness.yaml
Lihat hasil pemeriksaan kesehatan aplikasi NGINX.
Jalankan perintah berikut untuk melihat nama pod yang menjalankan aplikasi NGINX:
kubectl get pod| grep nginxJalankan perintah berikut untuk melihat peristiwa pod:
kubectl describe pod <Nama Pod>Dalam output perintah, tidak ada peristiwa yang menunjukkan pemeriksaan kesehatan gagal. Dalam kasus ini, pod siap. Ini tidak sesuai dengan harapan Anda.
Langkah 2: Konfigurasikan pengalihan permintaan pemeriksaan kesehatan untuk aplikasi NGINX
Jalankan perintah berikut untuk mengedit file tcp-liveness.yaml:
vim tcp-liveness.yamlTambahkan konten berikut ke bidang
templatedalam file tcp-liveness.yaml:annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true"Kode berikut menunjukkan contoh file tcp-liveness.yaml setelah menambahkan anotasi:
Jalankan perintah berikut untuk mendeploy aplikasi NGINX:
kubectl apply -f tcp-liveness.yaml
Langkah 3: Verifikasi bahwa hasil pemeriksaan kesehatan sesuai dengan harapan Anda
Lihat hasil pemeriksaan kesehatan aplikasi NGINX.
Jalankan perintah berikut untuk melihat nama pod yang menjalankan aplikasi NGINX:
kubectl get pod| grep nginxJalankan perintah berikut untuk melihat peristiwa pod:
kubectl describe pod <Nama Pod>Output yang Diharapkan:
Warning Unhealthy 45s kubelet Readiness probe failed: HTTP probe failed with statuscode: 500Output tersebut menunjukkan bahwa pemeriksaan kesehatan TCP untuk pod gagal. Ini sesuai dengan harapan Anda.
Jalankan perintah berikut untuk melihat file YAML pod setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan:
kubectl get pod nginx-deployment-746458cdc9-m9t9q -o yamlSetelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, permintaan TCP asli diubah menjadi permintaan HTTP. Port pemeriksaan kesehatan juga diubah dari port 80 menjadi port 15020, serta jalur /app-health/nginx/readyz secara otomatis ditambahkan untuk pemeriksaan kesehatan HTTP. Variabel lingkungan bernama
ISTIO_KUBE_APP_PROBERSditambahkan ke kontainer sidecar pod, dengan nilainya diserialisasi dari konfigurasi pemeriksaan kesehatan TCP asli dalam format JSON.Port 15020 digunakan untuk menerima permintaan pemeriksaan kesehatan HTTP yang telah dikonversi, serupa dengan konfigurasi pengalihan untuk permintaan tersebut. Setelah mengonfigurasi pengalihan permintaan pemeriksaan kesehatan, layanan pilot-agent yang berjalan di kontainer sidecar akan mendengarkan port 15020. Layanan ini menerima permintaan pemeriksaan kesehatan dari layanan kubelet dan memeriksa status port pemeriksaan kesehatan TCP yang dikonfigurasikan untuk kontainer aplikasi berdasarkan nilai variabel lingkungan
ISTIO_KUBE_APP_PROBERS. Jika pemeriksaan kesehatan TCP gagal, layanan pilot-agent akan mengembalikan kode status 500, yang menunjukkan bahwa pemeriksaan kesehatan tidak berhasil.