HEROJOON 블로그(히로블)
Docker와 Kubernetes 이해하기 본문
목표
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 |
---|