HomePostAbout
thumbnail
『쿠버네티스 교과서』실습 3장 part 2
K8s
Docker
DevOps
2024.01.18.

해당 포스트는 교재 『쿠버네티스 교과서』를 활용하며,
환경은 Kubernetes v1.28. Docker Desktop으로 진행합니다.

개념 요약

클러스터 외부 트래픽

데이터베이스와 같은 스토리지 컴포넌트는 k8s 외부에서 동작할수도 있다.
클러스터 외부를 가리키는 도메인 네임을 통해 이를 해결한다.

익스터널네임

애플리케이션 파드에서 로켈 네임을 사용하고, k8s DNS서버에 이 로컬 네임을 조외하여 외부 도메인으로 해소해준다.
단, HTTP 서비스의 경우 헤더의 호스트명이 익스터널네임 서비스와 다르다면 오류가 발생한다.

헤드리스 서비스

클러스터 IP 형태로 정의가 되지만, 레이블 셀렉터가 없어 대응하는 파드도 없다. IP 주소의 목록이 담긴 엔드포인트와 함께 배포된다.

엔드포인트

모바일 디바이스, 데스크톱 컴퓨터, 가상 머신, 임베디드 디바이스, 서버 등 네트워크 시스템에 연결하는 물리적 디바이스. 단, k8s에서는 서비스가 트래픽을 전달하고자 하는 Pod의 집합. 즉, 각 pod로 트래픽을 연결해주는 k8s 서비스의 일부분.

  • 서비스에도 컨트롤러가 존재하여, 파드가 변경되면 엔드포인트의 목록을 최신으로 업데이트한다!

k8s 네트워크 프록시

파드에서 나온 통신의 라우팅을 담당한다. 각각의 노드에서 모든 서비스의 엔드포인트에 대한 최신 정보를 유지하고, 운영체제가 제공하는 네트워크 패킷 필터를 사용하여 트래픽을 라우팅한다.

  • 파드는 각 노드마다 네트워크 프록시를 경유하여 네트워크에 접근한다.
  • 프록시는 패킷 필터링을 적용하여 가상 IP 주소를 실제 엔드포인트로 연결한다.

네임스페이스

여러 k8s 리소스를 하나로 묶기 위한 리소스. k8s 클러스터를 논리적 파티션으로 나누는 역할. 기본적으로 default 네임스페이스가 있고, DNS 서버나 API 같은 내장 컴포넌트가 쓰는 kube-system 네임스페이스가 있다.

실습

주요 요점들

  • 서비스는 k8s 가상네트워크의 일부로, 모든 파드가 제한없이 접근할 수 있다.
  • 각 파드에서는 도메인 네임을 조회하여 k8s DNS를 거쳐 서비스의 도메인 네임과 IP를 확인할 수 있다.
  • 로컬 도메인 네임은 네임스페이스를 포함하는 완전한 도메인 네임의 별명이다.

매니페스트 파일

api-service-externalName.yaml

apiVersion: v1
kind: Service
metadata:
  name: numbers-api
spec:
  type: ExternalName
  externalName: raw.githubusercontent.com

PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 현재 배포된 클러스터IP 서비스를 삭제한다
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl delete svc numbers-api
service "numbers-api" deleted
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 익스터널네임 서비스를 새로 배포한다
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl apply -f numbers-services/api-service-externalName.yaml
service/numbers-api created
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> 
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 서비스의 상세 정보를 확인한다
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl get svc numbers-api
NAME          TYPE           CLUSTER-IP   EXTERNAL-IP                 PORT(S)   AGE
numbers-api   ExternalName   <none>       raw.githubusercontent.com   <none>    2s

PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl exec deploy/numbers-api -- sh -c 'nslookup numbers-api'            
Server:         10.96.0.10
Address:        10.96.0.10:53

server cant find numbers-api.cluster.local: NXDOMAIN

server cant find numbers-api.cluster.local: NXDOMAIN

server cant find numbers-api.svc.cluster.local: NXDOMAIN

server cant find numbers-api.svc.cluster.local: NXDOMAIN

numbers-api.default.svc.cluster.local   canonical name = raw.githubusercontent.com
Name:   raw.githubusercontent.com
Address: 185.199.108.133
Name:   raw.githubusercontent.com
Address: 185.199.111.133
Name:   raw.githubusercontent.com
Address: 185.199.109.133
Name:   raw.githubusercontent.com
Address: 185.199.110.133

numbers-api.default.svc.cluster.local   canonical name = raw.githubusercontent.com
Name:   raw.githubusercontent.com
Address: 2606:50c0:8001::154
Name:   raw.githubusercontent.com
Address: 2606:50c0:8003::154
Name:   raw.githubusercontent.com
Address: 2606:50c0:8000::154
Name:   raw.githubusercontent.com
Address: 2606:50c0:8002::154
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 헤드리스 서비스를 배포한다
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl apply -f numbers-services/api-service-headless.yaml
service/numbers-api created
endpoints/numbers-api created
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 서비스의 상세 정보를 확인한다
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl get svc numbers-api
NAME          TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
numbers-api   ClusterIP   10.106.142.227   <none>        80/TCP    0s
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 엔드포인트의 상세 정보를 확인한다
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl get endpoints numbers-api
NAME          ENDPOINTS            AGE
numbers-api   192.168.123.234:80   0s
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # sleep-2 서비스의 엔드포인트 목록 출력
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl get endpoints sleep-2
NAME      ENDPOINTS       AGE
sleep-2   10.1.0.102:80   59m
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 파드 삭제
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl delete pods -l app=sleep-2
pod "sleep-2-7f69798f94-9mn2v" deleted
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 엔드포인트가 새로운 파드의 주소로 업데이트되었는지 확인 
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl get endpoints sleep-2
NAME      ENDPOINTS   AGE
sleep-2   <none>      59m
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 디플로이먼트 채로 삭제
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl delete deploy sleep-2
deployment.apps "sleep-2" deleted
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 엔드포인트는 여전히 있지만, 가리키는 IP 주소가 없음     
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl get endpoints sleep-2



NAME      ENDPOINTS   AGE
sleep-2   <none>      60m
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # default 네임스페이스의 서비스 리소스 목록 확인
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl get svc --namespace default
NAME          TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
kubernetes    ClusterIP      10.96.0.1        <none>        443/TCP          4h53m
numbers-api   ClusterIP      10.106.142.227   <none>        80/TCP           4h46m
numbers-web   LoadBalancer   10.108.149.146   localhost     8080:31104/TCP   4h52m
sleep-2       ClusterIP      10.111.245.96    <none>        80/TCP           74m
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 쿠버네티스 시스템 네임스페이스의 서비스 리소스 목록 확인
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl 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   4h53m
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 완전한 도메인 네임으로 DNS 조회하기
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl exec deploy/sleep-1 -- sh -c 'nslookup numbers-api.default.svc.cluster.local | grep "^[^*]"'   
Server:       10.96.0.10
Address:      10.96.0.10:53
Name:   numbers-api.default.svc.cluster.local
Address: 10.106.142.227
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03>
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> # 쿠버네티스 시스템 네임스페이스의 완전한 도메인 네임으로 DNS 조회하기
PS C:\Users\hdyang\Desktop\Project\k8s-practice\ch03> kubectl exec deploy/sleep-1 -- sh -c 'nslookup kube-dns.kube-system.svc.cluster.local | grep "^[^*]"'  
Server:       10.96.0.10
Address:      10.96.0.10:53
Name:   kube-dns.kube-system.svc.cluster.local
Address: 10.96.0.10

Source

Just an developer with drinks
2022 HyeonDong, Powered By Gatsby.