RĂ©solution DNS longue dans Kubernetes

Cet article se concentre sur les problÚmes DNS dans Kubernetes que notre équipe a rencontrés. Il s'est avéré que le problÚme est parfois beaucoup plus profond qu'il ne semble au départ.


introduction


Il arrive toujours un moment oĂč les circonstances interviennent dans un travail dĂ©jĂ  dĂ©boguĂ©, nous forçant Ă  changer quelque chose. Notre petite Ă©quipe a donc Ă©tĂ© obligĂ©e de migrer toutes les applications utilisĂ©es vers Kubernetes. Il y avait de nombreuses raisons, objectives et peu nombreuses, mais l'histoire, en fait, n'est pas Ă  ce sujet.


Étant donnĂ© que personne n'avait utilisĂ© Kubernetes auparavant, le cluster a Ă©tĂ© recrĂ©Ă© plusieurs fois, c'est pourquoi nous n'avons pas eu le temps d'Ă©valuer la qualitĂ© des applications transfĂ©rĂ©es. Et donc, aprĂšs le quatriĂšme transfert, lorsque tous les cĂŽnes principaux sont dĂ©jĂ  pleins, tous les conteneurs sont assemblĂ©s et tous les dĂ©ploiements sont Ă©crits, vous pouvez analyser le travail effectuĂ© et, enfin, passer Ă  d'autres tĂąches.


11 heures, le début de la journée de travail. Il manque au systÚme de surveillance une partie des messages d'une des applications.


Diagnostique


L'application a été récemment transférée dans un cluster et consistait en un simple employé qui montait dans la base de données toutes les quelques minutes, vérifiait les modifications et, le cas échéant, envoyait un message au bus. Avant le début du test et aprÚs son achÚvement, l'application écrit un message dans le journal. Pas de parallélisme, pas de multitùche, le seul foyer avec le seul récipient dedans.


En y regardant de plus prĂšs, il est devenu clair que les journaux sont dans la console, mais dans Elastic, ils ne sont plus lĂ .


: 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 .


image


, :


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, , , .


, :


image


, – 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 Dans notre cas, pour automatiser ce processus, le webhook de mutation le plus simple a été écrit, ce qui dépose automatiquement cette section de configuration pour tous les nouveaux pods du cluster. Malheureusement, je ne peux pas fournir le code.


All Articles