CKA — 쿠버네티스 관리자 · 서비스와 네트워킹 · 실습
서비스로 트래픽 붙이기
목표
서비스 타입 다섯 가지와 인그레스를 직접 만들고, 셀렉터가 어긋나 엔드포인트가 비는 상황을 만들어 고칩니다.
왜 중요한가
시험에서 "서비스를 만들었는데 접속이 안 된다" 는 문제는 대부분 셀렉터, 포트, Ready 셋 중 하나입니다. Service 오브젝트가 트래픽을 나르는 것이 아니라 셀렉터로 백엔드 목록을 만드는 선언이라는 점을 이해하면 진단 순서가 자동으로 정해집니다. 엔드포인트에 IP 가 있는지부터 봅니다. 있으면 데이터플레인이나 포트 문제이고, 없으면 셀렉터나 파드 Ready 문제입니다.
targetPort 와 port 를 구분하는 것도 중요합니다. port 는 서비스가 여는 포트, targetPort 는 파드 쪽 포트입니다. 둘이 같으면 생략할 수 있어 헷갈리기 쉽지만, 다르게 두는 순간 실수가 드러납니다.
단계
1. 네임스페이스 cka-net 을 만들고 Deployment web (레플리카 2, 이미지 nginx:1.27, 파드 라벨 app=web)을 만든다. 그 다음 ClusterIP 서비스 web-svc 를 만든다. port 80, targetPort 80, 셀렉터 app=web.
2. Deployment api (레플리카 2, 이미지 nginx:1.27, 파드 라벨 app=api)를 만든다. 서비스 api-svc 를 셀렉터 app=api-server 로 잘못 만든 뒤 엔드포인트 조회 결과를 /root/cka-net/endpoints-before.txt 에 저장한다. 그 다음 셀렉터를 app=api 로 고친다.
3. NodePort 서비스 web-np 를 만든다. port 80, 셀렉터 app=web, nodePort 는 30080 으로 직접 지정한다.
4. Deployment db (레플리카 1, 이미지 nginx:1.27, 파드 라벨 app=db)를 만들고 헤드리스 서비스 db-headless 를 만든다. clusterIP None, port 5432, 셀렉터 app=db.
5. 서비스 multi-svc 를 만든다. 셀렉터 app=web, 포트 두 개 — 이름 http (port 80, targetPort 8080), 이름 metrics (port 9090).
6. 서비스 ext-db 를 만든다. type ExternalName, externalName nas.homelab.internal.
7. 인그레스 web-ing 을 만든다. ingressClassName nginx, host cka.homelab.internal, 경로 / (pathType Prefix)는 web-svc 의 80 포트로, 경로 /api (pathType Prefix)는 api-svc 의 80 포트로 보낸다.
참고
- 엔드포인트는
kubectl get endpointslice -n cka-net -l kubernetes.io/service-name=web-svc로도 볼 수 있습니다. - 2단계는 순서가 채점 대상입니다. 고치기 전에 반드시 파일로 남기세요.
- 흔한 실수 1:
clusterIP: None을 나중에 고치려는 것. 이 필드는 불변입니다. - 흔한 실수 2: 인그레스에서
pathType을 빼먹는 것. v1 에서는 필수 필드라 거부됩니다.
단계 7개
- ClusterIP 서비스와 엔드포인트
- 셀렉터 오타로 엔드포인트가 비는 상황
- NodePort 번호 직접 지정하기
- 헤드리스 서비스
- 포트 두 개 노출하기
- ExternalName 으로 외부 시스템 가리기
- 종합: 인그레스로 두 서비스 묶기