Kontainer sidecar mengintersepsi permintaan yang diterima oleh aplikasi mesh, sehingga pemeriksaan kesehatan HTTP dan TCP untuk aplikasi yang disuntikkan sidecar di Alibaba Cloud Service Mesh (ASM) dapat berperilaku tidak terduga, seperti kegagalan konsisten pada pemeriksaan kesehatan HTTP. Aktifkan pengalihan pemeriksaan kesehatan agar pemeriksaan tersebut berfungsi sebagaimana mestinya.
Informasi latar belakang
Tabel berikut menjelaskan perilaku tidak terduga dari pemeriksaan kesehatan HTTP dan TCP untuk aplikasi dalam mesh. Untuk memulihkan pemeriksaan kesehatan tersebut, tambahkan anotasi guna mengaktifkan pengalihan pemeriksaan kesehatan.
|
Type |
Description |
|
HTTP health checks |
Dalam kluster Kubernetes, kubelet mengirimkan permintaan pemeriksaan kesehatan untuk semua Pod. Setelah mode mutual TLS (mTLS) diaktifkan, aplikasi dalam mesh harus berkomunikasi melalui TLS. Kubelet bukan bagian dari mesh dan karena itu tidak memiliki sertifikat yang dikeluarkan ASM untuk aplikasi. Akibatnya, permintaan pemeriksaan kesehatan HTTP ditolak dan pemeriksaan kesehatan tersebut gagal secara konsisten. |
|
TCP health checks |
Untuk mengintersepsi permintaan, sidecar mendengarkan pada semua port Pod aplikasi dalam mesh. Selama pemeriksaan kesehatan TCP, kubelet menentukan status kesehatan aplikasi dengan memeriksa apakah aplikasi mendengarkan pada port yang dikonfigurasi untuk Pod aplikasi tersebut. Karena alasan ini, pemeriksaan kesehatan selalu berhasil selama sidecar disuntikkan ke dalam aplikasi dan sidecar tersebut berjalan, terlepas dari kondisi aktual aplikasi. Sebagai contoh, jika Anda mengonfigurasi port yang salah untuk aplikasi, pemeriksaan kesehatan Pod seharusnya selalu gagal dan membuat Pod tetap dalam status not-ready, tetapi pemeriksaan kesehatan tersebut justru berhasil. |
Jika Anda tidak mengaktifkan mode mTLS di ASM, Anda dapat menggunakan pemeriksaan kesehatan HTTP pada Pod aplikasi tanpa perlu mengonfigurasi pengalihan pemeriksaan kesehatan.
Secara default, graf topologi mesh menampilkan panggilan permintaan pemeriksaan kesehatan layanan aplikasi. Dalam banyak skenario, panggilan ini dapat mengganggu statistik trafik. Aktifkan pengalihan pemeriksaan kesehatan untuk aplikasi dalam mesh guna menghapus panggilan pemeriksaan kesehatan internal ini dari statistik.
Cara kerja pengalihan pemeriksaan kesehatan
Pengalihan pemeriksaan kesehatan dikendalikan oleh satu anotasi pada templat Pod suatu workload. Tambahkan sidecar.istio.io/rewriteAppHTTPProbers: "true" di bawah template.metadata.annotations, lalu terapkan workload tersebut. ASM menulis ulang pemeriksaan kesehatan yang dikonfigurasi untuk kontainer aplikasi sebagai pemeriksaan kesehatan HTTP pada port 15020.
Untuk aplikasi dalam mesh, port 15020 merupakan port khusus yang digunakan untuk observabilitas mesh. Trafik yang dikirim ke port ini tidak diintersepsi oleh sidecar dan karenanya tidak perlu memenuhi persyaratan mode TLS. Setelah pengalihan pemeriksaan kesehatan diaktifkan, layanan pilot-agent yang berjalan di kontainer sidecar mendengarkan pada port 15020 dan menerima pemeriksaan kesehatan dari kubelet. Berdasarkan konfigurasi pemeriksaan kesehatan dalam variabel lingkungan ISTIO_KUBE_APP_PROBERS, layanan pilot-agent meneruskan permintaan pemeriksaan kesehatan ke kontainer aplikasi. Dengan cara ini, pemeriksaan kesehatan HTTP berjalan sebagaimana mestinya.
Untuk pemeriksaan kesehatan TCP, pengalihan pemeriksaan kesehatan di ASM melakukan pemrosesan serupa dan menulis ulangnya sebagai pemeriksaan kesehatan HTTP pada port 15020. Berdasarkan konfigurasi pemeriksaan kesehatan TCP dalam variabel lingkungan ISTIO_KUBE_APP_PROBERS, layanan pilot-agent melakukan probing terhadap port pemeriksaan kesehatan TCP yang dikonfigurasi untuk kontainer aplikasi. Jika pemeriksaan kesehatan TCP aktual gagal, layanan pilot-agent mengembalikan kode status 500 untuk menunjukkan bahwa pemeriksaan kesehatan tersebut gagal.
Prasyarat
-
Aplikasi telah ditambahkan ke ASM dan sidecar telah disuntikkan ke dalam Pod aplikasi.
-
kubectl telah terhubung ke kluster tempat aplikasi berjalan. Untuk petunjuknya, lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Aktifkan pengalihan pemeriksaan kesehatan HTTP
Contoh berikut menggunakan aplikasi Nginx untuk mengaktifkan pengalihan pemeriksaan kesehatan HTTP. Setelah mode mTLS diaktifkan, pemeriksaan kesehatan HTTP yang dikonfigurasi untuk aplikasi Nginx gagal secara konsisten. Pengalihan pemeriksaan kesehatan kemudian diaktifkan untuk aplikasi Nginx tersebut. Jika event Pod tidak mencantumkan kegagalan pemeriksaan kesehatan dan Pod berada dalam status ready, berarti pengalihan pemeriksaan kesehatan HTTP telah berhasil diaktifkan untuk aplikasi tersebut.
Langkah 1: Aktifkan mode mTLS STRICT untuk namespace
Konfigurasikan mode mTLS pada halaman PeerAuthentication instans ASM target di Konsol ASM. Mode mTLS yang Anda konfigurasi dalam langkah ini berlaku untuk namespace yang Anda pilih.
-
Masuk ke Konsol ASM.
-
Di panel navigasi sebelah kiri, pilih .
-
Pada halaman Mesh Management, temukan instans ASM yang ingin Anda konfigurasi. Klik nama instans ASM tersebut atau klik Manage di kolom Actions.
-
Pada halaman detail instans ASM, pilih di panel navigasi sebelah kiri.
-
Di bagian atas halaman PeerAuthentication, pilih namespace, lalu klik Configure Global mTLS Mode.
-
Di panel Configure Global mTLS Mode, atur mTLS Mode (Namespace-wide) menjadi STRICT - Strictly Enforce mTLS, lalu klik Create.
Langkah 2: Sebarkan aplikasi Nginx
-
Sebarkan aplikasi Nginx.
-
Buat file bernama http-liveness.yaml dengan konten berikut.
Di bawah parameter readinessProbe, bidang httpGet mendefinisikan pemeriksaan kesehatan HTTP untuk aplikasi.
-
Jalankan perintah berikut untuk menyebarkan aplikasi Nginx.
kubectl apply -f http-liveness.yaml
-
-
Lihat status pemeriksaan kesehatan aplikasi.
-
Jalankan perintah berikut untuk melihat nama Pod aplikasi Nginx.
kubectl get pod | grep nginx -
Jalankan perintah berikut untuk melihat event Pod.
kubectl describe pod <pod_name>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 Pod gagal, sehingga Pod tetap dalam status not-ready.
-
Langkah 3: Aktifkan pengalihan pemeriksaan kesehatan untuk aplikasi Nginx
-
Jalankan perintah berikut untuk mengedit file http-liveness.yaml.
vim http-liveness.yamlTambahkan konten berikut di bawah parameter
template:annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true"Kode berikut menunjukkan isi file http-liveness.yaml setelah anotasi ditambahkan:
-
Jalankan perintah berikut untuk menyebarkan aplikasi Nginx.
kubectl apply -f http-liveness.yaml
Langkah 4: Verifikasi hasil pemeriksaan kesehatan
-
Lihat status pemeriksaan kesehatan Pod.
-
Jalankan perintah berikut untuk melihat nama Pod aplikasi Nginx.
kubectl get pod | grep nginx -
Jalankan perintah berikut untuk melihat event Pod.
kubectl describe pod <pod_name>Output tidak mencantumkan event kegagalan pemeriksaan kesehatan dan Pod berada dalam status ready. Pemeriksaan kesehatan HTTP berfungsi sebagaimana mestinya.
-
-
Jalankan perintah berikut untuk melihat file YAML Pod setelah pengalihan pemeriksaan kesehatan diaktifkan.
kubectl get pod <pod_name> -o yamlSetelah pengalihan pemeriksaan kesehatan diaktifkan, port pemeriksaan kesehatan berubah dari 80 menjadi 15020, dan path pemeriksaan kesehatan berubah dari /index.html menjadi /app-health/nginx/readyz. Variabel lingkungan
ISTIO_KUBE_APP_PROBERSjuga ditambahkan ke kontainer sidecar dalam Pod. Nilai variabel tersebut merupakan serialisasi JSON dari konfigurasi pemeriksaan kesehatan sebelum ditulis ulang.
Aktifkan pengalihan pemeriksaan kesehatan TCP
Contoh berikut menggunakan aplikasi Nginx untuk mengaktifkan pengalihan pemeriksaan kesehatan TCP. Prosedurnya sama dengan prosedur untuk pengalihan pemeriksaan kesehatan HTTP. Hanya konfigurasi probe dan hasil yang diharapkan yang berbeda. Port yang salah dikonfigurasi untuk aplikasi Nginx, tetapi pemeriksaan kesehatan TCP tetap berhasil pada Pod aplikasi, yang tidak sesuai ekspektasi. Setelah Anda mengaktifkan pengalihan pemeriksaan kesehatan untuk aplikasi Nginx, pemeriksaan kesehatan TCP gagal pada Pod aplikasi, yang sesuai ekspektasi dan menunjukkan bahwa pengalihan pemeriksaan kesehatan TCP telah diaktifkan untuk aplikasi tersebut.
Langkah 1: Sebarkan aplikasi Nginx
-
Sebarkan aplikasi Nginx.
-
Buat file bernama tcp-liveness.yaml dengan konten berikut.
Konten berikut mengonfigurasi port 2940 sebagai port pemeriksaan kesehatan, yang salah. Aplikasi Nginx tidak mendengarkan pada port 2940. Oleh karena itu, pemeriksaan kesehatan seharusnya selalu gagal setelah aplikasi disebarkan dan membuat Pod tetap dalam status not-ready.
Di bawah parameter readinessProbe, bidang tcpSocket mendefinisikan pemeriksaan kesehatan TCP untuk aplikasi.
-
Jalankan perintah berikut untuk menyebarkan aplikasi Nginx.
kubectl apply -f tcp-liveness.yaml
-
-
Lihat status pemeriksaan kesehatan aplikasi.
-
Jalankan perintah berikut untuk melihat nama Pod aplikasi Nginx.
kubectl get pod | grep nginx -
Jalankan perintah berikut untuk melihat event Pod.
kubectl describe pod <pod_name>Output tidak mencantumkan event kegagalan pemeriksaan kesehatan dan Pod berada dalam status ready, yang tidak sesuai ekspektasi.
-
Langkah 2: Aktifkan pengalihan pemeriksaan kesehatan untuk aplikasi Nginx
-
Jalankan perintah berikut untuk mengedit file tcp-liveness.yaml.
vim tcp-liveness.yamlDalam file tcp-liveness.yaml, tambahkan konten berikut di bawah parameter
template:annotations: sidecar.istio.io/rewriteAppHTTPProbers: "true"Kode berikut menunjukkan isi file tcp-liveness.yaml setelah anotasi ditambahkan:
-
Jalankan perintah berikut untuk menyebarkan aplikasi Nginx.
kubectl apply -f tcp-liveness.yaml
Langkah 3: Verifikasi hasil pemeriksaan kesehatan
-
Lihat status pemeriksaan kesehatan aplikasi.
-
Jalankan perintah berikut untuk melihat nama Pod aplikasi Nginx.
kubectl get pod | grep nginx -
Jalankan perintah berikut untuk melihat event Pod.
kubectl describe pod <pod_name>Output yang diharapkan:
Warning Unhealthy 45s kubelet Readiness probe failed: HTTP probe failed with statuscode: 500Output tersebut menunjukkan bahwa pemeriksaan kesehatan gagal, yang sesuai ekspektasi.
-
-
Jalankan perintah berikut untuk melihat konten YAML Pod aplikasi setelah pengalihan pemeriksaan kesehatan diaktifkan.
kubectl get pod <pod_name> -o yamlSetelah pengalihan pemeriksaan kesehatan diaktifkan, pemeriksaan kesehatan TCP asli ditulis ulang sebagai pemeriksaan kesehatan HTTP. Port pemeriksaan kesehatan berubah dari 2940 menjadi 15020, dan path pemeriksaan kesehatan HTTP diatur ke /app-health/nginx/readyz. Variabel lingkungan
ISTIO_KUBE_APP_PROBERSjuga ditambahkan ke kontainer sidecar dalam Pod. Nilai variabel tersebut merupakan serialisasi JSON dari konfigurasi pemeriksaan kesehatan TCP sebelum ditulis ulang.