HEROJOON 블로그(히로블)

Docker와 Kubernetes 이해하기 본문

Kubernetes

Docker와 Kubernetes 이해하기

herojoon 2019. 10. 18. 14:59
반응형

목표

Docker와 Kubernetes가 무엇인지 살짝 감이 올 정도까지 이해하기


1. 범용적인 용어 정리

용어

설명

가상머신

가상의 컴퓨터이다.

물리적인 개념이 아닌 컴퓨터 위에 가상환경을 생성하여 어떠한 명령을 가지고 실행시킬 수 있는 것이다.

- 관련 머신 SW : Virtualbox, VMWare

Hyper-v

Hyper-V도 가상머신이다.

호스트 컴퓨터 1대에서 다수의 운영체제를 동시에 실행할 수 있도록 해주는 가상 플랫폼 기술이다.

- System 요구사항 : Windows10 Pro 64bit 이상

호스트OS

(호스트라고도 부름)

컴퓨터 네트워크에 연결된 중앙 컴퓨터이다.

가상의 컴퓨터와 연결하여 파일을 이동할 수도 있다.

호스트는 메인이 되는 주체이며 이외의 호스트는 가상호스트이다.

게스트OS

(게스트라고도 부름)

가상환경의 컴퓨터 OS

가상머신에서 설치 및 실행되는 OS

이미지

컨테이너 실행에 필요한 파일과 설정값들을 포함하고 있는 것으로 상태값을 가지지 않고 변하지 않음.

ex) ubuntu 이미지 -> ubuntu를 실행하기 위한 모든 파일.

ex) MySQL 이미지 -> debian을 기반으로 MySQL을 실행하는데 필요한 파일과 실행 명령어, 포트 정보등.

ex) Gitlab 이미지 -> Centos를 기반으로 rubym go, database, redis, gitlab source, nginx 등

컨테이너

컨테이너 이미지를 실행한 상태이며, 추가되거나 변하는 값은 컨테이너에 저장됨.

하이퍼바이저(Hyper-V)란?

: OS를 가상화 해주는 것. 가상화 솔루션(=가상화 소프트웨어)

  • 하이퍼바이저의 architecture 타입은 2개로 나뉨.
  • 타입1(Native or Bare-metal)은 Hardware -> Hypervisor -> OS (Host OS, Guest OS)
  • 타입2(Hosted)는 Hardware -> Host OS -> Hypervisor -> Guest OS
  • Hypervisor를 Hardware에 바로 올리느냐, Host OS에 올리느냐의 차이.
  • 하이퍼바이저는 가상머신 환경을 최적화 하기위해 CPU, Memory, Disk, Network 자원을 할당하여 제공한다.

 

2. Docker

2-1. Docker 정의

  • 컨테이너 기반의 오픈소스 가상화 플랫폼
  • 쉽다 -> 인기 많아짐 -> 업데이트 속도 짱짱
  • Go언어로 만들어짐
  • Docker Hub를 통해 다양한 이미지 제공
  • Docker를 사용하면 Application과 Intra Structure를 쉽게 분리할 수 있다.
  • Docker를 이용해 환경 구성을 쉽게 할 수 있다. 환경을 쉽게 생성하고 보관하고 가져갈 수 있다.

 

2-2. Docker Architecture

 

2-3. Dockerfile 예시

FROM ubuntu:18.04
MAINTAINER herojoon432@gmail.com
WORKDIR /home/devuser/kube-study
RUN apt-get update
RUN apt-get install -y openjdk-8-jdk
ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=$CLASSPATH:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
RUN export JAVA_HOME PATH CLASSPATH

 

 

2-4. Dockerfile 명령어 정리

작업 명령어

설명

FROM

어떤 이미지를 기반으로 할지 설정합니다.

Docker이미지는 기존에 만들어진 이미지를 기반으로 생성합니다.

MAINTAINER

이미지를 생성한 사람의 정보를 생성합니다.

ex) herojoon, herojoon432@gmail.com

RUN

Container 실행 전에 기반 이미지의 추가 구성(이미지 기반과 함께 설치되어야 하는 패키지나 설정)을 위해 사용된다. (apt-get, yum 설치)

새로운 레이어에서 명령어를 실행하고, 새로운 이미지를 생성합니다.

VOLUMN

호스트와 공유할 디렉토리 목록입니다.

디렉터리 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정하는 것입니다.

docker run -v옵션으로 설정할 수 있습니다.

CMD

Docker Container가 실행(docker run, docker start 시)될 때 동작하는 명령어

Dockerfile에서는 CMD명령어를 하나만 사용가능하다. 여러 줄을 작성하면 마지막 줄 CMD만 실행된다.

만약 여러개의 CMD명령을 사용하고싶다면 별도의 .sh파일을 만들어 호출하면 된다.

<중요 포인트>

$ docker run [이미지명] [commad]를 이용하여 컨테이너 생성 및 띄울 때 command를 뒤에 붙이면 Dockerfile에 지정한 CMD는 실행되지 않고 $docker [이미지명] [command]에 작성된 [command]가 실행된다.

ex) $ docker run [이미지명] echo helloWorld 로 컨테이너 실행 시 Dockerfile의 CMD는 실행하지 않고 echo helloWorld 가 실행되어 helloWorld가 출력된다.

<CMD를 사용해야 하는 순간>

Docker 실행 시 ENTRYPOINT로 실행해야 하는 명령이 아닌 그 밖의 명령어

WORKDIR

CMD에서 설정한 실행 파일이 실행될 디렉터리입니다.

EXPOSE

호스트와 연결할 포트 번호입니다.

한 줄에 여러 개 Port설정이 가능합니다.

ex) 443

ex) 22 8080, 80

ENTRYPOINT

CMD와 마찬가지로 Docker Container가 실행(docker run, docker start 시)될 때 사용되는 명령어

<중요 포인트>

$ docker run [이미지명] [commad]를 이용하여 컨테이너 생성 및 띄울 때 command를 뒤에 붙이면 Dockerfile에 지정한 ENTRYPOINT도 실행되고 $docker [이미지명] [command]에 작성된 [command]도 실행된다.

ex) $ docker run [이미지명] echo helloWorld 로 컨테이너 실행 시 Dockerfile의 ENTRYPOINT는 echo helloWorld를 파라미터로 인식하여 helloWorld가 출력된다.

만약 Dockerfile에 작성된 ENTRYPOINT를 사용하지 않게 하기 위해서는 $ docker run 명령행에 --entrypoint를 붙여주면 된다.

<ENTRYPOINT를 사용해야 하는 순간>

Docker 실행 시 꼭 수행되어야 하는 명령어를 지정하는 경우

웹을 띄울 시 Port 설정하는 경우

 

 

2-5. Dockerfile의 RUN vs CMD vs ENTRYPOINT 차이

구분

실행 시점

특징

RUN

docker 컨테이너 실행 전

apt-get, yum을 이용한 패키지 설치나 FROM에 작성된 이미지 기반의 추가 환경구성을 위해 사용됨.

CMD

docker 컨테이너 실행 후

Dockerfile에서 CMD명령어는 한 번만 사용 가능.

여러 개의 CMD명령어를 사용하기 위해서는 .sh파일을 생성하여 실행시키는 방법으로 Dockerfile을 작성하면 됨.

ENTRYPOINT

docker 컨에티너 실행 후

Dockerfile에서 ENTRYPOINT명령어는 한 번만 사용 가능.

여러 개의 ENTRYPOINT명령어를 사용하기 위해서는 .sh파일을 생성하여 실행시키는 방법으로 Dockerfile을 작성하면됨.

docker 컨테이너 실행 시 꼭 수행되어야 하는 명령어 작성 시 사용됨.

컨테이너 실행시 입력하는 command가 존재할 경우 (ex. $ docker run [이미지] [command]) 컨테이너 실행 명령어에 입력된 command는 ENTRYPOINT의 파라미터로 인식되어 ENTRYPOINT와 함께 수행되어짐.

Dockerfile에 작성된 ENTRYPOINT를 무시하려면 컨테이너 실행 명령어에 --entrypoint를 입력하면 됨.

 

 

2-6. Dockerfile 특징

(*개인적으로 Kubernetes를 설치 해보면서 이해한 내용을 정리해놓은 것입니다.)

 

  • Dockerfile은 Docker설치 후 vi나 vim으로 빈파일을 생성하여 규격에 맞춰 작성해주어야 합니다. Docker를 설치했다고 해서 Dockerfile이 자동으로 생성되어지지는 않습니다.
  • Dockerfile은 작성된 순서대로 수행되어집니다.
  • FROM에 명시된 이미지는 로컬을 우선으로 합니다. 로컬에 해당 이미지가 존재하지 않으면 Docker Hub에서 가져옵니다.
  • Dockerfile의 FROM은 Docker이미지를 생성하기 위한 기본 Base 이미지를 명시하는 란이며, 꼭! 반드시 Dockerfile에 명시해야합니다. 만약 FROM [빈칸]으로 명시하거나 FROM을 아예 작성하지 않으면 에러가 발생합니다.
  • Dockerfile로 OS단 같은 최초설정(?)이나 FROM을 꼭 명시하고 싶지 않을 때에는 FROM에 무엇을 넣어야할까요? Docker는 scratch라는 빈 이미지를 제공합니다. 이것을 적절하게 이용해서 사용하면 됩니다. (Docker scratch 참고URL : https://hub.docker.com/_/scratch)
  • Dockerfile작성 시에는 apt-get install에 -y 옵션을 필수로 줄 것. -y 옵션을 주면 설치 진행 시 Y/N 질의 없이 설치가 진행됩니다.
  • Dockerfile 빌드 시 제외할 파일들은 .dockerignore파일에 명시하면 빌드 시 제외됩니다.
  • Dockerfile은 기본적으로 캐시를 사용합니다. 그래서 캐시를 사용하지 않으려면 docker build 시 뒤에 --no-cache=true를 붙여주어야 합니다.

 

3. Kubernetes

3-1. Kubernetes 정의

: 컨테이너화된 애플리케이션의 배포, 조정 및 관리 자동화를 위한 오픈 소스 시스템

 

1) 클라우드 환경을 이용한 Kubernetes Service 사용

  • GKE (Google Kubernetes Engine)
  • AKS (Azure Kubernetes Service)
  • EKS (Amazon Elastic Kubernetes Service)

2) 로컬 환경을 이용한 Kubernetis Service 사용

  • Minikube를 이용하여 Kubernetes환경 설치하여 사용 : Minikube는 로컬 머신에 설치가 필요한 경우나 학습용으로 많이 사용된다.

  • Kubeadm을 이용하여 Kubernetes환경 설치 : Kubeadm은 사용해보진 않았지만 Master Node, Workder Node의 설정을 각각 따로 해줘야하 한다고 한다. Minikube보다 설정해야 할게 좀 더 많은듯??

3-2. Kubernetes Architecture

 

3-3. Kubernetes 정리

(*개인적으로 Kubernetes를 설치 해보면서 이해한 내용을 정리해놓은 것입니다.)

 

  • Kubernetes는 Master Node와 Worker Node 두 개의 컴포넌트(개념)으로 분리된다.
  • Master Node는 Object 제어 관리용이지 Container를 띄우는 곳은 아니다.
  • Worker Node에는 Pod를 여러 개 띄울 수 있다.
  • Pod에는 Container를 여러 개 띄울 수 있다.
  • Worker Node에는 kubelet agent와 kube-proxy가 존재하여 Worker Node를 제어관리할 수 있도록 도와준다.
  • kubelet은 Worker Node의 상태를 확인하고 Worker Node에서 수행해야 하는 작업들을 제어한다.
  • kube-proxy는 iptables을 이용해 네트워크 규칙을 관리한다. (과거에는 userspace를 이용해서 네트워크 규칙을 관리했고, 현재에는 iptables를 이용해 네트워크 규칙을 관리했고, 앞으로는 ipvs를 이용해서 네트워크 규칙을 관리하도록 바뀔 예정이다.)

 

3-4. Kubernetes 용어

  • Etcd : 클러스터의 모든 설정, 상태 데이터를 저장하는 곳이다. Etcd를 잘 백업해두면 클러스터 복구가 가능하다고 한다. Etcd는 kube-apiserver를 통해서만 접근 가능하다고 한다.
  • Scheduler : 조건에 따라 적절하게 Pod를 적절한 Worker Node에 할당해준다.
  • Node : Kubernetes의 구성 단위이다. Master Node와 Worker Node로 나뉘며, Worker Node에는 보통 kubelet과 kube-proxy가 함께 구성된다.
  • Pod : Kubernetes의 최소 배포 단위이다.
  • Kubelet : Pod의 생명주기를 관리하고 kube-apiserver의 명령을 받아 Pod의 명령을 수행한다.
  • kube-proxy : Pod에 연결되는 네트워크 규칙을 관리한다.

 

 

반응형

'Kubernetes' 카테고리의 다른 글

Kubernetes 명령어  (0) 2020.03.16
Comments