Kubernetes에서 Consul DNS 요청 해석
Kubernetes에서 Consul DNS 요청 해석 (Resolve Consul DNS requests in Kubernetes)
이 주제에서는 KubeDNS를 사용하는 경우 stub-domain 구성 또는 CoreDNS를 사용하는 경우 proxy 구성을 사용하여 Kubernetes에서 Consul DNS를 구성하는 방법을 설명해요.
출처: 문서
본문
이 주제에서는 KubeDNS를 사용하는 경우 stub-domain 구성 또는 CoreDNS를 사용하는 경우 proxy 구성을 사용하여 Kubernetes에서 Consul DNS를 구성하는 방법을 설명합니다.
구성되면 <consul-service-name>.service.consul 형식의 DNS 요청이 Consul의 서비스에 대해 해석됩니다. 이는 모든 Kubernetes namespace에서 작동합니다.
참고 (Note): <consul-service-name>만(.service.consul 없이) 해석되도록 요청을 원한다면 Consul to Kubernetes Service Sync를 켜야 합니다.
Consul DNS Cluster IP
KubeDNS 또는 CoreDNS를 구성하려면 먼저 Helm 차트가 만든 Consul DNS 서비스의 ClusterIP가 필요합니다.
Consul DNS 서비스의 기본 이름은 consul-dns입니다. 해당 이름을 사용하여 ClusterIP를 가져오세요:
$ kubectl get svc consul-dns --output jsonpath='{.spec.clusterIP}'
10.35.240.78%
이 설치에서 ClusterIP는 10.35.240.78입니다.
참고 (Note): consul이 아닌 다른 helm 릴리스 이름으로 Consul을 설치했다면 DNS 서비스 이름은 <release-name>-consul-dns가 됩니다.
KubeDNS
KubeDNS를 사용하는 경우 KubeDNS가 .consul로 끝나는 모든 도메인을 해석하기 위해 Consul DNS 서비스를 사용하도록 지시하는 ConfigMap을 만들어야 합니다:
Consul DNS IP를 환경 변수로 내보내세요:
export CONSUL_DNS_IP=10.35.240.78
그리고 ConfigMap을 만드세요:
$ cat <<EOF | kubectl apply --filename -
apiVersion: v1
kind: ConfigMap
metadata:
labels:
addonmanager.kubernetes.io/mode: EnsureExists
name: kube-dns
namespace: kube-system
data:
stubDomains: |
{"consul": ["$CONSUL_DNS_IP"]}
EOF
Warning: kubectl apply should be used on resource created by either kubectl create --save-config or kubectl apply
configmap/kube-dns configured
ConfigMap이 성공적으로 생성되었는지 확인하세요:
$ kubectl get configmap kube-dns --namespace kube-system --output yaml
apiVersion: v1
data:
stubDomains: |
{"consul": ["10.35.240.78"]}
kind: ConfigMap
...
참고 (Note): stubDomain은 정적 IP를 가리킬 수만 있습니다. Consul DNS 서비스의 클러스터 IP가 변경되면 계속 작동하려면 구성 맵에서 새 서비스 IP와 일치하도록 업데이트해야 합니다. 이는 전체 클러스터 재구축과 같이 서비스가 삭제되고 다시 생성될 때 발생할 수 있습니다.
참고 (Note): .consul이 아닌 다른 존을 사용하는 경우 stub domain을 해당 존으로 변경하세요.
이제 Verifying DNS Works 섹션으로 건너뛰세요.
CoreDNS 구성 (CoreDNS Configuration)
Kubernetes 클러스터에서 KubeDNS 대신 CoreDNS를 사용하는 경우 kube-system namespace의 기존 coredns ConfigMap에 Consul DNS 서비스의 클러스터 IP를 가리키는 consul에 대한 forward 정의를 포함하도록 업데이트해야 합니다.
ConfigMap을 편집하세요:
$ kubectl edit configmap coredns --namespace kube-system
기본 .:53 블록 아래에 consul 블록을 추가하고 <consul-dns-service-cluster-ip>를 앞서 찾은 DNS 서비스의 IP 주소로 바꾸세요.
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>
+ }
참고 (Note): consul 프록시는 정적 IP만 가리킬 수 있습니다. consul-dns 서비스의 클러스터 IP가 변경되면 계속 작동하려면 새 IP로 업데이트해야 합니다. 이는 전체 클러스터 재구축과 같이 서비스가 삭제되고 다시 생성될 때 발생할 수 있습니다.
참고 (Note): .consul이 아닌 다른 존을 사용하는 경우 키를 그에 따라 변경하세요.
OpenShift 클러스터 (OpenShift clusters)
참고 (Note): 아래에서는 OpenShift CLI oc을 사용하여 다음 단계를 완료합니다. OpenShift CLI 설치에 대한 자세한 내용은 Getting started with OpenShift CLI에서 확인할 수 있습니다.
consul 하위 도메인(존)에 대해 consul-dns 서비스를 지정하여 /etc/resolv.conf 파일의 기본 전달 구성을 재정의하는 데 DNS 전달을 사용할 수 있습니다.
먼저 consul-dns 서비스 clusterIP를 찾으세요:
$ oc get svc consul-dns --namespace consul --output jsonpath='{.spec.clusterIP}'
172.30.186.254
해당 IP 주소를 기록한 다음 default DNS Operator를 편집하세요:
$ oc edit edit dns.operator/default
DNS Operator 구성의 spec 섹션에 다음 servers 섹션 항목을 추가하세요:
spec:
servers:
- name: consul-server
zones:
- consul
forwardPlugin:
policy: Random
upstreams:
- 172.30.186.254 # Set to clusterIP of consul-dns service
구성 변경 사항을 저장하세요. 그런 다음 dns-default configmap에 consul 전달 존이 업데이트되었는지 확인하세요:
$ oc get configmap/dns-default -n openshift-dns -o yaml
...
data:
Corefile: |
# consul-server
consul:5353 {
prometheus 127.0.0.1:9153
forward . 172.30.186.254 {
policy random
}
errors
log . {
class error
}
bufsize 1232
cache 900 {
denial 9984 30
}
}
...
DNS 작동 확인 (Verifying DNS Works)
DNS가 작동하는지 확인하려면 DNS를 쿼리하는 간단한 작업을 실행하세요. 다음 작업을 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
그런 다음 작업의 포드 이름을 쿼리하고 로그를 확인하세요. 성공적인 DNS 쿼리를 보여주는 다음과 유사한 출력이 표시되어야 합니다. 오류가 보이면 DNS가 제대로 구성되지 않은 것입니다.
$ kubectl get pods --show-all | grep dns
dns-lkgzl 0/1 Completed 0 6m
$ 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