본문 바로가기
Development(Web, Server, Cloud)/22) LINUX - Cloud

클라우드 47일차

by tonyhan18 2022. 3. 13.
728x90

 

 

스토리지를 반드시 2개 이상 준비해서 클러스터로 묶어라.

 

클러스터라고 하면 앞에서도 우리는 도커 스웜이라는 것을 했다. 도커 스웜도 overlay로 네트워크가 구성되어서 인스턴스간에 통신이 가능했다.

 

네트워크도 클러스터 환경에서는 자원을 풀에 넣어서 각자의 자원 풀(CPU, RAM, NIC)에 넣어서 함께 사용하겠다는 이야기 인데 그 요소중에 하나가 overlay 네트워크이다. overlay 네트워크도 클러스터 환경에서는 공유가 된다는 이야기이다. 그 결과 네트워크가 하나로 합쳐져 ingress 네트워크가 생성된다. ingress 네트워크의 드라이버는 overlay 이다. 그러면 우리가 원하는 이름의 ingress 네트워크를 가질 수 있다. ingress 네트워크는 RR을 제공해준다. ingress 네트워크는 드라이버를 overlay를 사용한다.

 

그런데 사용하다보니까 서버자체에 문제가 생긴것이다. 그럼 HAProxy는 RR 알고리즘에 따라 에러가 난 서버에도 패킷을 던지지만 health check로 네트워크의 사태를 꾸준히 확인한다.

 

이와 유사하게 overlay 네트워크 ingress도 이를 처리한다.

 

그래서 공유저장소에서 한쪽이 멈추게 된다면 데이터 센터에 스토리지를 하나더 두는 것이다. 이 두개를 클러스터로 묶는다. 그리고 자원풀에 담는다. 이 상황에서 상호 생존여부를 확인하고 자원도 분산처리한다. 문제는 이 상태에서 스위치 자체에 문제가 있다면? 이를 대비하기 위해서 백엔드는 별도의 존하고 또 연결을 해주어야 한다.(ex. 일산-목동)

 

이더넷0번도 그냥 ip를 넣지 않고 가상의 스위치를 넣었다(br0)

br0는 linux bridge이다. 또다른 것은 OpenvSwitch(ovs) 이다.

이 둘의 가장큰 차이점은 br0는 L2만 처리할 수 있다.

ovs는

- [L3 이상의 트래픽 처리, 라우팅, NAT] 가능하다.

- ovs는 또한 [vlan 사용이 가능하다(Access Trunk)].

- [터널링(GRE, VxLAN)이 가능하다].

 

이더넷 위에 가상머신들을 연결해보자. 이때 서로 다른 vlan으로 할당해주어 각각 분리해주자. 이 상태에서 마이그레이션도 가능하게 만들어주자. 그런데 우리는 이 상태에서 같은 vlan끼리는 통신할 수 있도록 클러스터링하고 vlan으로 묶는 것이다.

그럼 다른 서버의 같은 이름의 vlan은 같은 것일까? 이는 다르다. 왜냐하면 상호 통신을 위해서는 L3를 거치어야 하기 때문에 같은것이 아니다. 그래서 같은 vlan에 있는 것처럼 만들기 위해서는 터널링이 필요하고 각자의 vlan을 유지해서 각 고객별로 vlan 번호를 유지하고 싶다면 VxLAN 을 써야한다. VxLAN은 VLAN의 확장판으로 더 많은 네트워크 번호화 네트워크 연결용으로 사용하게 된다.

 

나중에 실무에서는 테넌트(서비스) 별로 별도의 VxLAN이 할당된다. 

 

이때의 eth0는 trunk 로 구성해서 모든 포트가 나갈 수 있게 만들어주자.

 

---

 

다시 서버 두대를 두고 서버아래에 별도의 스위치랑 연결되어 있고 그 아래에는 ISP가 있다고 가정하자.

instance들을 연결해주는데 instance는 (xml + volume)으로 구성되어 있다. 특히 xml은 스펙과 디스크의 위치가 정해져 있다. 그래서 그 위치에 있는 이미지를 이용하겠다고 적혀있다. 이 상태에서 우리는 KVM을 동작시키기 위한 데몬이 정의되어 있다. 얘가 xml을 작동시키는 것이다.

사용하다가 살아있는 인스턴스를 Live Migration을 위해 XML을 다른 서버에 넘겨준다. 하지만 이걸 위해서는 KVM2에서도 동일한 디스크를 향하고 있어야 한다. 그래야만 xml만 이동시키어서 바로 동작시킬 수 있다.

 

그런데 이런것도 있을 수 있다. 디스크 공간이 점차 줄어드는 것이다. 그래서 이 스토리지 자체의 데이터를 다른 스토리지로 옮길 수 있어야 한다. 이것을 Storage Migration이라고 부른다. 시간이 오래 걸리기 떄문에 Fiber Channel을 사용해서 지연을 줄이고 패킷손실을 없애는 방법이다.

 

만들때는 사용자가 설치하는 방식으로 전달하면 안된다. 내가 서비스를 요청하면 바로 사용할 수 있어야 한다. 이걸 위해 우리는 먼저 docker과 compose를 설치해 놓았다. 이 이미지를 사용하기 위해서 token을 발행해놓는다. docker swarm을 이용해 worker들을 등록해서 사용하자

 

[ 실습 ]

 

[도커 스웜] 
스웜 매니저 : 2377/tcp
워커 사이의 통신 : 7946/tcp-udp
ingress 오버레이 네트워크 : 4789/tcp-udp

 

1. 인스턴스 배포를 위해 볼륨 생성(virt-builder)

virt-builder centos-7.4 --output /shared/manager.qcow2 \
--size 20G --hostname manager --mkdir /nfs \
--root-password password:test123 --run install.sh \
--run-command 'sudo systemctl enable docker' \
--run-command 'sudo systemctl disable firewalld' \
--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

 

위와같이 해서 virt-builder로 centos-7.4 이미지를 받아왔다. Base Cloud 이미지이다. 실재 파일을 가져오기 위해 curl을 이용한다.

 

#!/bin/bash

sudo yum -y install nfs-utils
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-builder를 사용할때 사용했던 shell 스크립트 install.sh이다.

 

virt-install --name manager --vcpus 1 --ram 2048 \
--network bridge:br0,model=virtio --disk /cloud/manager.qcow2  \
--import --noautoconsole --os-variant rhel7

실재 이미지를 가지고 인스턴스 배포해보자

 

매니저는 docker stack 형태로 배포가 가능하다.

docker swarm(cluster) + docker-compose(yml 재사용, 2개이상의 서비스 배포) => docker stack

- docker swarm 클러스터는 여러 서버를 묶어서 동작하는 것이다.

- docker-compose는 한개의 서버 위에 노드를 만드는 것이다.

 

이 둘의 기능을 추가하면 여러 서버위에 똑같은 서비스들을 배포할 수 있다.

 

worker 위에서는 runtime만 가지고 있으면 된다. 이때 swarm은 runtime으로 docker만 사용한다.

 

#!/bin/bash

sudo yum -y install nfs-utils
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

 

그래서 worker는 위와같이만 구성해놓으면된다.

 

virt-builder centos-7.4 --output /shared/worker1.qcow2 \
--size 20G --hostname worker1 --mkdir /nfs \
--root-password password:test123 --run installworker.sh \
--run-command 'sudo systemctl enable docker' \
--run-command 'sudo systemctl disable firewalld' \
--firstboot-command 'sudo mount -t nfs 211.183.3.199:/instance /nfs' \
--firstboot-command '$(grep SWMTKN /nfs/manager-token.txt)'\
--selinux-relabel

위의 명령어로 worker1, worker2 이미지 파일을 만들어 놓자

 

virt-install --name worker1 --vcpus 1 --ram 2048 \
--network bridge:br0,model=virtio --disk /cloud/worker1.qcow2  \
--import --noautoconsole --os-variant rhel7
virt-install --name worker2 --vcpus 1 --ram 2048 \
--network bridge:br0,model=virtio --disk /cloud/worker2.qcow2  \
--import --noautoconsole --os-variant rhel7

kvm2 에서 위의 명령어로 가상머신을 만들어주자

 

그러면 자동으로 manager에 자동으로 worker1, worker2가 등록된다.

 

```

docker inspect manager

```

1:29

728x90