레플리케이션 컨트롤러의 역할

 

1. 장애 극복

Replication contorller 는 단일 POD를 복제해 여러개의 인스턴스로 실행시킨다. 이런 특징 덕분에 어플리케이션의 장애가 발생하더라도, 복제된 인스턴스를 통해 요청을 처리할 수 있다.

 

2. 로드벨런서

Replication controller 는 단일 클러스터 내의 여러 노드에 걸쳐져 있다. 어플리케이션을 사용하는 유저의 수가 급증할때, 트래픽을 분산해주는 역할을 하며 해당 노드의 자원이 고갈 직전이라면, 다른 노드에 포드 배포함으로 트래픽을 효율적이게 분산해준다.

 


다른점: 레플리카 컨트롤러(Replica Controller) vs 레플리카세트(Replica Set)

* 쿠버네티스에서는 Replica Set 의 사용을 권장하고 있다. (Replica Controller 예전 방식)

 

1. Replica Controller 생성 방법(권장하지않음)

#replica-controller-definition.yaml

apiVersion: v1
kind: ReplicationController
metadata:
    name: myapp-rc
    labels:
        app: myapp
        type: front-end
spec:
    template:
        metadata:
            name: myapp-pod
            labels:
                app: myapp
                type: front-end
        spec:
            containers:
                - name: nginx-container
                image: nginx
    replicas: 3

template: 레플리카 컨트롤러에게 어떤 POD 를 기준으로 생성하라고 선언해주어야한다. 포드를 선언할때 사용했던 yaml 파일의 내용을 재사용할 수 있다. POD의정보(metadata ~ spec) 가 레플리카의 spec 아래에 위치한다.

replicas: 단일 포드의 정보를 몇개 복제할지 작성한다. 

* template 과 replicas 는 레플리카컨트롤러 spec 의 자식임으로 같은 level 에 선언되어야한다.(indent 주의)

 

template: 레플리카 컨트롤러에게 어떤 POD 를 기준으로 생성하라고 선언해주어야한다. 포드를 선언할때 사용했던 yaml 파일의 내용을 재사용할 수 있다. POD의정보(metadata ~ spec) 가 레플리카의 spec 아래에 위치한다.

 

 

2. Replica Set 생성방법(권장)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
    name: myapp-replicaset
    labels:
        app: myapp
        type: front-end
spec:
    template:
        metadata:
            name: myapp-pod
            labels:
                app: myapp
                type: front-end
        spec:
            containers:
                name: nginx-container
                image: nginx
    replicas: 3
    selector:
        matchLabels:
            type: front-end

selector(optional): 태그를 통해 어떤 POD 가 레플리카를 통해 관리되고 있는지 선언한다.

matchLabels: 해당 태그에 선언된 label 과 매칭되는 모든 POD 들을 관리한다.

 


 

레플리카 스케일 적용 및 변경하기

1. 명령어

kubectl scale --replicas=6 -f <파일.yml>

kubectl scale --replicas=6 -f replica-definition.yaml



kubectl scale --replicas=6 <오브젝트타입> <레플리카이름>

kubectl sacel --replicas=6 replicaset my-replicaset

 

*명령어를 통한 스케일링 변경은 파일을 자동적으로 업데이트해주지 않는다.

 

2. 선언파일 수정 후 적용

vim replica-definition.yaml

(수정)

kubectl replace -f replica-definition.yaml

 


레플리카세트 CRUD

1. 생성하기

kubectl create -f <레플리카 정의파일.yaml>
kubectl create -f my-replicaset.yaml

 

2. 불러오기

kubectl get replicaset

 

3. 수정하기

kubectl replace -f my-replicaset.yaml

 

4. 삭제하기

kubectl delete <오브젝트타입> <레플리카셋이름>
kubectl delete replicaset my-replicaset

 

'CONTAINER > kubernetes' 카테고리의 다른 글

[Kubernetes] POD 포드란? 생성, 수정, 확인, 삭제  (0) 2021.11.28

 

Kubernetes 는 어플리케이션을 컨테이너 형태로 호스팅하고,

컨테이너들은 POD 라는 곳에 캡슐화되어 배포되어진다.


 

POD 란?

POD는 Kubernetes의 가장 작은 단위의 객체이다. 보통 scaling 을 위해 어플리케이션과 컨테이너를 일대일 관계로 맺어주지만 다수의 컨테이너가 하나의 포드안에 존재하는 경우도 존재한다.

* kuberentes 는 어플리케이션의 스케일링을 위해 더 많은 POD를 배포한다.

 


POD 구성하기

kuberentes 는 YAML 파일 형식으로 작성된 definition file 을 사용해 객체(Pods, Replicas, Deployments, Service, 등)를 구성한다.

apiVersion: v1
kind: Pod
metadata:
    name: <포드이름>
    labels: #원하는 정보를 key, value 형식으로 선언할 수 있다.
        app: <앱이름>
        type: <앱타입: backend>
spec:
    containers:
        - name: <컨테이너이름>
          image: <컨테이너이미지>

1. apiVersion(str): 객체를 생성할때 사용될 kuberentes API 버전

2. kind(str): 생성할 객체의 타입(*case sensitive) 포드를 생성하기 위해서는 POD

3. metadata(dict): 객체의 정보, 해당 정보를 사용해 kuberentes 는 필터를 사용하기도한다.

*label에 선언된 정보를 사용해 kuberentes 는 포드를 필터할 수 있다.

4. specs(dict): 객체의 구성 스팩을 담는 필드, 여러개의 컨테이너가 선언될 수 있다.

*containers 블럭안에 - name 은 리스트의 첫번째 객체를 나타낸다.

 


POD 생성하는 법

# 방법 1: cli 로 생성하기
kubectl run <포드이름> --image=<이미지이름>
kubectl run nginx --image=nginx

# 방법 2
kubectl run <포드이름> --image=<이미지이름> --dry-run=clinet -o yaml > <생성할파일이름>
kubectl run nginx --image=nginx --dry-run=client -o yaml > nginx-definition.yaml
kubectl apply -f nginx-definition.yaml

kubernetes 는 입력받은 포드이름으로 포드를 생성하고, 선언된 도커 이미지를 docker hub 에서 다운로드 받는다.

2. 선언된 도커이미지를 docker hub 에서 다운로드한다.

* public, private 이미지 모두 사용할 수 있다.

 


POD 리스트 확인하기

kubectl get pods
kubectl get pods -o wide

* POD의 상태 또한 확인 할 수 있다.


POD 상세정보 확인하기

kubectl describe pod <pod_name>
kubectl describe pod nginx

POD 수정하기

# 방법 1
kubectl edit pod <포드이름>
kubectl edit pod nginx

# 방법 2: 직접 definition 파일 수정
vim ./nginx-definition.yaml
kubectl apply -f <구성파일이름>
kubectl apply -f nginx-definition.yaml

POD 삭제하기

kubectl delete pod <포드이름>
kubectl delete pod nginx

 


1.  프로젝트에 Dockerfile 만들기

vim Dockerfile

 

2. syntax parser directive 작성

# syntax=docker/dockerfile:1

  • Must appear before any other comment
  • Instructs the Docker builder what syntax to use when parsing the Dockerfile
  • Allows older Docker versions with BuildKit enabled to upgrade the parser before starting the build

3. 베이스 이미지 설정하기

FROM node:12.18.1

  •  use the official Node.js image that already has all the tools and packages that we need to run a Node.js application

4. 환경변수 설정해주기

EMV NODE_NODE=production

어떤 역할을 하는지 잘 모르겠다. 알아보자 

 

5. working directory 설정해주기

WORKDIR /app

  • Instructs Docker to use this path as the default location for all subsequent commands
  • Don't have to type full path, and use relateive apath based on the working directory.

6. package.json 과 package-lock.json 옮겨주기

COPY ["package.json", "package-lock.json*", "./"]

  • npm install 하기 전에 패키지들의 의존성 정보를 담은 package.jon 을 옮겨주자

7. RUN 명령어로 컨테이너가 생성될때 사용할 명령어를 작성

 

RUN npm install --production

 

8. 사용할 소스파일 복사해주기

COPY . .

 

9.  컨테이너를 만들고 난뒤에 실행할 명령어

CMD [ "node", "dev", "start"]

'CONTAINER > docker' 카테고리의 다른 글

[docker] 실행해보자  (0) 2021.02.28
[docker] 가슴이 docker docker...  (0) 2021.02.27

2가지 종류 

Community Edition | Enterprise Edition

community Edition 은 공짜이고 Enterprise Edition 은 이미지 관리, 보안 등 여러 서비스들을 유료로 제공해준다.


MAC 도커 설치 2가지 방법

 

1. 도커 툴바를 이용하는 방법

2. 맥 도커 데스크탑을 이용하는 방법(최신)

 

두가지 방법다 Linux kernel 위에 도커를 돌리는 방법으로 작동하지만, 도커 툴바는 오라클 Virtual Box 을 사용하지 않고 Hyper Kit 가상화 기술을 사용한다. 


run 명령어

docker run ngnix

image 로부터 conatiner 를 인스턴스화 시킨다. 만약 image 가 docker host 에 없다면 hub에서 pull 받는다.

 

 

run -tag

docker run [이미지 이름]:4.0

특정한 버전을 받고 싶다면 tag 를 입력해주면된다. 태그를 입력하지 않으면 기본적으로 제일 최신의 버전을 다운받는다. 최신 버전의 정보는 docker hub 에서 조회해볼 수 있다.

 

 

run-STDIN

docker -it [이미지 이름]

input 값을 입력받는 스크립트 파일을 이미지로 만들었을때 컨테이너를 interactive 하게 만드려면 -i (input)과 -t (terminal) 을 넣어 주어야한다. 

 

run - PORT mapping

docker -p 80:8000 [이미지 이름]

웹서버를 컨테이너 안에 담게 되면 컨테이너 포트가 8000이 되기때문에  외부에서 접근하려면 외부포트와 컨테이너 포트를 연결해주어야한다. 외부 포트를 80으로 설정하고 8000번인 컨테이너 포트를 연결하는 명령어.

 

run - Volume mapping

 

MySQL 컨테이너를 운용한다고 했을때 모든 생성,  수정, 삭제 작업은 컨테이너 내에서만 적용된다. 즉, 컨테이너는 고립된 환경이며 컨테이너를 삭제할시 모든데이터도 함께 삭제된다. 만일의 경우를 대비해 로컬에 데이터를 백업하고 싶다면 


ps 명령어

docker ps

현재 인스턴스화 된 모든 컨테이너 리시트를 보여준다. 

docker ps -a

 모든 컨테이너들의 리스트를 보여준다. *프로세스가 끝난 컨테이너들은 모두 여기서 확인할 수 있다. 컨테이너 생명주기는 컨테이너 안의 프로세스와 같다.


inspect

docker inspect [컨테이너 ID]

만약 ps 명령어보다 자세한 명령어를 보고 싶다면 inspect 명령어를 사용하면된다. Json 포멧으로 결과가 출력된다.


logs 명령어

docker logs [컨테이너 ID]

 

해당 컨테이너에대한 로그를 보여주고 싶을때 사용한다.


stop 명령어

docker stop [컨테이너아이디]

인스턴스화된 컨테이너 정지하기

 

rm 명령어

docker rm [컨테이너ID]

컨테이너 삭제


images 명령어

docker images

만들어져 있는 모든 이미지 리스트 보기


rmi 명령어

docker rmi [컨테이너ID]

이미지 삭제, 삭제하기 전에 해당 이미지에 의존하고 있는 컨테이너를 모두 삭제해야한다. 


pull 명령어

docker pull [컨테이너 이름]

 

도커 Hub 에서 바로 pull 받아와서 컨테이너를 사용


exec 명령어

docker exec [컨테이너 ID] cat /etc/hosts

컨테이너 안의 파일을 보고 싶을때 사용한다.


attach & detach 명령어

docker run [컨테이너 ID]

컨테이너를 foreground 에서 실행한다 

docker run -d [컨테이너 ID]

컨테이너를 background에서 실행한다.

docker attach [컨테이너 ID]

컨테이너를 다시 foreground 로 가지고 오고싶을때 사용한다.


 

docker labs 를 통해 브라우져에서 연습할수 있다

kodekloud.com/p/docker-labs

'CONTAINER > docker' 카테고리의 다른 글

도커 파일만들기 nodejs  (0) 2021.05.30
[docker] 가슴이 docker docker...  (0) 2021.02.27

왜 도커가 필요한 것인가?

 

호환성과 의존성문제

1. 만약 여러 기술스택(장고, MySQL, redis 등)을 개발을 진행한다고 가정한다고 했을때 각각의 기술 스택들은 설치되있는 OS의 버전에 대한 호환성과, 의존성 문제를 가진다.

2. 서비스의 기술 스택이 업그레이드 되거나 확장으로 인해 아키텍쳐 구조를 바꿀 상황은 항상 온다. 무엇인가 바뀔때마다 각각의 기술스택의 라이브러리 호환성과 의존성 문제를 체크해주어야 하는데 이런 지옥을 "The Matrix form Hell"이라고 하기도한다. 

3 새로운 개발자가 팀에 들어올때마다 초기세팅을 도와주는것은 정말 번거로운 작업이다. 정확한 버전의 운영체제, 그리고 기술스택을 사용하고 설치하고 있는지 확인하는 작업은 엄청난 고통을 동반한다. dev, test, beta, staging, production 등 여러 환경을 운용하고 있는 조직이라면 운용하고 있는 환경마다 작업을 해주어야한다는 엄청난 부담감이 생길 것이다.

 

이러한 호환성, 의존성 문제때문에 개발에 집중할수 없고 같은 환경을 공유하는데도 많은 이슈들을 겪어야 했다. 이러한 고통들은 도커를 사용한다면 해결이 가능하다. 도커는 각 기술스택들을  분리된 컨테이너에 고립시키고 얽혀있는 호환성과 의존성 문제를 분리 시켜준다. 운영체제가 다르더라도 도커만 설치한다면 대부분의 운영체제 환경에서 호환성, 의존성 문제 없이 어플리케이션을 실행 시킬 수 있다.


컨테이너(Container)란 무엇인가?

컨테이너는 모든 요소들로부터 완전히 독립되고 고립된 환경이다. 각각의 컨테이너는 각자의 process, network, mount를 가지고 있다. 하지만 여기서 중요한점은 OS kernal을 공유한다는 것이다.

 

또한, 컨테이너 개념 도커가 만든것이 아니다! 컨테이너는 이미 10여년 전부터 활용되고 있었고(LX c, LX d 등), 도커는 LX c 컨테이너를 활용하는 tool 이다. 로우-레벨에 위치한 LX c 컨테이너 환경 설정을 보다 쉽게 하기위해 도커는 개발자들에게 쉬운  접근성을 제공해준다. 

 


운영체제(OS: Operating System)

뜬금없이 왠 운영체제? 라고 하겠지만 도커가 어떤 방식으로 운용되는지 알기 위해 기초적인 운영체제 이해가 필요하다. Ubuntu, Fedora, Centos 등 이러한 운영체제는 크게 두가지로 구성되어 있다.

 

1. OS  커널

OS Kernel 은 탑제되어있는 하드웨어와 상호작용을 책임지는 역할을 한다. 

 

2. 소프트웨어 세트

소프트웨어 세트는 User-interface, drivers, compilers, file manager, etc) 이러한 소프트웨어들로 구성되어 있다.

 

OS 커널이 리눅스라고 가정했을때 그 위에 설치된 각기 다른 소프트웨어 세트에 의해서 운영체제의 종류가 결정이된다. 즉, 운영체제들을 Linux kernel을 사용하고 있고 다른점이라곤 그 위에 설치된 소프트웨어 세트일뿐이라는 점이다.

 

그리고, 도커는 Linux kernel을 공유하고 있다!


커널 공유

 

도커가 설치된 ubuntu 운영체제를 사용하고 있다고 가정했을때, Linux kernel을 공유하고 있는 다른 운영체제 환경(Fedora, Centos)에 컨테이너 환경을 배포할 수 있다.

 

중요한 점은 우리가 많이 쓰는  Window는 Linux kernel을 공유하고 있지 않다! (hate window). 이러한 이유 때문에 윈도우 환경에서 설치된 컨테이너는 Linux kernel을 공유하고 있는 OS 위에서 동작하지 않는다. 윈도우에서 도커를 사용하려면 window docker server 가 필요하다.

 

만약 리눅스 환경에서 만들어진 컨테이너를 윈도우에 돌린 경험이 있다면, 그것은 window 가 Linux virtual machine 실행하고 그 위에 리눅스 컨테이너들을 올려 놓은 이유이기 때문이다.

 

 


 

Container VS Virtual Machine

 

Virtual Mahine 은 Hyper-V 위에서 작동하고 각 VM 안에 OS가 설치되어 있다. 이러한 이유때문에 컨테이너보다는 무겁고 용량도 많이 차지하며 자원 소모도 크다는 점이 있다.

 

그렇다고 해서 conatainer 와  vm 중에 무엇을 선택해서 써야한다는 것이 아니다! 각 기술을 다른 목적을 위해 만들어 졌기 때문에 이 두 기술의 특징을 적절이 조합해 사용한다면 분명 응용할 방법이 있을것이다. 공부해보자.

 

virtual Machine - 가상화 기술을 통해  각 운영체제와 커널을 같은 하드웨어위에  운용하는 기술

container - 컨테이너 기술은 어플리케이션을 고립시켜서 어느 환경에서든 쉽게 운용할 수 있게 해주는 기술

 


Images VS Containers

 

Image 는 하나의 템플릿이라고 볼수 있다. 도커파일로 부터 생성되며 컨테이너를 생성하기 위해 사용된다.

Container 는 작동하고 있는 이미지의 인스턴스이다. 각 컨테이너는 독립적인 프로세스 구조와 환경을 가지고 있다.

 

이미 많은 이미지들이 Docker Hub에 존재하고 있기때문에 필요한 이미지를 간단히 Hub으로부터 받아 올수 있다.

도커 파일(Docker File) 도커 이미지를 생성하기 위한 가이드 라인이다.


 

'CONTAINER > docker' 카테고리의 다른 글

도커 파일만들기 nodejs  (0) 2021.05.30
[docker] 실행해보자  (0) 2021.02.28

+ Recent posts