5.1. 서비스가 나온 배경
파드가 다른 파드에게 제공하는 서비스를 사용하려면 다른 파드를 찾는 방법이 필요하다.
이때, 제공하는 IP주소나 호스트 이름을 지정하는 것은 쿠버네티스에서 동작할 수 없다.
1) 파드는 일시적이다. 파드가 다른 파드를 위한 공간 확보하려고 노드에서 제거되거나, 누군가 파드 수를 줄이거나, 클러스터 노드의 장애로 언제든 다른 노드로 이동할 수 있다.
2) 쿠버네티스틑 노드에 파드를 스케줄링한 후 바로 시작되기 전에 IP주소를 할당하기 때문에 미리 알 수 없다.
3) 수평 스케일링 같은 경우, 클라이언트는 파드의 개별 IP 목록을 유지하는 것이 아니라 단일 IP 주소로 접근해야함
5.2 서비스 소개
- 동일한 서비스를 제공하는 파드 그룹에 지속적인 단일 접점을 만들려고 할 때 생성하는 리소스
- 각 서비스는 서비스가 존재하는 동안 절대 바뀌지 않는 IP주소와 포트가 있다.
- 클라이언트는 해당 IP주소와 포트로 접속한 다음 해당 서비스를 지원하는 파드 중 하나로 연결된다.
5.3 kubectl expose를 사용해 서비스 생성
1) kubectl create -f kubia-svc.yaml
kubia-svc.yaml
kubernetes-in-action/Chapter05/kubia-svc.yaml at master · luksa/kubernetes-in-action (github.com)
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: kubia
서비스가 사용할 포트는 80이고, 파드의 포트 8080으로 라우팅 한다는 의미이다.
kubectl create -f kubia-svc.yaml
2) kubectl get svc
클러스터 ip 가 10.103.21.142 이고, 클러스터 ip이기 때문에 내부에서만 액세스 할 수 있다.
3) kubectl exec kubia-985c88848-n8ksc -- curl -s http://10.103.21.142
요청할때마다 다른 pods가 나온다고 알 수 있다.
*kubectl scale deployment kubia --replicas=3 로 일단 pods 늘린다.
- 파드의 컨테이너 내에서 curl 명령을 실행하도록 쿠버네티스에 지시
- 이 IP에는 세 개의 파드가 연결돼 있고, 쿠버네티스 서비스 프로기가 연결을 가로채서 세 개의 파드 중 임의의 파드로 요청 전달
- 해당 파드 내에서 실행 중인 node.js는 요청 처리하고 http 응답 반환
4) 서비스의 세션 어피니티 구성
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- port: 80
targetPort: 8080
sessionAffinity: ClientIP
selector:
app: kubia
sessionAffinity 속성을 기본값 None 대신 ClientIP 로 설정하면, 특정 클라이언트의 모든 요청을 매번 같은 파드로 리다이렉션 할 수 있다.
*쿠키 기반 세션 어피니티는 없는데, 이는 쿠버네티스 서비스가 payload를 신경쓰지 않고 tcp와 udp패킷만 처리하기 때문
kubectl delete service kubia
kubectl create -f kubia-svc.yaml
몇번을 요청해봐도 요청한 client와 동일한 pod를 리턴하는 것을 알 수 있다.
5) 이름이 지정된 포트 사용 + 동일한 서비스에서 여러 개의 포트 사용
apiVersion: v1
kind: Service
metadata:
name: kubia
spec:
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8443
selector:
app: kubia
5.4 서비스 검색
1) 환경변수 통한 서비스 검색
2) DNS 통한 서비스 검색
- 파드에서 실행중인 프로세스에서 수행된 모든 DNS쿼리는 시스템에서 실행 중인 모든 서비스를 알고 있는 쿠버네티스의 자체 DNS서버로 처리
- 각 서비스는 내부 DNS 서버에서 DNS 항목을 가져오고 서비스 이름을 알고 있는 클라이언트 파드는 환경변수 대신 FQDN(정규화된 도메인 이름)으로 액세스 가능
3) FQDN을 통한 서비스 연결
- FQDN (Fully Qualified Domain Name)
kubectl exec -it kubia-985c88848-8vd7j -- bash
curl http://kubia.default.svc.cluster.local
curl http://kubia.default
curl http://kubia
'스터디 > [쿠버네티스 인 액션] (2024.8)' 카테고리의 다른 글
[쿠버네티스 인 액션] 5장.서비스 - 레디니스 프로브, 헤드리스 서비스, 서비스 해결 (0) | 2024.09.22 |
---|---|
[쿠버네티스 인 액션] 5장.서비스 - 서비스 앤드포인트, 외부 클라이언트 연결 (노드포트, 로드밸러스, 인그레스) (0) | 2024.09.22 |
[쿠버네티스 인 액션] 4장. 레플리케이션과 그 밖의 컨트롤러 - 잡, 크론잡 (1) | 2024.09.09 |
[쿠버네티스 인 액션] 4장. 레플리케이션과 그 밖의 컨트롤러 - 레플리카셋, 데몬셋 (0) | 2024.09.08 |
[쿠버네티스 인 액션] 4장. 레플리케이션과 그 밖의 컨트롤러 - 라이브니스 프로브, 레플리케이션 컨트롤러 (2) | 2024.09.07 |