Development(Web, Server, Cloud)/22) LINUX - Cloud

Cloud18 - 인스턴스 생성 쉘 만들기

tonyhan18 2022. 1. 24. 13:39
728x90

shell -> system -> instance 생성하기

 

aws에서 인스턴스 생성하기

 

일요일은 한시간정도만 늦게자면 되고 운동꼭하고

 

for문은 IFS(Internal Field Seperator)에 의해서 결정된다.

1. 띄어쓰기 / 2. \t(tab키) / 3. \n(줄바꿈)

a:B:c -> 현재는 1개의 데이터 IFS를 조정하거나 :을 기존 IFS에 덧붙여 사용하면 별개의 데이터로 인식하게 된다.

 

for문 쓸때 명령어를 쓸려면

$()을 쓰면 됨

이제 한번 aws처럼 자동화 시켜보자

 

```

cp CentOSt.qcow2.xz CentOSt.qcow2.xz.bak

yum -y install guestfish

yum -y install libvirtd  # 안되어 있는 경우에만

systemctl restart libvirtd

```

 

위와같이 파일의 백업파일을 미리 만들어놓자.

 

guestfish를 설치하게되면 기본 이미지 안에 있는 내용을 변경할 수 있다. 우리가 원하는데로 수정이 가능해진다.

 

[실습]인스턴스 생성 스크립트 작성해 보기

```

virt-customize -a CentOSt.qcow2.xz --root-password password:test123

```

예전에는

1. 오픈소스를 이용하여 DC업무 자동화 구축

2. 기존의 레거시 DC(on-premise)->cloud로 마이그레이션

-> 예전 데이터 센터를 cloud로 전환하는 업무이다.

3. cloud에서 필요한 서비스 환경 개발

-> 1. aws와 같은 퍼블릭 환경 : 퍼블릭내에서 제공하는 서비스를 연결, 개발

-> 2. 사설 클라우드 환경 : 기본적인 서비스만 제공 -> 사설 클라우드 대부분 오픈소스화 되어 있으므로 개발자는 이에 대한 추가적인 서비스를 만들어 배포할 수 있다.

 

인스턴스(vm) 생성

1. iso파일을 이용한 설치 -> iso 이미지 파일 안을 풀어보면 OS가 설치 파일들이 있어서 일일히 사용자가 설정을 해주어야 하기에 클라우드 환경에는 적절하지 않다.

2. deployment(배포) -> 디스크에 OS가 이미 설치되어 있고 이걸 이미지처럼 만드는 것이다. 이걸 가지고 디스크에 갖다 붙여주면 디스크가 연결되고 디스크는 이미 설치되어 있다. 그래서 이걸 복붙해서 다른 디스크에 갖다주는 방법도 있다.

-> 물론 단점은 보안문제가 있는데 이걸 해결하기 위해 key-pair을 이용한다.

 

Serverless Framework: The Coca-Cola Case Study | Dashbird

 

Serverless Case Study - Coca-Cola

Be inspired by Coca-Cola's serverless framework. Learn how it uses AWS Lambda to make its vending machines more efficient >>

dashbird.io

 

위와같은 자판기는 CDN 서비스랑 연결되어 있다. CDN(Contents Delivery Network) 서비스는 내 서비스를 전세계에 설치된 aws의 서버들과 동기화해서 동일한 서비스를 복제한다. 그러면 북미에 있는 사람은 북미에 있는 CDN에 접속해서 콘텐츠를 쓰면된다. 그래서 빠르게 서비스를 제공할 수 있다. 이런건 퍼블릭 클라우드에 있는 서비스를 연결한거다.

 

 

---

 

그래서 위에서 virt-customize가 뭐냐 root 패스워드를 설정한 것이다.

그럼 이제 cpu, ram, NIC등을 제공해주기만 하면 된다. 자 이제 for문으로 가상화를 해보자

 

```

CentOSt.qcow2.xz

touch cinstance.sh ; chmod +x cinstance.sh

vi cinstance.sh

cat /proc/sys/net/ipv4/ip_forward  # 만약 이게 0이면 1로 바꾸어야 함

echo "1" > /proc/sys/net/ipv4/ip_forward

```

 

  1 #!/bin/bash
  2
  3 ## variables ##
  4 vmname=""       # name of instance
  5 vmcpu=""        # number of cpus
  6 vmram=""        # size of rams(MB)
  7
  8 echo
  9 echo -e "\t\t[인스턴스 생성 프로그램]"
 10 echo
 11 echo -en "\t인스턴스 이름 : "
 12 read vmname
 13 echo -en "\tCPU 개수선택 : "
 14 read vmcpu
 15 echo -en "\tRAM 사이즈(MB단위) : "
 16 read vmram
 17
 18 echo "In progress"
 19 cp /root/0124/CentOSt.qcow2 /root/0124/${vmname}.qcow2
 20
 21 while [ $! ]
 22 do
 23         sleep 1
 24 done
 25
 26 echo "인스턴스 생성을 시작합니다"
 27 virt-install --name ${vmname} --vcpus ${vmcpu} --ram ${vmram} --disk /root/01    24/${vmname}.qcow2 --import --network network:default --os-type linux --os-va    riant rhel7 --noautoconsole > /dev/null
 28
 29 echo "정상적으로 설치가 진행되었습니다"
 30 echo
 31 virsh list --all | grep ${vmname}

 

결과메시지를 /dev/null로 보낸다.

OS 버전 뭐로 하겠냐는 메세지를 해결하기 위해서 --os-type linux --os-variant rhel7으로 적어놓았다.

 

암튼 위와같이 말은 많지만 중요한건 virt-install 부분이다.

 

실행 결과 해결해야 문제점은 무엇보다 사용자 입력상의 문제점들이다.

 

```

virsh net-destory default
virsh net-start default
virsh list --all
virsh reboot <가상 머신>
virsh domifaddr <가상머신> -> 가상머신안에 모든 네트워크 볼 수 있음
cat /etc/resolv.conf

```

 

 

만약 인스턴스의 개수가 0과 같다면 프로그램을 종료해야한다. "프로그램이 종료되었습니다" : exit

그렇지 않고 만약 인스턴스수 = 1 -> 1개 생성

인스턴스수=2 이상이라면(동일작업을

CentOSt.qcow2 -> gildong-1.qcow2

CentOSt.qcow2 -> gildong-2.qcow2

인스턴스 이름 : gildong-1, gildong-2

 

#!/bin/bash

## variables ##
vmnum=""
vmname=""       # name of instance
vmcpu=""        # number of cpus
vmram=""        # size of rams(MB)

echo
echo -e "\t\t[인스턴스 생성 프로그램]"
echo -en "\t인스턴스의 개수 : "
read vmnum
echo -en "\t인스턴스 이름 : "
read vmname
echo -en "\tCPU 개수선택 : "
read vmcpu
echo -en "\tRAM 사이즈(MB단위) : "
read vmram

### Make image ###
echo "In progress"
if ((${vmnum} <= 0))
then
        echo -e "\t프로그램이 종료"
        exit 0
elif (($vmnum >= 2))
then
        for (( i=1 ; i<=${vmnum} ; i++))
        do
                cp /root/0124/CentOSt.qcow2 /root/0124/${vmname}-${i}.qcow2
                while [ $! ]
                do
                        sleep 1
                done
        done
elif (($vmnum == 1))
then
        cp /root/0124/CentOSt.qcow2 /root/0124/${vmname}.qcow2
        while [ $! ]
        do
                sleep 1
        done
fi

### Make Virtual Machine ###
echo "인스턴스 생성을 시작합니다"

if ((${vmnum} == 1))
then
        virt-install --name ${vmname} --vcpus ${vmcpu} --ram ${vmram} --disk /root/0124/${vmname}.qcow2 --import --network network:default --os-type linux --os-variant rhel7 --noautoconsole > /dev/null
else
        for (( i=1 ; i<=${vmnum} ; i++))
        do
                echo -e "\t${vmname}-${i} is generating"
                virt-install --name ${vmname}-${i} --vcpus ${vmcpu} --ram ${vmram} --disk /root/0124/${vmname}-${i}.qcow2 --import --network network:default --os-type linux --os-variant rhel7 --noautoconsole > /dev/null
                while [ $! ]
                do
                        sleep 1
                done
        done
fi


### Check Stauts ###
echo "정상적으로 설치가 진행되었습니다"
echo
virsh list --all | grep ${vmname}

대충 위와같이 짜주면 된다.

 

이제 vm을 만들때 authorized_keys를 미리 local driver에 만들어서 처리해주자

 

SDN/NFV를 쓰면 통신사들은 전체네트워크망을 하나의 대시보드에서 할 수 있게 된다.

 

 

---

 

네트워크

 

```

conf t

!

int e0/0

ip add 2.2.2.8 255.255.255.0

no shutdown

!

```

 

ctrl +z

 

자꾸만 duplex mismatch가 뜬다.

 

스위치에서

```

conf t

int range e0/0-3

int range e0/0-3, e1/0-3, e2/0-3, e2/0-3

```

해주면 포트에 대한 설정이 처리된다.

 

이제 Ping도 잘 보내주고 Duplex 에러도 안뜬다.

 

이제 브로드캐스트/멀티캐스트/유니캐스트를 알아보자

브로드캐스트는 그냥 전체에 보낸다.(255.255.255.255)

멀티캐스트는 네트워크 그룹안 장치들에 보낸다. (1.1.1.255)

유니캐스트는 한놈한테만 보낸다. (1.1.1.1)

 

멀티캐스트 => IGMP를 이용

 

R2, R3에

```

conf t

exit

int e0/0

ip igmp join-group 239.10.10.10

```

 

멀티캐스트는 위와같다.

 

SW2

```

conf t

!

int range e0/0-3 e1/0-3 e2/0-3 e2/0-3

```

 

R6가서

```

int e0/0

 

 

이론 중심 정리

 

만약 수동으로 DHCP

 

```

conf t

ip route <ip 주소> <서브넷 마스크> <인터페이스(ex. e0/0)> <타 네트워크로 가는 라우터>

do show ip route

```

그렇게 나온거의 C가

S가 경로이다.

 

```

do ping 2.2.2.7

```

하면 .이 아니라 UUUUU가 나온다. ICMP 가 보내준건데 1.1.1.1로 갈 수 있는 경로는 생긴상태이다.

 

R1에 가서

```

do show ip route

```

를 쳐보면 2.2.2.7로 갈 수 있는 경로가 없다. 그래서 중간에 패킷이 드랍된다.

 

destination is undetechable

내가 라우팅에 길을 안만들었다고 생각하면 된다.

 

다시 R으로 가자

ip route

 

 

-> 네트워크 층이 있어야 다른 곳으로 넘겨줄 수 있고 넘겨줄때 라우팅 테이블이 필요하다.

네트워크에서 패킷은 특정 정보를 보고 전달이 된다. 해당 정보가 없을 경우에는 drop (폐기)가 됨

 

이더넷은 2계층 셋팅을 안해도 사용이 간편하다는 특징이 있다.

2계층은 아무런 설정 없이 자동으로 되는 ethernet Protocol을 사용

3계층부터는 자동으로 되지 않고 관리자의 설정으 거쳐야 됨

 

그러니 나머지 것들은 이렇게 설정해놓자.

0.0.0.0 0.0.0.0 => 모든 ip주소(제로주소), Default Routing 주소 = 라우팅을 위해서 존재

=> 게이트웨이 IP주소가 설정이 되면 자동으로 입력이 됨

 

```

netstat -r   #라우팅 테이블 보기

ip route 0.0.0.0 0.0.0.0 e0/0 1.1.1.1

ip route 0.0.0.0 0.0.0.0 e0/0 2.2.2.5

```

 

ARP 프로토콜

-> 2계층 주소를 자동으로 알아내서 통신이 가능하다.

```

arp -a

```

를 윈도우 cmd 창에서 치면 지금까지 통신한 디바이스들의 MAC주소를 볼 수 있다.

 

이러한 기능들은 윈도우의 C:/Windows/system32에 저장되어 있다.

arp는 IP주소를 이용해서 2계층 주소를 알아낸다.

 

계층별 구분

- 1계층은 특정 프로세스가 없을 그냥 기계적, 물리적, 전기적 특성들 => 연결만 되면 모든 신호를 구분 없이 보냄

- 2계층은 특정 프로세스가 가동이 되면서 신호를 구분할 수 있음 => 2계층은 MAC주소(Ethernet에서 사용)를 통해 신호를 구분한다. MAC주소 기반 48bit 주소체계 => NIC을 만드는 업체에서 일괄적으로 부여(물리주소)

-> 2계층의 제어하는 대표 장비 => 스위치, 브릿지

-> 모르는 주소가 오면? 2계층 장비는 flooding을 해서 들어온 포트를 제외한 활성화된 모든 포트로 전달을 시킨다. => 허브랑 똑같은 역활(이는 곧 상위 계층 장비가 하위계층 장비 역활을 수행하는 것과 비슷하다)

- 3계층은 IP주소를 통해서 신호를 구분한다. ipv4 32bit 주소체계

- 4계층은 시스템 내부로 들어올 수 있는 통로 주소를 이용해 구분한다. 4계층 포트주소는 응용프로그램이 만든다. 그래서 4계층은 응용계층 프로그램이 통신 신호를 구분해서 받을 수 있도록 한 주소로 port주소라고 함 (0-65535 까지 사용 16bit 주소체계 응용프로그램설정시 설정이 가능)

- 7계층은 프로그램을 가지고 제어하는 것이다.

 

4계층은 전송계층으로 데이터가 전달된것처럼 보여서 전송계층이라고 부른다.

시스템 종단 간에 투명한 데이터 전송을 양방ㅎ샹으로 행하는 계층

 

5계층은 세션계층 : TCP/IP 계층

세션을 만들고, 유지하고, 끝내는 역활

 

6계층은 표현계층 : Presentation Layer

응용프로그램에서 사용하는 암호화, 압축등이 작동한다.

 

7계층은 응용계층 : 사용자에게 interface및 service를 제공

 

 

 

 

라우터에는 기능이 한가지 더 있다. L3 장비는 ff:ff:ff:ff:ff:ff L2계층의 브로드캐스트를 다른 네트워크로 넘기지 않고 차단하는 기능을 가지고 있음. 즉 브로드캐스트를 받았을떄 안넘기는 기능도 가지고 있다.

 

L3 주소와 L2주소는 서로 mapping이 되어 있어야지만 정상적인 통신이 가능함

unicast IP 주소인 경우 mapping을 하기 위해 arp 프로토콜을 사용

broadcast IP주소인 경우 ff:ff:ff:ff:ff:ff를 사용하도록 약속을 정함

multicast IP주소인 경우 01:00:5e:0(첫번째 bit만) 을 사용하면 멀티캐스트이다.

 

 

L7 장비들은 그냥 스펙이 컴퓨터급이다. 그러다보니 그냥 보안용으로 쓴다.

 

TCP/IP 4계층은 통신규약(프로토콜)의 모음이다. 이 통신규약을 모아둔 것을 슈트(Suite), 프로토콜의 모음으로 Protocol Suite라고 부름

interface : 접속장치

 

각 계층의 중복된 작업들이 있다. 그래서 다른 계층에서도 하위 계층 일을 수행할 수 있다.

 

이 그림은 반드시 기억해야한다.

 

SMTP(Simple Mail Transfer Protocol) : 25번 포트
HTTP : 80번 포트
POP3 : 110 포트

 

프로토콜 슈트를 적은건데... 오류가 좀 많다.

 

기본적으로 장비들은 자신의 주소가 확인이 되면 해당 헤더는 제거를 하고 처리를 하기 시작한다. 예를들어 L2계층 주소가 확인이 되면 L3 주소를 가지고 처리를 한다. L3 주소가 확인이 되면 L4나 L3의 ICMP, IGMP와 같은 프로세스가 처리를 한다.

 

그리고 자신의 주소가 아니면 해당 패킷을 drop하도록 만듬. L2장비는 자신의 주소가 아닌 주소가 입력이 되면 안으로 들어와 MAC Address table을 확인 후 모르는건 전체에 뿌려서 처리. 브로드캐스트는 일단 받아본다.

=> switch port라고 부름

 

L3 장비는 L2 주소가 자신이어야 장비 안으로 입력이 됨. 만약 L3 주소가 자신의 것이 아니면 넘김 그리고 Routing Table을 확인 후 forwarding 시키도록 설계가 되어 있음 만약 해당 table에 없다면 drop.

=> routed port

 

---

 

L2 장비를 쓰는 법을 이제 배워보자

 

728x90