Resolusi DNS yang panjang di Kubernetes

Artikel ini berfokus pada masalah DNS di Kubernet yang dihadapi tim kami. Ternyata, terkadang masalahnya terletak jauh lebih dalam daripada yang tampak pada awalnya.


pengantar


Selalu ada saat ketika keadaan mengintervensi pekerjaan yang sudah didebat, memaksa kita untuk mengubah sesuatu. Jadi tim kecil kami terpaksa memigrasikan semua aplikasi yang digunakan ke Kubernetes. Ada banyak alasan, obyektif dan tidak terlalu, tetapi ceritanya, pada kenyataannya, bukan tentang itu.


Karena tidak ada yang secara aktif menggunakan Kubernetes sebelumnya, cluster ini diciptakan kembali beberapa kali, itulah sebabnya kami tidak punya waktu untuk mengevaluasi kualitas aplikasi yang ditransfer. Jadi, setelah transfer keempat, ketika semua kerucut utama sudah penuh, semua kontainer sudah terpasang dan semua penyebaran ditulis, Anda dapat menganalisis pekerjaan yang dilakukan dan, akhirnya, beralih ke tugas-tugas lain.


11 jam, awal hari kerja. Sistem pemantauan tidak memiliki bagian pesan dari salah satu aplikasi.


Diagnostik


Aplikasi baru-baru ini dipindahkan ke sebuah cluster dan terdiri dari seorang pekerja sederhana yang naik ke database setiap beberapa menit sekali, mengeceknya untuk perubahan dan, jika ada, mengirim pesan ke bus. Sebelum memulai tes dan setelah selesai, aplikasi menulis pesan ke log. Tidak ada paralelisme, tidak ada multitasking, satu-satunya perapian dengan satu-satunya wadah di dalamnya.


Setelah diperiksa lebih dekat, menjadi jelas bahwa log ada di konsol, tetapi di Elastic mereka tidak lagi ada.


: Elasticsearch- , Kubernetes, Kibana. Elastic Serilog.Sinks.Elasticsearch, - Nginx ( , Elasticsearch , ). Nginx , .


Serilog, , Serilog selflog . , Serilog:


Serilog.Debugging.SelfLog.Enable(msg =>
{
  Serilog.Log.Logger.Error($"Serilog self log: {msg}");
});

, , . Kibana.


> Caught exception while preforming bulk operation to Elasticsearch: Elasticsearch.Net.ElasticsearchClientException: Maximum timeout reached while retrying request. Call: Status code unknown from: POST /_bulk

Elasticsearch , Elasticsearch . , HttpClient . , , .


, , . . , API Kubernetes, 5-10 100-150 . HTTP . .


– , , HTTP .


, , bash-, google.com :


while true;
do curl -w "%{time_total}\n" -o /dev/null -s "https://google.com/";
sleep 1;
done

– 5 .


gambar


, :


apiVersion: v1
kind: ConfigMap
metadata:
  name: ubuntu-test-scripts
data:
  loop.sh: |-
    apt-get update;
    apt-get install -y curl;
    while true;
    do echo $(date)'\n';
    curl -w "@/etc/script/curl.txt" -o /dev/null -s "https://google.com/";
    sleep 1;
    done
  curl.txt: |-
    lookup:        %{time_namelookup}\n
    connect:       %{time_connect}\n
    appconnect:    %{time_appconnect}\n
    pretransfer:   %{time_pretransfer}\n
    redirect:      %{time_redirect}\n
    starttransfer: %{time_starttransfer}\n
    total:         %{time_total}\n
---
apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-test
  labels:
      app: ubuntu-test
spec:
  containers:
  - name: test
    image: ubuntu
    args: [/bin/sh, /etc/script/loop.sh]
    volumeMounts:
    - name: config
      mountPath: /etc/script
      readOnly: true
  volumes:
  - name: config
    configMap:
      defaultMode: 0755
      name: ubuntu-test-scripts

– google.com curl. , /dev/null, curl.


, , . – DNS ( – ). Kubernetes 1.14, , , .


, :


gambar


, – DNS-lookup, 99% – 5 . , .



.


, — 5 seconds dns resolve kubernetes.


, :



issue weave.


, :


  1. ( , – 2017 , , , ) .
  2. DNS lookup. , 10-15 .
  3. , DNS- VIP, DNAT.
  4. .

– race conditions conntraking Linux SNAT DNAT. Tobias Klausmann 2009 , Linux 5.0 , .


, Kubernetes DNS, race condition .


glibc ( Ubuntu, Debian . .), :


  1. glibc UDP (A AAAA). UDP connectionless , connect(2) , conntrack .
  2. DNS- Kubernetes VIP DNAT iptables.
  3. DNAT , netfilter :
    a. nf_conntrack_in: conntrack hash object .
    b. nf_nat_ipv4_fn: conntrack.
    c. nf_conntrack_confirm: , .
  4. UDP . , DNS-. , . - insert_failed, .


, workaround:


  1. DNS- nameserver. LocalDNS cache
  2. Weave tc(8) - AAAA DNS
  3. single-request-reopen resolv.conf

, .


Kubernetes 1.9, pod dnsConfig, resolv.conf.


pod, glibc A AAAA , race condition.


spec:
  dnsConfig:
    options:
    - name: single-request-reopen

, — glibc (, alpine, musl), resolv.conf .


PS Dalam kasus kami, untuk mengotomatisasi proses ini, webhook bermutasi paling sederhana ditulis, yang secara otomatis meletakkan bagian konfigurasi ini untuk semua pod baru di cluster. Sayangnya, saya tidak bisa memberikan kodenya.


All Articles