본문 바로가기
CKA

[Udemy CKA - Core Concepts] Service

by 2won2 2024. 8. 11.

Services

  • 네트워크를 통해 외부 또는 내부에서 안정적으로 접근할 수 있도록 하는 추상화된 리소스
  • Pod는 일시적인 존재로, IP 주소가 자주 변경되므로, 클러스터 내에서 다른 Pod가 지속적으로 특정 Pod에 접근하기 어렵고, 외부에서도 접근하기 힘들기 때문에 Service를 사용한다.

 

NodePort

  • service가 내부 포트를 Node의 포트에 액세스할 수있게 하는 곳
  • 클러스터 외부에서 접근할 수 있도록 Node의 특정 포트를 열어줌
  • 외부 트래픽이 이 포트를 통해 들어와 service를 통해 Pod에 전달
    • TargetPort
      • service가 요청을 전달하는 곳
      • Pod에 붙어있음
    • Port
      • service에 붙어있음
      • ClusterIP와 함께 동작(기본적으로 ClusterIP가 생성)
    • NodePort
      - 웹 서버에 액세스 하는 데 사용
      • Node에 붙어있음
      • 30,000 ~ 32,767의 범위
apiVersion: v1
kind: Service
metadata:
  name: myapp-service

spec:
  type: NodePort
  ports:
    - targetPort: 80 # ClusterIP에서 사용하는 포트
      port: 80(필수) # Pod에서 사용하는 포트
      nodePort: 30008 # NodePort에서 사용하는 포트
  selector # Pod 정보 작성
    app: myapp
    type: front-end
  • targetPort를 지정하지 않으면 port와 같다.
  • nodePort를 지정하지 않으면 유효한 범위에서 자동으로 설정된다.

1. 30008 포트를 열어 외부 트래픽을 받아들인다
2. 이 트래픽은 port를 통해 Service로 전달된다.
3. Service는 targetPort번호로 전달하여 해당 포트를 사용하는 Pod들에게만 전달한다.
4. 선택된 Pod들 중 selector에 맞는 Pod들에게만 트래픽이 전달된다.

  • 여러개의 Pod와 연결될 때, 랜덤 알고리즘으로 로드밸런싱

 

Services Cluster IP

  • 클러스터 내부에서만 접근 가능한 IP 주소 할당
  • 여러 개의 Pod(ex 백엔드 pod)를 하나로 묶어 단일 인터페이스 제공
  • 내부 서비스들간의 통신 담당(외부 접근X)
apiVersion: v1
kind: Service
metadata:
  name: back-end

spec:
  type: ClusterIP
  ports:
    - targetPort: 80
      port: 80
  selector # Pod 정보 작성
    app: myapp
    type: back-end

 

 

Services - Loadbalancer

  • 클라우드 환경에서 외부 트래픽을 수신하고 service로 보낼 때 사용
  • 외부 트래픽을 여러 서버 또는 인스턴스로 분산(NordPort, ClusterIP로 전달 후 Pod로 도달)
  • GCP, AWS, Azure에서 제공

 

 

Practice

  • Service 수 조회
    • kubectl get service
  • 세부 조회
    • kubectl describe service 이름
  • Service 생성
    • kubectl create -f 파일명.yaml
    • kubectl create service clusterip my-cs --tcp=5678:8080
    • kubectl create service clusterip my-cs --clusterip="None"
    • kubectl create service nodeport my-ns --tcp=5678:8080
    • kubectl create service loadbalancer my-lbs --tcp=5678:8080
      뒤에 --dry-run=client -o yaml을 붙이면 yaml파일 정의
  • curl http://ip.portnumber : ip 주소에 있는 서버의 portnumber로 HTTP 요청을 보내고, 응답을 터미널에 출력