본문 바로가기
인프라/Docker

docker를 해보자 (feat. swarm/k8s)

by bloodFinger 2020. 12. 16.

 

 

 

1. 서비스(클라우드)

VMWare ESXi  + vCenter => vSphere

 

2. 구현기술

 도커 + 오케스트레이션(스웜/쿠버네티스)

 

 

$ docker start ubuntu1
$ docker exec -it ubuntu1 bash


$ apt update
$ apt install nano
$ docker exec -it ubuntu1 bash 
# apt update
# apt install nano


$ docker commit  -m “update and install nano” -a “sjha” ubuntu1 ubuntu_update_and_nano
$ docker images 
$ docker run -it --name=ubuntu_new1 ubuntu_update_and_nano

# nano
$ docker diff ubuntu1
$ docker commit  -m "update and install nano" -a "sjha" ubuntu1 ubuntu_update_and_nano
$ docker history ubuntu_update_and_nano

 

DockerFile 생성

$ cd $HOME
$ mkdir  sample
$ cd sample
$ nano Dockerfile

--------------------------------------------------
FROM ubuntu:latest
MAINTAINER Seokjae Ha <sjha72@gmail.com>

RUN apt update
RUN apt install nano
ENV TERM=xterm
--------------------------------------------------

$ cat Dockerfile
$ docker build -t ubuntu_dockerfile .

 

Portainer 설치

$ docker volume create portainer_data
$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data --restart=always portainer/portainer

 

localhost:9090 

 

Docker-Compose 

$ docker run -d -e MYSQL_ROOT_PASSWORD=kitri  --name=mysql1 mysql:5.7

yaml의 형식(docker-compose.yaml)


version: '2'
services:
  mysql1:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: kitri
      
     
     
$ sudo apt install docker-compose
$ cd sample
$ nano docker-compose.yaml


$ cat docker-compose.yaml
$ docker-compose up -d
$ docker ps -a

$ docker exec -it sample_mysql1_1 bash
# mysql -uroot -p
# mysql show databases;
mysql> show databases;
mysql> use mysql;

mysql> show tables;
mysql> desc user\G
mysql> select * from user\G

mysql> exit

$ docker-compose down

 

$ nano docker-compose2.yaml

------------------------------------------
version: "3" 
services: 
  db1: 
     image: mysql:latest 
     ports: 
       - "3306:3306" 
     environment: 
       MYSQL_ROOT_PASSWORD: kitri
  db2: 
     image: mysql:latest 
     ports: 
       - "3307:3306" 
     environment: 
       MYSQL_ROOT_PASSWORD: kitri

       
-------------------------------------------

$ docker-compose -f docker-compose2.yaml up -d
$ docker-compose -f docker-compose2.yaml down

 


 

오케스트레이션(Orchestration) - 여러 대의 서버/서비스를 편하게 실행

- Logging(Aggregation) , Monitoring  >여러대의 서버를 관리하는 경우 로그와 서버 상태를 한곳에서 관리

- service Discovery >서버나 컨테이너 추가 되었을 때 자동을 발견하는 작업

- Scheduling(핵심기능)  >어떤 서버/코어에 컨테이너

- Load Balancer(HW/SW) >여러 개의 서버/컨테이너 작업을 고르게 분배

- High Availability(고가용성) > 클러스터 내의 사버가 다운됐을 때 대응, 노드는 죽어도 서비스는 살아있다.

- Scalability(확장성) >성능을 지속적으로 향상시키는 기능

- Rolling Update >여러 개의 컨테이너가 운영되는 상태에서 서비스 정지없이 업그레이드

 

Swarm vs k8s

k8s 스웜

- 강력한 기능 / 복잡한 설정
- 500~5000대의 서버에 50000컨테이너를 서비스 가능

- 비교적 간단한 설정
- 느리고 기능이 단순
- 50대 미만의 경우 스웜을 사용하는 것이 유리

 > 하지만 시장에서는 확장성을 고려하기 때문에  k8s를 사용한다

 

swarm TEST

$ docker node ls
$ docker service create ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

$ docker service ls
$ docker ps -a


$ docker service ls
$ docker service ps <id>

//nginx
$ docker service create --name myweb --replicas 2 -p 80:80 nginx
$ docker service ls
$ docker service ps myweb

/*
웹 브라우저에서 http://localhost로 접근
로드 밸런서가 동작 .1-> .2 -> .1 -> .2 -> ..

눈으로 확인하고 싶다면 
https://subicura.com/2017/02/25/container-orchestration-with-docker-swarm.html

$ docker service create --name whoami \
  -p 4567:4567 \
  subicura/whoami:1
$ docker service scale whoami=5
$ docker service ps whoami

$ curl localhost:4567
	여러 번 실행 -> static load-balancer
	cf. curl / wget
*/


//고가용성 내장 기능 확인
$ docker service ps myweb
$ docker ps -a
$ docker rm -f myweb.2.xxxxx
$ docker service ps myweb

//도커/스웜/쿠버네티스 로그 확인
$ docker logs <name>           //-> 컨테이너 단위 하나씩
$ docker service logs <name>   //-> service 단위로 로그 취합
$ kub ...


//스웜 모드 - 서비스 업데이트(롤링x . 그린/블루 업데이트와 유사)
$ docker service create --name myweb2 --replicas 5 nginx:1.10 //5개의 컨테이너를 띄운다
$ docker service update --image nginx:1.11 myweb2             //5개 전부 변경
$ docker service ps myweb2

//롤링 업데이트-2개 단위 업데이트 //> 장점 : 중단없는 업데이트 , but 서로 다른 버전의 서비스 혼재 가능
$ docker service create --replicas 4 --name myweb3 --update-delay 10s --update-parallelism 2 nginx:1.10
$ docker service update --image nginx:1.11 myweb3
$ docker service ps myweb3

//ingress 네트워크
$ docker network ls

 

 

k8s 구조

- etcd > 

- kubectl > 마스터노드의 CLI로 클러스터 제어

- cubelet >노드를 관리하기 위한 에이전트 프로세스

- pod(포드)  >일종의 서브네트워크를 표현

- ReplicaSet > pod 생성, 관리 , 장애대응 , 롤링 업데이트 수행

 

구성 순서

Pod이 생성되는 과정

1.Deployment -> 2. Replicaset -> 3. Pod

 

-외부에서 Pod을 접근하는 과정

4. Service(외부접근/로드벨런싱) ->5. Pod

 

Kubernetes 환경(가상화환경 지원 안 함)

-최소 native 리눅스환경/ 클라우드

 

 

kubernetes.io/ko/docs/tutorials/kubernetes-basics/

 

쿠버네티스 기초 학습

운영 수준의 컨테이너 오케스트레이션

kubernetes.io

- 위의 공식 홈페이지를 참고한 실습

$ kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

$ kubectl get deployments
$ kubectl get replicasets
$ kubectl get pods
$ kubectl get services


//1.Proxy서버 실행
$ kubectl proxy 프락시서버 실행(8001포트)

//2. pod 이름확인(환경변수 사용)
$ export POD_NAME=$(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}')
kubernetes-bootcamp-765bf4c7b4-d4d4q

//3. POD에 접속
$ curl http://localhost:8001/api/v1/namespaces/default/pods/$POD_NAME/proxy/

//4. 결과확인
Hello Kubernetes bootcamp! | Running on: kubernetes-bootcamp-765bf4c7b4-d4d4q | v=1

//

 

 

micro k8s 설치 및 실습

essem-dev.medium.com/microk8s-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0-812aded1bab0

 

microk8s 설치하기

우분투에서 Kubernetes를 테스트 목적으로 사용해 보기 위해서는 minikube도 있지만, 여기서는 우분투가 제공하는 microk8s에 대해 정리해 보았다. 중요한 부분은 공식 가이드를 참고하면 설명이 잘 되

essem-dev.medium.com