Diagnosis dan atasi masalah ketika layanan dengan Type=LoadBalancer mengalami error CLB atau kegagalan akses. Lihat Catatan load balancing layanan.
Prasyarat
Versi komponen CCM adalah V1.9.3.276-g372aa98-aliyun atau yang lebih baru (instruksi upgrade, catatan rilis).
Proses diagnosis
Identifikasi sumber masalah layanan LoadBalancer.
-
Identifikasi layanan yang terkait dengan instans CLB. Ganti
XXX.XXX.XXX.XXXdengan alamat IP load balancer.kubectl get svc -A | grep -i LoadBalancer | grep {XXX.XXX.XXX.XXX}Layanan yang sehat menampilkan output serupa berikut:
default my-svc LoadBalancer 10.x.x.x XXX.XXX.XXX.XXX 80:32xxx/TCP 5d -
Jalankan perintah berikut untuk memeriksa apakah layanan memiliki event error.
kubectl -n {your-namespace} describe svc {your-svc-name}Periksa bagian Events di bagian bawah. Contoh output error:
Events: Type Reason Age From Message ---- ------ --- ---- ------- Warning SyncLoadBalancerFailed 2m service-controller <error message here>-
Jika terdapat event error, cocokkan pesan error tersebut dengan Event error layanan dan solusinya.
-
Jika tidak ada event error, gunakan panduan berbasis gejala di Metode troubleshooting.
-
Event error layanan dan solusinya
Jalankan kubectl -n {your-namespace} describe svc {your-svc-name} dan cocokkan pesan error pada bagian Events dengan tabel berikut.
| Pesan error | Penyebab | Solusi |
|---|---|---|
The backend server number has reached to the quota limit of this load balancers |
Instance CLB telah mencapai batas kuota 200 server backend. |
Lakukan salah satu langkah berikut:
1. Ajukan peningkatan kuota di halaman SLB Quota Management pageexternalTrafficPolicy: Local.
2. Atur externalTrafficPolicy: Local untuk mengurangi jumlah backend. Dalam mode Cluster, tambahkan anotasi untuk membatasi node backend.
3. Buat instance CLB baru.
|
The loadbalancer does not support backend servers of eni type |
Instance CLB bersama tidak mendukung backend Elastic Network Interface (ENI). | Tambahkan anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" untuk menggunakan instance CLB berkinerja tinggi. Verifikasi kompatibilitas versi CCM. Lihat Use annotations to configure a Classic Load Balancer (CLB) instance. |
There are no available nodes for LoadBalancer |
Instance CLB tidak memiliki server backend. | Periksa status pod: - Jika tidak ada pod yang sesuai dengan layanan, tambahkan satu. - Jika pod tidak sehat, selesaikan masalah tersebut. Lihat Troubleshoot pod issues. - Jika pod berjalan tetapi bukan backend, periksa apakah pod tersebut berada di node master dan pindahkan ke node pekerja. |
alicloud: not able to find loadbalancer named [%s] in openapi, but it's defined in service.loaderbalancer.ingress... atau alicloud: can not find loadbalancer, but it's defined in service |
Instance CLB yang dirujuk oleh layanan tidak ditemukan. | Cari instance CLB di Server Load Balancer console menggunakan EXTERNAL-IP layanan.
- Jika CLB sudah tidak ada dan layanan tidak diperlukan, hapus layanan tersebut.
- Jika CLB ada dan dibuat secara manual, tambahkan anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. Lihat Use annotations to configure a Classic Load Balancer (CLB) instance.
- Jika CLB dibuat oleh CCM, tambahkan label kubernetes.do.not.delete pada instance CLB. Lihat How do I rename an SLB instance if I am using an earlier version of CCM?. |
ORDER.ARREARAGE Message: The account is arrearage. |
Akun memiliki pembayaran tertunda. | Lunasi pembayaran tertunda. |
PAY.INSUFFICIENT_BALANCE Message: Your account does not have enough balance. |
Saldo akun tidak mencukupi.
Saldo akun tidak mencukupi. |
Isi ulang saldo akun. |
Status Code: 400 Code: Throttlingxxx |
OpenAPI CLB sedang mengalami pengendalian aliran (throttling). | 1. Periksa kuota CLB Anda di halaman SLB Quota Management page.
2. Periksa error layanan dan selesaikan: kubectl -n {your-namespace} describe svc {your-svc-name}. |
Status Code: 400 Code: RspoolVipExist Message: there are vips associating with this vServer group. |
Pendengar yang ditautkan ke kelompok vServer tidak dapat dihapus. | 1. Periksa apakah anotasi layanan berisi ID CLB: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-clb-id}. Jika ada, CLB sedang digunakan kembali.
2. Di konsol CLB, hapus pendengar untuk port yang didefinisikan dalam layanan. Lihat Configure listener forwarding rules. |
Status Code: 400 Code: NetworkConflict |
Instance CLB akses internal berada di Virtual Private Cloud (VPC) yang berbeda dengan kluster. | Pindahkan instance CLB ke VPC yang sama dengan kluster, atau buat instance CLB baru di VPC yang benar. |
Status Code: 400 Code: VSwitchAvailableIpNotExist Message: The specified VSwitch has no available ip. |
vSwitch tidak memiliki alamat IP yang tersedia. | Tambahkan anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}" untuk menentukan vSwitch berbeda dalam VPC yang sama. |
The specified Port must be between 1 and 65535. |
Mode ENI tidak mendukung nilai string untuk targetPort. |
Ubah targetPort menjadi bilangan bulat dalam YAML layanan, atau upgrade CCM. Lihat Upgrade the CCM component. |
Status Code: 400 Code: ShareSlbHaltSales Message: The share instance has been discontinued. |
Versi CCM lama membuat instance CLB bersama secara default, yang kini telah dihentikan. | Upgrade the CCM component. |
can not change ResourceGroupId once created |
Kelompok sumber daya CLB tidak dapat diubah setelah instance dibuat. | Hapus anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id:"rg-xxxx" dari layanan. |
can not find eniid for ip x.x.x.x in vpc vpc-xxxx |
IP ENI tidak ditemukan di VPC. Anotasi service.beta.kubernetes.io/backend-type: eni diatur, tetapi kluster menggunakan Flannel yang tidak mendukung mode ENI. |
Hapus anotasi service.beta.kubernetes.io/backend-type: eni dari layanan. |
The operation is not allowed because the instanceChargeType of loadbalancer is PayByCLCU. atau User does not have permission modify InstanceChargeType to spec. |
Metode penagihan CLB tidak dapat diubah dari bayar sesuai penggunaan (PayByCLCU) ke bayar berdasarkan spesifikasi. | Lakukan salah satu langkah berikut:
- Hapus anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec.
- Jika layanan memiliki anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type, atur nilainya menjadi PayByCLCU. |
SyncLoadBalancerFailed the loadbalancer xxx can not be reused, can not reuse loadbalancer created by kubernetes. |
Instance CLB dibuat oleh CCM dan tidak dapat digunakan kembali melalui anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. |
1. Temukan ID CLB dalam anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id pada YAML layanan.
2. Selesaikan berdasarkan status layanan:
- Layanan sedang pending: Ganti ID CLB dengan ID yang dibuat secara manual di Classic Load Balancer (CLB) console.
- Layanan tidak pending, IP CLB sesuai dengan EXTERNAL-IP layanan: Hapus anotasi service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id.
- Layanan tidak pending, IP CLB tidak sesuai: Temukan CLB yang sesuai dengan EXTERNAL-IP layanan di konsol dan perbarui anotasi. Jika tidak ada yang cocok, gunakan ID CLB yang dibuat secara manual dan buat ulang layanan. |
alicloud: can not change LoadBalancer AddressType once created. delete and retry |
Tipe instance CLB tidak dapat diubah setelah dibuat. | Hapus layanan dan buat ulang. |
the loadbalancer lb-xxxxx can not be reused, service has been associated with ip [xxx.xxx.xxx.xxx], cannot be bound to ip [xxx.xxx.xxx.xxx] |
Layanan telah ditautkan ke instance CLB dan tidak dapat ditautkan ulang dengan mengubah anotasi. | Hapus layanan dan buat ulang dengan ID instance CLB yang benar. |
Metode troubleshooting
Untuk masalah yang tidak menghasilkan event error, gunakan panduan berbasis gejala berikut.
| Masalah | Gejala | Solusi |
|---|---|---|
| Masalah akses CLB | Distribusi beban tidak merata di seluruh backend | Distribusi beban tidak merata di seluruh backend CLB |
| Error 503 saat pembaruan aplikasi | Error 503 saat pembaruan aplikasi | |
| CLB tidak dapat diakses dari dalam kluster | CLB tidak dapat diakses dari dalam kluster | |
| CLB tidak dapat diakses dari luar kluster | CLB tidak dapat diakses dari luar kluster | |
| Error "The plain HTTP request was sent to HTTPS port" | Tidak dapat terhubung ke layanan HTTPS backend | |
| Masalah konfigurasi CLB | Anotasi layanan tidak berlaku | Apa yang harus saya lakukan jika anotasi layanan tidak berlaku? |
| Konfigurasi CLB diubah secara tak terduga | Mengapa konfigurasi instans CLB saya diubah? | |
| Penggunaan kembali instans CLB yang sudah ada tidak berlaku | FAQ Layanan | |
| Tidak ada listener yang dikonfigurasi saat menggunakan kembali instans CLB yang sudah ada | Mengapa tidak ada listener yang dikonfigurasi saat saya menggunakan kembali instans CLB yang sudah ada? | |
| Backend CLB tidak konsisten | Apa yang harus saya lakukan jika kelompok vServer SLB tidak diperbarui? | |
| Masalah penghapusan CLB | Instans CLB dihapus secara tak terduga | Kapan instans SLB dihapus secara otomatis? |
| Instans CLB tidak dihapus setelah layanan dihapus | Kapan instans SLB dihapus secara otomatis? |
Distribusi beban tidak merata di seluruh backend CLB
Penyebab: Algoritma penjadwalan CLB tidak sesuai dengan pola trafik.
Gejala: Distribusi permintaan tidak merata di seluruh server backend.
Solusi:
-
Untuk layanan dengan
externalTrafficPolicy: Local, tambahkan anotasiservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wrr"untuk menggunakan penjadwalan Round-robin berbobot. -
Untuk layanan yang menggunakan koneksi persisten, tambahkan anotasi
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"untuk penjadwalan jumlah koneksi paling sedikit dengan bobot. Mencegah satu koneksi berumur panjang mendominasi trafik.
Error 503 saat pembaruan aplikasi
Penyebab: Pengurasan koneksi atau terminasi pod graceful belum dikonfigurasi. Selama pembaruan rolling, CLB mungkin mengarahkan trafik ke pod yang sedang dihentikan.
Gejala: Error 503 saat mengakses CLB selama pembaruan aplikasi.
Solusi:
-
Tambahkan anotasi
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainuntuk mengaktifkan pengurasan koneksi. Lihat Operasi umum untuk mengelola listener. -
Konfigurasi
readinessProbedanpreStoppada pod:-
readinessProbe: Pod hanya bergabung ke backend CLB setelah melewati probe. Atur frekuensi probe, delay, dan ambang batas kegagalan agar sesuai dengan waktu startup aplikasi Anda. Timeout yang terlalu singkat menyebabkan restart pod berulang.
-
preStop dan terminationGracePeriodSeconds: Atur
preStopsesuai waktu yang dibutuhkan aplikasi Anda untuk menguras permintaan yang sedang berlangsung. Atur terminationGracePeriodSeconds minimal 30 detik lebih lama dari preStop.
apiVersion: v1 kind: Pod metadata: name: nginx namespace: default spec: containers: - name: nginx image: nginx # Liveness probe livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Readiness probe readinessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Graceful termination lifecycle: preStop: exec: command: - sleep - 30 terminationGracePeriodSeconds: 60 -
CLB tidak dapat diakses dari dalam kluster
Penyebab: externalTrafficPolicy: Local diatur pada layanan. kube-proxy hanya meneruskan trafik ke pod di node yang sama dengan asal permintaan. Jika node tidak memiliki pod backend untuk layanan tersebut, koneksi gagal. Hal ini memengaruhi trafik dalam kluster yang diarahkan ke alamat CLB. Lihat kube-proxy adds external-lb address to node-local iptables rule.
Gejala: CLB dapat diakses dari luar kluster tetapi koneksi gagal dari dalam.
Solusi: Gunakan salah satu pendekatan berikut:
-
Akses melalui ClusterIP atau nama layanan (direkomendasikan untuk akses dalam kluster): Gunakan ClusterIP atau nama DNS layanan alih-alih alamat CLB. Untuk Ingress, nama layanan adalah
nginx-ingress-lb.kube-system. -
Beralih ke `externalTrafficPolicy: Cluster`: Trafik dalam kluster mencapai layanan terlepas dari penempatan pod, tetapi IP sumber klien tidak dipertahankan. Untuk mengubah layanan Ingress:
Dengan CLB Ingress, pod hanya dapat mengakses layanan yang diekspos oleh Ingress/CLB dari node tempat pod Ingress berjalan.
kubectl edit svc nginx-ingress-lb -n kube-system -
Gunakan `externalTrafficPolicy: Cluster` dengan transmisi langsung ENI (hanya Terway): Jika kluster Anda menggunakan Terway dengan ENI atau beberapa IP per ENI, atur
externalTrafficPolicy: Clusterdan tambahkan anotasiservice.beta.kubernetes.io/backend-type: "eni". Ini mempertahankan IP sumber dan memungkinkan akses dalam kluster. 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
CLB tidak dapat diakses dari luar kluster
Penyebab: ACL memblokir IP klien, kelompok vServer CLB tidak memiliki backend, atau pemeriksaan kesehatan gagal.
Gejala: Instans CLB tidak dapat dijangkau dari luar kluster.
Solusi:
-
Periksa event error layanan dan atasi. Lihat Event error layanan dan solusinya.
kubectl -n {your-namespace} describe svc {your-svc-name} -
Periksa apakah ACL dikonfigurasi pada instans CLB. Jika iya, verifikasi bahwa ACL mengizinkan lalu lintas masuk dari IP klien. Lihat Resource Access Management.
-
Periksa apakah kelompok vServer CLB kosong. Jika kosong, verifikasi bahwa pod terkait dengan layanan dan sedang berjalan. Jika tidak sehat, atasi masalah pod terlebih dahulu. Lihat Troubleshoot masalah pod.
-
Periksa apakah pemeriksaan kesehatan listener CLB berhasil. Jika gagal, verifikasi bahwa pod merespons dengan benar. Lihat FAQ pemeriksaan kesehatan CLB.
Tidak dapat terhubung ke layanan HTTPS backend
Penyebab: Dengan sertifikat pada listener CLB, CLB mengakhiri TLS dan meneruskan HTTP ke backend. Jika targetPort mengarah ke port HTTPS (misalnya, 443), pod menolak permintaan teks biasa dengan pesan "The plain HTTP request was sent to HTTPS port."
Gejala: Koneksi backend gagal setelah mengonfigurasi HTTPS pada listener CLB.
Solusi: Atur targetPort ke port HTTP pod. Misalnya, jika Nginx menyajikan HTTPS di port 443, atur targetPort ke 80.
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:
- name: http
port: 80
protocol: TCP
targetPort: 80
- name: https
port: 443
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer