DNS 프록시 설정
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 변환을 시도합니다. 예를 들어 포드에서
를 실행하면 다음과 같이 IP 주소가 표시됩니다.curl
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. 포드에서 DNS 변환 테스트 (TRAFFIC_DIRECTOR 및 ISTIOD)
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...