DNS 프록시 설정

Kubernetes는 로컬 클러스터의 Services에 대해서만 DNS 이름을 기본적으로 확인합니다. DNS 프록시를 사용하면 멀티 클러스터 설정에서 원격 클러스터 간에 Kubernetes Services를 확인하고 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 프록시가 사용 설정된 포드에서 DNS 변환을 시도합니다. 예를 들어 포드에서 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. 포드 (TRAFFIC_DIRECTOR 및 ISTIOD)에서 DNS 변환 테스트

TRAFFIC_DIRECTOR 및 ISTIOD 구현 모두에서 DNS 프록시가 사용 설정된 포드에서 요청을 전송하여 이름 변환이 할당된 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...