Kubernetes에서 Consul DNS 요청 해석
Kubernetes에서 Consul DNS 요청 해석 (Consul DNS on Kubernetes)
Kubernetes에서 Consul DNS 요청을 해석하는 방법을 설명하는 문서예요. 먼저 KubeDNS 또는 CoreDNS를 Consul과 인터페이스하도록 구성해야 해요.
출처: 문서
본문
이 주제는 Kubernetes에서 Consul DNS 요청을 해석하는 방법을 설명해요. 그 전에 KubeDNS 또는 CoreDNS를 Consul과 인터페이스하도록 구성해야 해요.
소개 (Introduction)
Consul DNS는 레코드를 쿼리하는 기본 인터페이스예요. Kubernetes에서 Consul DNS는 다음으로 구성할 수 있어요:
- KubeDNS를 사용하는 경우 스텁 도메인 구성(stub-domain configuration)
- CoreDNS를 사용하는 경우 프록시 구성
구성되면 <consul-service-name>.service.consul 형식의 DNS 요청이 Consul의 서비스에 대해 해석돼요. 이는 모든 Kubernetes 네임스페이스에서 동작해요.
<consul-service-name>(.service.consul 없이)으로 요청을 해석하려면 서비스 동기화(service sync)를 활성화해야 해요.
Consul DNS 클러스터 IP 가져오기 (Retrieve Consul DNS cluster IP)
KubeDNS 또는 CoreDNS를 구성하려면 Helm 차트가 만든 Consul DNS 서비스의 ClusterIP가 필요해요.
Consul DNS 서비스의 기본 이름은 consul-dns예요. 그 이름을 사용해 ClusterIP를 가져와요. 이 설치에서 ClusterIP는 10.35.240.78이에요.
$ kubectl get svc consul-dns --output jsonpath='{.spec.clusterIP}'
10.35.240.78%
Consul을 consul이 아닌 다른 Helm 릴리스 이름으로 설치했다면 DNS 서비스 이름은 <release-name>-consul-dns가 돼요.
ClusterIP를 확보하면 Kubernetes 설정에 맞는 KubeDNS 또는 CoreDNS 섹션으로 이동할 수 있어요.
KubeDNS 구성 (Configure KubeDNS)
KubeDNS를 사용한다면 .consul로 끝나는 모든 도메인을 해석하기 위해 Consul DNS를 사용하라고 KubeDNS에 지시하는 ConfigMap을 만들어야 해요.
먼저 Consul DNS IP를 환경 변수로 내보내요. 이는 이전 단계에서 가져온 IP 주소예요.
$ export CONSUL_DNS_IP=10.35.240.78
그런 다음 ConfigMap을 정의해요. .consul이 아닌 다른 존(zone)을 사용한다면 스텁 도메인을 그 존으로 변경해요.
consul-kubedns-config-map.yaml
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{ "consul": ["$CONSUL_DNS_IP"] }
ConfigMap을 만들어요.
$ kubectl apply --filename consul-kubedns-config-map.yaml
ConfigMap이 성공적으로 생성되었는지 확인해요.
$ kubectl get configmap kube-dns --namespace kube-system --output yaml
apiVersion: v1
data:
stubDomains: |
{"consul": ["10.35.240.78"]}
kind: ConfigMap
## ...
stubDomain은 정적 IP만 가리킬 수 있어요. Consul DNS의 클러스터 IP가 변경되면 새 서비스 IP에 맞게 ConfigMap을 업데이트해야 해요. Consul DNS의 클러스터 IP는 전체 클러스터 재구축과 같이 서비스가 삭제되고 다시 생성되면 변경될 수 있어요.
이제 DNS 확인 섹션으로 건너뛰어요.
CoreDNS 구성 (Configure CoreDNS)
CoreDNS를 사용한다면 kube-system 네임스페이스의 기존 coredns ConfigMap을 업데이트해 .consul에 대한 forward 정의를 Consul DNS 서비스의 클러스터 IP를 가리키도록 포함해야 해요.
coreDNS ConfigMap을 편집해요.
$ kubectl edit configmap coredns --namespace kube-system
다음 항목을 편집해야 해요:
- 기본
.:53블록 아래에consul블록을 추가한다. <consul-dns-service-cluster-ip>를 앞서 가져온 DNS 서비스의 IP 주소로 바꾼다..consul이 아닌 다른 존을 사용한다면 그에 맞게 키를 변경한다.
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: coredns
namespace: kube-system
data:
Corefile: |
.:53 {
## Existing CoreDNS definition...
}
consul {
errors
cache 30
forward . <consul-dns-service-cluster-ip>
}
Consul 프록시는 정적 IP만 가리킬 수 있어요. Consul DNS의 클러스터 IP가 변경되면 새 서비스 IP에 맞게 ConfigMap을 업데이트해야 해요. Consul DNS의 클러스터 IP는 전체 클러스터 재구축과 같이 서비스가 삭제되고 다시 생성되면 변경될 수 있어요.
DNS 확인 (Verify DNS)
DNS가 동작하는지 확인하려면 DNS를 쿼리하는 다음 예시 작업(Job)을 실행해요. 다음 작업을 job.yaml 파일에 저장해요.
job.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: dns
spec:
template:
spec:
containers:
- name: dns
image: anubhavmishra/tiny-tools
command: ['dig', 'consul.service.consul']
restartPolicy: Never
backoffLimit: 4
예시 작업을 클러스터에 배포해요.
$ kubectl apply --filename job.yaml
그런 다음 작업의 파드 이름을 가져와요.
$ kubectl get pods --show-all | grep dns
dns-lkgzl 0/1 Completed 0 6m
마지막으로 파드의 로그를 가져와요. 로그에는 다음과 비슷한 성공적인 DNS 쿼리가 표시되어야 해요. 로그에 오류가 표시되면 DNS가 제대로 구성되지 않은 거예요.
$ kubectl logs dns-lkgzl
; <<>> DiG 9.11.2-P1 <<>> consul.service.consul
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4489
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 4
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;consul.service.consul. IN A
;; ANSWER SECTION:
consul.service.consul. 0 IN A 10.36.2.23
consul.service.consul. 0 IN A 10.36.4.12
consul.service.consul. 0 IN A 10.36.0.11
;; ADDITIONAL SECTION:
consul.service.consul. 0 IN TXT "consul-network-segment="
consul.service.consul. 0 IN TXT "consul-network-segment="
consul.service.consul. 0 IN TXT "consul-network-segment="
;; Query time: 5 msec
;; SERVER: 10.39.240.10#53(10.39.240.10)
;; WHEN: Wed Sep 12 02:12:30 UTC 2018
;; MSG SIZE rcvd: 206