쿠버네티스로 배포해봅시다

문지은·2022년 12월 7일
1

쿠버네티스란?

쿠버네티스를 공부하기 위해서는 먼저 도커를 알아야 한다. 도커로는 하나의 머신에서 가상화 기술을 활용하여 컨테이너를 생성하고 서비스할 수 있게 해주었다. 하지만 대규모 서비스에서는 하나의 머신으로는 택도 없다. 그렇다면 이렇게 많은 수의 머신에서 워크로드를 분산하려면 어떻게 해야할까? 이 니즈에서 나온 것이 쿠버네티스라고 할 수 있다. 즉, 쿠버네티스는 다수의 컨테이너를 오케스트레이션 하기 위한 도구이다.

위의 그림처럼 하나의 쿠버네티스 클러스터 안에 여러 노드가 존재한다. 노드의 종류는 마스터 노드, 워커 노드가 있다.

  • 마스터 노드 : 클러스터를 조율하는 관리자
  • 워커 노드 : 애플리케이션을 구동하는 작업자

애플리케이션을 쿠버네티스에 배포하는 것 = 마스터에 애플리케이션 컨테이너를 구동하라고 지시하는 것

하나의 노드에는 파드들로 이뤄진다. 파드는 컨테이너들의 그룹을 나타내는 쿠버네티스의 추상적 개념이다. 파드는 쿠버네티스 플랫폼 상에서 최소 단위로 취급된다. 만약 컨테이너들이 서로 밀접하게 결합되어 있고 디스크와 같은 자원을 공유해야 한다면 오직 하나의 단일 파드로 노드가 이뤄져야 한다.

인그레스는 클러스터 내의 서비스에 대한 외부 접근을 관리하는 API 오브젝트이다. 위의 그림처럼 외부 연결에 대한 URL을 제공하고 트래픽 부하를 분산하고 SSL/TLS를 종료하고 dns 서비스를 할 수 있게 해준다.

배포해보자

배포하기 위한 디플로이먼트 파일(.yaml)을 생성한다. 디플로이먼트 파일에서는 디플로이먼트의 이름이나 몇개의 파드로 구성할지 어떤 이미지를 띄울지 등등을 설정할 수 있다.
쿠버네티스 공식 사이트에 올라온 예시는 다음과 같다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

위의 파일을 이용해서 디플로이먼트를 생성해서 배포해보고 배포한 파드에 접속해보자.

# 디플로이먼트 파일 실행
kubectl apply -f (디플로이먼트 파일.yaml)

# 디플로이먼트 확인
kubectl get deployments

# 포트 포워딩 이용해서 접속하게 설정
kubectl port-forward (파드 이름) 8080

# 파드 셸에 접속
kubectl exec -it (파드 이름) -- sh

# 디플로이먼트 삭제
kubectl delete -f (디플로이먼트 파일.yaml)
kubectl delete deploy (디플로이먼트 이름)

외부로 노출

위에서는 쿠버네티스로 애플리케이션을 배포한 한개의 파드에 접속을 해봤지만 해당 클러스터에 접속하려면 어떻게 해야 할까? 그러려면 크게 3가지 단계를 거쳐야 한다.

  1. 서비스 붙이기
  2. 인그레스 붙이기
  3. 인그레스 노드에 로드 밸런서의 VIP 연결하기
# 서비스 생성
kubectl apply -f (서비스 파일.yaml)

# 생성된 서비스 확인
kubectl get service

# 인그레스 생성
kubectl apply -f (인그레스 파일.yaml)

# 생성된 인그레스 확인
kubectl get ingress

# 로드 밸런서 서비스 생성
kubectl apply -f (로드 밸런서 서비스 파일.yaml)

# 생성된 로드 밸런서 서비스 확인. 여기서 외부 IP 확인 가능
kubectl get -n ingress-nginx service

# 위에서 확인한 외부 IP로 접속하면 외부 노출 성공!

서비스 파일, 인그레스 파일, 로드 밸런서 서비스 파일 예시는 다음과 같다!

# 서비스.yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
      
# 인그레스.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80


# 로드 밸런서 서비스.yaml
apiVersion: v1
kind: Service
metadata:
  name: example-service
spec:
  selector:
    app: example
  ports:
    - port: 8765
      targetPort: 9376
  externalTrafficPolicy: Local
  type: LoadBalancer

참고 사이트

쿠버네티스 디플로이먼트 문서

쿠버네티스 인그레스 문서

profile
백엔드 개발자입니다.

1개의 댓글

comment-user-thumbnail
2022년 12월 21일

👍

답글 달기