쿠버네티스란?

Jake Seo·2019년 2월 21일
4
post-custom-banner

쿠버네티스란?

  • 쿠버네티스를 가리키는 말은 여러가지가 있다.
    - 컨테이너 플랫폼
    - 유명한 컨테이너 플랫폼으로는 Docker가 있다.
    • 마이크로서비스 플랫폼
    • 이식성 있는 클라우드 플랫폼 그리고 더 많은 기능...

컨테이너와 vm의 차이는?

  • Container의 특징
    - vm은 container보다 훨씬 더 강력하게 격리된다.
    - vm은 가상화된 하드웨어 위에 os가 올라가는 형태로 거의 완벽하게 host와 분리
    - 반면 container는 os 가상화이다
    - os 부분을 가상화해서 올리고 커널을 host와 공유
    - vm보다 얕게 격리된다.
  • Container의 장점
    - 작다.
    - 아키텍쳐 구조 참조 : https://cdn-images-1.medium.com/max/1600/1*wOBkzBpi1Hl9Nr__Jszplg.png
    - vm은 hypervisor가 hadrdware 가상화를 한 뒤에 Guest OS가 올라간다.
    - container는 Docker Engine 위에 application 실행에 필요한 바이너리만 올라간다.
    - 그 외 커널 부분은 호스트의 커널을 공유
    - 만약 호스트의 커널과 container의 커널이 다르다면? 다른 부분만큼만 패키징된다.
    - 그만큼 공간을 절약 가능
    • 빠르다.
      • host 머신보다 느리지만 vm과 비교하면 상대적으로 매우 빠르다.
        • vm은 io가 발생하는 통로가 container보다 많다.
          - vm은 host os에서 거의 완전히 분리된 형태로 운영되지만 io가 오갈 때는 host os를 결국 병목이 발생할 수 밖에 없다.

Docker의 특징

  • 컨테이너 중 하나.
  • Docker만의 문법으로 작성하여야 한다.
  • 배포할 어플리케이션의 설치 과정을 상세히 기술해야 한다.
  • 의존성에 필요한 것이 있다면 알아서 설치해준다.
  • DB를 외부에 마운트해서 연동 가능.
    - 시스템이 아무리 변경된다고 해도 DB는 영향을 받지 않는다.
  • 네트웍은 분리 가능하고 원한다면 host로 통신도 가능하다.
  • Light and Scalable.

Docker 실습

  • Dockerfile을 작성
    - Docker문법을 이용해야 한다.
    	```
    FROM PYTHON:2
    ...
  • 실행 방법
    - docker run -d --name 도커 이름 -e 환경변수...
  • 로그 보기
    - docker logs -f 도커 이름

쿠버네티스란?

  • Kubernetes는 사실상의 컨테이너 관리 표준
  • 컨테이너를 효과적으로 배포할 수 있는 툴
    - container 자체를 묶으면 너무 low level로 묶이기 때문에 pod을 이용
    - 여러 개의 컨테이너는 하나의 Pod이라는 단위로 묶음
    - Pod 내에서 컨테이너들은 IP와 스토리지를 공유
  • Kubernetes가 없는 컨테이너 환경
    - 각 컨테이너가 독립적으로 실행
    • 각자 다른 IP/NETWORK로 통신
    • 서로 다른 노드에 설치될 수도 있음
    • 컨테이너끼리 디스크 자원을 공유할 수 없음
  • Kubernetes 아키텍쳐
    - Kubernetes Master가 Kubernetes Node들을 관리
    • Kubernetes Node는
      • 여러 개의 Pod을 갖고 있음
        • Kubelet을 갖고 있음
          - Master의 API Server와 통신
        • cAdvisor를 갖고 있음
      • Kube-Proxy를 갖고 있음
        - Pod들간의 통신을 할 때 컨테이너 이름을 기준으로 통신을 할 수 있게 해줌
        - Kubernetes Master는
      • API Server를 갖고 있음
        - Controller Manager를 갖고 있음
        - Scheduler를 갖고 있음
        • etcd를 갖고 있음
          - 모든 메타정보를 갖고 있음
  • Kubernetes Service
    - Service
    - L4 로드밸런서로 로드밸런싱 및 페일오버
    - ex) 여러개의 접속이 들어왔을 때 어느 pod으로 갈지...
    - L4는 포트 기반으로 서비스를 나눠줌
    • Service는 MSA상의 서비스와 거의 동일한 단위
  • Kubernetes Ingress
    - Ingress
    - L7 로드밸런서
    - L7은 L4와 달리 패킷의 내용을 볼 수 있음
    - URI 기반으로 서비스 별 라우팅
    - 서비스 앞 단에 위치
    - 하나의 Ingress는 많은 서비스를 관리
    - Google Cloud의 로드밸런서
  • Kubernetes Deployment & ReplicaSet
    - Deployment가 복수 개의 ReplicaSet을 통해 Rolling Update 처리
    - 테스트용 프로그램을 Deployment에 올려본다.
    - 성공하면 ReplicaSet -> Pod -> Service -> Ingress으로 순차적으로 배포
    - 운영시스템의 안정성을 높임
    - ReplicaSet에서 Pod들의 Scaling 담당
  • Kubernetes Namespace
    - Kubernates 클러스터를 부서, 프로젝트 등의 단위로 분리
    • 리소스를 분리하여 관리
      • 물리적으로 완전히 분리
        • 리소스를 더 많이 더 적게 주는 것이 가능
        • 하나의 쿠버네티스를 나눠쓰고 싶을 때
  • Kubernetes Volume
    - Conotainer 내부 디스크는 Ephemera (Stateless)
    - 컨테이너가 한번 지워지면 모든 정보가 사라진다.
    • Volume = Persistent Disk
    • Volume의 종류
      • gcePD
        • awsEBS
        • cephfs 등
    • Container 내부 디렉토리에 Mount
      • 컨테이너에서 기억하고 싶은 상태를 넣어둘 수 있다.
        • 추상화 때문에 이러한 개념들이 생긴다
        • 컨테이너가 같은 Volume을 공유할 수 있다.
    • Volume - Pod과 같은 Lifecycle
    • Persistent Volume - Pod과 별도의 자원으로 관리
  • Google Kubernetes Engine
    - 구글 클라우드와는 별개로 동작
    • 단, 클라우드 내부에서 Kubernetes를 대부분 지원 (AWS, GCL, ...)

쿠버네티스 고급

  • StatefulSet
    - 데이터 저장이 필요한 애플리케이션 지원 (ex: DB)
    • Kubernetes 1.9부터 지원
    • Pod의 이름이 일정한 규칙을 가진 형태로 생성
      • 반면 Deployment나 ReplicaSet으로 생성된 Pod은 랜덤한 Postfix가 붙음
  • Volume
    - Volume(Stateful 포함)의 디스크는 기본적으로 휘발성
    - Crash되어 재시작되면 기존 데이터가 사라짐
    - Pod이 존재하는 동안 데이터가 유지되는 저장소
    • Container에 Mount 가능
    • Pod 내의 컨테이너 간에 공유
    • Pod의 라이프싸이클과 일치 (Pod의 생성과 함께 만들어져, Pod의 종료와 함께 삭제)
      - Volume의 종류 - emptyDir
      - 임시 데이터 저장에 적합한 간단한 저장소
      - Pod과 동일한 라이프싸이클 (Pod 삭제 시 사라짐)
      - Volume의 종류 - hostPath
      - Pod이 위치한 노드의 파일 시스템 특정 위치
      • 동일한 노드에서 동작하는 여러가지 Pod들이 저장소 공유 가능
      • Pod이 종료되어도 hostPath 저장소는 삭제되지 않음
        - Volume의 종류 - nfs
        - NFS 디스크를 Pod에 Mount함
      • Pod이 종료되어도 디스크의 데이터 보존
      • 동시에 여러 Pod에서 Read/Write 가능
        - Volume의 종류 - Persistent Volume
        - Pod의 라이프싸이클과 별도로 Kubernetes에 의해 관리되는 저장소
      • 동시 접근 안됨
  • Job
    - 유한한 작업을 나타내는 컨트롤러
    • 지속적으로 동작하는 것이 아니라, 작업 동료와 동시에 리소스가 정리
    • 대규모 계산이나 배치 작업에 적합
    • 두 가지 종류
      • Non-parallel Job: 하나의 Pod에서만 실행되는 Job. Pod이 비정상 종료되면 다시 Job이 생성되고, 정상종료될 경우 Job은 완료 처리
        • Parallel jobs with completion count: 지정된 개수의 Pod들이 실행되어 정상 종료되었을 때 완료 처리
  • Deployment
    - Blue/Green Deployment Model
    - A, B테스트와 같이 A버전과 B버전을 만듦
    - 맘에 드는 버전 하나를 사용하고 나머지는 버림
    • Rolling update
      • 서비스의 중단 없이
        - Deployment Strategy
      • Recreate: it will have service outage
        • Rolling update: without service stop
  • Pod Affinity
    - 특정 Pod이 있는 Node에 띄워주고 싶을 때...
    - ex) DB가 있는 Pod에 띄우고 싶다.
    • 특정 Pod이 있는 Node에 가기 싫을 때...
profile
풀스택 웹개발자로 일하고 있는 Jake Seo입니다. 주로 Jake Seo라는 닉네임을 많이 씁니다. 프론트엔드: Javascript, React 백엔드: Spring Framework에 관심이 있습니다.
post-custom-banner

0개의 댓글