
Ketika mendiagnosis masalah dalam kluster Kubernetes, kita sering memperhatikan bahwa kadang-kadang salah satu dari node cluster gerimis * dan, tentu saja, ini jarang dan aneh. Jadi kami sampai pada kebutuhan akan alat yang akan melakukan 
ping dari setiap node ke setiap node dan menyajikan hasil kerjanya dalam bentuk 
metrik Prometheus . Kami hanya perlu menggambar grafik di Grafana dan dengan cepat melokalkan simpul yang gagal (dan, jika perlu, menghapus semua pod dari itu, dan kemudian melakukan pekerjaan yang sesuai **) ... 
* Dengan "gerimis" Saya mengerti bahwa node dapat masuk ke status NotReady dan tiba-tiba kembali bekerja. Atau, misalnya, bagian dari lalu lintas di pod mungkin tidak mencapai pod di node tetangga.** Mengapa situasi seperti itu muncul? Salah satu penyebab umum mungkin masalah jaringan pada sakelar di pusat data. Sebagai contoh, sekali di Hetzner kami mengkonfigurasi vswitch, tetapi pada saat yang luar biasa salah satu node tidak lagi dapat diakses pada port vswitch ini: karena ini, ternyata node tersebut benar-benar tidak dapat diakses di jaringan lokal.Selain itu, kami ingin 
meluncurkan layanan seperti itu secara langsung di Kubernetes , sehingga seluruh penyebaran dapat dilakukan dengan menggunakan pemasangan Helm-chart. (Mengantisipasi pertanyaan - jika menggunakan Ansible yang sama, kami harus menulis peran untuk berbagai lingkungan: AWS, GCE, bare metal ...) Setelah sedikit mencari di Internet untuk alat yang siap pakai untuk tugas tersebut, kami tidak menemukan sesuatu yang cocok. Karena itu, mereka membuat sendiri.
Script dan konfigurasi
Jadi, komponen utama dari solusi kami adalah 
skrip yang memantau perubahan pada setiap node di bidang 
.status.addresses dan, jika bidang telah berubah untuk beberapa simpul (mis. Simpul baru telah ditambahkan), mengirimkan nilai Helm ke bagan menggunakan daftar node ini dalam bentuk ConfigMap:
 --- apiVersion: v1 kind: ConfigMap metadata: name: node-ping-config namespace: kube-prometheus data: nodes.json: > {{ .Values.nodePing.nodes | toJson }} 
Skrip python itu sendiri: Ini 
berjalan pada setiap node dan mengirimkan paket ICMP ke semua instance cluster Kubernetes lainnya 2 kali per detik, dan hasilnya ditulis ke file teks.
Script termasuk dalam 
gambar Docker :
 FROM python:3.6-alpine3.8 COPY rootfs / WORKDIR /app RUN pip3 install --upgrade pip && pip3 install -r requirements.txt && apk add --no-cache fping ENTRYPOINT ["python3", "/app/node-ping.py"] 
Selain itu, 
ServiceAccount telah dibuat dan peran untuk itu, yang memungkinkan hanya daftar node yang akan diterima (untuk mengetahui alamat mereka):
 --- apiVersion: v1 kind: ServiceAccount metadata: name: node-ping namespace: kube-prometheus --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: kube-prometheus:node-ping rules: - apiGroups: [""] resources: ["nodes"] verbs: ["list"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: kube-prometheus:kube-node-ping subjects: - kind: ServiceAccount name: node-ping namespace: kube-prometheus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: kube-prometheus:node-ping 
Akhirnya, Anda memerlukan 
DaemonSet , yang berjalan di semua instance dari cluster:
 --- apiVersion: extensions/v1beta1 kind: DaemonSet metadata: name: node-ping namespace: kube-prometheus labels: tier: monitoring app: node-ping version: v1 spec: updateStrategy: type: RollingUpdate template: metadata: labels: name: node-ping spec: terminationGracePeriodSeconds: 0 tolerations: - operator: "Exists" serviceAccountName: node-ping priorityClassName: cluster-low containers: - resources: requests: cpu: 0.10 image: private-registry.flant.com/node-ping/node-ping-exporter:v1 imagePullPolicy: Always name: node-ping env: - name: MY_NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: PROMETHEUS_TEXTFILE_DIR value: /node-exporter-textfile/ - name: PROMETHEUS_TEXTFILE_PREFIX value: node-ping_ volumeMounts: - name: textfile mountPath: /node-exporter-textfile - name: config mountPath: /config volumes: - name: textfile hostPath: path: /var/run/node-exporter-textfile - name: config configMap: name: node-ping-config imagePullSecrets: - name: antiopa-registry 
Ringkasan stroke dalam kata-kata:
- Hasil skrip Python - yaitu file teks ditempatkan pada mesin host di direktori /var/run/node-exporter-textfiletextfile masuk ke DaemonSet simpul-eksportir. Argumen untuk menjalankannya menunjukkan--collector.textfile.directory /host/textfile, di mana/host/textfileadalah hostPath di/var/run/node-exporter-textfile. (Anda dapat membaca tentang pengoleksi file teks di simpul-eksportir di sini .)
- Akibatnya, simpul-eksportir membaca file-file ini, dan Prometheus mengumpulkan semua data dari simpul-eksportir.
Apa yang terjadi
Sekarang - untuk hasil yang ditunggu-tunggu. Ketika metrik tersebut dibuat, kita dapat melihatnya dan, tentu saja, menggambar grafik visual. Ini adalah tampilannya.
Pertama, ada blok umum dengan kemampuan (menggunakan pemilih) untuk memilih daftar node 
dari mana ping dilakukan dan 
di mana. Ini adalah 
tabel ringkasan untuk melakukan ping antara node yang dipilih untuk periode yang ditentukan dalam dasbor Grafana:

Dan di sini adalah grafik dengan informasi umum 
tentang node yang dipilih :

Kami juga memiliki daftar garis, yang masing-masing adalah grafik 
untuk satu simpul terpisah dari pemilih 
simpul Sumber :

Jika Anda memperluas garis seperti itu, Anda dapat melihat informasi tentang ping 
dari node tertentu ke semua yang dipilih dalam pemilih 
node Destination :

Informasi ini dalam bentuk grafik:

Akhirnya, seperti apa grafik yang disayangi dengan ping yang buruk di antara node?


Jika Anda mengamati ini di lingkungan nyata - inilah saatnya untuk mencari tahu alasannya.
PS
Baca juga di blog kami: