私は自分の問題を説明するために非常に具体的な方法を使いますが、抽象的な方法で説明するよりも具体的な方が良いと思います...
たとえば、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 つの解決策があります。
- ポッドごと(これらのドメインを解決するために必要なすべてのポッドに変更を追加する)
- クラスター単位(すべてのポッドがアクセスできる中央の場所に変更を追加します。この場合は
DNS
)
ポッドごとのソリューションから始めましょう。
Kunbernetes 1.7では、Podに/etc/hosts
直接エントリを追加できるようになりました。.spec.hostAliases
たとえば、を にfoo.local
、をに解決するには、 の下にある Pod の HostAliases を設定できます。bar.local
127.0.0.1
foo.remote
bar.remote
10.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 つの点を追加しました。
hosts
プラグインの前にプラグインがあり、kubernetes
プラグインfallthrough
のオプションを使用してhosts
ケースを満たしました。オプションについてもう少し詳しく説明します
fallthrough
。通常、バックエンドはそのゾーンの最終決定権を持ちます。つまり、結果を返すか、クエリに対して NXDOMAIN を返します。ただし、これが望ましい動作ではない場合があるため、プラグインの一部はfallthrough
オプションをサポートしています。fallthrough
が有効になっている場合、レコードが見つからないときに NXDOMAIN を返す代わりに、プラグインはリクエストをチェーンに渡します。チェーンのさらに下にあるバックエンドにリクエストを処理する機会が与えられ、この場合のバックエンドは ですkubernetes
。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