CKA — Kubernetes Administrator
Attaching Traffic With Services
한국어 원문으로 표시합니다.
목표
서비스 타입 다섯 가지와 인그레스를 직접 만들고, 셀렉터가 어긋나 엔드포인트가 비는 상황을 만들어 고칩니다.
왜 중요한가
시험에서 "서비스를 만들었는데 접속이 안 된다" 는 문제는 대부분 셀렉터, 포트, Ready 셋 중 하나입니다. Service 오브젝트가 트래픽을 나르는 것이 아니라 셀렉터로 백엔드 목록을 만드는 선언이라는 점을 이해하면 진단 순서가 자동으로 정해집니다. 엔드포인트에 IP 가 있는지부터 봅니다. 있으면 데이터플레인이나 포트 문제이고, 없으면 셀렉터나 파드 Ready 문제입니다.
targetPort 와 port 를 구분하는 것도 중요합니다. port 는 서비스가 여는 포트, targetPort 는 파드 쪽 포트입니다. 둘이 같으면 생략할 수 있어 헷갈리기 쉽지만, 다르게 두는 순간 실수가 드러납니다.
단계
- 네임스페이스
cka-net을 만들고 Deploymentweb(레플리카 2, 이미지nginx:1.27, 파드 라벨app=web)을 만든다. 그 다음 ClusterIP 서비스web-svc를 만든다. port 80, targetPort 80, 셀렉터app=web. - Deployment
api(레플리카 2, 이미지nginx:1.27, 파드 라벨app=api)를 만든다. 서비스api-svc를 셀렉터app=api-server로 잘못 만든 뒤 엔드포인트 조회 결과를/root/cka-net/endpoints-before.txt에 저장한다. 그 다음 셀렉터를app=api로 고친다. - NodePort 서비스
web-np를 만든다. port 80, 셀렉터app=web, nodePort 는30080으로 직접 지정한다. - Deployment
db(레플리카 1, 이미지nginx:1.27, 파드 라벨app=db)를 만들고 헤드리스 서비스db-headless를 만든다. clusterIPNone, port 5432, 셀렉터app=db. - 서비스
multi-svc를 만든다. 셀렉터app=web, 포트 두 개 — 이름http(port 80, targetPort 8080), 이름metrics(port 9090). - 서비스
ext-db를 만든다. typeExternalName, externalNamenas.homelab.internal. - 인그레스
web-ing을 만든다. ingressClassNamenginx, hostcka.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 에서는 필수 필드라 거부됩니다.
ClusterIP 서비스와 엔드포인트
네임스페이스 cka-net 을 만들고 Deployment web (레플리카 2, 이미지 nginx:1.27, 파드 라벨 app=web)을 만든다. 그 다음 ClusterIP 서비스 web-svc 를 만든다. port 80, targetPort 80, 셀렉터 app=web.
kubectl expose 가 가장 빠르지만 셀렉터가 무엇으로 잡히는지 확인하세요. 엔드포인트는 파드가 Ready 여야 채워집니다.
셀렉터 오타로 엔드포인트가 비는 상황
Deployment api (레플리카 2, 이미지 nginx:1.27, 파드 라벨 app=api)를 만든다. 서비스 api-svc 를 셀렉터 app=api-server 로 잘못 만든 뒤 엔드포인트 조회 결과를 /root/cka-net/endpoints-before.txt 에 저장한다. 그 다음 셀렉터를 app=api 로 고친다.
먼저 틀린 셀렉터로 만들어 엔드포인트가 빈 것을 눈으로 보고 파일에 남긴 다음 고치세요. 순서를 지키지 않으면 증거가 남지 않습니다.
NodePort 번호 직접 지정하기
NodePort 서비스 web-np 를 만든다. port 80, 셀렉터 app=web, nodePort 는 30080 으로 직접 지정한다.
nodePort 는 ports 배열 안에 들어갑니다. 기본 범위는 30000~32767 이고 그 밖의 값은 거부됩니다.
헤드리스 서비스
Deployment db (레플리카 1, 이미지 nginx:1.27, 파드 라벨 app=db)를 만들고 헤드리스 서비스 db-headless 를 만든다. clusterIP None, port 5432, 셀렉터 app=db.
clusterIP 를 None 으로 두면 VIP 가 배정되지 않습니다. 이 필드는 만든 뒤 바꿀 수 없으니 잘못 만들었다면 다시 만드세요.
포트 두 개 노출하기
서비스 multi-svc 를 만든다. 셀렉터 app=web, 포트 두 개 — 이름 http (port 80, targetPort 8080), 이름 metrics (port 9090).
포트가 둘 이상이면 각 포트에 name 이 필수입니다. port 와 targetPort 는 다른 값일 수 있습니다.
ExternalName 으로 외부 시스템 가리기
서비스 ext-db 를 만든다. type ExternalName, externalName nas.homelab.internal.
ExternalName 서비스는 셀렉터도 포트도 갖지 않고 ClusterIP 도 받지 않습니다. 다른 타입으로 먼저 만들었다면 다시 만드는 편이 깔끔합니다.
종합: 인그레스로 두 서비스 묶기
인그레스 web-ing 을 만든다. ingressClassName nginx, host cka.homelab.internal, 경로 / (pathType Prefix)는 web-svc 의 80 포트로, 경로 /api (pathType Prefix)는 api-svc 의 80 포트로 보낸다.
ingressClassName 은 애너테이션이 아니라 spec 의 필드입니다. 각 path 에는 pathType 이 필수이고 백엔드는 service.name 과 service.port.number 로 지목합니다.