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...