KCNA — 쿠버네티스·클라우드 네이티브 입문 · 서비스·네트워킹·스토리지 · 실습
서비스로 파드를 찾고 설정과 저장소를 붙이기
목표
Service 가 파드를 어떻게 찾는지, 못 찾으면 어떤 모습인지 직접 만들어 보고, ConfigMap/Secret 주입과
PVC 요청, 서비스 DNS 이름 규칙까지 손으로 확인합니다.
왜 중요한가
Service 관련 장애의 압도적 다수는 "서비스가 안 만들어졌다"가 아니라 **"서비스는 만들어졌는데
뒤에 아무것도 없다"** 입니다. 쿠버네티스는 셀렉터가 실제로 파드를 잡는지 검증해 주지 않기 때문입니다.
오타 하나로 엔드포인트가 0 건이 되어도 kubectl get svc 는 멀쩡해 보입니다.
그래서 이 실습에서는 일부러 그 상황을 만들어 봅니다. 한 번 손으로 만들어 본 실패는
현장에서 3분 만에 진단됩니다.
ConfigMap/Secret 은 12-factor 의 "설정은 환경에서"를 쿠버네티스가 구현한 형태입니다.
이미지는 어디서나 같고, 다른 건 주입되는 값이어야 합니다. 다만 Secret 은 이름과 달리
기본 설정에서 암호화되지 않는다는 점을 기억해 두세요 — 이건 KCSA 의 중요한 주제입니다.
PVC 는 '요청서'라는 비유가 전부입니다. 파드는 "NFS 서버 10.0.0.5 의 /export/data" 를 가리키지 않고
"1Gi 짜리 RWO 저장소"를 요청합니다. 이 간접 계층 덕분에 같은 매니페스트가 노트북 클러스터에서도
프로덕션에서도 돕니다.
단계
1. 네임스페이스 kcna-net 을 만들고 그 안에 Deployment shop 을 만듭니다 — 이미지 nginx:1.27-alpine, replicas 2, 파드 템플릿 라벨 app=shop.
2. Service shop-svc 를 만듭니다 — 타입 ClusterIP, port 80, 셀렉터 app=shop. 엔드포인트가 2 건 잡히는지 확인합니다.
3. Service broken-svc 를 같은 네임스페이스에 만듭니다 — port 80 이지만 셀렉터는 일부러 app=shopp(p 하나 더). 엔드포인트가 0 건인 것을 확인하고, 이 서비스를 고치는 올바른 셀렉터를 /root/kcna-net/diagnosis.txt 에 app=shop 형태로 한 줄 저장합니다.
4. Service shop-np 를 만듭니다 — 타입 NodePort, port 80, nodePort 는 30080, 셀렉터 app=shop.
5. ConfigMap shop-config 를 만듭니다(키 APP_MODE, 값 production). Secret shop-secret 을 만듭니다(키 API_KEY, 값은 아무 문자열). 그리고 파드 shop-client 를 만들어 환경변수 APP_MODE 는 shop-config 의 APP_MODE 키에서, 환경변수 API_KEY 는 shop-secret 의 API_KEY 키에서 가져오게 합니다. 이미지는 nginx:1.27-alpine 입니다.
6. PVC shop-data 를 만듭니다 — 요청 용량 1Gi, accessModes ReadWriteOnce, storageClassName standard.
7. shop-svc 의 정규화된 DNS 이름(FQDN)을 /root/kcna-net/dns.txt 에 한 줄로 저장하고, 같은 네임스페이스에 헤드리스 서비스 shop-headless 를 만듭니다 — 셀렉터 app=shop, port 80, clusterIP 는 헤드리스로 지정.
참고
- 엔드포인트 확인은
kubectl get endpointslice -n kcna-net -l kubernetes.io/service-name=shop-svc -o yaml로 볼 수 있습니다.kubectl describe svc의 Endpoints 줄도 빠릅니다. - 5단계 파드의 env 항목은
valueFrom.configMapKeyRef/valueFrom.secretKeyRef를 씁니다. 각각name과key두 필드가 필요합니다. - 클러스터 도메인은 기본값
cluster.local입니다. - 흔한 실수 1: 3단계에서 오타 서비스를 만들자마자 고쳐 버리는 것. 이 단계는 틀린 상태 그대로 두어야 통과합니다.
- 흔한 실수 2: 6단계 PVC 가 Pending 이라고 잘못 만든 줄 알고 지웠다 다시 만드는 것. 동적 프로비저너가 없으면 Pending 이 정상이며, 채점은 요청 내용만 봅니다.
단계 7개
- 백엔드 디플로이먼트 세우기
- ClusterIP 서비스와 엔드포인트 확인
- 셀렉터 오타를 일부러 재현하기
- NodePort 로 밖에서 들어오는 문 만들기
- ConfigMap 과 Secret 주입하기
- PVC 로 저장소 요청서 쓰기
- DNS 이름 규칙과 헤드리스 서비스