/etc/resolv.conf-д зориулсан Kubernetes pods, ndots:5 сонголт, энэ нь програмын гүйцэтгэлд хэрхэн сөргөөр нөлөөлж болох вэ

/etc/resolv.conf-д зориулсан Kubernetes pods, ndots:5 сонголт, энэ нь програмын гүйцэтгэлд хэрхэн сөргөөр нөлөөлж болох вэ

Бид саяхан Kops ашиглан AWS дээр Kubernetes 1.9-ийг эхлүүлсэн. Өчигдөр манай Kubernetes кластеруудын хамгийн томд шинэ траффикийг жигд хүргэж байх үед би манай аппликешнээр бүртгэгдсэн DNS нэрийг тодорхойлох ер бусын алдааг анзаарч эхлэв.

GitHub дээр энэ талаар маш их зүйл байдаг ярьсан, тиймээс би бас үүнийг олохоор шийдсэн. Эцэст нь хэлэхэд, манай тохиолдолд энэ нь ачаалал ихэссэнтэй холбоотой гэдгийг би ойлгосон kube-dns и dnsmasq. Миний хувьд хамгийн сонирхолтой бөгөөд шинэ зүйл бол DNS хүсэлтийн урсгалыг мэдэгдэхүйц нэмэгдүүлэх шалтгаан байсан юм. Миний нийтлэл энэ талаар болон энэ талаар юу хийх тухай юм.

Контейнер доторх DNS-ийн нарийвчлалыг ямар ч Линукс системийн нэгэн адил тохиргооны файлаар тодорхойлно /etc/resolv.conf. Өгөгдмөл Kubernetes dnsPolicy энэ нь ClusterFirst, энэ нь аливаа DNS хүсэлтийг дамжуулах болно гэсэн үг юм dnsmasq, хонгилоор гүйж байна kube-dns кластер доторх бөгөөд энэ нь эргээд хүсэлтийг програм руу шилжүүлэх болно kube-dns, хэрэв нэр нь кластерийн дагавараар төгссөн бол, эсхүл дээд түвшний DNS сервер рүү.

файл /etc/resolv.conf Контейнер бүрийн дотор өгөгдмөл нь дараах байдалтай харагдана.

nameserver 100.64.0.10
search namespace.svc.cluster.local svc.cluster.local cluster.local 
eu-west-1.compute.internal
options ndots:5

Таны харж байгаагаар гурван заавар байдаг:

  1. Нэрийн сервер нь үйлчилгээний IP юм kube-dns
  2. 4 орон нутгийн хайлтын домэйныг тодорхойлсон search
  3. Сонголт бий ndots:5

Энэ тохиргооны сонирхолтой хэсэг нь орон нутгийн хайлтын домэйн болон тохиргоог хэрхэн хийх явдал юм ndots:5 хамт байх. Үүнийг ойлгохын тулд та шаардлага хангаагүй нэрсийн DNS нарийвчлал хэрхэн ажилладагийг ойлгох хэрэгтэй.

Бүтэн нэр гэж юу вэ?

Бүрэн шаардлага хангасан нэр нь орон нутгийн хайлт хийхгүй нэр бөгөөд нэрийг шийдвэрлэх явцад үнэмлэхүй гэж тооцогдох нэр юм. Дүрмээр бол DNS программ хангамж нь тухайн нэрийг цэгээр (.) төгссөн бол бүрэн шаардлага хангасан, өөрөөр хэлбэл бүрэн шаардлага хангаагүй гэж үздэг. Тэр бол google.com. бүрэн тодорхойлсон ба google.com - үгүй.

Шаардлага хангаагүй нэрийг хэрхэн авч үздэг вэ?

Аппликешн нэрэнд заасан алсын хосттой холбогдох үед DNS нэрийг тодорхойлох нь ихэвчлэн системийн дуудлагыг ашиглан хийгддэг, жишээлбэл. getaddrinfo(). Гэхдээ хэрэв нэр нь шаардлага хангаагүй бол (. -ээр төгсдөггүй) системийн дуудлага эхлээд нэрийг үнэмлэхүй нэрээр шийдэхийг оролдох уу, эсвэл эхлээд локал хайлтын домэйнуудаар дамжин өнгөрөх үү? Энэ нь сонголтоос хамаарна ndots.

Гарын авлагаас resolv.conf:

ndots:n

устанавливает порог для количества точек, которые должны появиться в имени, прежде чем будет сделан начальный абсолютный запрос. Значение по умолчанию для n равно 1, что означает, что если в имени есть какие-либо точки, имя будет сначала опробовано как абсолютное имя, прежде чем к нему будут добавлены какие-либо элементы списка поиска.

Энэ нь хэрэв төлөө гэсэн үг юм ndots 5 гэсэн утгатай бөгөөд нэр нь 5-аас бага цэг агуулж байвал системийн дуудлагыг эхлээд бүх локал хайлтын домэйнуудаар дамжин дараалан шийдвэрлэхийг оролдох ба амжилтгүй бол эцэст нь үнэмлэхүй нэрээр шийднэ.

Яагаад тэгвэл ndots:5 Энэ нь програмын гүйцэтгэлд сөргөөр нөлөөлж чадах уу?

Таны төсөөлж байгаачлан, хэрэв таны хэрэглүүр маш их гадаад траффик ашигладаг бол TCP холболт үүсгэсэн (эсвэл илүү нарийвчлалтай, шийдвэрлэсэн нэр бүрийн хувьд) нэрийг зөв шийдвэрлэхээс өмнө 5 DNS асуулга гаргах болно, учир нь энэ нь эхлээд дамжих болно. 4 локал хайлтын домэйн, эцэст нь үнэмлэхүй нэрийг шийдвэрлэх хүсэлт гаргах болно.

Дараах диаграм нь манай программ дээр тохируулсан цөөн тооны хостын нэрийг бүрэн шаардлага хангасан болгон сольсоноос өмнөх болон дараах 3 kube-dns модулийн нийт урсгалыг харуулж байна.

/etc/resolv.conf-д зориулсан Kubernetes pods, ndots:5 сонголт, энэ нь програмын гүйцэтгэлд хэрхэн сөргөөр нөлөөлж болох вэ

Дараах диаграмм нь бидний аппликешнд тохируулсан хэд хэдэн хост нэрийг бүтэн нэрээр солихоос өмнөх болон дараах програмын хоцролтыг харуулж байна (босоо цэнхэр шугам нь байршуулалт):

/etc/resolv.conf-д зориулсан Kubernetes pods, ndots:5 сонголт, энэ нь програмын гүйцэтгэлд хэрхэн сөргөөр нөлөөлж болох вэ

Шийдэл №1 - Бүрэн шаардлага хангасан нэрийг ашиглах

Хэрэв танд олон тооны холболт үүсгэдэг цөөн тооны статик гадаад нэр (жишээлбэл, програмын тохиргоонд тодорхойлогдсон) байгаа бол хамгийн энгийн шийдэл бол тэдгээрийг зүгээр л хавсаргах замаар бүрэн шаардлага хангасан нэр рүү шилжүүлэх явдал юм. төгсгөлд нь.

Энэ бол эцсийн шийдэл биш, гэхдээ энэ нь цэвэр биш ч гэсэн нөхцөл байдлыг хурдан сайжруулахад тусалдаг. Бид асуудлыг шийдэхийн тулд энэ нөхөөсийг ашигласан бөгөөд үр дүнг нь дээрх дэлгэцийн агшинд харуулсан.

Шийдэл №2 - тохируулга ndots в dnsConfig

Kubernetes 1.9-д функц нь альфа горимд (бета хувилбар v1.10) гарч ирсэн бөгөөд энэ нь доторх pod өмчөөр дамжуулан DNS параметрүүдийг илүү сайн хянах боломжийг олгодог. dnsConfig. Бусад зүйлсийн дунд энэ нь утгыг тохируулах боломжийг танд олгоно ndots тодорхой хонхорцог, өөрөөр хэлбэл.

apiVersion: v1
kind: Pod
metadata:
  namespace: default
  name: dns-example
spec:
  containers:
    - name: test
      image: nginx
  dnsConfig:
    options:
      - name: ndots
        value: "1"

Эх сурвалжууд

Мөн манай блог дээрх бусад нийтлэлүүдийг уншина уу:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх