서비스란?
쿠버네티스의 서비스는 클라이언트의 요청을 파드에 전달하는 역활을 담당한다.
이러한 서비스가 필요한 이유는 파드의 IP 주소가 기동할 때마다 바뀌기 때문이다.
그래서 파드에 접속해야하는 클라이언트는 서비스가 가지는 대표 IP를 사용해서 접속해야 한다.
- 서비스는 로드밸런서의 역활을 가지며, 클라이언트의 요청을 받기 위한 대표 IP 주소를 획득한다.
- 서비스의 이름은 내부 DNS에 등록되기 때문에 클라이언트는 서비스의 이름만으로 서비스의 IP 주소를 획득할 수 있다.
- 서비스는 실렉터(selector)에 지정된 라벨과 일치하는 파드 중 하나에게 요청을 전달한다.
더보기파드는 기동될 때 라벨이나 IP 주소를 포함한 자신의 오브젝트 정보를 마스터 노드의 etcd에 등록한다.
그래서 서비스의 전송처를 결정할 때 실렉터(selector)의 라벨에 일치하는 파드를 etcd에서 조회하여 전송할 파드의 IP 주소를 취득한다.
라벨에 의해 대상 오브젝트를 결정하는 것이 쿠버네티스의 기본적인 동작이다. - 서비스가 만들어지고 나서 기동된 파드의 컨테이너에는 서비스에 대한 정보가 담긴 환경 변수가 자동으로 설정된다.
- 서비스에서는 4종류의 서비스 타입이 있어, 클라이언트의 범위를 클러스터 내부로 한정할지, 외부까지 확장할지, 또한 클러스터 외부의 IP 주소에 전송할지를 설정한다.
서비스의 기능을 이해하고자 할 때 중요한 7개 키워드는 다음과 같다.
대표 IP 주소
서비스는 파드의 그룹을 대표하여 클라이언트의 요청을 받기 위해 대표 IP 주소(ClusterIP)를 가진다.
헤드리스로 지정한 경우에는 대표 IP 주소를 획득하지 않고, 파드의 IP 주소를 직접 내부 DNS로 설정한다.
부하분산
서비스의 대표 IP 주소에 도착한 요청은 실렉터의 라벨과 일치하는 파드에 전송된다.
이를 위한 모듈은 kube-proxy는 초창기에는 커널의 유저 공간에서 동작하는 프록시 서버였지만, 지금은 iptables나 ipvs를 관리하는 프로그램으로 바뀌었다.
환경 변수
서비스가 만들어지고 나서 생성되는 파드의 컨테이너에는 환경 변수가 설정되어 있다.
컨테이너 안의 애플리케이션 코드에서는 환견 경부를 이용해서 서비스의 대표 IP 주소를 얻을 수 있다.
서비스 타입
서비스를 설정할 때는 해당 서비스를 이용하는 클라이언트를 고려하여 서비스 타입을 지정한다.
예를 들면, 클러스터 내부 파드를 대상으로 하는 경우 클러스터 외부에서 접근하는 경우를 고려하여 지정한다.
어피니티
기본적으로 부하분산에 사용되는 알고리즘은 랜덤이다.
클라이언트에 따라 전송되는 파드를 고정하고 싶은 경우에는 sessionAffinity 항목에 ClientIP를 설정한다.
그리고 HTTP 헤드 안의 쿠키(Cookie) 값에 따라 정송되는 파드를 고정하고 싶은 경우에는 뒤에서 설명할 인그레스를 이용해야 한다.
실렉터와 라벨
서비스에 도닥한 요청 트래픽이 파드에 전송될 때는 실렉터(selector)와 라벨을 참조한다.
라벨은 파드 등의 오브젝트에 부여하는 키값 쌍이다.
서비스에 도착한 요청은 실렉터에 설정된 조건에 일치하는 라벨을 가지는 파드에 전송한다.
실렉터의 라벨 조건이나 파드에 부여되는 라벨은 운영중에도 바꿀 수 있어 유연하게 운영할 수 있다.
'Docker & Kubernetes' 카테고리의 다른 글
도커 커맨드 명령어 시트 (0) | 2021.11.24 |
---|---|
컨트롤러의 기본 (0) | 2021.11.24 |
클러스터 네트워크 (0) | 2021.11.23 |
파드의 라이프 사이클과 종료 처리 (0) | 2021.11.23 |
파드의 기본 (0) | 2021.11.23 |