kube-dns に任意のレコードを追加する方法はありますか? 質問する

kube-dns に任意のレコードを追加する方法はありますか? 質問する

私は自分の問題を説明するために非常に具体的な方法を使いますが、抽象的な方法で説明するよりも具体的な方が良いと思います...

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

実験/移行フェーズでは、Kubernetes ポッドからこれらの mongo db サーバーにアクセスする必要があります。ただし、Kubernetes では、ポッド/コンテナーの /etc/hosts にカスタム エントリを追加できないようです。

MongoDB レプリカ セットはすでに大規模なデータ セットで動作しているため、クラスター内に新しいレプリカ セットを作成することはできません。

私は GKE を使用しているため、kube-dns 名前空間内のリソースを変更することは避けるべきだと思います。自分のニーズに合わせて kube-dns を構成または置き換えることは、最後に試すべきことです。

Kubernetes クラスター内のカスタム ホスト名の IP アドレスを解決する方法はありますか?

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

編集:この質問は参考:

ベストアンサー1

この問題には、現在 2 つの解決策があります。

  1. ポッドごと(これらのドメインを解決するために必要なすべてのポッドに変更を追加する)
  2. クラスター単位(すべてのポッドがアクセスできる中央の場所に変更を追加します。この場合はDNS

ポッドごとのソリューションから始めましょう。

Kunbernetes 1.7では、Podに/etc/hosts直接エントリを追加できるようになりました。.spec.hostAliases

たとえば、を にfoo.local、をに解決するには、 の下にある Pod の HostAliases を設定できます。bar.local127.0.0.1foo.remotebar.remote10.1.2.3.spec.hostAliases

apiVersion: v1
kind: Pod
metadata:
  name: hostaliases-pod
spec:
  restartPolicy: Never
  hostAliases:
  - ip: "127.0.0.1"
    hostnames:
    - "foo.local"
    - "bar.local"
  - ip: "10.1.2.3"
    hostnames:
    - "foo.remote"
    - "bar.remote"
  containers:
  - name: cat-hosts
    image: busybox
    command:
    - cat
    args:
    - "/etc/hosts"

クラスターごとのソリューション:

Kubernetes v1.12 の時点では、CoreDNSが推奨される DNS サーバーであり、 に置き換わっています。kube-dns.クラスターが元々 を使用している場合はkube-dns、 ではkube-dnsなく をデプロイしている可能性があります。ここでは、K8S DNS として をCoreDNS使用していると想定します。CoreDNS

CoreDNS では、クラスター ドメイン内に任意のエントリを追加することができ、そのようにすることで、すべてのポッドが各ポッドのすべてのファイルを変更する必要なく、DNS から直接このエントリを解決します/etc/hosts

初め:

coreos ConfigMap を変更し、必要な変更を追加しましょう。

kubectl edit cm coredns -n kube-system 

apiVersion: v1
kind: ConfigMap
data:
  Corefile: |
    .:53 {
        errors
        health {
          lameduck 5s
        }
        hosts /etc/coredns/customdomains.db example.org {
          fallthrough
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
        }
        prometheus :9153
        forward . "/etc/resolv.conf"
        cache 30
        loop
        reload
        loadbalance
    }
  customdomains.db: |
    10.10.1.1 mongo-en-1.example.org
    10.10.1.2 mongo-en-2.example.org
    10.10.1.3 mongo-en-3.example.org
    10.10.1.4 mongo-en-4.example.org

基本的に、次の 2 つの点を追加しました。

  1. hostsプラグインの前にプラグインがあり、kubernetesプラグインfallthroughのオプションを使用してhostsケースを満たしました。

    オプションについてもう少し詳しく説明しますfallthrough。通常、バックエンドはそのゾーンの最終決定権を持ちます。つまり、結果を返すか、クエリに対して NXDOMAIN を返します。ただし、これが望ましい動作ではない場合があるため、プラグインの一部はfallthroughオプションをサポートしています。fallthroughが有効になっている場合、レコードが見つからないときに NXDOMAIN を返す代わりに、プラグインはリクエストをチェーンに渡します。チェーンのさらに下にあるバックエンドにリクエストを処理する機会が与えられ、この場合のバックエンドは ですkubernetes

  2. ConfigMap ( ) に新しいファイルを追加し、そこにcustomdomains.dbカスタム ドメイン ( ) を追加しました。mongo-en-*.example.org

最後に、CoreDNS ポッド テンプレートcustomdomains.dbにファイルを追加することを忘れないでください。config-volume

kubectl edit -n kube-system deployment coredns
volumes:
        - name: config-volume
          configMap:
            name: coredns
            items:
            - key: Corefile
              path: Corefile
            - key: customdomains.db
              path: customdomains.db

最後に、Kubernetes に CoreDNS をリロードさせます (各ポッドが実行中)。

$ kubectl rollout restart -n kube-system deployment/coredns

おすすめ記事