DNS 프록시 설정
DNS 프록시는 다음 기능을 제공하는 기능입니다.
- 멀티 클러스터 설정에서 클러스터 간에
Services의 DNS 항목을 전파합니다. 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
...
그런 다음 다른 클러스터에서 curl을 Service에 사용하면 다음과 같이 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...