2016-05-11 8 views
5

Userò modo molto specifico per spiegare il problema, ma penso che questo è meglio essere specifico di problema astratto ...È un modo per aggiungere un record arbitrario a kube-dns?

dice, c'è una replica mongo db insieme al di fuori di un cluster kubernetes ma in un Rete. Gli indirizzi IP di tutti i membri del set di repliche sono stati risolti da/etc/hosts nei server delle app e nei server db.

In una fase di esperimento/transizione, ho bisogno di accedere a quei server mongo db dai pod kubernetes. Tuttavia, Kubernetes non sembra consentire l'aggiunta di voci personalizzate a/etc/hosts in pod/container.

I set di repliche db mongo funzionano già con un set di dati di grandi dimensioni, la creazione di un nuovo set di repliche nel cluster non è un'opzione.

Becaseu Io uso GKE, la modifica di qualsiasi risorsa nello spazio dei nomi di kube-dns dovrebbe essere evitata, suppongo. Configurare o sostituire kube-dns per essere adatti al mio bisogno sono l'ultima cosa da provare.

È un modo per risolvere l'indirizzo IP di nomi host personalizzati in un cluster kubernetes?

È solo un'idea, ma se kube2sky può leggere alcune voci di configmap e usarle come record DNS, è fantastico. ad es. repl1.mongo.local: 192.168.10.100.

EDIT: ho fatto riferimento a questa domanda da https://github.com/kubernetes/kubernetes/issues/12337

risposta

2

UPDATE: 2017/07/03 Kunbernetes 1.7 ora supporta Adding entries to Pod /etc/hosts with HostAliases.


La soluzione non riguarda kube-dns, ma/etc/hosts. Ad ogni modo, il trucco sembra funzionare fino a quel momento ...

MODIFICA: La modifica di/etc/hosts può avere condizioni di competizione con il sistema kubernetes. Lascia che riprova.

1) creare un configMap

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

2) Aggiungere uno script chiamato ensure_hosts.sh.

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

Non dimenticare chmod a+x ensure_hosts.sh.

3) Aggiungere uno script wrapper start.sh vostra immagine

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

Non dimenticare chmod a+x start.sh

4) Usare la configMap come volume ed eseguire 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

Giù votato ... Lo so, non deve essere la risposta corretta, ma abbiamo bisogno di soluzioni alternative. – hiroshi

1

Usa configMap sembra il modo migliore per impostare il DNS, ma è un po 'pesante quando basta aggiungere qualche record (secondo me). Quindi aggiungo i record a /etc/hosts tramite lo script di shell eseguito dalla finestra mobile CMD.

ad esempio:

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... 

Avviso, se il vostro eseguire più di un container in un baccello, si deve sceneggiatura aggiuntivo in ogni container, poiché i contenitori di avvio di Kubernetes casualmente, /etc/hosts possono essere sostituiti da un altro contenitore (che viene avviato in un secondo momento).

+0

Ah, più contenitori in un pod possono sovrascrivere/etc/hosts ... sembra ... Grazie per la tua comprensione. – hiroshi

3

Per la cronaca, una soluzione alternativa per coloro che non verificano il riferimento github issue.

È possibile definire un servizio "esterno" in Kubernetes, non specificando alcun selettore o ClusterIP. Devi anche definire un Endpoint corrispondente che punta al tuo IP esterno.

Dal 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 } 
      ] 
     } 
    ] 
} 

Con questo, si può puntare la vostra applicazione all'interno dei contenitori per my-service:9376 e il traffico dovrebbe essere trasmesso al 1.2.3.4:9376

Limitazioni:

  • Il DNS il nome utilizzato deve essere solo lettere, numeri o trattini. Non è possibile utilizzare nomi a più livelli (something.like.this). Ciò significa che probabilmente devi modificare l'app in modo che punti solo a your-service e non a yourservice.domain.tld.
  • È possibile solo puntare a un IP specifico, non a un nome DNS. Per questo, puoi definire un tipo di alias DNS con un servizio di tipo ExternalName.
+0

Grazie. Queste informazioni saranno utili se hostname -> ip mapping è necessario. – hiroshi

3

Per accedere a host o IP al di fuori dei kubernetes è necessario un tipo di nome esterno.

Quanto segue ha funzionato per me.

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

Questo funziona !!!! Stupefacente. Grazie . Questo deve essere al top. – Karthik

Problemi correlati