# openvswitch -> linuxbridge로 변경.
# kvm1 kvm2
# 1. ovs 끄기
ovs-vsctl show
ovs-vsctl del-br vswitch01
systemctl stop openvswitch
systemctl disable openvswitch
# 2. 네트워크 설정하기
cd /etc/sysconfig/network-scripts/
mv ifcfg-vswitch01 ifcfg-br0
vi /etc/sysconfig/network-scrpts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=211.183.3.101
PREFIX=24
GATEWAY=211.183.3.2
DNS1=8.8.8.8
NM_CONTROLLED=no
vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
systemctl restart network
# 3. 상태 확인하기
모든 서버에서 인터넷 연결확인 ping192.1168.1.0/24대 서버끼리 통신 가능한지 확인
192.168.1.102 101
192.168.1.199
192.168.2.102 101
192.168.2.199
211.183.3.102 101
211.183.3.199
ping www.google.com
# 4. KVM1/KVM2은 STORAGE의 /shared를 자신의 /cloud로 마운트 되어 있는지 확인
vswitch를 없애자
가상머신을 만들때 순서대로
eth0 -> eth1 -> eth2 순이었는데
eth0 -> VMnet8
eth1 -> VMnet1
eth2 -> VMnet2
순서였다.
마지막 eth2는 vmnet2에 연결된 상태이다. vmnet2(192.168.2.0/24)-host only
eth1도 vmnet1에 연결된 상태이다.
eth2는 마이그레이션 용도로 사용했다.
관리용으로도 사용중이다.
eth1,2는 직접적으로 ip 주소를 넣었다.
하지만 eth0는 br0라는 스위치 안에 eth0를 포함시키었다. 그래서 eth0는 외부로 연결되어있다. 이제 만드는 가상머신들은 br0에 연결해서 사용할 예정이다.
[ 실습 시나리오 ]
서버 가상화 환경에서 도커 스웜 클러스터 배포하기
- GKE 에서 쿠버네티스 클러스터 환경 배포처럼
매니저 1, 워커 3 배포해라 (CPU, RAM) 선택하고 배포를 시작하면
클러스터구현까지 완료된 서비스를 제공하는 방식
- manager 배포 -> 도커/compose는 설치가 되어 있어야 함
-> 토큰도 발행해둔 상태이어야 함
-> 토큰은 별도의 파일로 공유 저장소에 보관
- worker 배포 -> 도커 설치되어 있어야 함
-> 처음 실행하면서, 토큰 파일의 내용을 읽어서 클러스터에 참여시켜야 함
-> 완료된 뒤에 manager에서 docker node ls를 해보면 스웜 클러스터가 구현되어 있어야 함
-> 서버 가상화 환경에서 배포되므로 워커나 매니저가 마이그레이션 되더라도 클러스터는 유지되어야 함
위와같이 VM을 만들었는데 이걸 옆 서버로 마이그레이션하면 네트워크 IP를 그대로 쓸 수 있는가? 결론은 쓸 수 있다. 왜냐하면 설정상 br0를 쓰겠다고 했기 때문에 줄곧 유지 되는 것이다.
이전에 보았던 GKE도 이와 유사하게 서버를 늘리고자 할때 추가적으로 늘려서 쓸지를 물어보았다. 이때 물어본것이 기존에 있었던 zone에 배치할지 말지를 물어보았다.
즉 마이그레이션되어도 운영이 가능해야하고 클러스터링도 가능해야하니 공인 IP로 통신하거나 overlay가 가능하게 해야한다.
manager 배포 -> 처음 실행하면서?
docker swarm init --advertise-addr=211.183.3.100
토큰 발행됨 -> 공유 저장소에 파일 형태로 저장
그런데 우리가 ip를 모르는데 이걸 어떻게 하냐는 것이다.
다행히도 인터페이스도 manager의 주소로 배포가 가능하다
docker swarm init --advertise-addr eth0:2377
storage(centos) 에서 manager를 생성 -> centos 7버전에 도커, 컴포즈가 설치되도록
이제부터는 docker swarm에 참여할 노드들을 위한 디렉토리를 만들것이다.
```
mkdir /instance
chmod 777 /instance
```
docker의 manager, worker들이 연결할 디렉토리이다.
그리고 nfs의 접근 권한을 설정해놓자
```
systemctl restart nfs-server
```
/shared 디렉토리에 이미지를 만들어보자
virt-builder를 시작해야하는데 먼저 가상화가 가능하도록 만들어야 한다.
먼저 위와같이 설정해주고
패키지를 설치해야한다.
```
yum install -y libvirt qemu-kvm virt-install guestfish
#ubuntu이면 libguestfs까지 설치
vi /etc/libvirt/qemu.conf
```
위와같이 user와 group의 주석을 해제해주자
```
virt-builder -l | grep CentOS
```
```
virt-builder centos-7.4 -o /shared/docker-manager.qcow2 --size 20G --hostname manager
```
이미지(볼륨)을 만들때
- 호스트이름 : manager
- 루트패스워드 : test123
- storage의 ./instance 디렉토리를 마운트 할 /nfs 디렉토리 생성
- 이 볼륨에 nfs 클라이언트, docker, 컴포즈를 설치하려면?
무조건 first-boot로 설치할 수는 없다. 기본 이미지 centos-7.4에다가 nfs, 도커, 컴포즈를 설치하라고 하고, 이미지가 애시당초부터 설치해 놓은 상태에서 가상머신을 만들어야 한다.
그런데 설치할것도 한두개이지 이걸 매번 명령어로 넘길 수 없으니 설치할 파일이 적힌 쉘스크립트를 던져서 처리해야한다.
추가 패키지를 설치하라고 한다.
```
yum -y install libguestfs-xfs
```
다시 설치하자
비밀번호가 재 설정되었다.
virt-builder -> 인스턴스에 추가될 볼륨 생성작업(기본이미지 centos-7.4를 이용하여 이용가능한 볼륨 크기로 늘리기 위해서는 virt-resize) -> 생성된 볼륨을 불러와서 새로운 인스턴스를 생성한다 (virt-install -> cpu, ram, nic)
- 호스트이름 : manager -> --hostname
- 루트패스워드 : test123 -> --root-password password:test123
- storage의 ./instance 디렉토리를 마운트 할 /nfs 디렉토리 생성 -> --mkdir /nfs
- 이 볼륨에 nfs 클라이언트, docker, 컴포즈를 설치하려면?
-> --run-command 'sudo yum -y install nfs-utils'
-> --run install.sh
- 이미지에 방화벽 해제, 도커 실행을 위한 설정 입력
-> --run-command 'sudo systemctl disable firewalld'
-> --run-command 'sudo systemctl enable docker'
--- install.sh ---
#!/bin/bash
sudo yum install -y nfs-utils
# sudo 도커 설치 관련 명령들...
# sudo 컴포즈 설치 명령들...
[ 처음 부팅할 떄 실행해야 할 요소들 ]
- 생성된 볼륨을 virt-install을 이용하여 인스턴스로 배포할 때 실행할 명령들...
로컬에 있는 /nfs와 211.183.3.199의 /instance 디렉토리를 마운트
--firstboot-command 'sudo mount -t nfs 211.183.3.199:/instance /nfs'
- 로컬에서 도커 스웜을 시작하고 결과코드(토큰 포함된...)를 /nfs 의 아래에 파일로 저장
--firstboot-command 'sudo docker swarm init --advertise-addr=eth0:2377' > /nfs/manager-token.txt
[ 실습 ]
먼저 /dockertest 에 sh 파일을 만들고
여기에서는 구지 파일권한 부여안해도 libvirt가 불러올때 내용을 읽어서 자동실행시킨다
virt-builder centos-7.4 -o /shared/dockertest.qcow2 --size 20G \
--hostname manager --root-password password:test123 \
--run install.sh \
--run-command 'sudo systemctl enable httpd' \
--run-command 'sudo systemctl disable firewalld' \
--selinux-relabel
이미지가 잘 만들어졌다.
(나는 잘못만들어서 docker-manager이 되었지만 보는 사람은 dockertest.qcow2로 만들자
virt-install --name test \
--vcpus 1 --ram 2048 \
--network bridge:br0,model=virtio \
--disk /cloud/dockertest.qcow2 --import \
--noautoconsole --os-variant rhel7
이걸 확인하기 위해 kvm1에서 가상머신을 만든다음 kimchi에 들어가보자
만들어진 VM이 확인된다.
들어가보자
```
virsh console test
```
대충 우리가 만든 내역이 모두 확인되니 지우자
```
virsh destroy test
virsh undefine test --remove-all-storage
```
[ 실습 시나리오 ]
virt-builder centos-7.4 -o /shared/manager.qcow2 --size 20G \
--hostname manager --root-password password:test123 \
--run install.sh \
--mkdir /nfs \
--run-command 'sudo systemctl enable httpd' \
--run-command 'sudo systemctl disable firewalld' \
--run-command 'sudo systemctl enable docker' \
--firstboot-command 'sudo mount -t nfs 211.183.3.199:/instance /nfs' \
--firstboot-command 'sudo docker swarm init --advertise-addr eth0:2377 > /nfs/manager-token.txt' \
--selinux-relabel
CentOS 7.4 에서 도커와 컴포즈 설치를 위한 install.sh 파일의 내용
#!/bin/bash
sudo yum -y install nfs-utils httpd
sudo yum -y install yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum -y install docker-ce
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
시작전에 마운트되는 폴더에 미리 파일을 만들어놓자
virt-install 내용
virt-install --name manager \
--vcpus 1 --ram 2048 \
--network bridge:br0,model=virtio \
--disk /cloud/manager.qcow2 --import \
--noautoconsole --os-variant rhel7
집적 들어가보자
virsh console manager
정상동작한다
```
cat /nfs/manager-token.txt
```
를 확인하면 docker swarm token이 있는 것을 확인할 수 있다.
[ worker ]
워커 입장에서는 worker1 생성
이미지 작성
# Worker1 - KVM1
virt-builder centos-7.4 -o /shared/worker1.qcow2 \
--size 20G --hostname worker1 --mkdir /nfs \
--root-password password:test123 --run install_worker.sh \
--run-command 'sudo systemctl enable httpd' \
--run-command 'sudo systemctl disable firewalld' \
--run-command 'sudo systemctl enable docker' \
--firstboot-command 'sudo mount -t nfs 211.183.3.199:/instance /nfs' \
--firstboot-command 'sudo $(cat /nfs/manager-token.txt | grep "SWMTKN") ' \
--selinux-relabel
# Worker2 - KVM2
virt-builder centos-7.4 -o /shared/worker2.qcow2 \
--size 20G --hostname worker2 --mkdir /nfs \
--root-password password:test123 --run install_worker.sh \
--run-command 'sudo systemctl enable httpd' \
--run-command 'sudo systemctl disable firewalld' \
--run-command 'sudo systemctl enable docker' \
--firstboot-command 'sudo mount -t nfs 211.183.3.199:/instance /nfs' \
--firstboot-command 'sudo $(cat /nfs/manager-token.txt | grep "SWMTKN") ' \
--selinux-relabel
manager가 nfs 폴더에 적은 내용이 swarm join 용으로 사용할 수 있도록 만들어주자
CentOS 7.4 에서 도커와 컴포즈 설치를 위한 install.sh 파일의 내용
#!/bin/bash
sudo yum -y install nfs-utils httpd
sudo yum -y install yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum -y install docker-ce
# kvm1 - worker1
virt-install --name worker1 \
--vcpus 1 --ram 2048 \
--network bridge:br0,model=virtio \
--disk /cloud/worker1.qcow2 --import \
--noautoconsole --os-variant rhel7
# kvm2 - worker2
virt-install --name worker2 \
--vcpus 1 --ram 2048 \
--network bridge:br0,model=virtio \
--disk /cloud/worker2.qcow2 --import \
--noautoconsole --os-variant rhel7
정상 등록되었다.
--- 마이그레이션 / 노드 연결 상태 확인 / 서비스 배포 ---
KVM2 에 있던 worker2를 KVM1으로 마이그레이션
* KVM1 에서 worker2 가 정상적으로 옮겨진 것을 확인하고 manager에 들어간다.
* manager에서 아래와 같이 서비스 배포해 보기
```
docker node ls
docker service create --name test -d -p 80:80 --replicas 2 --constraint 'node.role==worker' nginx
```
* 윈도우 10dptj wjqthrgkrl
지금까지 네트워크가 안되어서 계속 돌아다니었는데
어째서인지 VMnet8의 Allow any Organizationally Unique Identifier을 설정하니 잘된다.;;;;;
알고보니 우리가 만든 VM들은 IP를 VMWare에서 알고 있으니 상관없는데 virsh과 같은것들은 VMWare가 아는 머신이 아니라서 IP를 보고 드랍한다고 한다.