SKT Fly AI 4기 활동기록

[컨테이너] 3. Kubernetes 기초, POD, Deployment, Service | 미니쿠베를 활용한 실습

이무기뱀술 2024. 4. 5. 12:04
728x90

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