(7) DNS for Service and Pods
Services, Load Balancing and Networking
Kubernetes networking은 4가지 문제를 해결
- Pod 내의 Container들은 loopback을 통한 networking을 사용하여 통신
- LoopBack?
- 거의 coding없이
dynamic end-to-end REST API
를 생성가능한 고확장가능한, 오픈소스 Node.js Framework - 가상의 인터페이스. 물리 인터페이스인 경우 serial일때 clock rate, WAN encapsulation등 부여 및 외부 간섭이 필요
- 비교적 안전한 인터페이스
- 거의 coding없이
- LoopBack?
- Cluster Networking은
다른 Pod 간의 communication
을 제공 - Service resource는 Pod안에 실행 중인 application을
cluster 바깥에서 접근하기 위해 외부로 노출
- Service를 활용하여 cluster 내부에서 사용할 수 있는 서비스만 게시 가능
DNS for Service and Pods
Introduction
Kubernetes DNS은 DNS Pod와 Service 를 Cluster에 스케쥴링 함. 개별 container들이 DNS Name을 해석할때 DNS servier의 IP를 사용하도록 kubeletes를 구성
Cluster에 정의된 모든 Service들은 DNS Name에 할당. 기본적으로 client Pod의 DNS 검색은 Pod의 namespace와 cluster의 기본 domain을 포함하여 검색
Namespaces of Services
DNS query는 pod의 namespace에 따라서 다른 결과를 return한다 namespace를 특정하는 DNS query들은 pods의 namespace에 제한된다 DNS query에서 지정하여 다른 namespace의 서비스에 접근한다
- example
test
라는 namespace가 있다고 가정.prod
라는 namespace에 있는data
service 안에 존재.data
를 위한 query는 결과를 얻을 수 없음. 왜냐하면 그것은 pod의test
namespace를 사용하기 떄문이다data.prod
의 query는 원하는 결과를 얻을 수 있음. 왜냐하면 특정한 namespace를 지정하였기 떄문이다
- example
- DNS query들은 pod의
/etc/resolvconf
를 활용하여 확장된다. Kubelet은 이 file을 각각의 pod에 설정.- example
data
를 위한 query는data.test.cluster.local
로 확장된다search
option의 값은 query들은 확장한다. - 상세 : resolv.conf
1 2 3
nameserver 10.32.0.10 search <namespace>.svc.cluster.local svc.cluster.local cluster.local options ndots:5
- example
- 요약하면,
test
의 namespace에 있는 pod는data.prod
또는data.prod.cluster.local
로 성공적으로 접근 가능
DNS Records
DNS record를 찾은 object들은 아래와 같음
1
2
1. services
2. pods
Services
A/AAAA records
"Normal" service
들은 service ip계열에 따라my-svc.my-namespace.svc.cluster-domain.example
형식의 이름을 가진 DNS A또는 AAAA record에 할당. 이는 service의 cluster ip로 해석Headless(cluster ip가 없는)
는 service들은 또한 service ip계열에 따라my-svc.my-namespace.svc.cluster-domain.example
형식의 이름을 가진 DNS A또는 AAAA record에 할당.Normal
service와 달리, 이것은 service에 의해 선택된 Pod의 ip집합으로 해석.- client들은 set를 사용하거나 set에서 표준 round-robin 선택을 사용
SRV records
- SRV 레코드는
Normal service
또는Headless service
에 속하는 네임드 port 를 위해 만들어졌다. - 각각의 네임드 port에 대해서 SRV 레코드는 다음과 같은 형식을 가질 수 있다.
_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster-domain.example.
Normal service
의 경우, 이는 포트 번호와 도메인 네임으로 해석된다.my-svc.my-namespace.svc.cluster-domain.example.
Headless service
의 경우, 서비스를 지원하는 각 파드에 대해 하나씩 복수 응답으로 해석되며 이 응답은pod의 포트 번호
와domain 이름
을 포함한다.auto-generated-name.my-svc.my-namespace.svc.cluster-domain.example
Pods
- 일반적으로 파드에는 다음과 같은 DNS 주소를 갖는다.
pod-ip-address.my-namespace.pod.cluster-domain.example.
예를 들어, default 네임스페이스의 파드에 IP 주소 172.17.0.3이 있고, 클러스터의 도메인 이름이 cluster.local 이면, 파드는 다음과 같은 DNS 주소를 갖는다.
172-17-0-3.default.pod.cluster.local.
- 서비스에 의해 노출된 디플로이먼트(Deployment)나 데몬셋(DaemonSet)에 의해 생성된 모든 파드는 다음과 같은 DNS 주소를 갖는다.
pod-ip-address.deployment-name.my-namespace.svc.cluster-domain.example
Pod’s Hostname and subdomain fields
Pod’s DNS Policy
DNS 정책은 파드별로 설정할 수 있다. 현재 k8s는 다음과 같은 pod별 DNS 정책을 지원한다. 이 정책들은 pod spec dnsPolicy 필드에서 지정할 수 있다.
Default: 파드는 파드가 실행되고 있는 노드로부터 네임 해석 설정(the name resolution configuration)을 상속받는다. 자세한 내용은 관련 논의에서 확인할 수 있다.
ClusterFirst: “www.kubernetes.io”와 같이 클러스터 도메인 suffix 구성과 일치하지 않는 DNS 쿼리는 노드에서 상속된 업스트림 네임서버로 전달된다. 클러스터 관리자는 추가 스텁-도메인(stub-domain)과 업스트림 DNS 서버를 구축할 수 있다. 그러한 경우 DNS 쿼리를 어떻게 처리하는지에 대한 자세한 내용은 관련 논의에서 확인할 수 있다.
ClusterFirstWithHostNet: hostNetwork에서 running 상태인 파드의 경우 DNS 정책인 “ClusterFirstWithHostNet”을 명시적으로 설정해야 한다.
None: 이 정책은 파드가 쿠버네티스 환경의 DNS 설정을 무시하도록 한다. 모든 DNS 설정은 파드 스펙 내에 dnsConfig필드를 사용하여 제공해야 한다. 아래 절인 파드의 DNS 설정에서 자세한 내용을 확인할 수 있다.
Note:
Default
is not the default DNS policy. If dnsPolicy is not explicitly specified, thenClusterFirst
is used.
Pods’s DNS Config
사용자가 Pod의 DNS setting을 직접 설정 가능
dnsConfig
field는 optional이고, dnsPolicy
setting과 함께 동작 dnsPolicy
값이 None
으로 설정되어 있어야 dnsConfig
field를 지정가능
nameservers
: pod의 dns서버가 사용할 IP주소의 목록.dnsPolicy
가None
으로 설정된 경우 적어도 하나의 IP주소가 포함되어야함. 그렇지 않으면 이 속성은 생략 가능.nameservers
에 나열된 서버는 지정된 dns policy를 통해 생성된 기본 nameserver와 합쳐지며 중복되는 주소는 제거searches
: pod의 hostname을 찾기 위한 dns search domain. 이 속성은 생략가능. 값을 지정한 경우 나열된 검색 domain은 지정된 dns policyy를 통해 기본 search domain과 합쳐진다. 병합 시 중복되는 domain은 제거되며, kubernetes는 최대6개의 search domains
을 허용options
:name 속성(필수)과 value 속성(선택)
을 가질 수 있는 오브젝트들의 선택적 목록이다. 이 속성의 내용은 지정된 DNS 정책에서 생성된 옵션으로 병합된다. 이 속성의 내용은 지정된 DNS 정책을 통해 생성된 옵션으로 합쳐지며, 병합 시 중복되는 항목은 제거된다.custom dns setting의 예시
- 위에서 pod가 생성되면, container의
test
의/etc/resolv.conf
파일에는 다음과 같은 내용이 검색1 2 3
nameserver 1.2.3.4 search ns1.svc.cluster-domain.example my.dns.search.suffix options ndots:2 edns0
- 위에서 pod가 생성되면, container의