KT AIVLE School 3기/AIVLER 활동

[AIVLE_AI] 가상화 클라우드 실습

순제로 2023. 5. 8. 20:42
728x90
 

[AIVLE_AI] 가상화 클라우드 1일차

Hello, SOOON_ZERO! [AIVLE_AI] 가상화 클라우드 1일차 본문

sooonzero.tistory.com

 

[AIVLE_AI] 가상화 클라우드 2일차

Hello, SOOON_ZERO! [AIVLE_AI] 가상화 클라우드 2일차 본문

sooonzero.tistory.com

 

 

[AIVLE_AI] 가상화 클라우드 3일차

Hello, SOOON_ZERO! [AIVLE_AI] 가상화 클라우드 3일차 본문

sooonzero.tistory.com


가상화 클라우드 3일차에서 했던 정리 내용

 

 

 


실습 환경

- AWS의 CLOUD9

 

Cloud IDE - AWS Cloud9 - AWS

AWS Cloud9은 브라우저만으로 코드를 작성, 실행 및 디버깅할 수 있는 클라우드 기반 IDE(통합 개발 환경)입니다. 코드 편집기, 디버거 및 터미널이 포함되어 있습니다. Cloud9은 JavaScript, Python, PHP를

aws.amazon.com

 

사용 언어

- 리눅스 명령어

 

현재 사용중인 쿠버네티스에서 사용 가능한 컨트롤러 목록 조회

kubectl api-resources

ls

폴더 내부에 조회

 

yaml 파일 편집: vi 편집기 사용

vi pod.yaml


POD

1. Pod 조회

kubectl get pods

kubectl get pod

kubectl get po

-> 3중 택1 방법 활용, 모두 다 같은 결과를 가져옴

 

2. yaml 확인

cat pod.yaml

 

3. yaml 을 활용한 Pod 생성

kubectl create -f pod.yaml

-> 2번에서 조회한 metadata의 name lab2-pod가 생성됨을 알 수 있다.

 

4. Pod 조회 및 세부정보 확인

kubectl get po (세부정보)

kubectl describe po (상세정보)

-> READY

실제 생성되어 실행되는 컨테이너 개수/스펙에 넣은 컨테이너 개수

->로그도 확인가능

 

+)kube-system pod 조회

쿠버네티스를 배포하면 기본적으로 만들어지는 아키텍처를 구성하는 pod들을 확인할 수 있다.

 

5. Pod 삭제

kubectl delete po kubectl delete po --all

->all은 모든 pod 삭제, 사진처럼 pod를 지정해서 삭제도 가능하다.

 

6. Pod 조회

kubectl get pod

 

7. run 명령을 사용한 pod 생성

kubectl run lab2-pod --image=nginx --port=80

조건: pod name : lab2-pod container image : nginx container port : 80

 

8. 7과정 에서 생성한 pod 조회

kubectl get po kubectl describe po

 

9. 7에서 생성한 pod 삭제

kubectl delete pod lab2-pod kubectl delete pod --all

 


Namespace

1. Namespace 확인

kubectl get namespace kubectl get ns

kubectl get namespace kubectl get namespaces

 

2. yaml 확인

cat ns.yaml

 

3. yaml 을 활용한 namespace 생성

kubectl create -f ns.yaml

 

4. Namespace 재확인

kubectl get ns

 

5. lab3-ns namespace 안에 pod 생성

kubectl create -f pod.yaml -n lab3-ns

-n lab3 -ns가 없다면 default 공간에 생성, -n lab3 -ns을 써줌으로써 생성되는 타켓 설정

 

6. pod 확인

kubectl get po kubectl get po -n lab3-ns

 

7. pod2.yaml 확인

cat pod2.yaml

 

 

8. pod2.yaml 생성

kubectl create -f pod2.yaml

 

 

9. 5에서 생성한 Pod 삭제

kubectl delete pod lab3-pod -n lab3-ns

 

 

10. pod 재확인

kubectl get pod -n lab3-ns

 

 

11. 3에서 생성한 Namespace 삭제

kubectl delete ns lab3-ns

-> Namespace 안에있는 리소스도 같이 삭제되기 때문에 상대적으로 시간이 걸림

 

12. create, run 명령으로 namespace 와 pod 생성

-namespace 조건

namespace name : lab3-ns2

-pod 조건

pod name : lab3-pod3

namespace : lab3-ns2

container image : nginx

container port : 80

 

kubectl create ns lab3-ns2

kubectl run lab3-pod3 --image=nginx --port=80 -n lab3-ns2

-와 - -의 차이점: -는 약어, --는 이미지를 표시하기위한 풀네임

 

13. 10에서 생성한 namespace와 pod 조회

kubectl get ns kubectl get pod -n lab3-ns2

 

14. namespace 삭제로 해당 namespace에 있던 리소스 모두와 함께 삭제

kubectl delete ns lab3-ns2

 

15. 삭제 확인

kubectl get ns

 


Replicaset

1. Replicaset 확인

kubectl get replicaset kubectl get rs

-> replicasets의 약어는 rs 이기 때문에 둘 다 사용 가능

 

2. yaml 확인

cat rs.yaml

-> api버전 apps.v1

 

*) kubectl api-resources | grep rs

명령어를 통해서 아래와 같이 확인할 수도 있다.

 

3. yaml 을 활용한 replicaset 생성

kubectl create -f rs.yaml

 

4. replicaset, pod 확인

kubectl get rs kubectl get rs

kubectl get rs kubectl get pod

->이름 / 2개 설계 / 2개 생성 / 2개 사용가능

 

5. pod 1개 삭제

kubectl delete pod

 

6. pod 재배포 확인

kubectl get pod

 

*)pod를 다 지워도 다시 새로운 pod가 생성되는것을 볼 수 있다.

 

7. replicaset 삭제

kubectl delete rs --all

-> replicaset을 삭제했더니 pod가 삭제된것 확인 가능.

 

8. replicaset 삭제 확인

kubectl get rs kubectl get rs


Deployment

1. Deployment 확인

kubectl get deployment kubectl get deploy

->deploy도 가능

 

2. yaml 확인

cat deploy.yaml

 

 

3. yaml 을 활용한 Deployment 생성

kubectl create -f deploy.yaml

 

4. deployment, replicaset, pod 확인

kubectl get deploy

kubectl get rs

kubectl get pod

-> READY에 표시되는 개수는 pod의 개수

 

 

5. pod 1개 삭제

kubectl delete pod

 

 

 

6. pod 재배포 확인

kubectl get po

 

 

 

7. Deployment 삭제

kubectl delete deploy --all

 

 

 

8. Deployment 삭제 확인

kubectl get deploy kubectl get pod

 

 

 

9. 터미널을 하나 더 오픈하여 모니터링용 터미널을 생성합니다.

watch -n 0.5 kubectl get pod

 

10. create 명령으로 deployment 생성

-deployment 조건

deployment name : lab5-deploy2 container image : nginx:1.14.0 container port : 80 replicas : 3 kubectl create deploy lab5-deploy2 --image=nginx:1.14.0 --port=80 --replicas=3

 

11. 컨테이너 이미지 1.15.0으로 버전 업데이트

kubectl set image deployment/lab5-deploy2 nginx=nginx:1.15.0 --record=true

이때 명령어 수행 직후 모니터링 터미널로 동작 확인 record=true 값으로 해야 히스토리 확인시 어떤 내용인지 확인 가능

 

12. 업데이트 내역 확인

kubectl describe pod kubectl describe deploy

 

13. 업데이트 방식 변경

kubectl edit deploy lab5-deploy2 strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate 를 strategy: type: Recreate 로 수정합니다. vi 편집기 사용법과 동일합니다.

 

14. 컨테이너 이미지 1.16.0 으로 버전 업데이트

kubectl set image deployment/lab5-deploy2 nginx=nginx:1.16.0 --record=true 이때 명령어 수행 직후 모니터링 터미널로 동작 확인

 

15. 업데이트 내역 확인

kubectl describe pod kubectl describe deploy 16. 롤 아웃 기록 확인 kubectl rollout history deploy/lab5-deploy2

 

17. 직전 버전으로 롤백

kubectl rollout undo deploy/lab5-deploy2

 

18. 버전 확인

kubectl describe deploy

 

19. 리비전 지정하여 롤백

kubectl rollout undo deploy/lab5-deploy2 --to-revision=1

 

20. 버전 확인

kubectl describe deploy

 

21. 스케일링

kubectl scale deploy/lab5-deploy2 --replicas=5

 

22. 결과 확인

kubectl get pod kubectl describe deploy

 

23. deployment 삭제

kubectl delete deploy --all

 


ClusterIP Service

1. Service 조회

kubectl get service kubectl get svc

 

2. yaml 확인

cat pod.yaml cat svc-clusterip.yaml

 

3. yaml 을 활용한 ClusterIP 유형의 Service및 pod 생성

kubectl create -f svc-clusterip.yaml kubectl create -f pod.yaml

 

4. 위 3에서 만든 리소스 확인

kubectl get pod kubectl get svc

 

5. curl 명령을 통한 통신 확인

curl :9090 4에서 확인한 IP를 입력합니다.

 

6. 리소스 삭제

kubectl delete pod,svc --all

 


NodePort Service

1. yaml 확인

cat pod.yaml cat svc-nodeport.yaml

 

2. yaml 을 활용한 NodePort 유형의 Service및 pod 생성

kubectl create -f svc-nodeport.yaml kubectl create -f pod.yaml

 

3. 생성된 Service 확인

kubectl get svc

 

4. Worker1 로의 접근을 통해 통신 확인

curl <Worker1 노드의 IP>:30000

 

5. Worker2 로의 접근을 통해 통신 확인

curl <Worker2 노드의 IP>:30000

 

6. 리소스 삭제

kubectl delete pod,svc --all

 

 


Loadbalancer Service

1. yaml 확인

cat pod.yaml cat svc-loadbalancer.yaml

 

2. yaml 을 활용한 Loadbalancer 유형의 Service및 pod 생성

kubectl create -f svc-loadbalancer.yaml kubectl create -f pod.yaml

 

3. 생성한 Service 확인

kubectl get svc

ExternalIP 를 발급받지 못하는 Pending 상태 확인

 

4. Loadbalancer 타입의 서비스가 생성한 ClusterIP 를 활용하여 내부에서 접근 시도

curl <Loadbalancer 타입의 서비스의 ClusterIP>:9090

 

5. Loadbalancer 타입의 서비스가 생성한 NodePort 를 활용하여 외부에서 접근 시도

curl <아무 Worker IP>:<Loadbalancer 타입의 서비스의 NodePort>

 

 


EmptyDir Volume

1. yaml 확인

cat pod.yaml

 

2. yaml 을 활용한 emptydir 유형의 Volume을 사용하는 Pod 생성

kubectl create -f pod.yaml

 

3. 위 2에서 만든 Pod 내부의 컨테이너 redis로 접속합니다.

kubectl exec -it emptydir-pod --container redis -- /bin/bash

 

4. 마운트 된 디렉토리로 이동 후 파일생성

cd /mount1 echo hello emptydir >> test.txt cat test.txt exit

 

5. 위 2에서 만든 Pod 내부의 컨테이너 nginx로 접속합니다.

kubectl exec -it emptydir-pod --container nginx -- /bin/bash

 

6. 디렉토리 이동 후 4에서 생성한 파일 확인

cd /mount2 ls cat test.txt exit

 

7. 리소스 삭제

kubectl delete pod emptydir-pod

 

 

 

 

 

 

 

 

 

 


HostPath Volume

1. yaml 확인

cat pod.yaml

 

2. yaml 을 활용한 hostpath 유형의 Volume을 사용하는 Pod 생성

kubectl create -f pod.yaml

 

3. 위 2에서 생성한 redis 컨테이너로 접속

kubectl exec -it hostpath-pod --container redis -- /bin/bash

 

4. 마운트 된 디렉토리로 이동 후 파일생성

cd /mount1 echo hello hostpath >> test.txt cat test.txt exit

 

5. 위 2에서 생성한 Pod 가 어떤 노드에 생성되었는지 확인

kubectl get pod -o wide

 

6. 위 5에서 확인한 노드의 터미널로 이동하여 파일 생성 확인

cd /tmp ls cat test.txt

 

7. 리소스 삭제

kubectl delete pod hostpath-pod

 

 

 


Persistent Volume

1. PV, PVC, Pod yaml 확인

cat pv.yaml pvc.yaml pod.yaml

 

2. 위 13에서 확인한 yaml로 리소스 생성

kubectl create -f pv.yaml kubectl create -f pvc.yaml kubectl create -f pod.yaml

 

3. 생성된 리소스 확인

kubectl get pv,pvc,po

 

4. persistentvolume 안에 있는 컨테이너로 접속

kubectl exec -it pv-pod --container container -- /bin/bash

 

5. 마운트 된 디렉토리로 이동 후 파일생성

cd /mount1 echo hello pv >> pv.txt cat pv.txt exit

 

6. persistentvolume라는 pod 가 어떤 노드에 생성되었는지 확인

kubectl get po pv-pod -o wide

 

7. 위 18에서 확인한 노드의 터미널로 이동하여 파일 생성 확인

cd /tmp ls cat pv.txt

 

8. 클리어

kubectl delete pod,pv,pvc --all

 

 

 


Appendix_Autoscaling HPA

 

1. Metic-server 설치

kubectl create -f metric-server.yaml

 

2. Deployment 편집

kubectl edit deployment metrics-server -n kube-system

 

/kubelet-use-node-status-port

 

- --kubelet-use-node-status-port

- --metric-resolution=15s

- --kubelet-insecure-tls

맨 아랫줄을 추가해줍니다.(- --kubelet-insecure-tls)

 

3. 동작 확인

kubectl top node

 

4. 실습에 필요한 Deployment와 Service 생성

kubectl create -f php-apache.yaml

 

5. HPA 생성

kubectl autoscale deployment php-apache \ --cpu-percent=50 --min=1 --max=10

 

6. 생성한 HPA 확인

kubectl get hpa

 

7. php-apache 서비스의 ClusterIP 확인

kubectl get svc

 

8. 부하 생성(다른 터미널을 추가하여 진행)

kubectl run -i --tty load-generator --rm \

--image=busybox --restart=Never -- \

/bin/sh -c "while sleep 0.01; do \

wget -q -O- http://<위에서확인한 IP>; done"

 

9. 1분정도 뒤 Pod 증가 확인

kubectl get hpa

kubectl get deployment php-apache

 

10. 부하 중지(부하 생성 시 터미널에서 진행)

Ctrl + C

 

11. 약 5~7분 뒤 Pod 감소 확인

kubectl get hpa kubectl

get deployment php-apache

 

12. clear

kubectl delete pod,hpa,deploy --all

 

 

 

 

728x90