Topik ini menjelaskan cara mendiagnosis dan memecahkan masalah layanan LoadBalancer.
Informasi latar belakang
Saat Anda mengatur tipe layanan menjadi Type=LoadBalancer, komponen ACK Cloud Controller Manager (CCM) secara otomatis membuat atau mengonfigurasi instans Alibaba Cloud Classic Load Balancer (CLB) untuk layanan tersebut. Ini mencakup sumber daya seperti instans CLB, pendengar (listener), dan kelompok server backend. Untuk informasi lebih lanjut tentang kebijakan pembaruan otomatis untuk CLB, lihat Catatan tentang konfigurasi Server Load Balancer untuk layanan.
Proses diagnosis
Pastikan versi komponen CCM Anda adalah V1.9.3.276-g372aa98-aliyun atau yang lebih baru. Untuk informasi lebih lanjut tentang cara memperbarui komponen CCM, lihat Perbarui komponen CCM. Untuk catatan rilis CCM, lihat Cloud Controller Manager.
Jalankan perintah berikut untuk mengidentifikasi layanan yang terkait dengan instans CLB.
kubectl get svc -A |grep -i LoadBalancer|grep {XXX.XXX.XXX.XXX} # XXX.XXX.XXX.XXX adalah alamat IP load balancer.Jalankan perintah berikut untuk memeriksa apakah layanan memiliki event kesalahan.
kubectl -n {your-namespace} describe svc {your-svc-name}Jika terdapat event kesalahan, lihat Event kesalahan layanan dan solusinya.
Jika tidak ada event kesalahan, lihat Metode pemecahan masalah.
Event kesalahan layanan dan solusinya
Tabel berikut menjelaskan solusi untuk berbagai pesan kesalahan.
Pesan kesalahan | Deskripsi dan solusi |
| Jumlah server backend untuk instans CLB telah mencapai batas kuota. Solusi: Optimalkan penggunaan kuota Anda dengan salah satu cara berikut:
|
| Instans CLB bersama tidak mendukung ENI. Solusi: Jika backend CLB menggunakan ENI, Anda harus memilih instans CLB berkinerja tinggi. Anda dapat menambahkan anotasi Penting Pastikan anotasi tersebut kompatibel dengan versi CCM Anda. Untuk informasi lebih lanjut tentang pemetaan antara anotasi dan versi CCM, lihat Gunakan anotasi untuk mengonfigurasi instans Classic Load Balancer (CLB). |
| Instans CLB tidak memiliki server backend. Periksa apakah layanan dikaitkan dengan pod dan apakah pod berjalan sebagaimana mestinya. Solusi:
|
| Instans CLB tidak dapat dikaitkan berdasarkan layanan. Solusi: Masuk ke Konsol Server Load Balancer. Di wilayah tempat layanan berada, cari instans CLB berdasarkan
|
| Akun Anda memiliki pembayaran tertunda. |
| Saldo akun Anda tidak mencukupi. |
| OpenAPI CLB sedang mengalami pengendalian aliran. Solusi:
|
| Pendengar yang terkait dengan kelompok vServer tidak dapat dihapus. Solusi:
|
| Kesalahan ini terjadi jika Anda menggunakan kembali instans CLB akses internal yang tidak berada dalam VPC yang sama dengan kluster. Solusi: Pastikan instans CLB dan kluster berada dalam VPC yang sama. |
| Jumlah alamat IP yang tersedia di vSwitch tidak mencukupi. Solusi: Gunakan |
| Mode ENI tidak mendukung nilai string untuk Solusi: Ubah nilai bidang |
| Versi CCM yang lebih lama membuat instans CLB bersama secara default. Namun, instans CLB bersama telah dihentikan. Solusi: Perbarui komponen CCM. |
| Kelompok sumber daya instans CLB tidak dapat diubah setelah instans dibuat. Solusi: Hapus anotasi |
| Alamat IP ENI yang ditentukan tidak ditemukan di VPC. Solusi: Periksa apakah anotasi |
| Metode penagihan instans CLB tidak dapat diubah dari bayar sesuai penggunaan menjadi bayar berdasarkan spesifikasi. Solusi:
|
| Kesalahan ini terjadi ketika instans CLB yang dibuat oleh CCM digunakan kembali. Solusi:
|
| Tipe instans CLB tidak dapat diubah setelah instans dibuat. Kesalahan ini terjadi jika Anda mengubah tipe CLB setelah membuat layanan. Solusi: Hapus dan buat ulang layanan. |
| Layanan sudah terhubung ke instans CLB dan tidak dapat dihubungkan ke instans lain. Solusi: Anda tidak dapat menggunakan kembali instans CLB yang ada dengan mengubah ID CLB dalam anotasi |
Metode pemecahan masalah
Untuk masalah yang bukan merupakan kesalahan layanan, pecahkan masalah tersebut seperti yang dijelaskan dalam tabel berikut.
Kategori masalah | Gejala | Solusi |
Masalah akses CLB | Distribusi beban tidak merata di backend CLB | |
Terjadi kesalahan 503 saat mengakses instans CLB selama pembaruan aplikasi | Terjadi kesalahan 503 saat mengakses instans CLB selama pembaruan aplikasi | |
Instans CLB tidak dapat diakses dari dalam kluster | ||
Instans CLB tidak dapat diakses dari luar kluster | ||
Terjadi kesalahan " | ||
Kelas konfigurasi untuk CLB | Anotasi layanan tidak berlaku | Apa yang harus saya lakukan jika anotasi layanan tidak berlaku? |
Konfigurasi CLB dimodifikasi | ||
Menggunakan kembali instans CLB yang ada tidak berlaku | ||
Tidak ada pendengar yang dikonfigurasi saat instans CLB yang ada digunakan kembali | Mengapa tidak ada pendengar yang dikonfigurasi saat saya menggunakan kembali instans CLB yang ada? | |
Backend CLB tidak konsisten | Apa yang harus saya lakukan jika kelompok vServer SLB tidak diperbarui? | |
Masalah penghapusan CLB | Instans CLB dihapus | |
Instans CLB tidak dihapus setelah layanan dihapus |
Distribusi beban tidak merata di backend CLB
Cause
Algoritma penjadwalan instans CLB tidak dikonfigurasi dengan benar.
Symptom
Beban didistribusikan secara tidak merata di server backend instans CLB.
Solution
Untuk layanan dalam mode Local (
externalTrafficPolicy: Local), atur algoritma penjadwalan CLB ke Round-robin berbobot. Anda dapat melakukannya dengan menambahkan anotasiservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wrr"ke layanan.Jika aplikasi Anda menggunakan koneksi persisten, beban mungkin tidak seimbang karena beberapa permintaan dikirim melalui setiap koneksi. Dalam hal ini, atur algoritma penjadwalan CLB ke jumlah koneksi paling sedikit dengan bobot dengan menambahkan anotasi
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"ke layanan.
Terjadi kesalahan 503 saat mengakses instans CLB selama pembaruan aplikasi
Cause
Pengurasan koneksi tidak dikonfigurasi untuk pendengar CLB, atau terminasi graceful tidak dikonfigurasi untuk pod.
Symptoms
Saat mengakses instans CLB selama pembaruan aplikasi, kesalahan 503 dikembalikan.
Solution
Gunakan anotasi seperti
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainuntuk mengonfigurasi pengurasan koneksi untuk pendengar CLB. Untuk informasi lebih lanjut tentang anotasi tersebut, lihat Operasi pendengar khas.Konfigurasikan
preStopdanreadinessProbeuntuk pod berdasarkan mode jaringan kontainer Anda.readinessProbeadalah pemeriksaan kesiapan. Pod hanya ditambahkan ke Endpoint setelah melewati pemeriksaan kesiapan. Setelah ACK mendeteksi perubahan pada Endpoint, node tersebut dilampirkan ke backend instans CLB. Anda harus mengonfigurasi frekuensi probe, penundaan, dan ambang batas tidak sehat untukreadinessProbedengan benar. Beberapa aplikasi membutuhkan waktu lama untuk memulai. Jika periode timeout terlalu singkat, pod mungkin akan restart berulang kali.Atur periode
preStopke waktu yang dibutuhkan aplikasi untuk memproses semua permintaan yang tersisa. Atur periodeterminationGracePeriodSecondske nilai yang setidaknya 30 detik lebih lama dari periodepreStop.
Contoh konfigurasi Pod:
apiVersion: v1 kind: Pod metadata: name: nginx namespace: default spec: containers: - name: nginx image: nginx # Pemeriksaan kesehatan livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Pemeriksaan kesiapan readinessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Keluar secara graceful lifecycle: preStop: exec: command: - sleep - 30 terminationGracePeriodSeconds: 60
Instans CLB tidak dapat diakses dari dalam kluster
Penyebab
Pengaturan externalTrafficPolicy: Local dikonfigurasi untuk Layanan. Saat pengaturan ini digunakan, kube-proxy hanya meneruskan lalu lintas ke endpoint lokal. Jika permintaan berasal dari node yang tidak memiliki pod backend untuk Layanan tersebut, permintaan gagal. Meskipun alamat CLB dimaksudkan untuk akses dari luar kluster, permintaan dari dalam kluster tetap dirutekan oleh kube-proxy berdasarkan kebijakan ini.
Jika tidak ada pod layanan backend untuk Layanan tersebut di node yang menerima permintaan, terjadi kegagalan koneksi jaringan. Jika pod layanan backend ada di node tersebut, akses berhasil. Untuk informasi lebih lanjut tentang masalah ini, lihat kube-proxy adds external-lb address to node-local iptables rule.
Gejala
Instans CLB tidak dapat diakses dari dalam kluster.
Solusi
Dari dalam kluster Kubernetes, akses layanan menggunakan ClusterIP atau nama layanan.
Nama layanan Ingress adalah
nginx-ingress-lb.kube-system.Ubah nilai externalTrafficPolicy dalam layanan LoadBalancer menjadi Cluster. Namun, hal ini menyebabkan alamat IP sumber hilang di aplikasi. Perintah berikut menunjukkan cara memodifikasi layanan Ingress:
CatatanJika Anda menggunakan instans CLB Ingress, pod hanya dapat mengakses layanan yang diekspos melalui Ingress atau instans CLB pada node tempat pod Ingress berada.
kubectl edit svc nginx-ingress-lb -n kube-systemJika kluster Anda menggunakan Terway dengan ENI atau beberapa alamat IP per ENI, Anda dapat mengubah nilai externalTrafficPolicy dalam layanan LoadBalancer menjadi Cluster dan menambahkan anotasi untuk transmisi langsung ENI, seperti
service.beta.kubernetes.io/backend-type: "eni". Contoh kode berikut memberikan ilustrasi. Metode ini mempertahankan alamat IP sumber dan memungkinkan Anda mengakses layanan dari dalam kluster tanpa masalah. Untuk informasi lebih lanjut, lihat Gunakan anotasi untuk mengonfigurasi instans Classic Load Balancer (CLB).apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/backend-type: eni labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: externalTrafficPolicy: Cluster
Instans CLB tidak dapat diakses dari luar kluster
Cause
Daftar kontrol akses (ACL) dikonfigurasi untuk instans CLB, atau instans CLB tidak berjalan sebagaimana mestinya.
Symptom
Instans CLB tidak dapat diakses dari luar kluster.
Solution
Jalankan perintah berikut untuk melihat informasi event layanan dan selesaikan event kesalahan apa pun. Untuk informasi lebih lanjut, lihat Event kesalahan layanan dan solusinya.
kubectl -n {your-namespace} describe svc {your-svc-name}Periksa apakah ACL dikonfigurasi untuk instans CLB.
Jika ACL dikonfigurasi, periksa apakah ACL mengizinkan akses dari alamat IP klien. Untuk informasi lebih lanjut tentang konfigurasi ACL CLB, lihat Resource Access Management.
Periksa apakah kelompok vServer CLB kosong.
Jika kelompok vServer kosong, periksa apakah pod aplikasi dikaitkan dengan layanan dan apakah pod aplikasi berjalan sebagaimana mestinya. Jika pod yang dikaitkan bermasalah, temukan dan selesaikan masalah pada pod tersebut. Untuk informasi lebih lanjut, lihat Pemecahan masalah pod.
Periksa apakah pemeriksaan kesehatan untuk pendengar CLB normal.
Jika pemeriksaan kesehatan CLB bermasalah, periksa apakah pod aplikasi berjalan sebagaimana mestinya. Untuk informasi lebih lanjut tentang masalah pemeriksaan kesehatan CLB, lihat FAQ pemeriksaan kesehatan CLB.
Tidak dapat terhubung ke layanan HTTPS backend
Cause
Setelah sertifikat dikonfigurasi pada instans CLB, dekripsi dilakukan pada instans CLB. Akibatnya, permintaan yang dikirim ke pod backend adalah permintaan HTTP.
Symptoms
Tidak dapat terhubung ke layanan HTTPS backend.
Solution
Atur targetPort yang sesuai dengan port HTTPS dalam layanan ke port HTTP. Misalnya, jika Nginx menggunakan Port HTTPS 443, targetPort yang sesuai harus diubah menjadi 80.
Contoh konfigurasi:
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
name: nginx
namespace: default
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
- port: 443
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer