3일차

3일차

교육 참고 내용

도커 멀티 호스트 구성

  • 오케스트레이션 : 쿠바, 도커 스웜

  • 도커 모니터링 :

도커 컨테이너 마운트

  • 컨테이너 데이터 마운트

  • 볼륨 : 도커가 관리하는 호스트 영역과 마운트 -> 주로 볼륨 방식으로 통일됨

  • 바인드 마운트 : 호스트 특정 디렉토리와 마운트

  • tmps 마운트 : 호스트 메모리와 마운트

볼륨 특징

  • 도커가 추천하는 마운트 방식

  • 컨테이너로부터 데이터가 분리

  • 컨테이너간 데이터 공유가 가능

  • 호스트와 컨테이너 간 파일 공유가 가능

  • I/O 성능 향상

  • 저장위치는 호스트 서버내 도커가 관리하는 영역

    • /var/lib/docker/volume

    • 볼륨 위치 지정이 가능. 그러나 도커가 관리하는 영역은 달라지지 않음.

볼륨 관리 유형

  • 케이스 1 : 컨테이너 내부에 저장

  • 케이스 2 : 도커 호스트 파일시스템 볼륨 마운트

  • 케이스 3 : 클라우드 프로바이더 볼륨 마운트

    • volume-driver를 이용해 네트워크로 연결된 장치에 저장

볼륨 주요 명령어

$ docker volume create
$ docker volume ls
$ docker volume inspect
$ docker volume rm 

# 볼륨 생성
$ docker volume create --name test1

# 컨테이너 생성 및 실행
$ docker run -it -v test1:/www/test1 ubuntu bash  

# 컨테이너 생성
$ docker run -d --name=gpgs -p 10022:22 -p 3000:3000 \
-v gogs-data:/data gogs/gogs
  • 지정안하면 임의 할당 driver -> local

네트워킹 모델

  • 도커가 시작 될 때 호스트 머신에 docker0라고 부르는 가상 ㄴ인터페이스를 생성

  • 사설 IP -> 컨테이너 내부에서 사용하는 IP

Network 주요 명령어

$ docker network create
$ dokcer network ls
$ docker network inspect
$ docker network rm
$ docker network connect
$ docker network disconnect

network 유형

  • bridge : 단일 호스트내에서 컨테이너를 연결해주는 네트워크 (ex - docker0)

  • overlay : 멀티 호스트 간에 연결 해주는 네트워크

bridge network

  • 컨테이너는 동일 호스트내에 위치

  • 사용자 정의 bridge 네트워크에 포함된 컨테이너는 컨테이너 이름으로 통신 가능

$ docker network create blue

$ docker run -itd --net=red --name ubuntu1 ubuntu 

$ docker run -itd --net=blue --name ubuntu3 ubuntu

$ apt-update

# 연결 -> 실행중에도 가능
$ docker network connect blue 컨테이너명

overay network

  • 멀티호스트 간의 네트워크 구성

  • key-value 스토어 : Consul. Etcd, Zookeeper

  • key-value 스토어에 연결된 호스트 클러스터

  • 커널버전 3.16이상

  • 각 호스트 도커엔진 설정

    • 포트오픈

      • tcp 2377 : 클러스터 관리

  • consul.io

    • 서비스 디스커버리나 설정관련 기ㅅ능을 구현할 때 사용 할 수 있는 서비스 메시 솔루션

    • 헬스체크, KV 스토어 , 시큐어 서비스 스토어 -> 오픈소스

  • 키벨류 머신 1, 도커 호스트 머신 2대 총 3대의 가상 머신이 필요함

$ docker-machine ls
$ docker-machine create -d virtualbox mhl-consul

$ docker $(docker-machine config mhl-consul) run -d -p 8500:8500 -h consul progrium/consul -server -bootstrap

$ docker-machine create -d virtualbox \
--engine-opt="cluster-store=consul://$(docker-machine ip mhl-consul):8500" \
--engine-opt="cluster-advertise=eth1:0" \
mhl-demo1

$ docker-machine create -d virtualbox \
--engine-opt="cluster-store=consul://$(docker-machine ip mhl-consul):8500" \
--engine-opt="cluster-advertise=eth1:0" \
mhl-demo2


# 접속 해당 머신으로
$ eval $(docker-machine env mhl-demo1)

$ docker network create -d overlay frontend

$ docker network ls

$ eval $(docker-machine env mhl-demo2)

$ docker network ls

$ eval $(docker-machine env mhl-demo1) 

# 네트워크  frontend  붙이기
$ docker run -itd --name=web --net=frontend nginx  

$ eval $(docker-machine env mhl-demo2) 
$ docker network ls
# 네트워크 frontend 붙이기
$ docker run -it --rm --net=frontend busybox wget -qO- http://web

도커 스웜

  • 도커 호스트 ㅌ클러스터를 구성하고, 클러스터에 컨테이너를 배치해주는 도구

  • 표준 Docker API

  • 스케쥴링 지원

  • 디스커버리 지원 : Consul, Etcd, Zookeeper

스웜 모드

  • ehzj dpswlsdp zmffjtmxj rhksflrk xhdgkqehls ahem

    • 조건 : 도커 엔진 1.12.0 이상

  • 멀티호스트네트워킹 : 분산환경에서 여러개 노드를 하나의 네트워크로 묶은것

  • 서비스 디스커버리 : 멀티호스트

  • 헬스체킹

  • 노깅

  • 스케일아웃

  • 모니터링

  • HA

롤링 업데이트를 활용한 배포 프랙티스

  • BlueGreen Deployment

  • Canary Release

스웜 모드 중요개념

스웜 클러스터

  • 스웜을 이용해 구축한 클러스터

  • aka 스웜

  • node : 스웜 클러스터에 참여하는 도커 엔진 인스턴스

    • Manager Node

      • 스웜매니저가 실행

      • 스웜 클러스트 상태를 관리하는 노드. 오케스트레이션

      • Service 정의, Task 할당

    • Worker Node

      • 매니저 노드의 명령을 받아서 컨테이너 작업을 수행

      • Task 처리

  • 서비스

    • 배포단위

    • 한개 서비스는 여러개의 테스크를 갖음

    • 보통 1개의 이미지를 이용해 동일한 타입의 ㅓㄴ테이너를 여러개 실행

    • global services

      • 클러스터에 있는 모든 노드에서 실행 되는 서비스

    • replicated services

      • 스케일 아웃을 위해 특정 노드에서 실행하는 서비스

  • Task

    • 컨테이너 배포 단위, 컨테이너와 컨테이너에서 처리하는 명령

    • 스웜 스케쥴링 단위

스웜 모드 명령어

$ swarm init # 생성
$ swarm join # 참여
$ service create
$ service inspect
$ service ls
$ servcie rm
$ servcie
  • No extermal KV(key-valeu) stroe needed

스웜 실습 참고하여 해보기

  • --swarm-master 옵션 : 스웜매니저로 사용?

  • 워커노드는 위 옵션 빼도 됨

$ docker-machine create virtualbox nod1
$ docker-machine create virtualbox nod2
$ docker-machine create virtualbox nod3

# 스웜 생성
$ docker swarm init --advertiese-addr 192.168.99.104
# 2,3 번가서 
$ docker swarm join --token 발행된거 스웜ip:port

# 노드 확인
$ eval (~ nod1)
$ docker node ls
# 서비스 생성
$ docker service create --name myweb -p 80:80 nginx:1.10
# 서비스 확인
$ docker service ls
$ docker service ps myweb(컨테이너)
$ curl

ingress 네트워크

  • swarm 클러스트 외부에 서비스 포트 공개를 지원

  • 모든 노드는 ingress routing mesh 에 들어감

    • 필수포트

      • 7946 : 디스커버리포트

      • 4789 : 인그레스 네트워크 포트

  • HAProxy (로드밸런싱) -> 라우팅 -> 내부연결

$ docker service scale myweb=5  #  -> 5개로 늘린다
$ docker service ps myweb       # myweb 확인
$ docker service upate --image nginx:1.11 myweb # nginx 1.11 버전으로 갱신

swarm kit

  • 리눅스 킷과 스왐이 합쳐진....

  • 도커 노드 클러스터링 이슈

    • 싱글노드 : private ip

    • 멀티노드

  • swarmd

  • swarmct

쿠버네티스

  • 1세대 -> 2세대 -> 3세대(k8s)

  • 컨테이너 어플리케이션에 대한 배포, 스케일링, 관리를 자동화 해주는 오픈소스 시스템

  • 왜 쿠버네티스가 필요한가

  • 서비스 디스커버리 : 컨테이너 노출

  • 로드밸런싱 : 컨테이너 네트워크 트래픽 관리

  • 스토리지 오케스트레이션 (볼륨 데이터 공유 등)

  • 네트워크, 스토리지 잘해야됌

  • 상태관리: 자동화된 롤아웃,백으로 노드에 대한 상태를 유지

  • 스케쥴링 : 조건에 맞는 노드를 찾아서 컨테이너를 배치

  • 클러스터링 : 가상 넽워크를 통해 하나의 클러스터 노드를 제공

  • 리소스 모니터링, 시크릿 등...

    • 시크릿 -> 인프라 관리 -> 키값 관리가 많은데... 무분별하게 쓰여지는것이 많고... 안정적인 관리를 위한?

kubectl 명령어

  • dashboard : 웹서비스

# mini kube 설치
$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && chmod +x minikube && sudo mv minikube /usr/local/bin/
# start
$ minikube start --vm-driver=virtualbox
# 시작안되는경우
$ rm -f ~/.minikube

$ eval $(minikube docker-env)

$ minikube docker-env

# kubectl 설치
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl

# kubectl 확인
$ kubectl cluster-info

# 이미지 빌드
$ docker build -t hello-node:v1 .

# 이미지 확인
$ docker images

# 배포
$ kubectl run hello-node --image=hello-node:v1 --port=8080

$ kubectl get deployments

$ kubectl get pods

$ kubectl config view

$ kubectl expose deployment hello-node --type=LoadBalancer

# 확인
$ minikube service hello-node

$ vi server.js # 수정 v2ㅗ

$ docker build ~

$ kubectl set iamage deployment/hello-node hello-node=hello-node:v2
# nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: 
...
# yaml 설정 생성 / 실행
$ kubectl create -f nginx-pod.yaml 

# 수정
$ kubectl aply -f ㅍ파일명

k8s 클러스터

  • k8s 클러스터 : 컨테이너 애플리케이션을 실행하는 노드 == 워쿼노드의 집합

    • 마스터 -> 여러개의 워커

    • 마스터 -> 컨트롤플레인으로 명칭 변경

  • etcd, kube-controller-manager, cloud-controller-manager, 스케쥴러

  • 노드 : 파드들이 생성되는 머신

컨트롤 플레인

  • k8s 클러스터를 관리

  • 1대이상(운영-최소 3대) 필요하며 실제로 컨테이너를 배치하지 않는다.

  • api 서버 : 클라이언트 통신하는 http(s) REST API 서버

  • 쿠베 컨트롤러 매니저 : DaemonSet Contorller, Replication Controoler 등의 컨트롤러를 관리하고 API서버와 통신

  • 클라우드 컨트롤러 매니저 : 공개 클라우드 사업자를 위해 확장 포인트제공

  • 스케쥴러 : 노드에 리소스를 배치한다

  • etcd: 분산형 key-value 저장소, 설정 정보 저장

Node

  • 실제로 컨테이너가 실행되는 머신... 마스터 API서버와 통신하면서 노드에 컨테이너를 관리

  • kubelet : API 서버와 통신하며 컨테이너 상태를 관리

  • kube-Proxy (프록시 서버) : 네트워크 프록시, 로드밸런서

  • cAdivisior : 리소스 모니터링

  • 컨테이너 런타임 : Docker, Container

Pod (가장중요)

  • 배포단위

  • 하나의 Pod 은 여러 개의 컨테이너를 가짐

  • Pod내에 있는 컨테이너 끼리는 로컬 콜 -> 브릿지 네트워크

  • 고유 IP 가짐. Pod이 가짐. VM? 서버?

  • CPU, Memory, volumes, IP Address 및 기타 자원을 할당. (Pod 내의 모든 컨테이너가 자원을 공유)

  • 컨트롤러 관리

  • Pod IP Range

Service

  • pods은 늘어나거나 줄어들 수 있음.

  • pods으로 가는 traffic을 로드밸런싱 해줄 수 있어야하는데, service가 그역할을 수행

  • Private IP가 service에 할당

  • Service에 할당된 IP+PORTfmfx hdgo wjqrmsgkaus, enldp dlTsms ㅔㅐㅇㄴdp round-robin등의 방식으로 접근

  • sticky session 지원

  • Service 유형은 Cluster IP, NodePort, Loadbalace, Ingress 가 있음

Cluster IP

  • 팟이 유동적이기 떔에 클러스터내 고유한 IP

Ingress GW

kube-controller-manager

  • ReplicaSet

    • 팟을 관리

    • 예전에는 Replication Controller였는데 대체중

  • Deployment

kubeflow

Docker 호스트 모니터링

htop

  • 터미널 기반 유닉스 프로세스 모니터닝 도구

# 터미널기반
$ docker run -it  --rm --pid host tehbilly/htop

$ docker run -d -P --name myweb nginx

$ docker run -it --rm --pid=container:myweb tehbilly/htop

# 웹콘솔 
$ docker run -it --pid=host -v /var/run/docker.sock:/var/run/docer.sock:ro --name glances nicolargo/glances

$ docker run -d -p 61208:61208 -p 61209:61209 -e "GLACNES_OPT=-w" --pid=host -v /var/run/docker.sock:/var/run/docker.sock:ro --name glances nicolargo/glances

컨테이너 로깅 기준

  • 로그를 이벤트 스트림으로 취급하라

  • 로그파일로 관리하지말고 stdout으로 출력

  • 로그파일은 앱이 아닌 실행환경으로 관리한다

$ docker logs [컨테이너명 | 컨테이너 아이디]

$ docker-compose logs -f [서비스명]

멀티호스트 모니터링

  • frontail

ELK를 이용한 로그 분석 환경 구축

  • 엘라스틱 서치 : 아파치 루신 기반읜 검색 엔진 서버

  • 로그스태시 : 로그와 같은 데이터를 실시간으로 수집해주는 엔진

  • 키바나 :엘라스칙 서치 결과를 분석하고 표현해주는 플랫폼

  • 레디스 : 인메모리 데이터 저장소

싱글호스트 구축

$ docker-machine create -d virtualbox --virtualbox-memory "2048" elkr

$ docker-machine ssh elkr

$ sudo sysctl -w vm.max_map_count=262144

$ docker $(docker-machine config elkr) run -d -p 9200:9200 --name elasticsearch
docker.elastic.


$ docker-machine ssh elkr

# ES HQ 플러그인 설치
$ docker exec -it elasticsearch /bin/bash 

$ 접속 -> 
$ .usr/share/elasticsearch/bin/plugin install https://github.com/NLPa~~

# ES HQ 플로그인 확인
$ curl http://$(docker-machine ip elkr):9200/_plugin/hq

# kibana 설치 -> link로 바라봐야하므로 앨 서 먼저 설치하고 설치해야함
$ docker $(docker-machine config elkr) run -d  --link elasticsearch:elasticsearch --name kibana -p 5601:5601 kibana 

# 확인
$ curl http://$(docker-machine ip elkr):5601


# 레디스 설치
$ docker $(docker-machine config elkr) run -d -p 6379:6379 --name redis redis

$ docer-machine ssh elkr

$ docker exec -it redis reids-cli info

# 수집 대상 > nginx 
$

# json 포맷로그를 남기는 nginx.conf 파일
# 파일 복사

$ docker run -d -P --nane web1 -v ~/nginx.conf:/etc/nginx/nginx.conf \
-v ~/nginx/log:/var/log/nginx \
-v ~/nginx/content:/usr/share/nginx/html nginx

$ tail -f ~

# nginx log -> redis로 유입시키는 .. log-conllector.conf 정의

$ docker run -it --rm --link reids:redis 
-v /home/docker/nginx/log:/nginx/log \
-v ~/logstash:/config-dir logstash logstash -f /config-dir/log-collector.conf

$ docker run -it --rm \ 
--link reids:redis \
--link elasticsearch:elasticsearch \
-v ~/logstash:/config-dir \

..

# elkr 네트워크를 추가한다
$ docker $(docker-machine config mhl-elkr) network create -d overlay elkr 

# web 네트워크
$ docker $(docker-mahine config mhl-elkr) \
run -d -p 9200:9200 \
--net=elkr --name elasticsearch elasticsearch

멀티호스트 구축

Last updated