/etc/resolv.conf Kubernetes қосқыштары, ndots:5 опциясы, бұл қолданбаның жұмысына қалай кері әсер етуі мүмкін

/etc/resolv.conf Kubernetes қосқыштары, ndots:5 опциясы, бұл қолданбаның жұмысына қалай кері әсер етуі мүмкін

Біз жақында Kops көмегімен AWS жүйесінде Kubernetes 1.9 нұсқасын іске қостық. Кеше біздің Kubernetes кластерлерінің ең үлкеніне жаңа трафикті біркелкі таратып жатқанда, мен қолданба арқылы тіркелген әдеттен тыс DNS атауларын шешу қателерін байқадым.

GitHub сайтында бұл туралы көп нәрсе бар сөйледі, сондықтан мен оны анықтауды шештім. Ақырында, мен біздің жағдайда бұл жүктеменің артуына байланысты екенін түсіндім kube-dns и dnsmasq. Мен үшін ең қызықты және жаңа нәрсе DNS сұрау трафигінің айтарлықтай артуына себеп болды. Менің жазбам бұл туралы және бұл туралы не істеу керек.

Контейнер ішіндегі DNS ажыратымдылығы – кез келген Linux жүйесіндегі сияқты – конфигурация файлымен анықталады /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 қосқыштары, ndots:5 опциясы, бұл қолданбаның жұмысына қалай кері әсер етуі мүмкін

Төмендегі диаграмма қолданбамызда конфигурацияланған бірнеше хост атауларын толық атауларға ауыстырғанға дейінгі және кейінгі қолданбаның кідірісін көрсетеді (тік көк сызық – орналастыру):

/etc/resolv.conf Kubernetes қосқыштары, ndots:5 опциясы, бұл қолданбаның жұмысына қалай кері әсер етуі мүмкін

Шешім №1 - толық жарамды атауларды пайдаланыңыз

Егер сізде қосылымдардың көп санын жасайтын статикалық сыртқы атауларыңыз (яғни қолданба конфигурациясында анықталған) аз болса, ең қарапайым шешім оларды жай қосу арқылы толық жарамдыларына ауыстыру болуы мүмкін. соңында.

Бұл түпкілікті шешім емес, бірақ ол таза болмаса да, жағдайды тез жақсартуға көмектеседі. Біз бұл патчты мәселені шешу үшін қолдандық, оның нәтижелері жоғарыдағы скриншоттарда көрсетілген.

Шешім №2 - теңшеу ndots в dnsConfig

Kubernetes 1.9 нұсқасында функционалдылық альфа режимінде (бета нұсқасы v1.10) пайда болды, бұл 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

пікір қалдыру