2016-05-11 11 views
5

私は問題を説明するために非常に具体的な方法を使用しますが、これは抽象的な問題よりも具体的である方が良いと思います...kube-dnsに任意のレコードを追加する方法はありますか?

kubernetesクラスタの外にあるmongo dbレプリカセットはありますが、ネットワーク。レプリカセットのすべてのメンバーのIPアドレスは、アプリケーションサーバーとdbサーバーの/ etc/hostsによって解決されました。

実験/移行段階では、kubernetesポッドからmongo dbサーバーにアクセスする必要があります。 しかし、kubernetesは、カスタムエントリをポッド/コンテナの/ etc/hostsに追加することを許可していないようです。

mongo dbレプリカセットはすでに大きなデータセットで動作しているため、新しいレプリカセットを作成することはオプションではありません。

私はGKEを使用しています.kube-dnsの名前空間内のリソースを変更するのは避けてください。私の必要性に合うようにkube-dnsを設定したり置き換えたりすることは最後の試みです。

これは、kubernetesクラスタのカスタムホスト名のIPアドレスを解決する方法ですか?

これは単なるアイデアですが、kube2skyがconfigmapのいくつかのエントリを読んでそれらをdnsレコードとして使うことができれば、それは素晴らしいものになります。例: repl1.mongo.local: 192.168.10.100

EDITは:2017年7月3日Kunbernetes 1.7は今Adding entries to Pod /etc/hosts with HostAliasesをサポートしています。私は、UPDATE

答えて

2

https://github.com/kubernetes/kubernetes/issues/12337からこの質問を参照しました。


解決策はkube-dnsではなく、/ etc/hostsです。 とにかく、以下のようなトリックがうまくいくようです...

編集:/ etc/hostsにkubernetesシステムと競合する可能性があります。再試行しましょう。

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)ボリュームとして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

使用を実行します)

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

chmod a+x start.sh

4を忘れないでください、あなたのイメージのラッパースクリプトstart.shを追加します。 configMapはDNSを設定する方がいいかもしれませんが、ちょっとレコードを追加すると少し重いです(私の意見では)。だから私はによって実行されるシェルスクリプトによって/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... 

お知らせ、あなたがポッド内に複数のコンテナを実行した場合、あなたはそれぞれにスクリプトを追加する必要がありますコンテナは、kubernetesがコンテナをランダムに開始するため、/etc/hostsは別のコンテナ(後で開始)によってオーバーライドされる可能性があります。

+0

ああ、ポッド内の複数のコンテナは/ etc/hostsを上書きすることができます...そうです...あなたの洞察に感謝します。 – hiroshi

3

記録のために、参照されていないものの代わりの解決策github issue

セレクターまたはClusterIPを指定しないで、Kubernetesで「外部」サービスを定義することができます。外部IPを指す対応するエンドポイントも定義する必要があります。 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

制限事項に転送する必要があります:DNS

  • 使用される名前は、の文字、数字またはダッシュのみである必要があります。複数レベルの名前(something.like.this)は使用できません。つまり、おそらくyour-serviceを指すようにアプリケーションを修正しなければならず、yourservice.domain.tldではないことを意味します。
  • DNS名ではなく、特定のIPだけをポイントできます。そのためには、ExternalNameタイプのサービスを使用して、DNSエイリアスの種類を定義できます。
+0

ありがとうございます。この情報は、hostname - > ipマッピングが必要な場合に役立ちます。 – hiroshi

3

kubernetes外のホストまたは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

関連する問題