들어가기전
- (참고)웹 서비스 데몬의 위치
이미지 웹 서비스 경로 httpd /usr/local/apache2/htdocs nignx /usr/share/nginx/html centos+httpd /var/www/html ubuntu+nginx /var/www/html ubuntu+httpd /var/www/html
- python docker 설치
sudo apt -y install pip pip install docker rapa@manager:~$ which python3 /usr/bin/python3
간단 예제
example1)
vi ctn.py
import docker client = docker.from_env() print(client.containers.run("alpine", ["echo", "hello", "all"]))
chmod +x ctn.py # 실행 퍼미션 설정 ./ctn.py docker container ls
example2) nginx 컨테이너 실행
cp ctn.py ctn1.py
#!/usr/bin/python3 import docker client = docker.from_env() test = client.containers.run("nginx", detach=True) print(test.id)
example3) for문으로 container list 출력
#!/usr/bin/python3 import docker client = docker.from_env() for ctn in client.containers.list(): print(ctn.id)
결과
도커 스웜 모드 모니터링
도커스웜 모드 시각화 도구: 도커 스웜 모드 클러스터는 여러 호스트와 서비스를 처리하는 오케스트레이션 도구다. 따라서, 도커 스웜 명령을 통한 조회보다 시각적 피드백이 더욱 유용하다.
/var/run/docker.sock 에 도커 컨테이너에 관한 정보들이 저장되는데 이를, 각 컨테이너와 마운트 해서 모니터링 할 수 있게 한다.
docker container run -d --restart always -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --name portainer portainer/portainer
portainer 사용
9000번 포트로 들어가서 비밀번호 test1234, docker로 시작 설정
환경 셋팅
manager(private-registry) CPU RAM NIC(Vmnet10) manager 2 4 211.183.3.100 worker1 2 2 211.183.3.101 worker2 2 2 211.183.3.102 worker3 2 2 211.183.3.103 manger를 clone하여 worker node들을 생성한다.
- ip설정
sudo vi /etc/netplan/01-network-manager-all.yaml
sodu netplan aplly
#변경한 ip 적용
ip a
로 확인- 모든 노드의 /etc/hosts 아래에 다음 내용 추가
211.183.3.100 manager
211.183.3.101 worker1
211.183.3.102 worker2
211.183.3.103 worekr3- 모든 노드에서 동작중인 컨테이너 삭제
- 모든 노드에서 시간을 확인하여 동일한 시간인지 여부 확인
Manager, Worker, MSA 개념
cluster 환경에서는 자원을 pool에 담아 하나의 자원(computing, network, storage)로 활용될 수 있다. 기능적으로 두 가지 기능이 호스트에 부여된다.
- manager(master@k8s)
- controller 역할 수행
- worker의 기능 포함
- 일반적으로 매니저는 컨테이너 배포에서 제외하고 주로 컨트롤, 관리, 모니터링 역할에 주력해야 한다.
- worker(node@k8s): 컨트롤러로 부터 명령을 전달받고 이를 수행하는 역할
- maneger, worker는 처음 클러스터 생성시 자동으로 node.role이 각 노드에 부여된다. 또는 추가적으로 label을 각 노드에 부여하여 컨테이너 배포시 활용할 수 있다.
- 쿠버네티스의 master는 worker의 기능을 수행하지 않는다.
MSA(Micro Service Architecture)
- 고도화를 위해 다수의 컨테이너나 VM을 이용하여 개발을 진행할 수 있다.
- 개발 속도를 향상시키고 모듈 형식으로 기능을 구별하여 개발하므로 문제발생시 해당 컨테이너나 코드, VM만 확인하면 되므로 관리가 용이하다.
- Scale out에 유리
- 각 기능에서 언어를 지정하지 않으므로 필요한 언어를 선택하여 개발하면 된다.
- 각 기능별 데이터는 API를 통해 주고 받으면 된다.
클러스터 환경 구현하기
매니저 역할을 수행할 노드에서 토큰을 발행하고 워커는 해당 토큰을 이용하여 조인한다.
manager에서 token 생성 후 worker에서 조인
rapa@manager:~/0824$ docker swarm init --advertise-addr ens32 Swarm initialized: current node (084qs3331s62phkgh2vz3flq1) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4jgyfeymuhfupq79k318nnf614851htt4mmz47kak33zo83llu-a86jbfg4b4ltczikamxfr4fef 211.183.3.100:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. rapa@worker1:~$ docker swarm join --token SWMTKN-1-4jgyfeymuhfupq79k318nnf614851htt4mmz47kak33zo83llu-a86jbfg4b4ltczikamxfr4fef 211.183.3.100:2377 This node joined a swarm as a worker.
- 결과
- AVAILABILITY
- Active: 컨테이너 생성이 가능한 상태
- drain: 동작중인 모든 컨테이너가 종료되고 새로운 컨테이너를 생성할 수 없는 상태
- pause: 새로운 컨테이너를 생성할 수는 없다. 하지만, drain과는 달리 기존 컨테이너가 종료되지는 않는다.
- 유지보수를 위해 drain 또는 pause로 변경한다.
worker 관리
- 처음 매니저가 토큰을 발행하면 manager 용, worker 용 토큰이 발행된다. worker 외에 추가로 manager를 두고 싶다면, 별도의 노드에서는 manager 용 토큰으로 스웜 클러스터에 join 한다.
- 만약 manager가 한 개인 상태에서 해당 매니저가 다운된다면 전체 클러스터를 관리할 수 없으므로 실제 환경에서는 최소한 2대의 매니저를 두어야 한다.
- 예) manger1(Leader), manager2, worker1, worker2
rapa@manager:~/0824$ docker swarm join-token worker To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4jgyfeymuhfupq79k318nnf614851htt4mmz47kak33zo83llu-a86jbfg4b4ltczikamxfr4fef 211.183.3.100:2377 rapa@manager:~/0824$ docker swarm join-token manager To add a manager to this swarm, run the following command: docker swarm join --token SWMTKN-1-4jgyfeymuhfupq79k318nnf614851htt4mmz47kak33zo83llu-7153hz2kv4mmzkdubv0onzxho 211.183.3.100:2377
- 만약 현재 상태에서 worker1을 manger로 변경하고 싶다면?
- 등급을 올려준다. docker node promote worker1
- 등급 올리기전
- 등급 올린 후
- worker1에서 node 상태 확인 가능해졌다. worker2에서는 확인 불가능
- docker node demote worker1: worker1을 다시 worker로 내림
- 각 노드에서 클러스터를 벗어나기
- worker에서 leave, manager에서 rm
- docker swarm leave <- worker에서 실행
- manger에서 확인
docker node rm worker1
: manager에서 지워주면 끝
클러스터에 nginx 배포
- 단일 노드에서는 컨테이너 단위로 배포
docker service create --name web --constraint node.role==worker --replicas 3 -p 80:80 nginx
docker service ls
: 클러스터에 동작중인 서비스의 목록확인, 동작컨테이너 개수 / 요청 컨테이너 개수docker service ps web
: 각 컨테이너가 어떤 노드에서 동작중인가?- 결과
- 컨테이너가 생성되지 않는 이유
- 이미지가 다운로드 되지 않은 상태에서 생성하려고 할 때
- 이미지 다운로드를 위한 인증정보가 없을 경우: 자원사용의 불균형이 발생할 수 있다. 즉, 현대의 노드에서 여러 컨테이너가 동작하고 몇 노드에서는 컨테이너 생성이 되지 않는 문제
- 각 노드에 저장소 접근을 위한 인증정보가 config.json에 없다면 이를 해결하기 위해
- manager에서 로그인을 하고 config.json 정보를 일일이 각 노드의 config.json 에 붙여넣기 한다.
- manager에서 로그인을 하고 config.json 정보를 docker service create 시 넘겨준다.
--with-registry-auth
- [실습 상황]각 노드에 config.json 파일을 넘겨주지 않았는데 생긴이유
- manager노드를 클론하면서 worker 노드에 생긴 경우
- docker hub에서 IP를 확인하고 하루 100개 이하로 요청이 왔다면 인증정보를 준다.
- scale 조정하기
docker service scale web=1
- 이렇게해도 211.183.3.100~103 모두 접속 가능하다.
docker serivice rm web
: 동작중인 서비스 삭제하기