Introduction
k8s의 dns에 대해서 포스팅하려고한다.
CKA준비하는 포스팅인데 계속 엘리스의 토끼굴에 빠지게됨 ㅡㅡ
# k8s의 dns 구성
k8s클러스터에서는 이렇게 서비스에 연결된 pod형식으로 dns서버역할을 하는 coredns pod들이 있다.
얘네들이 네임서버가 된다.
dns에 대해서 예전에 포스팅해놓은게 있음.
https://jacobowl.tistory.com/229
DNS
# DNS란 무엇일까?? 영어는 Domain Name Server이라고 하는데 예전에 난 도메인 구입해본 경험이 있다. 우리가 보통 naver.com이나, google.com을 들어갈때 브라우저에 이 주소를 입려하고 가는데 이게 바로
jacobowl.tistory.com
# 확인해보자.
일단 muzzi랑 dori라는 web server pod들을 만들어줄거다.
kubectl run muzzi --image=nginx --restart=Never -- sh -c 'echo "muzzi web" > /usr/share/nginx/html/index.html && nginx -g "daemon off;"'
kubectl run dori --image=nginx --restart=Never -- sh -c 'echo "dori web" > /usr/share/nginx/html/index.html && nginx -g "daemon off;"'
각각 만들어줬고 curl 요청으로 웹통신이 잘 되는것도 확인함.
뭐 이런식으로 muzzi랑 dori pod들을 만들어줌.
# 새로운 pod를 만들어서 통신을 해보자.
kubectl run testdns --image=curlimages/curl --restart=Never --command -- sleep 3600
curl되게하려고 저 이미지로 testdns라는 pod를 만들어줬음. 참고로 얜 sleep 커맨드 안쳐주면 죽더라.
잘 만들어졌음.
뭐 이런식으로 생겼을거다.
각각 아이피가 저렇게 생김.
이제 저 testdns pod로 exec로 들어가서 muzzi, dori pod에 curl 로 확인해보면
각각 muzzi랑 dori web으로 잘 된다.
즉 다른 pod들이더라도 같은 네트워크에 있어서 서로 통신이 잘 되는것같음. network policy를 사용하면 차단하고 할수있다는데..
암튼
이제 이 pod에서 도메인서버가 어디인지 확인을 해보자
cat /etc/resolv.conf
네임 서버가 10.96.0.10이란다.
아까 kube-system ns에서 서비스 확인할때 kube-dns 서비스가 이 아이피랑 일치한다.
즉 이 testdns pod는 10.96.0.10이라는 아이피로 도메인아이피를 따온다는 소리임.
# 그럼 muzzi web과 dori web의 도메인은 어떻게 될까?
DNS for Services and Pods
Your workload can discover Services within your cluster using DNS; this page explains how that works.
kubernetes.io
공식문서를 보면
이런식으로 형식이라고 한다.
아이피에서 쩜을 하이픈으로 바꿔야함. 아마 도메인이 쩜을 쓰니까 그런듯?
그럼 curl 요청을 muzzi pod 도메인형식에 보내보면
curl 10-244-3-69.default.pod.cluster.local
아이피 친거랑 똑같이 웹서버에서 html파일을 잘 읽어온다.
ns lookup을 쳐보면 해당 도메인이 어떤 아이피에 연결됐는지, 네임서버 포트까지 잘 나온다.
아까 muzzi pod의 아이피랑 연결된걸 볼 수 있음.
뭐 이런식으로 동작하는거다.
# 하위도메인 테스트
cluster.local까지는 짤라도 된다.
# 외부 인터넷망 도메인 테스트
구글 네임서버 8.8.8.8에 핑을 쳐봐도 된다.
그럼 구글 도메인에는?
이렇다.
예전 dns서버 포스팅에서 사용한 이미지인데 도메인서버가 도메인 찾는 flow이다.
아마 coredns pod에서는 도메인 정보를 못찾으면 아마 외부 도메인서버에서 도메인을 찾게 하는듯.
core dns에서 네임서버를 확인하고 싶어서 exec로 접속하려고 했으나,
얘네는 쉘자체가 없고 cat명령어도 안되더라. 그래서 확인은 못했음.
# 서비스 연결
테스트를 위해 test dns에서 나와서 서비스를 하나 더 만들어보았다.
서비스 도메인형식은 저렇게 생겼단다.
다시 testdns pod로 접속해서 테스트를 해보면,
서비스 도메인으로 통신이 잘 되는걸 확인 할 수 있다.
서비스는 pod처럼 아이피 하이픈 형식이아니라 그냥 서비스이름만으로 되는거라 좀 편한거같음.
왜 pod는 아이피로 안해놨을까? 싶은데..
# 다른 네임스페이스끼리도 될까?
outside라는 네임스페이스를 만들고, 여기에 seokgu라는 pod를 만들어줬다.
test dns에서 seokgu pod의 도메인으로 네임스페이스부분을 outside로 설정하고 nslookup을 헀더니 아이피를 잘 가져와준다.
# dns셋팅 커스텀
시간없어서 나중에 보충함
# 시험문제는?
보통 pod를 만들고 이에 연결된 svc를 만든다음 dns테스트를 위한 busybox이미지 파일을 만들고 nslookup 명령어를 pod와 svc에 쳐서 나온 스트링을 뽑아내는 식으로 나온다.
* trouble shooting 1
core dns pod가 먹통됨 ㅡㅡ
kubectl rollout restart deployment coredns -n kube-system
재시작해주니
살아남.
* trouble shooting 2
controller pod도 먹통
걍 vm재시작하니 됨.
노트북이 배터리쇼트발생해서 아예 먹통됨 ㅡㅡ 그래서 전기끊기면 노트북이 아예꺼져서 계속 vm이 비정상적으로 종료되니 이런일이 자주 발생한다..
'k8s > CKA' 카테고리의 다른 글
따배씨 / pod - multi & side-car & init containers / resource usage (0) | 2024.10.28 |
---|---|
따배씨 / network policy (0) | 2024.10.24 |
따배씨 / persistent volume (0) | 2024.10.20 |
Mock Exam - 2 (0) | 2024.09.24 |
role & rolebinding / clusterRole & clusterRolebinding / service account (0) | 2024.09.20 |