모음/[쿠버네티스 인 액션]

[쿠버네티스 인 액션] 5장.서비스 - 서비스 생성, 서비스 검색

ttoance 2024. 9. 21. 21:34

 

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

kubectl create -f kubia-svc.yaml

 

 

2) kubectl get svc 

kubectl get svc

클러스터 ip 가 10.103.21.142 이고, 클러스터 ip이기 때문에 내부에서만 액세스 할 수 있다. 

 

 

3) kubectl exec kubia-985c88848-n8ksc -- curl -s http://10.103.21.142

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

kubectl exec kubia-985c88848-n8ksc -- curl -s http://10.97.60.28

 

몇번을 요청해봐도 요청한 client와 동일한 pod를 리턴하는 것을 알 수 있다. 

 

 

5) 이름이 지정된 포트 사용 + 동일한 서비스에서 여러 개의 포트 사용 

kubernetes-in-action/Chapter05/kubia-svc-named-ports.yaml at master · luksa/kubernetes-in-action (github.com)

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) 환경변수 통한 서비스 검색 

kubectl exec kubia-985c88848-8vd7j -- env

 

 

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

 

 

반응형