-
[컨테이너] 3. Kubernetes 기초, POD, Deployment, Service | 미니쿠베를 활용한 실습SKT Fly AI 4기 활동기록 2024. 4. 5. 12:04728x90
kubectl apply -f deployment.yaml
kubectl apply -f deployment.yaml
쿠버네티스란?
구글에서 만든 오픈소스 container orchestration 툴
container orchestration이란? orchestration은 프로그램의 모듈, 패키지, 라이브러리 관리하는 것 container orchestration 컨테이너 관리
쿠버네티스의 구조
Kubectl 인터페이스로 명령 내릴 수 있음
그림 1. 쿠버네티스의 구조도 [1] - 사용자는 Kubectl 인터페이스로 명령
- Kubectl은 master에게 일 시킴 (그림에서는 Control plane)
- master는 node에게 일 시킴
- node에는 pod가 여러개 있음
- pod에서는 컨테이너가 여러개 있음
Azure 클라우드에서 서버 만들고 네트워크 세팅하여 쿠버네티스를 활용한 웹서버 구축할 수 있다.
미니쿠베 설치
더 자세한 설치방법은 아래 포스트에서 확인해주세요
https://baemsul.tistory.com/160
[컨테이너] 3-1. Minikube 설치
2024년 1월 SKT Fly AI 4기에서 실습한 내용을 바탕으로 작성되었습니다. Azure 클라우드에서 Ubuntu 20.04 가상환경을 구축한 다음 수행하였습니다. 미니쿠베 설치 curl -LO https://storage.googleapis.com/minikube/re
baemsul.tistory.com
POD 관리하기
YAML 코드로 컨테이너를 관리한다.
YAML이란?
직렬화(Serial) 포맷, 들여쓰기 중요
컨테이너를 실행하고 데이터를 전송할 수 있다.
1초마다 날짜를 출력하는 카운터 이미지를 만들어 보자
pod.yaml
apiVersion: v1 # kubernetes resource 의 API Version kind: Pod # kubernetes resource name metadata: # 메타데이터 : name, namespace, labels, annotations 등을 포함 name: counter spec: # 메인 파트 : resource 의 desired state 를 명시 containers: name: count # container 의 이름 image: busybox # container 의 image args: [/bin/sh, -c, 'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done'] # 해당 image 의 entrypoint 의 args 로 입력하고 싶은 부분
방금 만든 파일로 미니쿠베 설정
kubectl apply -f pod.yaml
내가 만든 POD 보기
kubectl get pod
실행 결과 예시
NAME READY STATUS RESTARTS AGE counter 1/1 Running 0 113s
- RESTARTS: 뭔가 오류가 많아서 재시작했을 것이다.
다양한 get pod 명령어
모든 pod 출력
kubectl get pod -A
특정 조건으로 pod 출력
kubectl get pod -o wide kubectl get pod -o yaml
-o 옵션은 output이다.
파이프라인 명령어 --> 로 이것을 다른 파일에 저장할 수 있다
kubectl get pod -o yaml --> a.yaml
pod 보는 상태 계속 유지
kubectl get pod -w
로그 지속적으로 찍기
kubectl logs counter -f
pod 안 컨테이너의 bash에 들어가기
kubectl exec -it counter /bin/bash
우분투라면 쿠버네티스 안의 pod 안의 컨테이너(1개 뿐임)의 bash
pod 안에 여러 개의 container 가 있는 경우
kubectl exec -it -c -- <명령어>
pod 삭제
kubectl delete pod <pod-name> # 다른 거 삭제할 위험 있음 kubectl delete -f <YAML-파일-경로> # 정해진 것만 삭제함
Deployment
Publish: 큰 서비스 전체 배포
Deployment: 작은 거 하나하나 배포
- Pod 관리 기능 제공
- Self-healing: pod 재실행
- Scaling: 자원 더 주거나 줄이기
- Rollout: 무중단 업데이트
- 가용성옵션: 서버 여러대 멀리 떨어뜨려서, 한번에 고장 안 나게
deployment.yaml 만들고, pod 만들기
apiVersion: apps/v1 # kubernetes resource 의 API Version kind: Deployment # kubernetes resource name metadata: # 메타데이터 : name, namespace, labels, annotations 등을 포함 name: nginx-deployment labels: app: nginx spec: # 메인 파트 : resource 의 desired state 를 명시 replicas: 3 # 동일한 template 의 pod 을 3 개 복제본으로 생성합니다. selector: matchLabels: app: nginx template: # Pod 의 template 을 의미합니다. metadata: labels: app: nginx spec: containers: - name: nginx # container 의 이름 image: nginx:1.14.2 # container 의 image ports: - containerPort: 80 # container 의 내부 Port
kubectl apply -f deployment.yaml
deployment 실습
ghkd3531@labuser78ubuntu2204:~$ kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE nginx-deployment 3/3 3 3 115s ghkd3531@labuser78ubuntu2204:~$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-66b6c48dd5-hmltt 1/1 Running 0 4m52s nginx-deployment-66b6c48dd5-qh44r 1/1 Running 0 4m52s nginx-deployment-66b6c48dd5-sclhk 1/1 Running 0 4m52s ghkd3531@labuser78ubuntu2204:~$ kubectl delete pod nginx-deployment-66b6c48dd5-qh44r pod "nginx-deployment-66b6c48dd5-qh44r" deleted ^C ghkd3531@labuser78ubuntu2204:~$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-66b6c48dd5-dgjbs 1/1 Running 0 11s # auto healing nginx-deployment-66b6c48dd5-hmltt 1/1 Running 0 7m13s nginx-deployment-66b6c48dd5-sclhk 1/1 Running 0 7m13s ghkd3531@labuser78ubuntu2204:~$
kubectl delete pod nginx-deployment-66b6c48dd5-qh44r
이 코드를 실행하여 qh44r pod를 지웠지만 복구되었다.
이것이 auto healing
pod는 사라질 수 있음. pod에는 상태를 저장하면 안 된다.
pod 5개로 늘리기
kubectl scale deployment/nginx-deployment --replicas=5
ghkd3531@labuser78ubuntu2204:~$ kubectl scale deployment/nginx-deployment --replicas=5 pod 크기 바 deployment.apps/nginx-deployment scaled ghkd3531@labuser78ubuntu2204:~$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-66b6c48dd5-dgjbs 1/1 Running 0 4m5s nginx-deployment-66b6c48dd5-fcwgt 0/1 ContainerCreating 0 3s nginx-deployment-66b6c48dd5-hmltt 1/1 Running 0 11m nginx-deployment-66b6c48dd5-pp896 1/1 Running 0 3s nginx-deployment-66b6c48dd5-sclhk 1/1 Running 0 11m
pod 30개로 늘렸다가 3개로 줄이기
ghkd3531@labuser78ubuntu2204:~$ kubectl scale deployment/nginx-deployment --replicas=3 deployment.apps/nginx-deployment scaled ghkd3531@labuser78ubuntu2204:~$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-deployment-66b6c48dd5-266bt 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-2v5r7 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-5l2sk 1/1 Terminating 0 95s nginx-deployment-66b6c48dd5-65dln 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-6vwq9 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-974gn 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-cpj75 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-dgjbs 1/1 Running 0 6m21s nginx-deployment-66b6c48dd5-hmltt 1/1 Running 0 13m nginx-deployment-66b6c48dd5-jsxfb 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-jx2hg 1/1 Terminating 0 95s nginx-deployment-66b6c48dd5-mxpn6 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-pb8wn 1/1 Terminating 0 95s nginx-deployment-66b6c48dd5-pcjfq 1/1 Terminating 0 95s nginx-deployment-66b6c48dd5-qm2xg 1/1 Terminating 0 95s nginx-deployment-66b6c48dd5-r8dsf 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-rmjsq 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-sclhk 1/1 Running 0 13m nginx-deployment-66b6c48dd5-vw26m 0/1 Terminating 0 95s nginx-deployment-66b6c48dd5-whvd6 0/1 Terminating 0 95s
yaml로 pod 삭제
ghkd3531@labuser78ubuntu2204:~$ kubectl delete -f deployment.yaml deployment.apps "nginx-deployment" deleted ghkd3531@labuser78ubuntu2204:~$ kubectl get pod No resources found in default namespace.
Service
- 인터넷 - Gateway - 사설망
- 인터넷 - Kubernetes - Pod - 컨테이너
쿠버네티스 pod 를 외부에서 접근
pod의 내부 IP에 외부 IP 접근
ghkd3531@labuser78ubuntu2204:~$ kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-66b6c48dd5-bc6g8 1/1 Running 0 2m1s 172.17.0.5 minikube <none> <none> nginx-deployment-66b6c48dd5-ft78z 1/1 Running 0 2m1s 172.17.0.4 minikube <none> <none> nginx-deployment-66b6c48dd5-ntk7c 1/1 Running 0 2m1s 172.17.0.3 minikube <none> <none> ghkd3531@labuser78ubuntu2204:~$ curl -X GET 172.17.0.5 -vvv Note: Unnecessary use of -X or --request, GET is already inferred. * Trying 172.17.0.5:80... * connect to 172.17.0.5 port 80 failed: No route to host * Failed to connect to 172.17.0.5 port 80 after 3055 ms: No route to host * Closing connection 0 curl: (7) Failed to connect to 172.17.0.5 port 80 after 3055 ms: No route to host
- curl -X GET 172.17.0.5 -vvv
- 외부(우분투서버)에서 쿠버네티스로 못 들어감
미니쿠베에서 작업
minikube ssh
ghkd3531@labuser78ubuntu2204:~$ minikube ssh docker@minikube:~$ curl -X GET 172.17.0.5 -vvv # 미니쿠베에서 작업하는 것 Note: Unnecessary use of -X or --request, GET is already inferred. * Trying 172.17.0.5:80... * TCP_NODELAY set * Connected to 172.17.0.5 (172.17.0.5) port 80 (#0) > GET / HTTP/1.1 > Host: 172.17.0.5 > User-Agent: curl/7.68.0 > Accept: */* > * Mark bundle as not supporting multiuse # 웹서버의 응답 < HTTP/1.1 200 OK < Server: nginx/1.14.2 < Date: Fri, 12 Jan 2024 05:49:47 GMT < Content-Type: text/html < Content-Length: 612 < Last-Modified: Tue, 04 Dec 2018 14:44:49 GMT < Connection: keep-alive < ETag: "5c0692e1-264" < Accept-Ranges: bytes < <!DOCTYPE html> # nginx의 샘플 웹페이지 <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html> * Connection #0 to host 172.17.0.5 left intact
밖에서 안을 들어올 수 있게 뜷어줘야 함
Service 생성
참고 자료
[1] https://sensu.io/blog/how-kubernetes-works
728x90'SKT Fly AI 4기 활동기록' 카테고리의 다른 글
[클라우드] 1. Azure 클라우드 기초 | 용어 정의 및 리소스 그룹 만들기 (0) 2024.04.08 [컨테이너] 3-1. Minikube 설치 (0) 2024.04.05 [컨테이너] 2. 도커 이미지 생성 및 배포 (0) 2024.01.31 [컨테이너] 1. 도커 설치하기, 기초 명령어 실습 (0) 2024.01.30 [컨테이너] 0. 도커 컨테이너란 무엇인가? (0) 2024.01.29