DNS 프록시 설정

DNS 프록시는 다음과 같은 기능을 제공하는 기능입니다.

  1. 멀티 클러스터 설정에서 클러스터 간에 Services의 DNS 항목을 전파합니다.
  2. ServiceEntry의 DNS 항목 채우기

Kubernetes는 로컬 클러스터의 Services에 대해서만 DNS 확인을 제공합니다. 원격 클러스터에서 Services의 이름 확인을 제공하거나 추가 내부 전용 DNS 서버 없이 ServiceEntry와 함께 내부 전용 호스트 이름을 사용해야 하는 경우 DNS 프록시를 사용하면 이러한 경우에 DNS 이름을 확인할 수 있습니다.

DNS 프록시 구성

클러스터 전체 구성

클러스터에서 DNS 프록시를 구성하려면 MeshConfigConfigMapISTIO_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
...

그런 다음 other 클러스터에서 Servicecurl를 사용하면 다음과 같이 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 프록시가 사용 설정된 포드에서 DNS 확인을 시도합니다. 예를 들어 포드에서 curl를 실행하면 다음과 같이 IP 주소가 표시됩니다.

curl -sS -v not-existing-hostname.internal
*   Trying 192.168.123.123:80...