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

클라우드 54일차

by tonyhan18 2022. 3. 22.
728x90

virsh autostart <인스턴스 명> => 특정 인스턴스가 재부팅시 알아서 실행이 된다.

 

어떻게 하면 우리의 키를 다른 인스턴스에게 줄 수 있을까?

 

1. 파일을 열어 직접 넣어주기

 

2. ssh-copy-id -i gildong.pem.pub root@목적지주소

 

3. 인스턴스 생성시 public 키를 강제로 넣어서 생성해 준다.

 

접속하기

클라이언트에서 서버에 접속하기 위해서는?

클라이언트에서 서버에 접속을 하기 위해서는 접속한 서버의 캐시 정보를 자신의 /root/.ssh/known_hosts에 저장한다. 만약 저장되어 있지 않다면 접속시 저장할 것인지를 물어보는 메시지가 띄어진다. yes/no나옴

여러 서버가 있는 경우라면 yes를 여러번 입력한 뒤, 접속을 원하는 서버의 정보를 known_hosts에 먼저 등록해야 하지만 너무 많은 소요 시간이 필요할 것이다. 이 경우 나의 known_hosts에 등록되어 있지 않은 서버에 접속할 때 해당 내용 확인하지 말고 개인키와 공개키의 조합여부만 확인하여 접속이 되도록 하고 싶다면 "StrictHostKeyChecking"을  no로 변경해야 한다.

 

/etc/ssh/ssh_config가장 아래에

StrictHostKeyChecking no 로 빠구어쭌따.

 

이렇게 되면 위와같이 pem키만으로 데이터를 받아올 수 있는 것을 확인할 수 있다.

 

그런데 이렇게 하다보면 나중에 명령어가 너무 길어져서 이중에서도 ssh부터 ip 부분까지는 환경변수로 미리 등록해놓자

 

 

```

$comm docker service create -d -p 80:80 --name web --replicas 4 --with-registry-auth nginx

```

 

아래와같이 진행해주세요

```
$comm docker node update --label-add company=a worker1
$comm docker node update --label-add company=a worker3

$comm docker service create -d -p 8001:80 --name web --mode global --constraint 'node.labels.company==a' httpd

```

 

이제 DB에 인스턴스들을 등록해보자.

 

```

# IP 가 나온다.

$comm docker node inspect manager --format {{.Status.Addr}}

# 인스턴스의 id 정보가 나온다.

$comm docker node ls -q

# 인스턴스의 ip 주소가 나온다.

$comm docker node inspect <instance_id> --format {{.Status.Addr}}

```

 

이걸 이용해서

 

DB에 데이터 전송시에는

name

ip

role

managertoken

workertoken

 

#!/bin/bash

# var
## docker swarm
name=""
conn=""
ip=""
role=""
managertoken=""
workertoken=""
statement=""

# func
conn="ssh -i ~/.ssh/gildong.pem root@211.183.3.128";
managertoken=$($conn docker swarm join-token manager | grep SWMTKN);
workertoekn=$($conn docker swarm join-token worker | grep SWMTKN);
echo $managertoken
	echo $workertoekn
for index in $($conn docker node ls -q)
do
	name=$($conn docker node inspect $index --format {{.Description.Hostname}});
	ip=$($conn docker node inspect $index --format {{.Status.Addr}});
	role=$($conn docker node inspect $index --format {{.Spec.Role}});
	statement=$($conn docker node inspect $index --format {{.Status.State}});

	mysql clouddb -u root -p'TEst!234' -e "INSERT INTO instance values('$name','$ip','$role','$managertoken','$workertoekn')"
done

위와같이 짜서 DB에 데이터를 저장했다.

 

 

 

[root@storage ~]# cat db.sh
#!/bin/bash

###################### 변수선언
command="ssh root@211.183.3.171 -i /root/.ssh/beomtaek.pem"
name=''
ip=''
role=''
managerkey=''
workerkey=''
statement=''
###################### 메인코드

for node in $($command docker node ls -q)
do
        ip=$($command docker node inspect $node --format {{.Status.Addr}})
        name=$(ssh root@$ip -i /root/.ssh/beomtaek.pem hostname)
        role=$($command docker node inspect $node --format {{.Spec.Role}})

        if [[ $role == manager ]]
        then
                managerkey=$($command docker swarm join-token manager | grep SWMTKN)
                workerkey=$($command docker swarm join-token worker | grep SWMTKN)
                statement="INSERT INTO instance VALUES ('$name', '$ip', '$role', '$managerkey', '$workerkey')"
                mysql clouddb -u root -p'TEst!234' << EOF
$statement
EOF
        else
                managerkey=""
                workerkey=""
                statement="INSERT INTO instance (name, ip, role) VALUES ('$name', '$ip', '$role')"
                mysql clouddb -u root -p'TEst!234' << EOF
$statement
EOF
        fi
done

        if [ $? -eq 0 ]
        then
                mysql clouddb -u root -p'TEst!234' -e 'select * from instance'
        else
                echo "Problem adding data"
        fi

[root@storage ~]#

이건 강사님의 생각이다. 가장 크게는 manager과 worker을 구분하지 않았던것이 문제될것으로 보인다.

 

그리고 mysql 구문도 변수로 넣어 사용할 수도 있었는데 내가 그 부분을 신경쓰지 못했던거 같다.

 

Quiz. 기존 instance 뒤에 열 이름으로 cpu를 추가한다. 이 CPU는 각 노드에서 5초동안  CPU를 5번 체크하고 (1초에 1번씩 5번) 이들의 평균값을 저장한다. 데이터는 실수이며 소수점 이하 2자리까지 표기

 

```

yum install -y sysstat

mpstat

```

하면 위와같이 현재 자원의 정보를 확인할 수 있다.

```

mpstat | tail -1 | gawk '{print 100-$13}'

```

위와같이 작성하면 현재 사용하는 자원을 확인할 수 있다.

 

이를 활용하여 CPU 값을 sleep 1을 주고 5초동안 확인하고 각각의 값을 배열에 넣는다. 배열내의 값을 더한다. 그리고 5로 나눈다. 실수(소수점)를 ????

 

```

sar 2 3

```

2초마다 한번씩 총 3번 확인해서 계산하라는 의미이다.

구지 이걸 만들고 있을 필요가 없었던 것이었다.

 

```

sar -u 1 3 | tail -1 | gawk '{print 100 - $8}'

```

위와같이 나오는데 이게 과연 진짜로 다른 컴퓨터에서도 실행이 될지 해보자.

 

---

테스트를 위한 준비를 해보자

1) 아래의 명령을 이용하여 manager에 sysstat 설치(mgmtdb)

ssh -i /root/.ssh/gildong.pem root@211.183.3.128 yum install -y sysstat

 

2) 웹서버 성능 측정 도구 설치하기(storage)

apache benchmark (httpd-tools)

[root@storage ~]# yum -y install httpd-tools
[root@storage ~]# ab -c 300 -n 600 -t 60 http://211.183.3.128/

300명의 사용자 600페이지를 60초동안본다고 가정하고 트래픽을 던지는 것이다.

------ 위에서 성능 측정을 위한 트래픽을 발생 시킨 뒤 아래와 같이 mgmtdb 에서 CPU 사용량을 확인한다 ---
[root@mgmtdb ~]# ssh -i /root/.ssh/gildong.pem root@211.183.3.128 sar -u 1 3 | tail -1 | gawk '{ print 100 - $8 }'
12.71

 

이부분 잘안됨

 

--- 위에서 성능 측정을 위한 트래픽을 발생 시킨 뒤 아래와 같이 mgmtdb에서 CPU 사용량을 확인해보자

 

단, 우리는 모든 노드(worker 1~3 포함)에서 CPU를 측정해 보고 싶다.

모든 노드에 sysstat을 설치하고 테스트 해야 한다.

현재는 워커에 public 키가 없으므로 원격에서 관리가 어렵다. 아래와 같은 방법으로 public 키를 각 노드(매니저 제외)에 붙여넣기 해 주어야 한다.

 

1) mgmtdb 에서 gildong.pem.pub 파일을 열고 내용을 복사한 뒤, 워커에 직접 들어가서 .ssh를 만들고 그 아래에 authorized_keys를 생성한 뒤 복사한 키를 붙여넣기 한다.

2) ssh-copy-id -i /root/.ssh/gildong.pem.pub root@211.183.3.129 -> yes/no 물어보면 yes

 

step1. 시작전에 cpu 사용량을 위한 칼럼을 추가해놓자.

step2. CPU만을 업데이트 하기 위한 cpu.sh를 작성하여 실행한다.

 

시작하기전에 반드시 kvm1, kvm2 기기에 gildon

 

#!/bin/bash

###################### 변수선언
command="ssh root@211.183.3.128 -i /root/.ssh/gildong.pem"
name=''
ip=''
role=''
managerkey=''
workerkey=''
statement=''
cpustat=''
###################### 메인코드

for node in $($command docker node ls -q)
do
        ip=$($command docker node inspect $node --format {{.Status.Addr}})
        name=$(ssh root@$ip -i /root/.ssh/gildong.pem hostname)
        role=$($command docker node inspect $node --format {{.Spec.Role}})
				cpustat=$($command sar -u 1 3 | tail -1 | gawk '{ print 100 - $8 }')

        if [[ $role == manager ]]
        then
                managerkey=$($command docker swarm join-token manager | grep SWMTKN)
                workerkey=$($command docker swarm join-token worker | grep SWMTKN)
                statement="INSERT INTO instance VALUES ('$name', '$ip', '$role', '$managerkey', '$workerkey', '$cpustat')"
                mysql clouddb -u root -p'TEst!234' << EOF
$statement
EOF
        else
                managerkey=""
                workerkey=""
                statement="INSERT INTO instance (name, ip, role, cpu) VALUES ('$name', '$ip', '$role','$cpustat')"
                mysql clouddb -u root -p'TEst!234' << EOF
$statement
EOF
        fi
done

        if [ $? -eq 0 ]
        then
                mysql clouddb -u root -p'TEst!234' -e 'select * from instance'
        else
                echo "Problem adding data"
        fi

[root@storage ~]#

---

[root@mgmtdb ~]# cat cpu.sh
#!/bin/bash
manager="ssh root@211.183.3.128 -i /root/.ssh/gildong.pem"

for node in $($manager docker node ls -q)
do
        name=$($manager docker node inspect $node --format {{.Description.Hostname}})
        ip=$($manager docker node inspect $node --format {{.Status.Addr}})
        cpu=$(ssh -i /root/.ssh/gildong.pem root@${ip} sar -u 1 5 | tail -1 | gawk '{print 100-$8}')
        updatecpu="UPDATE clouddb.instance SET cpu = '${cpu}' WHERE ( name = '$name' )"
        mysql clouddb -u root -p'TEst!234' << EOF
$updatecpu
EOF
done

        if [[ $? == 0 ]]
        then
                mysql clouddb -u root -p'TEst!234' -e 'select * from instance order by cpu'
        else
                echo "ERROR OCCURRED"
        fi
[root@mgmtdb ~]#

 

[ 사설 저장소 구축(on storage)하고 insecure 모드로 이미지 올리기 ]

1. 아래와 같이 registry와 registry web-ui를 설치

docker run -d -p 5000:5000 --restart always --name registry registry

docker run -d -p 8080:8080 --name registry-web --restart always --link registry -e REGISTRY_URL=http://registry:5000/v2 -e REGISTRY_NAME=localhost:5000 hyper/docker-registry-web

 

2. 로컬에서 업로드용 이미지 만들고 push 하기

docker tag nginx:latest 211.183.3.199:5000/mynginx:blue

docker push

 

728x90

'Development(Web, Server, Cloud) > 22) LINUX - Cloud' 카테고리의 다른 글

클라우드 55일차  (0) 2022.03.24
클라우드 54일차 - 오픈스택 보강  (0) 2022.03.22
클라우드 53일차  (0) 2022.03.21
클라우드 52일차  (0) 2022.03.18
클라우드 51일차  (0) 2022.03.17