2016-03-03 7 views
8

मैं अपने परिसर क्लस्टर पर जीकेई में माइग्रेट करने का प्रयास कर रहा हूं। इस संक्रमण को सुविधाजनक बनाने के लिए मुझे विरासत सेवाओं के नामों को हल करने में सक्षम होना चाहिए।मैं Google कंटेनर इंजन [जीकेई] में सभी फोडों में नेमसर्वर कैसे जोड़ूं?

मान लें कि नेटवर्किंग/वीपीएन एक हल समस्या है।

क्या वर्तमान में जीकेई के साथ ऐसा करने का कोई तरीका है?

प्रभावी रूप से मैं हर /etc/resolv.conf

उत्तर

3

मैं क्या एरिक ने कहा करने के लिए जोड़ सकते हैं और यह थोड़ा उत्परिवर्तित करना चाहते

इस मुद्दे देखें।

कुबर्नेट्स 1.1 "निपटान अवधि" के दौरान हमारे पास एक प्राप्तियां थीं कि वास्तव में resolv.conf और रिज़ॉल्यूवर व्यवहार जैसी चीजों के लिए चश्मे नहीं हैं। विभिन्न रिज़ॉल्यूवर पुस्तकालय अलग-अलग चीजें करते हैं, और इससे हमारे उपयोगकर्ताओं के लिए दर्द होता है।

विशेष रूप से, कुछ सामान्य संकल्प मानते हैं कि सभी nameserver एस कवक हैं और यदि आपके पास नेमसर्वर थे जो DNS नामस्थान के विभिन्न हिस्सों को संभाले थे। हमने निर्णय लिया कि क्यूब 1.2 के लिए हम कंटेनरों में एकाधिक nameserver लाइनों को पास नहीं करेंगे। इसके बजाए, हम केवल क्यूब-डीएनएस सर्वर पास करते हैं, जो cluster.local प्रश्नों को संभालता है और किसी अन्य प्रश्न को "अपस्ट्रीम" नेमसर्वर को आगे बढ़ाता है।

हम कैसे जानते हैं कि "अपस्ट्रीम" क्या है? हम नोड के nameservers का उपयोग करते हैं। एक प्रति-पॉड डीएनएस नीति क्षेत्र है जो इस विकल्प को नियंत्रित करता है। शुद्ध परिणाम यह है कि कंटेनर resolv.conf में एक nameserver देखते हैं, जो हमारे पास है, और वह नेमसर्वर पूरे DNS नेमस्पेस को संभालता है।

इसका व्यावहारिक अर्थ यह है कि आपके लिए अपने नेमसर्वर को इंजेक्ट करने के लिए कोई शानदार हुक नहीं है। आप अपने खुद के DNS सर्वर को इंगित करने के लिए --cluster-dns ध्वज को क्यूबलेट में बदल सकते हैं, जो तब क्यूब-डीएनएस को आगे बढ़ाएगा, जो तब "अपस्ट्रीम" तक आगे बढ़ेगा। समस्या यह है कि जीकेई वास्तव में इस तरह से बदलते झंडे का समर्थन नहीं करता है। अगर/जब नोड अद्यतन किया जाता है, तो ध्वज डिफ़ॉल्ट के पक्ष में गायब हो जाएगा।

संभावित समाधान:

  • kubelets एक में क्लस्टर config से अपने झंडे पढ़ा है। यह पहले से ही रिकॉर्ड की योजना है, लेकिन v1.2

  • है क्यूब-डीएनएस एक झंडा लेते हैं जो दर्शाता है कि "अपस्ट्रीम" क्या है। क्यूब-डीएनएस एक "क्लस्टर एडन" है और जैसा कि अंत उपयोगकर्ताओं द्वारा वास्तव में अनुकूल नहीं है (हम इसे आपके क्लस्टर के साथ अपडेट करेंगे और आपके परिवर्तन खो देंगे)।

  • क्या क्यूब-डीएनएस इन-क्लस्टर कॉन्फ़िगरेशन से अपने झंडे पढ़ते हैं, और एक झंडा लेते हैं जो "अपस्ट्रीम" है। यह एक व्यावहारिक विचार है, लेकिन शायद v1.2 (बहुत देर हो चुकी) के लिए नहीं। यह इसे v1.2.x में पैच करना संभव हो सकता है लेकिन यह वास्तव में एक बगफिक्स नहीं है, यह एक विशेषता है।

  • प्रत्येक नोड पर resolv.conf में अपना स्वयं का DNS सर्वर प्राप्त करें ताकि क्यूब-डीएनएस आपको अपस्ट्रीम के रूप में उपयोग कर सकें। मुझे नहीं लगता कि जीकेई के पास इसे कॉन्फ़िगर करने का एक तरीका है जो नोड अपग्रेड पर भी खो नहीं जाएगा। आप एक नियंत्रक लिख सकते हैं जो समय-समय पर वीएम को एसएसएच किया गया था और उसे लिखा था, और बाद में सहीता के लिए अपने क्यूब-डीएनएस कंटेनर की जांच की। Blech।

मुझे लगता है कि सही जवाब क्लस्टर कॉन्फ़िगरेशन का उपयोग करना है ताकि कुबलेट या DNS (या दोनों) को सूचित किया जा सके। यदि आपको लगता है कि ये व्यावहारिक उत्तर हो सकते हैं (टाइमफ्रेम मुद्दों के बावजूद), तो यह बहुत अच्छा होगा अगर आपने चर्चा करने के लिए गिटहब मुद्दा खोला। इसे वहां और अधिक दृश्यता मिलेगी।

1

करने के लिए एक एन एस जोड़ने के लिए प्रभावी ढंग से नहीं।

आप नोड के resolv.conf संशोधित करते हैं फली परिवर्तन प्राप्त कर लेंगे प्रयास कर रहा हूँ।

हालांकि, glibc 3 से अधिक नेमसर्वर या 6 से अधिक खोज रिकॉर्ड का उपयोग करने पर रोक लगाता है।

जीसीई वीएम नोड मेटाडेटा और प्रोजेक्ट नेटवर्किंग तक पहुंचने के लिए 2 नेमसर्वर और 3 खोजों का उपयोग करते हैं। और जीकेई 1 नेमसर्वर और 3 खोजों का उपयोग करता है। इससे आपको 0 नेमसर्वर और 0 खोज मिलती हैं। https://github.com/kubernetes/kubernetes/issues/9079 और इस मुद्दे: https://github.com/kubernetes/kubernetes/issues/9132

+0

हालांकि, हो सकता है कि आप अपनी सभी विरासत सेवा DNS रिकॉर्ड्स को Google क्लाउड DNS में कॉपी कर सकें। (Https://cloud.google.com/dns/what-is-cloud-dns)। इससे उन्हें आपके सभी जीसीपी परियोजना उदाहरणों और सभी जीकेई कंटेनर में हल करने योग्य बना दिया जाएगा। –

+0

हां, लेकिन यदि ओपी एक आंतरिक डीएनएस का उपयोग करता है और सार्वजनिक डीएनएस रिकॉर्ड नहीं – nelasx

1

मैंने इसे के 8 एस क्लस्टर में एक dnsmasq सेवा स्थापित करके हल किया और dnsmasq को dnsmasq सेवा को छोड़कर सभी फोड नेमसर्वर को इंगित किया।
dnsmasq डोमेन प्रत्यय के आधार पर सही नेमसर्वर को अनुरोध अग्रेषित करेगा। तो आंतरिक और बाहरी दोनों वीपीएन लुकअप काम करेंगे।

  1. एक dnsmasq सेवा सेटअप करें।
    फली इस तरह कुछ देख सकते हैं, सुनिश्चित करें कि इसमें कम से कम 2 फोड हैं क्योंकि इसे एचए होना चाहिए।

    apiVersion: v1 
    kind: Pod 
    metadata: 
        name: dnsmasq 
    spec: 
        containers: 
        - name: dnsmasq 
        image: "andyshinn/dnsmasq:2.76" 
        ports: 
        - containerPort: 53 
         hostPort: 53 
         protocol: UDP 
        - containerPort: 53 
         hostPort: 53 
         protocol: TCP 
        args: [ 
         "-S", "/consul/10.3.20.86", 
         "-S", "/consul/10.3.20.88", 
         "-S", "/consul/10.3.20.90", 
         "-S", "/your-vpn-domain.dom/10.3.128.22", 
         "-S", "/your-vpn-domain.dom/10.3.128.23" 
        ] 
        securityContext: 
         capabilities: 
         add: 
         - NET_ADMIN 
    
  2. एक resolv-conf कॉन्फ़िगरेशन मानचित्र जोड़ें।

    #!/bin/bash 
    
    DNS_IP=$(kubectl get svc --template '{{.spec.clusterIP}}' dnsmasq) 
    DNS_POD=$(kubectl get pod -n kube-system | grep -v kube-dns-autoscaler | grep ^kube-dns | head -1 | awk '{ print $1; }') 
    DOMAIN=$(kubectl describe -n kube-system pod/${DNS_POD} | grep -- --domain= | sed -Ee 's/.*--domain=(.*)\..*/\1/') 
    SEARCH=$(kubectl exec -n kube-system ${DNS_POD} -c kubedns -- cat /etc/resolv.conf | grep ^search | cut -d' ' -f2-) 
    VPN_SEARCH="your-vpn-domain.dom" 
    
    kubectl create -f - <<EOF 
    apiVersion: v1 
    kind: ConfigMap 
    metadata: 
        name: resolv-conf 
    data: 
        resolv.conf: | 
        # This file is created by resolv-conf config map and points to the dnsmasq service. 
        search default.svc.${DOMAIN} svc.${DOMAIN} ${DOMAIN} ${SEARCH} ${VPN_SEARCH} 
        nameserver ${DNS_IP} 
        ndots:5 
    EOF 
    
  3. अपनी सेवाओं/फली में cfgmap को माउंट करें। अपने फली

    volumeMounts: 
        - mountPath: /etc/resolv.conf 
        name: resolv-conf 
        subPath: resolv.conf 
        readOnly: true 
    volumes: 
        - name: resolv-conf 
        configMap: 
         name: resolv-conf 
    

यह समाधान शायद थोड़ा बदसूरत माना जा सकता है कर सकते हैं में जोड़ना , लेकिन वर्तमान में वहाँ कई अन्य विकल्प नहीं हैं। भविष्य में मैं Google क्लाउड या क्यूब-डीएनएस में एक डीएनएस अग्रेषित सुविधा देखने की उम्मीद करूंगा।

यह पागल है कि Google क्लाउड निर्दिष्ट डोमेन/जोनों के लिए DNS आगे की सुविधा प्रदान नहीं करता है।

+2

क्या इससे मदद http://blog.kubernetes.io/2017/04/configuring-private-dns-zones-upstream-nameservers-kubernetes.html? – Kuberchaun

+0

बिल्कुल ठीक लगता है कि ओपी और मुझे क्या चाहिए। मैं इसे जीकेई पर जांचने वाला हूं और बाद में रिपोर्ट करूंगा। – Raboo

+0

साफ समाधान रबू के लिए धन्यवाद। मुझे यह पसंद है कि यह मेरे कुबर्नेट वर्कफ़्लो में कैसे फिट बैठता है और मेरे नोड्स पर कॉन्फ़िगरेशन प्रबंधन की आवश्यकता नहीं है। लिंक के लिए धन्यवाद GoatWalker। मुझे खुशी है कि अब इसमें बेक्ड है। – Jake

संबंधित मुद्दे