2016-05-11 4 views
5

मैं समस्या को समझाने के लिए बहुत विशिष्ट तरीके का उपयोग करूंगा, लेकिन मुझे लगता है कि यह अस्थायी समस्या से विशिष्ट होना बेहतर है ...क्या यह क्यूब-डीएनएस के मनमाने ढंग से रिकॉर्ड जोड़ने का एक तरीका है?

कहें, एक मोंगो डीबी प्रतिकृति एक कुबेरनेट क्लस्टर के बाहर सेट है लेकिन एक में नेटवर्क। प्रतिकृति सेट के सभी सदस्यों के आईपी पते को ऐप सर्वर और डीबी सर्वर में/etc/hosts द्वारा हल किया गया था।

एक प्रयोग/संक्रमण चरण में, मैं Kubernetes फली से उन मोंगो डाटाबेस सर्वर का उपयोग करने की जरूरत है। हालांकि, Kubernetes फली/कंटेनरों में करने के लिए/etc/hosts कस्टम प्रविष्टि जोड़ने की अनुमति के लिए प्रतीत नहीं होता।

मोंगो डीबी प्रतिकृति सेट पहले से ही बड़े डेटा सेट के साथ काम कर रहे हैं, क्लस्टर में नया प्रतिकृति सेट बनाना एक विकल्प नहीं है।

Becaseu मैं GKE उपयोग करते हैं, Kube-dns नाम स्थान में संसाधनों की किसी को भी बदलने से बचा जाना चाहिए मुझे लगता है। मेरी जरूरत के लिए उपयुक्त होने के लिए क्यूब-डीएनएस को कॉन्फ़िगर या प्रतिस्थापित करना आखिरी बात है।

है एक Kubernetes क्लस्टर में कस्टम होस्ट नामों के आईपी पते का समाधान करने के लिए एक रास्ता है?

यह सिर्फ एक विचार है, लेकिन अगर kube2sky कॉन्फ़िगरेशन की कुछ प्रविष्टियां पढ़ सकता है और उन्हें डीएनएस रिकॉर्ड के रूप में उपयोग कर सकता है, तो यह बहुत अच्छा होगा। उदा। repl1.mongo.local: 192.168.10.100

संपादित करें: मैं https://github.com/kubernetes/kubernetes/issues/12337

उत्तर

2

से इस सवाल का संदर्भित अद्यतन: 2017/07/03 Kunbernetes 1.7 अब Adding entries to Pod /etc/hosts with HostAliases समर्थन करते हैं।


समाधान क्यूब-डीएनएस, लेकिन/etc/hosts के बारे में नहीं है। वैसे भी, चाल के बाद अब तक काम करना प्रतीत होता है ...

संपादित करें: बदलना/आदि/होस्ट्स में कुबेरनेट सिस्टम के साथ दौड़ की स्थिति हो सकती है। इसे पुनः प्रयास करें।

1) एक configMap

apiVersion: v1 
kind: ConfigMap 
metadata: 
    name: db-hosts 
data: 
    hosts: | 
    10.0.0.1 db1 
    10.0.0.2 db2 

2) ensure_hosts.sh नाम के एक स्क्रिप्ट जोड़ें पैदा करते हैं।

#!/bin/sh                           
while true 
do 
    grep db1 /etc/hosts > /dev/null || cat /mnt/hosts.append/hosts >> /etc/hosts 
    sleep 5 
done 

chmod a+x ensure_hosts.sh मत भूलना।

3) एक आवरण स्क्रिप्ट start.sh अपनी छवि को जोड़े

#!/bin/sh 
$(dirname "$(realpath "$0")")/ensure_hosts.sh & 
exec your-app args... 

मत भूलना chmod a+x start.sh

4) एक मात्रा के रूप में configmap का प्रयोग करें और start.sh

apiVersion: extensions/v1beta1 
kind: Deployment 
... 
spec: 
    template: 
    ... 
    spec: 
     volumes: 
     - name: hosts-volume 
     configMap: 
      name: db-hosts 
     ... 
     containers: 
     command: 
     - ./start.sh 
     ... 
     volumeMounts: 
     - name: hosts-volume 
      mountPath: /mnt/hosts.append 
     ... 
+0

नीचे मतदान किया गया ... मुझे पता है, यह सही उत्तर नहीं होना चाहिए, लेकिन हमें कामकाज की आवश्यकता है। – hiroshi

1

उपयोग चलाने configMap DNS सेट करने का बेहतर तरीका प्रतीत होता है, लेकिन जब कुछ रिकॉर्ड (मेरी राय में) जोड़ते हैं तो यह थोड़ा सा भारी होता है। इसलिए मैं डोकर CMD द्वारा निष्पादित खोल स्क्रिप्ट से /etc/hosts को रिकॉर्ड जोड़ें।

उदाहरण के लिए

:

Dockerfile

...(ignore) 
COPY run.sh /tmp/run.sh 
CMD bash /tmp/run.sh 

run.sh

#!/bin/bash 
echo repl1.mongo.local 192.168.10.100 >> /etc/hosts 
# some else command... 

सूचना, यदि आपका एक फली में एक से अधिक कंटेनर चलाने के लिए, आप प्रत्येक में ऐड स्क्रिप्ट के लिए है कंटेनर, क्योंकि कुबर्नेट्स यादृच्छिक रूप से कंटेनर शुरू करते हैं, /etc/hosts किसी अन्य कंटेनर द्वारा ओवरराइड किया जा सकता है (जो बाद में शुरू होता है)।

+0

आह, एक फली में एकाधिक कंटेनर/etc/hosts ओवरराइट कर सकते हैं ... ऐसा लगता है ... आपकी अंतर्दृष्टि के लिए धन्यवाद। – hiroshi

3

रिकॉर्ड के लिए, संदर्भित github issue की जांच न करने वालों के लिए एक वैकल्पिक समाधान।

आप किसी भी चयनकर्ता या क्लस्टरआईपी को निर्दिष्ट न करके कुबेरनेट में "बाहरी" सेवा को परिभाषित कर सकते हैं। आपको अपने बाहरी आईपी पर इंगित एक संबंधित एंडपॉइंट भी परिभाषित करना होगा।

Kubernetes documentation से

:

 
{ 
    "kind": "Service", 
    "apiVersion": "v1", 
    "metadata": { 
     "name": "my-service" 
    }, 
    "spec": { 
     "ports": [ 
      { 
       "protocol": "TCP", 
       "port": 80, 
       "targetPort": 9376 
      } 
     ] 
    } 
} 
{ 
    "kind": "Endpoints", 
    "apiVersion": "v1", 
    "metadata": { 
     "name": "my-service" 
    }, 
    "subsets": [ 
     { 
      "addresses": [ 
       { "ip": "1.2.3.4" } 
      ], 
      "ports": [ 
       { "port": 9376 } 
      ] 
     } 
    ] 
} 
इस के साथ

, आप my-service:9376 कंटेनरों के अंदर अपने अनुप्रयोग इंगित कर सकते हैं और यातायात के लिए 1.2.3.4:9376

सीमाएं अग्रेषित किया जाना चाहिए:

  • डीएनएस नाम का उपयोग होना चाहिए केवल अक्षरों, संख्याओं या डैश। आप बहु-स्तर के नामों का उपयोग नहीं कर सकते (something.like.this)। इसका मतलब है कि आपको शायद your-service पर इंगित करने के लिए अपने ऐप को संशोधित करना होगा, और yourservice.domain.tld नहीं।
  • आप केवल एक विशिष्ट आईपी को इंगित कर सकते हैं, न कि DNS नाम। इसके लिए, आप ExternalName प्रकार सेवा के साथ एक प्रकार का DNS उपनाम परिभाषित कर सकते हैं।
+0

धन्यवाद। होस्टनाम -> आईपी मैपिंग की आवश्यकता होने पर यह जानकारी मददगार होगी। – hiroshi

3

कुबर्नेट के बाहर मेजबान या ips तक पहुंचने के लिए बाहरी प्रकार का एक बाहरी नाम आवश्यक है।

निम्नलिखित मेरे लिए काम किया।

{ 
    "kind": "Service", 
    "apiVersion": "v1", 
    "metadata": { 
     "name": "tiny-server-5", 
     "namespace": "default" 
    }, 
    "spec": { 
     "type": "ExternalName", 
     "externalName": "192.168.1.15", 
     "ports": [{ "port": 80 }] 
    } 
} 
+1

यह काम करता है !!!! गजब का। धन्यवाद । यह शीर्ष पर होना चाहिए। – Karthik

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