티스토리 뷰

▣ 서비스(Service) : 포드를 연결하고 외부에 노출

쿠버네티스는 디플로이먼트를 생성할 때 포드를 외부로 노출 하지 않으며, 디플로이먼트의 YAML 파일에는 단지 포드의 어플리케이션이 사용할 내부 포트만 정의한다. 이 포트를 외부로 노출해 사용자들이 접근하거나, 다른 디플로이먼트의 포드들이 내부적으로 접근하려면 서비스(Service)라고 부르는 별도의 쿠버네티스 오브젝트를 생성해야 한다. 

 

서비스의 핵심 기능

  • 여러 개의 포드에 쉽게 접근할 수 있도록 고유한 도메인 이름을 부여한다.
  • 여러 개의 포드에 접근할 때 요청을 분산하는 로드 밸런서 기능을 수행한다.
  • 클라우드 플랫폼의 로드 밸런서, 클러스터 노드의 포트 등을 통해 포드를 외부로 노출한다.

서비스(Service)의 종류

컨테이너(포드)의 호스트 이름 을 반환하는 간단한 웹 서버 이미지를 사용한다.

vi deployment-hostname.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostname-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      name: my-webserver
      labels:
        app: webserver
    spec:
      containers:
      - name: my-webserver
        image: alicek106/rr-test:echo-hostname
        ports:
        - containerPort: 80

kubectl apply -f deployment-hostname.yaml

kubectl get pods -o wide (포드 IP확인)

서비스의 종류에 따라 포드에 접근할 수 있는 방법이 달라진다. 서비스는 여러 가지 종류가 있으나, 주로 사용하는 서비스 타입은 크게 3 가지이다.

  • ClusterIP 타입: 쿠버네티스 내부에서만 포드들에 접근할 때 사용한다. 외부로 포드를 노출하지 않기 때문에 쿠버네티스 클러스터 내부에서만 사용되는 포드에 적합하다.
  • NodePort 타입: 포드에 접근할 수 있는 포트를 클러스터의 모든 노드에 동일하게 개방한다. 따라서 외부에서 포드에 접근할 수 있는 서비스 타입이다. 접근할 수 있는 포트는 랜덤 으로 정해지지만, 특정 포트로 접근하도록 설정할수도 있다.
  • LoadBalancer 타입: 클라우드 플랫폼에서 제공하는 로드 밸런서를 동적으로 프로비저닝해 포드에 연결한다. NodePort 타입과 마찬가지로 외부에서 포드에 접근할 수 있는 서비스 타입이다. 그러나 일반적으로 AWS, GCP 등과 같은 클라우드 플랫폼 환경에서만 사용할 수 있다

■ ClusterIP 타입의 서비스 - 쿠버네티스 내부에서만 포드에 접근

vi hostname-svc-clusterip.yaml

apiVersion: v1
kind: Service
metadata:
  name: hostname-svc-clusterip
spec:
  ports:
    - name: web-port
      port: 8080
      targetPort: 80
  selector:
    app: webserver
  type: ClusterIP

spec.selector 항목은 이 서비스에서 어떠한 라벨을 가지는 포드에 접근할 수 있게 만들 것인지 결정한다. 위 예시에서는 app: webserver라는 라벨을 가지는 포드들의 집 합에 접근할 수 있는 서비스를 생성한다. deployment-hostname.yaml 파일로 생성된 디플 로이먼트의 포드는 이 라벨이 설정돼 있으므로 이서비스에 의해 접근 가능한 대상으로 추가될 것이다.

spec.ports.port : 생성된 서비스는 쿠버네티스 내부에서만 사용할 수 있는 고유한 IP(Clust erIP)를 할당받는다.

spec.ports.targetPort : selector 항목에서 정의한 라벨에 의해 접근 대상이 된 포드들이 내부적으로 사용하고 있는 포트를 입력한다.

 

kubectl apply -f hostname-svc-clusterip.yaml

kubectl get services  /  kubectl get svc

nodeport서비스는 신경쓰지 말자....

ClusterIP타입의 서비스가 생성되었다. kubernetes라는 이름의 서비스는 미리 생성되어 있다.

이 서비스는 포드 내부에서 쿠버네티스의 API에 접근하기 위한 서비스이다.

 

쿠버네티스 클러스터의 노드 중 하나에 접속해 위 IP로 요청을 보내도 되지만, 이번에는 kub ectl run 명령어로 임시 포드를 만들어 요청을 전송해 본다.

kubectl run -i --tty --rm debug --image=moon682/ubuntu:curl --restart=Never -- bash

서비스의 IP와 포트를 통해 포드에 접근할 수 있음

요청을 보낼때마다 다른 포드들이 응답한다. 이는 서비스에게 전해진 요청들이 자동으로 분산되는 것이다. 

즉, 별도의 설정 없이도 서비스를 통해서 로드 밸런싱이 되고 있다는 것을 알 수 있다. 


■ NodePort 타입의 서비스 - 서비스를 이용해 포드를 외부에 노출하기

NodePort 타입의 서비스는 모든 노드(Node)의 특정 포트(Port)를 개방해서 서비스에 접근하는 방식이다. 스웜 모드에서 컨테이너를 외부로 노출하는 방식과 비슷하다.

vi hostname-svc-nodeport.yaml

apiVersion: v1
kind: Service
metadata:
  name: hostname-svc-nodeport
spec:
  ports:
    - name: web-port
      port: 8080
      targetPort: 80
  selector:
    app: webserver
  type: NodePort

kubectl apply -f hostname-svc-nodeport.yaml

NodePort타입의 서비스가 생성되었다. 30476이란 포트는 모든 노드에서 동일하게 접근할 수 있는 포트를 의미한다.

내부 IP로 접근하기 위해서는 클러스터 내부에 접속한 상태여야 한다.

클러스터 내부로 접속하는 대신 적절한 보안그룹 규칙을 추가한 뒤 외부로 접속해서 테스트 할 수도 있다.

 

curl 10.110.136.136:30476 --silent | grep Hello

@@@잘안됨 왜안될까.......

 

내부로 접근해서 테스트해보자

kubectl run -i --tty --rm debug --image=moon682/ubuntu:curl --restart=Never -- bash

curl 10.110.136.136:8080 --silent | grep Hello

@@@잘안됨 왜안될까......


■ LoadBalancer 타입의 서비스 - 클라우드 플랫폼의 로드 밸런서와 연동하기

(지금부터는 aws eks환경에서 실습한다.)

 


▣ 네임스페이스(Namespace) : 리소스를 논리적으로 구분하는 장벽(

 


지금까지 테스트한 모든 리소스들을 정리하는 명령어이다.

kubectl delete deployment,pod,rs --all

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함