د Kubernetes او OpenVPN سایډکار ترمنړ DNS ڕنګه ووېشو
سایډکار پوډ ته دوه نومونو نړۍ ته اړتیا ده. یو لوپبیک ریزولور کلستر او تونل ته ونیسئ، او له سم شوي resolv.conf سره تړاو پرېږدئ.
هغه پوډونه چې OpenVPN سایډکار چلوي، د نومونو په حل کې په پېژندل شوې بڼه ناکامېږي: د کلستر نومونه ځوړند پاتې کېږي، لرې نومونه تر هغه ځواب ورکوي چې پوډ بیا پیل شی، او ستاسو سم شوۍ ریزولور فایل بېرته ږي۔ په دې ترتیب کې هېڅ شی د تونل خرابي نه ده۔ پوډ یو ریزولور فایل او دوه نومونې نړۍ لري، او فایل کولی شي سرورونه په ترتیب ولیکي خو زونونه نشی ښودلی۔ تلپاته حل هغه ریزولور دی چې د پوډ دننه چلېږي او وېش لري، نو فایل ساده پاتې کېږي او هېڅ پالیسی یې د بیا لیکلو سبب نه لري۔
ولې ستاسو کړی بدلون هر وخت ورکېږي
فایل د kubelet دی، ستاسو نه۔ د dnsPolicy: ClusterFirst لاندې kubelet هغه جوړوي څو کلستر DNS ته اشاره وکړي او هر وخت چې کانټینر پیل شی بیا یې جوړوي۔ هر ښه چې د kubectl exec له لارې بدل کړئ د کانټینر د لیکلو وړ پرت کې ژوند کوي، نو بیا پیل، ایستل یا رول اوټ یې غورځوي۔ د پوډ مشخصات لا هم هماغه پالیسی لري، نو هماغه فایل بېرته ړي۔
dnsPolicy: None ټاکل بیا جوړېدل بندوي او کلستر حل هم لرې کوي۔ تاسو هغه فایل ترلاسه کوئ چې کنټرول یې لرئ او اړین نومونه له لاسه ورکوئ۔ دا تبادله ټوله ستونزه ده: resolv.conf د زون تصور نه لري، یوازې هغه سرورونه چې په ترتیب ازمویل کېږي، نو نشی کولی cluster.local یوې پتې ته او شخصی زون بلې پتې ته ولېږي۔
په پوډ کې یو ریزولور چل کړئ، پر لوپبیک
پوډ لوپبیک ته یو نومسرور ته ونیسئ، بیا هغه CoreDNS کانټینر چې د پوډ شبکه نومځای شریکوي پر پورټ 53 ځواب ووایي۔ پالیسی None ته وټاکئ، پوډ ته هغه یوه پته ورکړئ، او د VPN او اپلیکیشن ترڅنګ DNS کانټینر ورزیات کړئ:
spec:
dnsPolicy: None
dnsConfig:
nameservers:
- 127.0.0.1
options:
- name: ndots
value: "5"
containers:
- name: dns
image: coredns/coredns
args: ["-conf", "/etc/coredns/Corefile"]
volumeMounts:
- {name: corefile, mountPath: /etc/coredns, readOnly: true}
- name: vpn
image: your-openvpn-client-image
- name: app
image: your-app-image
volumes:
- name: corefile
configMap:
name: split-dns-corefileدرې واړه کانټینر یو شبکه نومځای شریکوي، نو د اپلیکیشن کانټینر څخه 127.0.0.1:53 پرته له خدمت، پرته له port-forward او پرته له کلستر شبکې ګرځېدو CoreDNS ته رسېږي۔ د ConfigMap څخه Corefile نښلول هغه د ساحې په ځای کې سمېدونکي فایل پر ځای نسخه شوی انپټ ساتي۔ جوړ شوی resolv.conf بیا یو نومسرور او نور هېڅ نه لري، دا هغه حالت دی چې کولی شی پرې فکر وکړئ۔
دلته دوه تفصیلات چیچي۔ رسمي عکس پورټ 53 د root په توګه تړي، او ڛینې کلستر پالیسۍ غواړي چې په څرګنده یې ولیکئ۔ په پوډ کې هر کانټینر اوس د هغه یو کانټینر پر چلېدو تکیه دی، نو بې زرر نوم ته readiness probe ورزیات کړئ او اپلیکیشن ته د پیل ناکامۍ زغملو اجازه ورکړئ۔
هر شخصی زون ته خپل upstream ورکړئ
Corefile د زونونو لیست دی، هر یو هغه سرور نوموي چې ځواب یې ویلای شي۔ یو بلاک د تونل زون پوښي، او ټول نیوونکی بلاک وروستی راړي او هر هغه څه اخلي چې هېڅ څرګند بلاک یې ادعا نه دې کړۍ۔ ټول نیوونکی بلاک باید ریښتیني upstream ته مخه وکړي، هېڅکله بېرته پوډ ته نه: .:53 { forward . 10.100.0.10 } کلستر ریزولور بیا کاروي ځکه چې دا لا دمخې عام نومونه د نوډ خپلو ریزولورونو ته لېږي۔ په پوډ کې بل هېڅ څه ته نه پکار ده چې پوه شی نوم کومې شبکې ته منسوب دی۔
.:53 {
errors
cache 30
forward . 10.100.0.10
}
svc.acme.internal:53 {
errors
cache 30
forward . 192.168.240.1
}د کلستر پته د مقالې څخه کاپي کولو پر ځای په kube-system کې د kube-dns خدمت څخه ولولئ، ځکه چې د خدمت CIDR توپیر لري۔ د تونل پته د OpenVPN سرور لېږل شوي dhcp-option DNS ارزښت څخه یا د هغه زون له واکمن سرور څخه راړي۔ که ستاسو کلستر ریزولور عام نومونو ته ځواب نه وایي، د نوډ د ریزولور پته په ټول نیوونکی بلاک کې کېږدئ، چې پر نوډ لوستل شوې وی نه د پوډ دننه۔
ټول نیوونکی بلاک /etc/resolv.conf ته مه نیسئ، دا هغه هڅوونکې یوه کرښه او په همدې جوړښت کې دام دی۔ د dnsPolicy: None لاندې د پوډ خپل فایل یوازینی نومسرور 127.0.0.1 لري، نو هغه هدف CoreDNS پخپله دی او هره ناسمه پوښتنه تر پای وخت تکراریږي۔ svc.acme.internal نوم بلاک هغه نوم او د هغه لاندې هر نوم سره سمون خوري، چې db.svc.acme.internal رانغاړي او svc.acme.internal.example.net وباسي۔ پای ټکی ښکاره، ځکه چې زون نومونه بشپړ وړ بڼې ته نورمالېږي؛ د پایښت حد ټاکي چې پوښتنه چېرته کېږي۔
پریکره وکړئ چې لېږد کلستر ریزولور ته اړه لري که نه
که د نومځای هر کاري بار تونل زون ته اړتیا لري، د kube-system لاندې CoreDNS ConfigMap کې د لېږد بلاک د هر پوډ لپاره سایډکار څخه ارزان دی۔ دا بدلون د کلستر کچه ده: مدیر حقوق او د هغه ډېپلوی بدلون ته اړتیا لري چې ټول پرې تکیه دي۔ یوازې هماغه یو زون ته محدود کړئ، هېڅکله ریښې ته نه۔ د یو کاري بار د تونل پته بیا د هغه زون لپاره د هر پوډ ریزولور شی، او د تونل د لوېدو په ورڜ ټول کلستر نوم له لاسه ورکوي۔
سایډکار د چاودنې وړانګه د یو پوډ دننه ساتي، چې کله یوازې څو خدمتونه لرې شبکه غواړي غوره ډیفالټ دی۔ هر څه چې غوره کړئ، ولیکئ چې کوم ریزولور زون لري، ځکه راتلونکی کس چې ټایم اوټ ډیبګ کوي به پوښتنه وکړي۔
هغه نومونه چې اړیکې لا ناکامې وی او حل کېږي
حل د دوو شیانو څخه یو دی چې تونل باید یې ولېږي؛ بل د بېرته راستنېدو لاره ده، او پوډ شبکه یې ښه پټوي۔ که OpenVPN سرور پخپله د پوډ په توګه چلېږي، هغه قواعد چې په دې کانټینر کې ورزیاتوئ د نوډ له لارې وتونکي ټرافیک کنټرول نه کوي۔ دا خرابي تنګه ده: یوازې د هغه نوډ پوډونه چې سرور یې هم چلاوه ځوابونه واخیستل، او نور ټول وخت وت۔
سرور د hostNetwork: true سره چلول هغه نوډ نومځای ته بېرته راوړي، چېرته چې FORWARD قاعده او سرچینه ژباړه اغېزه کوي۔ د وتلو پر مهال د کلاینټ حوضه ژباړه کړئ، که نه هېڅ لرې نوډ 10.8.0.6 په دې تونل پتې ته د بېرته تګ لاره نه لري۔ د Corefile بیا لمس کولو دمخه دواړه لورې وګورئ۔ هغه تونل چې پوښتنه لېږدوي خو ځواب نه، هماغه ټایم اوټ تولیدوي چې هېڅکله پوښتنه نه دې ترلاسه کړۍ ریزولور۔
له نوې پوډ څخه تایید کړئ، نه له هغه ناستې چې سمه کړه
دواړه زونونه په څرګنده وپوښتئ، بیا د پوډ له بدلون وروستې پوښتنه تکرار کړئ۔ یوازې په چلېدونکي کانټینر کې موجوده ترتیبات ترتیبات نه دی:
kubectl exec -it deploy/app -- dig @127.0.0.1 kubernetes.default.svc.cluster.local +short
kubectl exec -it deploy/app -- dig @127.0.0.1 db.svc.acme.internal +short
kubectl delete pod -l app=your-app
kubectl wait --for=condition=Ready pod -l app=your-app --timeout=90s
kubectl exec -it deploy/app -- dig @127.0.0.1 db.svc.acme.internal +shortکه لومړۍ جوړه ځواب ووایي او د بدلون وروستې جوړه نه، Corefile سم دی او د پوډ مشخصات نه۔ که دواړه ځواب ووایي خو اپلیکیشن لا هم نشی نښلېدلی، DNS ډیبګ بند کړئ او د کانټینر له دننه nc -vz db.svc.acme.internal 5432 سره TCP لاره وازموئ۔ د dig پایله په ټکټ کې وساتئ، ځکه هغه اثر دی چې د نوم ستونزه د لارې ستونزې څخه جلا کوي۔