
커넥터를 사용하여 공유 VPC에 연결하는 Cloud Run 완전 관리형 서비스가 있습니다. 이 공유 VPC는 다른 GCP 프로젝트와 다른 팀에서 관리하지만 이 VPC에 인스턴스를 배포할 수 있습니다. 이 VPC에는 해당 팀의 내부 리소스를 확인하는 사용자 지정 DNS 서버가 있습니다. 사용자 정의 DNS 서버는 DHCP에 의해 VPC 사용자에게 전파되지 않습니다. Cloud Run 컨테이너에서 IP를 통해 모든 내부 리소스에 액세스할 수 있지만 커스텀 DNS 서버를 사용하지 않으면 이름으로 액세스할 수 없습니다.
문제는 오류 없이 이러한 서버를 컨테이너에 전파할 수 없다는 것입니다.
내 컨테이너에 다음 진입점 스크립트를 만들었습니다.
#!/usr/bin/env sh
set -e
{
echo "nameserver 10.80.64.19";
echo "nameserver 10.80.64.20";
echo "nameserver 10.80.64.21";
} >> /etc/resolv.conf
exec "$@"
이로 인해 실행 중인 컨테이너에 다음 파일 내용이 표시됩니다.
nameserver 10.80.64.21
nameserver 10.80.64.20
nameserver 10.80.64.19
search google.internal.
nameserver 169.254.169.254
(내 스크립트가 작성된 후에 사용자 정의 라인이 추가되었습니다)
때로는 마지막 NS 서버가 사용되며 공유 VPC 리소스를 이름(예 Failed to resolve 'some-name'
: )으로 연결하는 중에 오류가 발생합니다.
이 문제를 해결하는 방법은 무엇입니까? AFAIK, 맞춤 DNS 서버만 사용하거나 해당 서버와 표준 서버의 정보를 "병합"해야 합니다 169.254.169.254
. 이 경우 어떻게 해야 합니까? 가능한 해결책은 무엇입니까?
답변1
Google 지원팀에서 제안한 솔루션 옵션은 다음과 같습니다.
Cloud Run 측에서 처리할 때 발생하는 문제는 resolv.conf
네트워킹 항목이 Docker에 의해 설정되므로 덮어쓸 수 없다는 것입니다. 이를 수행하는 데는 두 가지 옵션이 있습니다.
- 아웃바운드 전달 영역:https://cloud.google.com/dns/docs/zones#creating-forwarding-zones
- 아웃바운드 서버 정책:https://cloud.google.com/dns/docs/policies#create-out
전달 영역을 구현하면 특정 DNS 서버로 이동해야 하는 도메인 이름을 요청하는 클라우드 DNS에 지시할 수 있습니다. 사용자 지정 DNS 서버에서 제공하는 내부 영역 이름이 그리 많지 않은 경우 좋은 옵션입니다.
아웃바운드 정책을 구현하면 해결 순서를 변경하고 해결 요청을 사용자 지정 서버에 먼저 보낼 수 있습니다. 요청이 VPC 커넥터에 도달하면 메타데이터 서버로 이동해야 하며 아웃바운드 서버 정책을 사용하는 방법을 알아야 합니다.
답변2
시스템에서 구성된 서버에 의존하는 대신 코드에서 고유한 DNS 클라이언트를 수행하고 선택한 서버에 쿼리를 보낼 수 있습니다.
예를 들어 Python에서 'tut.by' 리소스의 A 레코드(IP 주소)에 대해 DNS 서버 1.1.1.1을 쿼리하기 위해 다음을 수행합니다( configure=False
Resolver가 시스템 전체 값으로 구성되는 것을 방지하기 위해).
>>> import dns.resolver
>>> resolver = dns.resolver.Resolver(configure=False)
>>> resolver.nameservers.append('1.1.1.1')
>>> response = resolver.resolve('tut.by')
>>> for ip in response:
... print(ip)
...
178.172.160.4
178.172.160.5
178.172.160.3
178.172.160.2
도움이 되길 바랍니다.