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 | 스웜 |
- 강력한 기능 / 복잡한 설정 |
- 비교적 간단한 설정 |
> 하지만 시장에서는 확장성을 고려하기 때문에 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/
- 위의 공식 홈페이지를 참고한 실습
$ 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