[클라우드 With리눅스/인스턴스 생성 및 DB연결하기]

SooYeon Yeon·2022년 8월 17일

실습

인스턴스를 생성하고, 생성된 인스턴스의 정보를 DB로 전송하기

클라우드 또는 가상화 환경에서 사용하는 인스턴스는 일반 VM과는 달리 이미지 OS가 설치되어 있는 형태를 이미지화 한 것이다.

클라우드 환경은 on Demand여야 한다.

데이터베이스와 같은 경우 사용자가 직접 운영체제를 설치하고, 서비스 애플리케이션을 설치하는 과정이 생략된 상태에서 주문 즉시 해당 서비스를 이용할 수 있어야 한다. → 완전 관리형 서비스 → 대신 사용자는 OS나 애플리케이션 자체에 대한 접근 권한은 없다.

클라우드에서 제공하는 serverless 서비스

  • 파이썬 등과 같은 언어를 이용하여 일종의 트리거(함수)를 만들어 두는 것 트리거는 인풋값이 들어오면 자동으로 특정 서비스를 호출.
  • 서버를 내내 돌리지 않고 약 15분 이내정도면 서버리스를 통해 건 당으로 비용을 지불
  • 실제로는 서버가 있지만 해당 서버 자체에 대한 접근은 불가하며 언어를 이용하여 서비스를 호출하는 방법

VM은 OS 설치에서부터 패키지 설치까지 직접 모든 것을 수동으로 설치 해야하지만, 클라우드 용 이미지를 이용한 인스턴스는 배포하는 형식이다.

리눅스

# 압축 풀기
xz -d [파일제목] 

# 확인, 결과로 나온 이것이 하나의 볼륨이라고 생각
ls

# 파일이름이 길기 때문에 이름 바꾸기
mv [파일이름] [새로바꿀이름]

# 이미지 준비 완료되었다.

가상화 환경을 만들기 위한 설정

  1. Hypervisor 설치하기

    yum update -y
    yum -y install @virt # 가상화 관련 도구들을 패키지로 묶어 설치해줌
    yum -y install libguestfs-tools # 클라우드용 이미지를 커스터마이징 할 수 있는 도구

    한번에 설치하려면앞에거 되면 뒤에 실행될 수 있도록 &&을 이용

    yum update -y && yum -y install @virt && yum -y install libguestfs-tools
  2. Hypervisor 실행을 위한 설정

    # 지정한 문자열이 있다면 이 문자열로 바꿔라
    setenforce 0 # 당장 멈추기
    set -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    cat /etc/selinux/config

    리눅스에서의 보안

    1. 방화벽에서 처리
      • 서버에서 ping , 다른 서버로 갈 때
      • 바깥쪽에서 나한테 와서 terminate되는 것
      • 나를 거쳐 다른 쪽으로 빠져나가는 것 (가로지르는 것)
    2. selinux
      • 리눅스 안에서의 보안
      • 허용하지 않은 디렉토리 접근 막기

    위에서는 selinux를 disabled해서 변경할 수 있게 함. 내가 원하는 클라우드(다른 디렉토리)에서 하려고 함

  3. 서버 가상화 서비스 실행

    gedit /etc/libvirt/qemu.conf
    • 519번째 user=”root”, 523번째 group = “root” 주석을 지움 → 가상머신 root의 권한으로만 사용할 수 있도록 하게 함 → SAVE
    # 실행
    systemctl enable libvirtd && systemctl start libvirtd
    # 가상머신 manage 도구 설치
    yum -y install virt-manager

    리눅스 바탕화면 ALL에서 manager 앱 실행

  4. 클라우드 이미지의 내용을 요구사항에 맞게 변경시키기

    <요구사항>

    1. 기존 CentOS 이미지를 복사하여 gildong.qcow2를 생성
    2. 해당 이미지에는 루트 패스워드가 없다, 우리는 root / test123으로 지정하자
    3. 기본적으로 웹서비스를 제공할 수 있어야 한다. httpd를 이용한다. (httpd 설치 → OS 부팅 시 자동으로 실행되도록 되어야 한다.)
    4. 3에서 만든 이미지를 이용하여 인스턴스 배포하기
    # 1. 복사하기. CentOS.qcow2는 원본, gildong.qcow2는 복사본 
    cp CentOS.qcow2 gildong.qcow2 

```bash
# 2,3 이미지에 웹서버 설치. 부팅되면 자동으로 웹서버 실행하도록 함
virt-customize -a gildong.qcowvirt-customize -a gildong.qcow2 --root-password password:test123 --install httpd --run-command 'systemctl enable httpd' --selinux-relabel2 --root-password password:test123 -- install httpd --run-command 'systemctl enable httpd' --selinux-relabel
```

```bash
# gildong을 복사해 하나 더 만들기
cp gildong.qcow2 chulsoo.qcow2
```

```bash
# 4. 인스턴스 만들기
# 네트워크는 일단 default, 나머지 설정
virt-install --name gildong --vcpus 1 --ram 1024 --disk /cloud/gildong.qcow2 --os-type linux --os-variant rhel7.0 --import --noautoconsole > /dev/null

# 동작중인 가상머신 (인스턴스)를 확인
virsh list --all

```

더블클릭 후 root, test123으로 정상적으로 로그인

- ifconfig로 IP 확인
- ping으로 인터넷 확인
- systemctl status httpd로 httpd가 동작중인 지 확인
- 클라우드는 ACL, 보안그룹으로 관리하기때문에 방화벽이 현재 설정 안되어있음
- systemctl stop firewalld

원래의 리눅스로 돌아가서

```bash
# gildong 정보 확인 가능
virsh domifaddr gildong

# IP만 뽑아내기
virsh domifaddr gildong | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}'

# 변수 적용해서 name="gildong" 넣어서 실행도 가능
name="gildong"
virsh domifaddr $name
```

인스턴스를 다량 생산해야한다.

스크립트 작성

```bash
[root@dblab cloud]# touch instance.sh
[root@dblab cloud]# chmod +x instance.sh
[root@dblab cloud]# gedit instance.sh
```

```bash
#!/bin/bash

name=''
vcpu=''
ram=''

clear
echo -e "\t\tINSTANCE CREATION PROGRAM"
echo
echo -en "\tINSTANCE NAME : "
read name
echo -en "\tHOW MANY CPUs DO YOU WANT : "
read vcpu
echo -en "\tMEMORY SIZE : "
read ram

echo $name
echo $vcpu
echo $ram
```

```bash
./instance.sh
```

사용자가 값 입력

chulsoo를 템플릿으로 쓸 것임. 다시 instance.sh를 수정. 변수를 이용해 받아 인스턴스 생성

```bash
#!/bin/bash

# 변수 선언
name='' 
vcpu=''
ram=''

clear # 화면 지우기
echo -e "\t\tINSTANCE CREATION PROGRAM" # 화면에 출력
echo
echo -en "\tINSTANCE NAME : " # 사용자에게 인스턴스 이름 입력받기 위한 문장 띄우기
read name # 사용자가 입력한 값을 변수 name에 저장
echo -en "\tHOW MANY CPUs DO YOU WANT : "
read vcpu
echo -en "\tMEMORY SIZE : "
read ram

# chulsoo.qcow2는 템플릿용 기본이미지
cp chulsoo.qcow2 ${name}.qcow2 # 설치를 위한 디스크를 변수에 담긴 이름으로 복사하여 준비

# 변수에 담긴 값을 이용하여 인스턴스 설치. 발생되는 메시지는 null에 버린다(설치메시지출력X)
virt-install --name $name --vcpus $vcpu --ram $ram --disk /cloud/${name}.qcow2  --os-type linux --os-variant rhel7.0 --import --noautoconsole > /dev/null

# 화면을 15초동안 중지시킨다.
sleep 15

# 화면에 결과 내용 출력하기
echo -e "\t\tFINISHED"
result=$(virsh list --all | grep ${name})
echo -e "\t$result"
```

gildong, kimgildong 이런식으로 있을 때 딱 gildong만 뽑아내기 위해 정규표현식 ^$name$ 이런식으로 사용 ( ^는 시작, $는 끝)

다시 실행

```bash
./instance.sh
```

IP 보기

DB로 접속해 데이터 읽기

```bash

```

DB로 접속해 데이터 전달

```bash
id=user1
name=gildong
year=1996
addr=NY

mysql sqlDB -u root -p1234 -e "INSERT INTO userTbl VALUES ('$id','$name',$year,'$addr',NULL,NULL,NULL,NULL)"
echo $? # 잘 수행되었는 지 확인, 0이면 정상수행

# 정상적으로 값이 들어갔는 지 확인
mysql sqlDB -u root -p1234 -e "SELECT * FROM userTbl"
```

[실습 시나리오]

CloudDB

물리서버에서 확인할 수 있는 정보(hostTbl)

(열이름)

- (hostname)
    - hostname 명령을 통해서 서버의 이름 확인 가능
    - PK로 지정
    - ex) dblab
    - VARCHAR(20)
- (hostip)
    - ifconfig .. 일부 정보 필터링을 통해 IP주소 확인 가능
    - NOT NULL
    - CHAR(15)

인스턴스에서 확인할 수 있는 정보(instanceTbl)

- (iname)
    - 인스턴스의 이름
    - $name
    - PK로 지정 (실제로는 자동부여된 id가 PK인 것이 좋음)
    - VARCHAR(20)
- (hostname)
    - 호스트서버 이름
    - dblab (위 호스트네임 강제로)
    - FK로 지정
    - VARCHAR(20)
    - 리눅스에서 $HOSTNAME 또는 host=$(hostname)
- (iip)
    - 인스턴스 IP 주소
        - $ipinfo
        - CHAR(15)
    
    ```bash
    ipinfo=$(virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/'{print $1}')
    ```
    
- (ram)
    - 인스턴스의 메모리 사이즈
    - $ram
    - INT

hostTbl에 값 한 개 넣고 실습 시작

스크립트 밑에 DB 연결하는 코드 작성

```bash
#!/bin/bash

name=''
vcpu=''
ram=''

clear
echo -e "\t\tINSTANCE CREATION PROGRAM"
echo
echo -en "\tINSTANCE NAME : "
read name
echo -en "\tHOW MANY CPUs DO YOU WANT : "
read vcpu
echo -en "\tMEMORY SIZE : "
read ram

cp chulsoo.qcow2 ${name}.qcow2
virt-install --name $name --vcpus $vcpu --ram $ram --disk /cloud/${name}.qcow2  --os-type linux --os-variant rhel7.0 --import --noautoconsole > /dev/null

sleep 15

echo -e "\t\tFINISHED"
result=$(virsh list --all | grep ${name})
echo -e "\t$result"

# to Database
sleep 60
iip=$(virsh domifaddr $name | grep ipv4 | gawk '{print $4}' | gawk -F/ '{print $1}')

mysql CloudDB -u root -p1234 -e "INSERT INTO instanceTbl VALUES ('$name','$HOSTNAME','$iip',$ram)"

mysql CloudDB -u root -p1234 -e "SELECT * FROM instanceTbl WHERE iname = '$name'"
```

여기서는 sleep 60으로 했지만, 나중에는 계속 확인해서 되면 실행되도록 함

```bash
./instance.sh # 실행해서 작성해보기
```

0개의 댓글