Service
Service 리소스
- POD가 재생성되면 IP가 바뀌기때문에 직접 연결하는 데 문제가 생길 수 있음
- 그래서 서비스 리소스를 이용
- 한 번 할당받은 뒤에 바뀌지 않는 cluster IP 갖고 있음
- Service 리소스가 cluster IP 할당받고, 사용자는 그 IP에 리퀘스트 요청
- POD의 레이블(Selector)을 이용해서 서비스가 POD에 리퀘스트 전달
- POD 앞단에서 사용자의 트래픽 Load Balancing하는 역할
Service 종류
- ClusterIP
- 디폴트 서비스타입. 클러스터 내부에서 접속 가능
- NodePort
- 각 Node의 지정된 port 할당하는 방식. 클러스터 내/외부 모두 접속 가능
- LoadBalancer
- 로드밸런서의 IP 이용하여 클러스터 외부에서 접근 가능
Service 상세 조회
app=guestbook이라는 label을 가진 pod에 요청 전송
endpoints들에 해당하는 것이 대상 pod의 IP와 port
sessionAffinity 속성
MSA: stateless하게 개발 (session을 사용하지 않음)
sessionAffinity: ClientIP 옵션을 사용하면 들어오는 요청을 매번 같은 POD로 리다이렉트
Multi-Port
Service 리소스 1개로 멀티 포트 지원 가능
각 포트에 반드시 이름 지정해야 함
TargetPort 별로 Endpoint 생성됨
+ 레이블 셀렉터는 각 포트에 개별적으로 설정 불가
+ port에 이름 지정할 경우 Service 스펙 변경 없이 POD의 컨테이너 port 변경 가능
Service discovery
1. 환경 변수
- POD 생성 전에 서비스 생성 시 POD는 환경변수를 조사해서 서비스의 IP 주소와 port 번호 알 수 있다.
- pod와 service의 생성 시점에 따라 정보를 알 수도, 모를 수도 있음
2. DNS
- 서비스 이름을 알고 있는 경우 환경 변수 대신 FQDN(Qualified Domain Name, 정규화된 도메인 이름)을 통해 액세스 가능
- pod 내부에서 사용할 때만 의미가 있고, 여전히 환경변수로부터 port 번호를 알 수 있어야 함
- 요청한 url의 호스트 이름을 사용하듯이 서비스 이름을 통해 서비스에 액세스 가능
- 각 pod 컨테이너의 dns resolver 구성 방식에 따라 네임스페이스 및 svc.cluster.local 접미어 생략 가능
외부 클라이언트에 서비스 노출
1. NodePort 서비스 타입으로 설정
- 서비스 액세스 가능 주소
- <ClusterIP>:<ClusterIP>
- <NodeIP>:<NodePort>
- <MasterIp>:<NodePort>
2. LoadBalancer 서비스 타입으로 설정 (NodePort 타입 확장형)
3. Ingress 리소스 이용
- Layer 7에서의 요청 처리 가능
- HTTP 요청을 인그레스에 보냈을 때 호스트와 요청상의 경로는 요청이 포워드될 서비스 결정
- 인그레스 컨트롤러
- 인그레스 리소스 작동 위해서는 클러스터에서 인그레스 컨트롤러 실행해야 함
- 쿠버네티스 공식 지원 구현체: GKE, NGINX Ingress Controller
Service Health Check
1. Liveness probe
- 컨테이너가 살아있는지 아닌지를 체크하는 방법
- 실패 시 컨테이너 다시 시작
2. Readiness probe
- 컨테이너가 서비스가 가능한 상태인지를 체크하는 방법
- 실패 시 서비스에서 제외
'TIL > etc' 카테고리의 다른 글
[이산수학] 집합론 (1) | 2024.04.22 |
---|---|
jupyter notebook 설치 명령어 (0) | 2024.03.27 |
[Kubernetes] Deployment (0) | 2024.01.14 |
[Kubernetes] POD / POD Generator (1) | 2024.01.12 |
[Kubernetes] Kubernetes 개요 (0) | 2024.01.11 |