DNS プロキシを設定する

DNS プロキシは、次の機能を提供するための機能です。

  1. マルチクラスタ設定において、Services の DNS エントリをクラスタ間で伝播する。
  2. ServiceEntry の DNS エントリを入力する。

Kubernetes は、ローカル クラスタの Services に対してのみ DNS の解決を提供します。リモート クラスタで Services の名前解決を提供する必要がある場合や、追加の内部専用 DNS サーバーを使用せずに ServiceEntry で内部専用ホスト名を使用する場合は、DNS プロキシは、このようなケースでの DNS 名を解決する方法を実現します。

DNS プロキシの構成

DNS プロキシを構成するには、次のように ISTIO_META_DNS_CAPTURE フラグを構成します。クラスタ全体の構成またはプロキシごとの構成のいずれかを選択できます。

クラスタ全体の構成

クラスタで 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...

ServiceEntry の IP 自動割り当て

DNS プロキシで ServiceEntry を使用する場合は、必要に応じて IP の自動割り当てを有効にできます。有効にすると、spec.addresses で明示的な IP アドレスを指定していない ServiceEntry ホストに、内部 IP アドレス(240.240.0.0/16 範囲)が自動的に割り当てられます。

IP 自動割り当てを有効にする

IP の自動割り当てを有効にするには、コントロール プレーンの実装の手順に沿って操作します。

TRAFFIC_DIRECTOR

TRAFFIC_DIRECTOR コントロール プレーンの実装では、ip_auto_allocation: "true" を設定して、istio-system 名前空間内の asm-options ConfigMap で IP 自動割り当てを構成します。

次の例は、IP 自動割り当てが有効になっている asm-options ConfigMap を示しています。

apiVersion: v1
kind: ConfigMap
metadata:
  name: asm-options
  namespace: istio-system
data:
  # Enable IP auto-allocation for ServiceEntry (Rapid channel)
  ip_auto_allocation: "true"

この構成は、kubectl patch を使用して適用することもできます。

kubectl patch configmap/asm-options -n istio-system --type merge \
  -p '{"data":{"ip_auto_allocation":"true"}}'

ISTIOD

ISTIOD コントロール プレーン実装(クラスタ内またはマネージド ISTIOD)を使用するクラスタの場合は、MeshConfig 内のプロキシ メタデータに ISTIO_META_DNS_AUTO_ALLOCATE: "true" を追加して、IP の自動割り振りを構成します。

apiVersion: v1
data:
  mesh: |-
    defaultConfig:
      proxyMetadata:
        ISTIO_META_DNS_CAPTURE: "true"
        ISTIO_META_DNS_AUTO_ALLOCATE: "true"
kind: ConfigMap
metadata:
  name: istio-<revision_name>
  namespace: istio-system

IP の自動割り当てを確認する

IP の自動割り当てが機能していることを確認するには、次の操作を行います。

検証の前に、spec.addresses を指定せずに ServiceEntry を作成します。

$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
  name: auto-allocated-service-entry
  namespace: ns1
spec:
  hosts:
  - auto-allocated.internal
  ports:
  - name: http
    number: 80
    protocol: HTTP
  resolution: DNS
EOF

1. status.addresses で割り当てられたアドレスを確認する(TRAFFIC_DIRECTOR のみ)

TRAFFIC_DIRECTOR 実装では、コントローラが VIP を割り当て、ServiceEntry の status.addresses フィールドに入力します。

$ kubectl get serviceentry auto-allocated-service-entry -n ns1 -o yaml

出力には、割り当てられたアドレスが status.addresses の下に表示されます。

status:
  addresses:
  - host: auto-allocated.internal
    value: 240.240.0.1

2. Pod(TRAFFIC_DIRECTOR と ISTIOD)から DNS の解決をテストする

TRAFFIC_DIRECTOR と ISTIOD の両方の実装で、DNS プロキシが有効になっている Pod からリクエストを送信して、名前解決が割り当てられた VIP に解決されることを確認します。

$ kubectl exec deploy/curl -n ns1 -- curl -sS -v http://auto-allocated.internal

接続試行は、自動的に割り当てられた VIP(240.240.0.1:80 など)に解決されるはずです。

*   Trying 240.240.0.1:80...