written by yechoi

[ft_services] 도커를 바탕으로 쿠버네티스 이해하기(1) - 생성 본문

Born 2 Code/Docker, Kubernetes

[ft_services] 도커를 바탕으로 쿠버네티스 이해하기(1) - 생성

yechoi 2020. 10. 11. 23:57
반응형

42cursus에서 ft_services 과제를 할 때 가장 애먹었던 건 쿠버네티스의 개념을 이해하는 것이었다. 공식 도큐먼트를 읽는 건 물론 쿠버네티스 관련 책도 사서 보고 블로그 글도 많이 읽었는데, 용어가 너무 어려워서 개념이 구체적으로 잡히진 않고 둥둥 떠다녔다.

과제를 끝날 때 쯤에야 개념을 이해했는데, 돌이켜 생각하면 도커에 비교하면 이해가 더 빨랐을 듯하다. 이에 도커에 비교해 쿠버네티스의 기능과 각종 커맨드들을 설명해보려고 한다. (이 글은 도커에 대한 이해를 전제한다. 혹여 간단히 설명하느라 왜곡이 발생했다면, 댓글로 피드백을 주면 도움이 될 것 같다.)

도커, 하나의 컴퓨터 vs. 쿠버네티스, 여러 개의 컴퓨터

도커는 가상 머신에 많이 비교된다. 물론 엄밀히 말하면 가상 머신과 다르고 다르기 때문에 더 각광받는 거지만, 설명의 편의를 위해서 도커는 하나의 가상 컴퓨터라고 하겠다.

도커가 가상의 컴퓨터를 하나 띄운 거라면, 쿠버네티스는 여러개의 컴퓨터로 '클러스터'를 만든 것이다. 여러개의 컴퓨터는 서로 연결돼 서비스를 제공할 수 있다.

도커와 쿠버네티스의 또 다른 큰 차이점은 '상태 관리'가 가능하다는 것이다. 도커와 달리 쿠버네티스는 가상 컴퓨터가 죽으면, 자동으로 켜주는 일을 할 수 있다. 이러한 기능을 헬스체크라고 한다. ft_services에서는 이러한 기능을 요구하고 있으며, 이를 위해선 liveness probe에 대한 개념을 찾아보는 게 좋다.

쿠버네티스 공식문서 중 파드 이미지 

도커, 컨테이너 만들기 vs 쿠버네티스, 파드 만들기

도커에서 띄운 가상의 컴퓨터를 '컨테이너'라고 불렀다. 쿠버네티스에서 띄운 가상의 컴퓨터는 '파드'라고 부른다. 파드는 컨테이너 하나 또는 그 이상으로 이뤄진다.

도커에서 컨테이너를 만드는 과정과 쿠버네티스에서 파드를 만드는 과정은 많이 닮아있다. 우선 도커에서 컨테이너를 만드는 방법을 생각해보자.

  1. docker build -t IMAGE_NAME . 등으로 IMAGE_NAME으로 이미지 빌드
  2. docker run --name CONTAINER_NAME -it -p 80:80 -p 443:443 IMAGE_NAME /bin/bash 같은 식으로 컨테이너 런

쿠버네티스에서 파드를 만들 때도 도커 이미지가 필요하다. 1번과 같은 작업을 해주면 된다.

그 이후에 파드를 만드는 건, 설정 파일이 필요하다. 도커 컨테이너를 런 할 때는 -p 80:80 옵션으로 포트를 열어주는 것처럼 명령어로 각종 설정을 넣어줬다. 쿠버네티스에서는 이런 설정을yaml 형식으로 된 파일에 넣어둔다. 아래는 nginx yaml 파일 예시.

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  type: LoadBalancer
  ports:
    - port: 80
      name: http
      protocol: TCP
      targetPort: 80
    - port: 443
      name: https
      protocol: TCP
      targetPort: 443
    - port: 22
      name: ssh
      protocol: TCP
      targetPort: 22
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      name: nginx-pod
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx-container
          image: nginx-image
          imagePullPolicy: Never
          ports:
            - containerPort: 80
              name: http
            - containerPort: 443
              name: https
            - containerPort: 22
              name: ssh
          livenessProbe:
            initialDelaySeconds: 20
            periodSeconds: 10
            timeoutSeconds: 5
            tcpSocket:
              port: 22

이 yaml 파일에는 두 가지 내용이 들어있다. 하나는 service에 관한 내용이고, 또 다른 것은 deployment 다.

이 쯤에서 두 개념을 설명하자면 먼저 deployment는 파드의 성격 자체를 정의한다. 도커 이미지로 nginx-image를 쓸 것이고, 컨테이너는 nginx-container 하나, 포트는 80, 443, 22를 사용하기로 한다. 그리고 앞서 설명한 죽은 컴퓨터를 알아서 살리는 기능인 liveness probe 설정도 들어가 있다.

service는 이 파드를 외부로 어떻게 노출할 것이냐에 대한 설정이다. 우리는 nginx에선 서비스에 공인 IP를 할당해 줄 것이므로 type엔 LoadBalacer를 택할 것이다. 외부 노출 없이 클러스터 내부 IP에 대해서만 노출하고 싶으면 ClusterIP를 택하면 된다. 더 많은 설명은 공식 문서 참고. ( 📎 서비스에 대한 doc1, 서비스에 대한 doc2)

yaml 파일로 설정을 완료했다면, 명령어로 적용해서 파드를 구성하면 된다.

그래서 우리가 사용하는 명령어는

  1. docker build -t IMAGE_NAME . 로 이미지 구성
  2. kubectl apply -f NAME.yaml 파드 형성

 

(2)편에선 파드의 상태 확인, 파드 삭제, 파드에 저장소 붙이는 법 등을 알아본다.

반응형