DNS プロキシを設定する
DNS プロキシは、次の機能を提供するための機能です。
- マルチクラスタ設定において、
Services
の DNS エントリをクラスタ間で伝播する。 ServiceEntry
の DNS エントリを入力する。
Kubernetes は、ローカル クラスタの Services
に対してのみ DNS の解決を提供します。リモート クラスタで Services
の名前解決を提供する必要がある場合や、追加の内部専用 DNS サーバーを使用せずに ServiceEntry
で内部専用ホスト名を使用する場合は、DNS プロキシは、このようなケースでの DNS 名を解決する方法を実現します。
DNS プロキシの構成
クラスタ全体の構成
クラスタで DNS プロキシを構成するには、MeshConfig
の ConfigMap
に ISTIO_META_DNS_CAPTURE
プロキシ メタデータを追加します。ConfigMap
の名前の形式は istio-<revision_name>
です。リビジョンの詳細については、リビジョンの概要をご覧ください。
apiVersion: v1
data:
mesh: |-
...
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
...
kind: ConfigMap
metadata:
name: istio-<revision_name>
namespace: istio-system
プロキシごとの構成
プロキシの DNS プロキシを構成するには、次のように ISTIO_META_DNS_CAPTURE
プロキシ メタデータ アノテーションを追加します。
kind: Deployment
metadata:
name: app1
namespace: ns1
spec:
...
template:
metadata:
annotations:
proxy.istio.io/config: |
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
...
確認
クラスタ間の Service
の名前解決
マルチクラスタの設定が完了したら、クラスタ間の名前解決を確認するために、いずれかのクラスタにのみ Service
をデプロイします。
次の例の Service
ns1/svc1
がある場合、Service
で ClusterIP
を見つけることができます。
$ kubectl get -n ns1 svc1
kind: Service
metadata:
name: svc1
namespace: ns1
spec:
...
ClusterIP: 210.200.1.1
...
次に、他のクラスタから Service
に curl
を使用すると、次のように ClusterIP
が表示されます。
curl -sS -v svc1.ns1.svc.cluster.local
* Trying 210.200.1.1:80...
ServiceEntry
の名前解決
DNS に登録されていないホスト名を使用して ServiceEntry
を追加します。次の例では、名前解決を確認するために明示的なアドレス 192.168.123.123
を使用しています。
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: test-service-entry
spec:
addresses:
- "192.168.123.123"
hosts:
- not-existing-hostname.internal
ports:
- name: http
number: 80
protocol: HTTP
EOF
次に、DNS プロキシが有効になっている Pod で DNS 解決を試します。たとえば、Pod で curl
を実行すると、IP アドレスは次のように表示されます。
curl -sS -v not-existing-hostname.internal
* Trying 192.168.123.123:80...