안녕하세요, 쯀리입니다.
오늘은 CoreDNS에 관해 알아보도록 하겠습니다.
https://kubernetes.io/docs/tasks/administer-cluster/coredns/
CoreDNS
CoreDNS는 유연하고 확장 가능한 DNS 서버로, 쿠버네티스 클러스터 DNS 역할을 할 수 있습니다. 쿠버네티스와 마찬가지로, CoreDNS 프로젝트는 CNCF에서 호스팅합니다.
기존 배포에서 kube-dns를 대체하거나 클러스터를 배포하고 업그레이드하는 kubeadm과 같은 도구를 사용하여 클러스터에서 kube-dns 대신 CoreDNS를 사용할 수 있습니다.
⭐️ DNS 이름 구조
Kubernetes에서 서비스에 접근할 때 사용하는 DNS 이름은 일반적으로 다음과 같은 계층 구조를 가집니다:
- <service-name>: 현재 네임스페이스에서 서비스에 접근할 때 사용됩니다.
- <service-name>.<namespace>: 다른 네임스페이스의 서비스에 접근할 때 사용됩니다.
- <service-name>.<namespace>.svc: 서비스 리소스임을 명시하는 완전한 형태의 DNS 이름입니다.
- <service-name>.<namespace>.svc.cluster.local: 클러스터 내에서 완전히 정규화된 도메인 이름(FQDN)으로, 클러스터의 루트 도메인까지 포함한 가장 긴 형태의 이름입니다.
Quiz.
1. Identify the DNS solution implemented in this cluster.
controlplane ~ ➜ k get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-768b85b76f-548jr 1/1 Running 0 10m
coredns-768b85b76f-thpjb 1/1 Running 0 10m
etcd-controlplane 1/1 Running 0 10m
kube-apiserver-controlplane 1/1 Running 0 10m
kube-controller-manager-controlplane 1/1 Running 0 10m
kube-proxy-vvcdc 1/1 Running 0 10m
kube-scheduler-controlplane 1/1 Running 0 10m
DNS로 보여지는 Pod들이 보이나요? Coredns-{파드명}
2.How many pods of the DNS server are deployed?
controlplane ~ ➜ k get deploy -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
coredns 2/2 2 2 11m
3. What is the name of the service created for accessing CoreDNS?
controlplane ~ ➜ k get svc -n kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 13m
4. What is the IP of the CoreDNS server that should be configured on PODs to resolve services?
Service에서 Cluster-IP인 10.96.0.10가 CoreDNS 서버의 IP입니다.
5. Where is the configuration file located for configuring the CoreDNS service?
controlplane ~ ➜ k describe po coredns-768b85b76f-548jr -n kube-system
Name: coredns-768b85b76f-548jr
Namespace: kube-system
Priority: 2000000000
..
Args:
-conf
/etc/coredns/Corefile
config 파일은 /etc/coredns/Corefile에 있다고 명시되어있습니다.
6. How is the Corefile passed into the CoreDNS POD?
controlplane ~ ➜ k describe po coredns-768b85b76f-548jr -n kube-system
...
Volumes:
config-volume:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: coredns
Optional: false
kube-api-access-p6hqj:
ConfigMap (a volume populated by a ConfigMap)에서 받아서 CoreDNS POD로 넘겨줍니다.
7. What is the name of the ConfigMap object created for Corefile?
controlplane ~ ➜ kubectl get configmap -n kube-system
NAME DATA AGE
coredns 1 38m
extension-apiserver-authentication 6 38m
kube-apiserver-legacy-service-account-token-tracking 1 38m
kube-proxy 2 38m
...
coredns
8. What is the root domain/zone configured for this kubernetes cluster?
controlplane ~ ➜ kubectl describe configmap coredns -n kube-system
Name: coredns
Namespace: kube-system
Labels: <none>
Annotations: <none>
Data
====
Corefile:
----
.:53 {
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
BinaryData
====
Events: <none>
Configmap의 '.:53' 부분을 살펴보면 CoreDNS의 Corefile에서 DNS 서버가 어떤 도메인과 포트에서 요청을 처리할지를 정의하는 설정입니다.
kubernetes cluster.local in-addr.arpa ip6.arpa 부분은
- kubernetes cluster.local in-addr.arpa ip6.arpa: CoreDNS가 클러스터 내에서 cluster.local 도메인과 in-addr.arpa(IPv4 역방향 조회), ip6.arpa(IPv6 역방향 조회) 도메인을 처리합니다.
클러스터 내의 모든 서비스는 기본적으로 cluster.local 도메인 하위에 위치하고 있기 때문에 root domain/zone은 cluster.local입니다.
9. We have deployed a set of PODs and Services in the default and payroll namespaces. Inspect them and go to the next question.
controlplane ~ ➜ k get po
NAME READY STATUS RESTARTS AGE
hr 1/1 Running 0 42m
simple-webapp-1 1/1 Running 0 42m
simple-webapp-122 1/1 Running 0 42m
test 1/1 Running 0 42m
controlplane ~ ➜ k get po -n payroll
NAME READY STATUS RESTARTS AGE
web 1/1 Running 0 42m
controlplane ~ ➜ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 48m
test-service NodePort 10.103.39.238 <none> 80:30080/TCP 42m
web-service ClusterIP 10.111.79.175 <none> 80/TCP 42m
controlplane ~ ➜ k get svc -n payroll
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-service ClusterIP 10.97.70.151 <none> 80/TCP 42m
10. What name can be used to access the hr web server from the test Application?
You can execute a curl command on the test pod to test. Alternatively, the test Application also has a UI. Access it using the tab at the top of your terminal named test-app.
hr 어플리케이션을 접속해보겠습니다.
controlplane ~ ➜ k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 54m
test-service NodePort 10.103.39.238 <none> 80:30080/TCP 49m
web-service ClusterIP 10.111.79.175 <none> 80/TCP 49m
controlplane ~ ➜ k describe svc web-service
Name: web-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: name=hr
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.111.79.175
IPs: 10.111.79.175
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.0.5:80
Session Affinity: None
Events: <none>
web-service의 서비스를 살펴보면 selector가 hr를 선택하고 있기때문에 IP는 web-service의 ip 와 포트를 사용해서 접근해야겠습니다.
Test Application에 접근해 curl도 날려보겠습니다.
controlplane ~ ➜ k get po
NAME READY STATUS RESTARTS AGE
hr 1/1 Running 0 51m
simple-webapp-1 1/1 Running 0 50m
simple-webapp-122 1/1 Running 0 50m
test 1/1 Running 0 51m
controlplane ~ ➜ k exec -it test -- /bin/sh
/opt/webapp-conntest # curl -k 10.111.79.175:80
This is the HR server!
문제로 돌아가 hr서비스에 접근하기 위한 서비스의 이름은 web-service 입니다.
11. Which of the names CANNOT be used to access the HR service from the test pod?
12. Which of the below name can be used to access the payroll service from the test application?
controlplane ~ ➜ k get svc -n payroll
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-service ClusterIP 10.97.70.151 <none> 80/TCP 57m
test에서 접근하기위해서는 {서비스명}.{네임스페이스}로 접근해야합니다.
web-service.payroll
13.Which of the below name CANNOT be used to access the payroll service from the test application?
위에서 명시해준 DNS 이름의 순서대로 접근해야합니다. cluster로 접근하려면 web-service.payroll.svc.cluster.local로 접근해야겠죠?
14. We just deployed a web server - webapp - that accesses a database mysql - server. However the web server is failing to connect to the database server. Troubleshoot and fix the issue.
They could be in different namespaces. First locate the applications. The web server interface can be seen by clicking the tab Web Server at the top of your terminal.
다른 namespace를 가졌다면 host를 명시해줄때 namespace와 함께 명시해주어야합니다.
controlplane ~ ➜ k get svc -n payroll
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
mysql ClusterIP 10.101.237.133 <none> 3306/TCP 3m24s
web-service ClusterIP 10.104.78.52 <none> 80/TCP 10m
default에 있는 web-app의 database host를 찾지 못해 생기는 이슈입니다. 해당 pod를 수정해주겠습니다.
controlplane ~ ➜ k get po
NAME READY STATUS RESTARTS AGE
hr 1/1 Running 0 8m28s
simple-webapp-1 1/1 Running 0 8m13s
simple-webapp-122 1/1 Running 0 8m13s
test 1/1 Running 0 8m27s
webapp-9cbdd95f-j9xns 1/1 Running 0 58s
controlplane ~ ✖ k describe po webapp-9cbdd95f-j9xns
Name: webapp-9cbdd95f-j9xns
....
Restart Count: 0
Environment:
DB_Host: mysql
DB_User: root
DB_Password: paswrd
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-2bqnl (ro)
....
DB_Host 부분을 mysql.payroll로 변경해줍니다.
issue !! Pod를 삭제하고 수정해도 자동으로 이전 버전으로 파드가 물려있는것 확인
!Deployment를 수정해주어야 합니다!
controlplane ~ ➜ k edit deploy webapp
'''
Environment:
DB_Host: mysql.payroll
DB_User: root
DB_Password: paswrd
'''
deployment.apps/webapp edited
그럼 pod도 자동으로 새로 생성이 되며 해결 가능
15. From the hr pod nslookup the mysql service and redirect the output to a file /root/CKA/nslookup.out
controlplane ~ ➜ k exec -it hr -- /bin/sh
~ # nslookup mysql.payroll
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: mysql.payroll.svc.cluster.local
Address: 10.101.237.133
~ # exit
controlplane ~ ➜ k exec -it hr -- nslookup mysql.payroll > /root/CKA/nslookup.out
controlplane ~ ➜ cat /root/CKA/nslookup.out
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: mysql.payroll.svc.cluster.local
Address: 10.101.237.133
오늘은 CoreDNS에 관해 알아보았습니다.
다음시간에는 Ingress에 관해 알아보겠습니다.
참조
※ Udemy Labs - Certified Kubernetes Administrator with Practice Tests
'IT 잡지식 > DevOps' 카테고리의 다른 글
[CKA] KodeKloud - Ingress Networking - 2 (0) | 2024.08.15 |
---|---|
[CKA] KodeKloud - Ingress Networking - 1 (0) | 2024.08.15 |
[CKA] KodeKloud - Service Networking (0) | 2024.08.10 |
[CKA] KodeKloud - Networking Weave (0) | 2024.08.10 |
[CKA] KodeKloud - Deploy Network Solution (0) | 2024.08.08 |