파드는 일시적이다(언제든 지워지고 새로 생성될 수 있다). 수평 스케일링 된 파드들은 동일한 서비스를 제공해야 한다. 매번 생성된 파드의 아이피를 알고 여러개의 파드들의 아이피를 매번 연결해주는 작업은 번거롭다. 이 문제를 해결하기 위해 ‘서비스’ 라는 리소스를 제공한다.
서비스
각 서비스는 고정된 ip와 포트를 가지고 있고 서비스로 들어온 요청은 서비스와 연결된 파드 중 하나로 연결된다.
그렇기 때문에 각 파드의 아이피와 포트를 알 필요가 없어진다.
서비스도 레이블 셀렉터를 이용해 파드와 연결을 한다.
kubectl expose 명령어로 레플리케이션 컨트롤러에 의해 생성된 파드에 바로 서비스를 달 수 있다.
yaml로 수동으로 생성하는 것도 가능하다.
세션 어피니티
sessionAffinity: ClientIP
특정 클라이언트의 요청을 특정 파드에만 보내도록 설정 할 수 있다.
서비스는 쿠키를 안본다.
서비스는 TCP와 UDP 패킷만 처리하고 페이로드는 신경쓰지 않는다.
쿠키는 http 프로토콜에 포함되어 있으므로 쿠키는 보지 않는다.
그렇기 때문에 세션 어피니티를 쿠키 기반으로 할 수 없다.
서비스는 여러 포트를 열 수 있다.
단일 포트 뿐만 아니라 80, 443 같이 멀티 포트도 지원한다.
단 각 포트에 따라 다른 파드에 연결하는 것은 불가능하다.
각 포트에 번호가 아닌 이름을 지정해서 사용할 수도 있다.
서비스의 아이피와 포트 확인
서비스가 생성되고 이제 확인을 해야한다.
서비스의 아이피는 환경변수를 통해 확인 할 수 있다.
서비스이름_SERVICE_HOST, 서비스이름_SERVICE_PORT 의 이름으로 저장된다.
DNS로 확인
시스템 파드 중 kube-dns라는 파드가 있고 같은 이름의 서비스도 존재한다.
얘들은 자체 dns서버를 실행하며 모든 파드는 자동으로 이를 사용하도록 구성된다.
서비스들은 이 dns 항목을 가져올 수 있고 서비스의 이름을 알고 있으면 환경변수 대신 FQDN으로 접근할 수 있다.