LabHub
배우기 러닝패스 코스

CKA — Kubernetes Administrator

Attaching Traffic With Services

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

서비스 타입 다섯 가지와 인그레스를 직접 만들고, 셀렉터가 어긋나 엔드포인트가 비는 상황을 만들어 고칩니다.

왜 중요한가

시험에서 "서비스를 만들었는데 접속이 안 된다" 는 문제는 대부분 셀렉터, 포트, Ready 셋 중 하나입니다. Service 오브젝트가 트래픽을 나르는 것이 아니라 셀렉터로 백엔드 목록을 만드는 선언이라는 점을 이해하면 진단 순서가 자동으로 정해집니다. 엔드포인트에 IP 가 있는지부터 봅니다. 있으면 데이터플레인이나 포트 문제이고, 없으면 셀렉터나 파드 Ready 문제입니다.

targetPortport 를 구분하는 것도 중요합니다. 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 포트로 보낸다.

참고

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 로 지목합니다.