Mendalami cara mendapatkan peta jaringan dan menghubungkan IP dengan beban kerja cluster untuk mempercepat proses debug

Kubernetes, sebagai platform penerapan standar de facto, telah memungkinkan pengembang untuk menerapkan aplikasi produksi dengan pipeline CI/CD dengan cepat. Namun penggunaannya telah mengakibatkan jumlah sumber daya yang meroket di cluster Kubernetes. Untuk pemeliharaan platform yang lebih baik, kami memerlukan kemampuan observasi yang lebih tinggi untuk membantu kami memantau status kesehatan klaster secara tepat waktu.

Observabilitas di “Kubernetes” adalah 'proses berkelanjutan dalam menggunakan metrik, peristiwa, log, dan data penelusuran yang dihasilkan sistem Kubernetes untuk mengidentifikasi, memahami, dan mengoptimalkan kesehatan dan kinerjanya.'

Apa itu Pemantauan Klaster?

Pemantauan cluster adalah cara paling penting untuk mencapai observabilitas, yang mencakup banyak aspek, termasuk sumber daya, kinerja, peristiwa, log, dll. Serangkaian indikator dan log dari sistem yang diamati dapat dikumpulkan dengan alat pemantauan.

Dengan sebuah cluster yang menghasilkan jutaan metrik ini setiap hari, ada dua tantangan besar yang menghadang: Pertama, banyak sistem pemantauan konvensional perlu memantau banyak metrik yang berasal dari cluster Kubernetes. Kedua, sulit membedakan metrik yang paling penting dari “data yang berantakan”.

Oleh karena itu, solusi yang mampu menangani semua data, menganalisis dan membuat grafik secara otomatis, dan menunjukkan metrik penting, adalah apa yang kami cari. Dengan mengumpulkan data yang diperlukan secara efektif sambil memfilter data yang tidak diperlukan, kita dapat menghemat banyak upaya dalam menjaga semuanya berfungsi dengan baik.

Pemantauan cluster dan pemetaan jaringan

Mari kita lebih spesifik. Data jaringan yang besar dan kompleks adalah hal yang harus kita patuhi karena data tersebut selalu terisolasi dan berbeda dalam granularitas dan perubahan yang cepat. Misalnya, alamat IP yang berumur pendek meningkat seiring dengan meningkatnya beban kerja, dan sulit untuk menemukan dan mengatasi masalah tersebut begitu masalah jaringan terjadi.

Beberapa alat pihak ketiga hanya dapat memainkan peran terbatas karena kerumitan penggunaannya dan mode berbasis sespan yang invasif. Selain itu, mereka tampaknya tidak berdaya terkait penundaan jaringan layanan, sehingga diperlukan alat canggih untuk mendapatkan peta jaringan antar beban kerja cloud.

Jadi kami akan menggunakan Caretta di sini, yang memungkinkan kami menemukan masalah dengan cepat dari beban kerja terkait yang kami temukan berdasarkan namespace, nama, dan port di UI saat dikombinasikan dengan Grafana.

Caretta adalah alat sumber terbuka yang menawarkan pemantauan jaringan dengan mengumpulkan informasi sumber daya cluster dan memproses data kernel dengan eBPF (Extender Berkeley Packet Filter), mengirimkan metrik berlabel melalui Prometheus, dan memvisualisasikan data di dasbor Grafana.

Ini terdiri dari K8sIPResolver yang diimplementasikan oleh paket client-go dan pelacak dengan server metrik yang mengirimkan data eBPF.

K8sIPResolver secara dinamis memonitor sembilan jenis sumber daya cluster (pods, node, replicaset, daemonset, statefulset, job, service, deployment, cronjob) dengan mekanisme client-go watch, mengumpulkan dan menganalisis data seperti alamat IP, mencatatnya dalam sebuah LRU cache, dan mengambil snapshot.

Apa itu eBPF?

Metrik menggunakan eBPF untuk mengumpulkan data jaringan dan mengirimkan metrik ke Prometheus setelah memberi label berdasarkan informasi sumber daya di atas.

Dapat dikatakan bahwa eBPF menghadirkan performa tinggi pada Caretta.

eBPF tidak mengganggu, efisien, aman, dan bekerja di dalam kernel Linux, yang memiliki keunggulan besar dibandingkan metode implementasi tradisional ketika diterapkan dalam alat observasi. eBPF memungkinkan pengguna untuk menulis plugin untuk kernel Linux dalam keadaan kotak hitam. Dan metode eBPF dijalankan setelah program di kernel berjalan hingga plugin akan dimasukkan, memenuhi perluasan fungsi kernel.

Cara kerja eBPF di Caretta

Di Caretta, probe terkait disesuaikan untuk melacak data jaringan seperti tcp_data_queue dan inet_sock_set_state. Dan bpfobject dihasilkan dengan paket cilium ebpf untuk mengumpulkan data tautan jaringan dengan cepat.

Anda dapat menemukan kode untuk ini di GitHub.

eBPF diimplementasikan dalam dua langkah.

Yang pertama adalah kode, yaitu menyesuaikan struktur data dan algoritma: mengurai data TCP, sock, dan peran dalam eBPF, menyimpannya dalam peta dan menghasilkan probe dalam kode Go.

Kedua, paket eBPF dengan kode Go dengan perintah berikut di Makefile dan terapkan.

generate_ebpf: ${BPF2GO_BINARY}_${BPF2GO_VERSION} \
    download_libbpf_headers
 go mod vendor
 (cd ${REPODIR}/pkg/tracing && \
  GOPACKAGE=tracing ${REPODIR}/${BPF2GO_BINARY}_${BPF2GO_VERSION} \
  -cc "${BPF_CLANG}" -cflags "${BPF_CFLAGS}"  \
  -target native bpf \
  ebpf/caretta.bpf.c --)

Caretta dengan Grafana

Grafana adalah alat visualisasi paling terkenal untuk pemantauan data di komunitas cloud. Ini mendukung berbagai bagan, filter, dan konfigurasi alarm dengan menampilkan data dari sumber data seperti Prometheus dan diintegrasikan ke dalam Caretta untuk menampilkan diagram pemetaan jaringan.

Caretta terintegrasi dengan Grafana dengan menambahkan diagram helm dan dasbor ke dalam sumbernya agar pengguna dapat dengan cepat mendapatkan visualisasi yang diharapkan. Ada empat panel di dasbor: ServiceMap, Active Ports, Top throughput Workloads, dan Top Throughput Connections, yang semuanya diperoleh melalui agregasi berbeda berdasarkan metrik caretta_links_observed.

Misalnya, ekspresi Top Throughput Workloads adalah 8 beban kerja teratas pada sum setelah group menurut client_name.

topk(8, sum by (client_name) ((rate(caretta_links_observed{client_namespace=~\"$namespace\", client_kind=~\"$kind\", client_name=~\"$workload\", server_port=~\"$port\"}[$__range:$__interval]))))

Keempat panel ini memenuhi kebutuhan dasar kami untuk memantau pemetaan jaringan beban kerja, dan kami juga dapat menyesuaikan kueri atau bidang terkait untuk memperoleh informasi lebih lanjut.

Bagaimana mereka bekerja sama

Mari kita lihat demonstrasi singkat Caretta.

Instal cluster yang baik hati. Jika Anda menggunakan mesin Mac, VM Linux diperlukan.

Cluster jenis default hanya berisi satu node. Mari buat cluster dengan tiga node pekerja dengan konfigurasi berikut untuk menampilkan data dengan lebih baik.

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker

Kemudian buat cluster dengan konfigurasi di atas.

shell
kind create cluster --config=config.yaml
kubectl cluster-info --context kind-kind

Untuk menginstal Caretta, Anda perlu menginstal helm CLI secara lokal terlebih dahulu.

helm repo add groundcover https://helm.groundcover.com/
helm repo update
helm install caretta --namespace caretta --create-namespace groundcover/caretta

Periksa status pengoperasian pod Caretta dengan kubectl get pods -ncaretta.

Catatan: Anda harus menggunakan Docker versi terbaru (4.13). Jika tidak, kode eBPF akan gagal dijalankan, dan Anda akan mendapatkan pesan kesalahan berikut:

Couldn't load probes - error loading BPF objects from go-side. field HandleSockSetState: program handle_sock_set_state: apply CO-RE relocations: no BTF found for kernel version 5.15.49-linuxkit: not supported

Meneruskan port ke Grafana lokal di port 3000.

kubectl port-forward --namespace caretta caretta-grafana-5b8594ddb8-cxmvr 3000:3000

Sekarang, kita dapat melihat status pemetaan jaringan cluster di browser localhost:3000. Jika tidak ada penerapan dan layanan untuk menampilkan data di cluster di awal, kita dapat menginstal hello-app.

kubectl create deployment hello-app --image=hello-repo/hello-app:v2
# expose 
kubectl expose deployment hello-app --name=hello-app-service --type=LoadBalancer --port 80 --target-port 8080

Kemudian, informasi jaringan spesifik ditampilkan di Grafana.

Secara keseluruhan, Caretta sangat efisien dalam membuat pemetaan jaringan kecuali satu batasan: eBPF hanya didukung oleh Linux, bukan Mac. Pengembangan eBPF di Mac M1 perlu ditingkatkan.

Kesimpulan

Aspek Kubernetes yang berhubungan dengan jaringan, apa pun konfigurasi, aplikasi, atau pemantauannya, telah mengganggu banyak pengembang cloud.

Namun, beberapa alat pemantauan ringan dan berkinerja tinggi seperti Caretta dapat secara signifikan membantu kami memperoleh peta jaringan dan menghubungkan IP dengan beban kerja, memfasilitasi pengelolaan status jaringan cluster dan mempercepat proses debug.

Saya berharap Caretta segera menambahkan dukungan untuk sumber daya khusus dan lebih banyak fitur berdasarkan eBPF untuk meningkatkan pemantauan jaringan cloud.