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
'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 |