도커/쿠버네티스를 활용한 컨테이너 개발 실전 입문 - 05. 쿠버네티스 입문

백근영·2020년 1월 28일
1
post-thumbnail

01. 쿠버네티스란 무엇인가

쿠버네티스란?

컨테이너 운영을 자동화하기 위한 컨테이너 오케스트레이션 도구.

클라우드 플랫폼의 쿠버네티스 지원

GCP는 GKE, Azure는 AKS, AWS는 EKS로 쿠버네티스를 매니지드 서비스의 형태로 제공한다.

vs 도커 스웜

쿠버네티스는 컴포트/스택/스웜의 기능을 통합해 더 높은 수준의 관리 기능을 제공하는 도구

03. 쿠버네티스의 주요 개념

리소스용도
노드컨테이너가 배치되는 서버
네임스페이스쿠버네티스 클러스터 안의 가상 클러스터
파드컨테이너의 집합 중 가장 작은 단위로, 컨테이너의 실행 방법을 정의
레플리카세트같은 스펙을 갖는 파드를 여러개 생성하고 관리하는 역할을 함(stateless한 파드 관리에 주로 사용)
디플로이먼트레플리카세트의 리비전을 관리
서비스파드의 집합에 접근하기 위한 경로를 정의
인그레스서비스를 쿠버네티스 클러스터 외부로 노출시킨다.
컨피그맵설정 정보를 정의하고 파드에 전달한다.
퍼시스턴트볼륨파드가 사용할 스토리지의 크기 및 종류를 정의
퍼시스턴트볼륨클레임퍼시스턴트 볼륨을 동적으로 확보
스토리지클래스퍼시스턴트 볼륨이 확보하는 스토리지의 종류를 정의
스테이트풀세트같은 스펙으로 모두 동일한 파드를 여러 개 생성하고 관리
상주 실행을 목적으로 하지 않는 파드를 여러 개 생성하고 정상적인 종료를 보장
크론잡크론 문법으로 스케줄링되는 잡
시크릿인증 정보 같은 기밀 데이터 정의
네임스페이스 안에서 조작 가능한 쿠버네티스 리소스의 규칙을 저으이
롤바인딩쿠버네티스 리소스 사용자와 롤을 연결 지음
클로스터롤클러스터 전체적으로 조작 가능한 쿠버네티스 리소스의 규칙을 정의
클러스터롤바인딩쿠버네티스 리소스 사용자와 클러스터롤을 연결 지음
서비스 계정파드가 쿠버네티스 리소르를 조작할 때 사용하는 계정

04. 쿠버네티스의 클러스터와 노드

쿠버네티스 클러스터

쿠버네티스의 여러 리소스를 관리하기 위한 집합체

노드(node)

쿠버네티스의 리소스 중 가장 큰 개념으로, 쿠버네티스 클러스터의 관리 대상으로 등록된 컨테이너 호스트를 뜻한다.

마스터 노드

쿠버네티스 클러스터 전체를 관리하는 서버인 마스터 노드가 적어도 하나 이상 있어야 한다. 쿠버네티스 클러스터는 마스터 노드와, 일반 노드의 집합으로 구성된다.

05. 네임스페이스

네임스페이스

쿠버네티스는 클러스터 안에 가상 클러스터를 또 다시 만들 수 있는데, 이 가상 클러스터를 네임스페이스라고 한다. 네임스페이스는 개발팀이 일정 규모 이상일 때 유용하다.
예를 들어, 개발자마다 자신만의 네임스페이스를 두면 메인 네임스페이스가 어질러지는 것을 방지할 수 있다. 네임스페이스마다 권한을 설정할 수 있으므로 더욱 견고하고 세세하게
권한을 제어할 수 있다.

06. 파드

파드(pod)

파드는 컨테이너가 모인 집합체의 단위로, 적어도 하나 이상의 컨테이너로 이루어짐.
쿠버네티스에서는 결합이 강한 컨테이너(예: nginx 컨테이너와 web UI 컨테이너)를 파드로 묶어 일괄 배포한다. 컨테이너가 하나인 경우에도 파드로 배포한다.
같은 파드를 여러 노드에 배치할 수도 있고 한 노드에 여러 개 배치할 수도 있다. 단, 한 파드를 여러 노드에 걸쳐 배포할 수는 없다.

매니페스트 파일

쿠버네티스에서 여러 가지 리소스를 정의하는 파일을 매니페스트 파일이라고 한다.
아래는 nginx 컨테이너와 echo 컨테이너로 구성되는 파드를 정의한 매니페스트 파일이다.

apiVersion: v1
kind: Pod
metadata:
  name: simple-echo
spec:
  containers:
  - name: nginx
    image: gihyodocker/nginx:latest
    env:
    - name: BACKEND_HOST
      value: localhost:8080
    ports:
    - containerPort: 80
  - name: echo
    image: gihyodocker/echo:latest
    ports:
    - containerPort: 8080

kind에서 정의하려는 쿠버네티스 리소스의 유형을 지정할 수 있음. 메타데이터는 말 그대로 리소스에 부여되는 메타데이터를 뜻함.
나머지는 문법은 기존 docker-compose의 yml 파일과 약간 차이가 날 수 있지만 의미는 전체적으로 상통함.

파드로 실행시킨 컨테이너 내부 접근하기

docker container exec 명령과 비슷하게 kubectl을 이용해 컨테이너 내부에 접근할 수 있다. 파드 안의 컨테이너가 여러 개인 경우에는 -c 옵션으로
컨테이너 이름을 지정해주면 된다.

$ kubectl exec -it simple-echo sh -c nginx
#

kubectl log 명령으로 파드 안에 있는 컨테이너의 표준 출력을 화면에 띄울 수 있다.

$ kubectl logs -f simple-echo -c echo
2020/01/18 15:30:30 start server

파드와 파드 안에 든 컨테이너의 주소

파드에는 각각 고유의 가상 IP 주소가 할당된다. 더불어 파드 안의 모든 컨테이너들은 이 파드에 할당된 가상 IP를 공유한다. 그래서 같은 파드 내의 컨테이너들은
단순히 localhost로 통신할 수 있고, 다른 파드의 컨테이너끼리도 파드의 가상 IP만 알면 통신이 가능하다. 파드는 사실 컨테이너를 담은 가상 머신이나 마찬가지다.

07. 레플리카세트

레플리카세트

파드를 정의한 매니페스트 파일로는 파드를 하나밖에 생성할 수 없다. 그러나 어느 정도 규모가 되는 애플리케이션을 구축하려면 같은 파드를 여러 개 실행해
가용성을 확보해야 하는 경우가 생긴다. 이런 경우에 사용하는 것이 레플리카세트이다. 레플리카세트는 똑같은 정의를 갖는 파드를 여러개 생성하고 고나리하기 위한 리소스다.
파드의 정의 자체가 레플리카 세트를 정의한 매니페스트 파일에 포함되므로 파드를 위한 매니페스트 파일을 따로 둘 필요도 없다.

예시)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: echo
  labels:
    app: echo
spec:
  replicas: 3 # 레플리카 수
  selector:
    matchLables:
      app: echo
  template: # 해당 레플리카세트가 관리할 파드에 대한 정의
    metadata:
      name: simple-echo
    spec:
      containers:
      - name: nginx
        image: gihyodocker/nginx:latest
        env:
        - name: BACKEND_HOST
          value: localhost:8080
        ports:
        - containerPort: 80
      - name: echo
        image: gihyodocker/echo:latest
        ports:
        - containerPort: 8080

레플리카세트를 통해 파드의 개수를 늘리고 줄일 수 있음. 삭제된 파드는 복원할 수 없기 때문에 stateless한 파드를 사용하기에 유리함. stateful한 파드를 관리하기 위한 리소스로
스테잍풀세트가 있음.

08. 디플로이먼트

디플로이먼트

레플리카세트보다 상위에 해당하는 리소스로 디플로이먼트가 있다. 디플로이먼트는 애플리케이션 배포의 기본 단위가 되는 리소스이다.
레플리카세트는 똑같은 파드의 레플리케이션 개수를 관리 및 제어하고, 디플로이먼트는 레플리카세트를 관리하고 다루기 위한 리소스이다.

매니페스트 파일

디플로이먼트의 매니페스트 파일은 레플리카세트의 것과 거의 똑같다. 디플로이먼트가 하는 일은 레플리카세트의 리비전 관리 정도이다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo
  labels:
    app: echo
spec:
  replicas: 3 # 레플리카 수
  selector:
    matchLables:
      app: echo
  template: # 해당 레플리카세트가 관리할 파드에 대한 정의
    metadata:
      name: simple-echo
    spec:
      containers:
      - name: nginx
        image: gihyodocker/nginx:latest
        env:
        - name: BACKEND_HOST
          value: localhost:8080
        ports:
        - containerPort: 80
      - name: echo
        image: gihyodocker/echo:latest
        ports:
        - containerPort: 8080

이 매니페스트 파일을 kubectl apply를 통해 적용하면 디플로이먼트는 물론 레플리카세트와 파드까지 한 번에 생성된다. 레플리카세트의 내용에 변화가 있을 경우
리비전 번호가 올라간 채로 수정된 레플리카세트가 새로 생성되고 기존 레플리카세트와 교체된다.

롤백

디플로이먼트는 롤백 기능 덕분에 최신 디플로이먼트에 문제가 있을 경우 곧바로 이전 버전으로 돌아갈 수 있으며, 애플리케이션의 이전 버전의 동작을
확인하려는 경우에도 활용할 수 있다. 다음 명령어로 롤백을 수행할 수 있다.

$ kubectl rollout undo deployment echo
deployment "echo" rolled back
profile
서울대학교 컴퓨터공학부 github.com/BaekGeunYoung

0개의 댓글