[컨테이너] 3. Kubernetes 기초, POD, Deployment, Service | 미니쿠베를 활용한 실습
kubectl apply -f deployment.yaml
kubectl apply -f deployment.yaml
쿠버네티스란?
구글에서 만든 오픈소스 container orchestration 툴
container orchestration이란? orchestration은 프로그램의 모듈, 패키지, 라이브러리 관리하는 것 container orchestration 컨테이너 관리
쿠버네티스의 구조
Kubectl 인터페이스로 명령 내릴 수 있음
- 사용자는 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