ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [컨테이너] 3. Kubernetes 기초, POD, Deployment, Service | 미니쿠베를 활용한 실습
    SKT Fly AI 4기 활동기록 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

    댓글

안녕하세요? 반가워요. 광고 눌러주세요?