PlayData 백엔드 부트캠프 정리

쿠버네티스 활용 및 사용

효건 2024. 12. 11. 12:51

https://minikube.sigs.k8s.io/docs/start/?arch=%2Fmacos%2Farm64%2Fstable%2Fbinary+download

 

minikube start

minikube is local Kubernetes, focusing on making it easy to learn and develop for Kubernetes. All you need is Docker (or similarly compatible) container or a Virtual Machine environment, and Kubernetes is a single command away: minikube start What you’ll

minikube.sigs.k8s.io

미니 쿠버네티스에서 다운로드 받는다. 급하게 하지말고 천천히 지시한데로 진행하면 된다. 그리고 파워셀로 다운로드 받는다면 스타트하고 다시 켜서 하자 아니면 에러가 발생한다....

 

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
이명령어를 사용해서 Hyper-V라는 기능을 활성화한다.

 

이후 

 kubectl version

라는 명령어를 기입해서 
Client Version: v1.30.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.31.0

가 표출되면 바로 시작하면 되는 데 없다고 한다면 

curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.23.5/bin/windows/amd64/kubectl.exe
명령어를 기입하여 설치를 진행한다.


개발 중간에 쉬는 시간이나 하루의 개발을 마무리하였다면 

minikub delete로 꺼주는 걸 추천한다. 그래야 우리 컴퓨터가 리소스를 그만 할수있다.

 

자 이제 진짜 시작이다. 

미니쿠브에서 도커를 실행해야 한다 

& minikube docker-env | Invoke-Expression명령어로 미니쿠브에서 도커 환경을 실행시킨다.

실행이 완료되었다면 docker build -t spring-boot-app:latest . 명령어를 진행하여 도커파일을 이용한 빌드를 진행한다. 

pod는 쿠버네티스 즉k8s에서 가장 작은 단위이다. 이한 pod는 적어도 1개이상의 컨테이너를 가져야한다. 

pod는 선언적으로 생성하는데 yaml파일을 이용해서 세팅을 해야한다.

아래 는 예시 yaml파일이다.

※yml 과 yaml은 차이가 없으니 신경쓰지 않아도 된다. 

apiVersion: v1
kind: Pod
metadata:
  name: spring-boot-pod
spec:
  containers:
    - name: spring-boot-container
      image: spring-boot-app:latest
      ports:
        - containerPort: 8080

 

위에 yaml을 뜯고 씹고 맛보고 즐겨보면 

apiVersion은 그야말로 그냥 버젼이다.

kind는 어떤것을 쿠버네티스로 만들고 싶은지를 기입하면 된다 사실상 pod는 고정값이다 

metadata: 

   name:은 unique이다. 따라서 겹치면 안된다. pod의 이름이다. 

위 3항목은 어떤 쿠버네티스의 yaml에서 필수값이다. 

 

spec의 containers는 pod 하나당 컨테이너 하나가 기본이다. 그러나 특별한 일이 있다면 여러가지가 들어갈수있다.

그리고 나머지 내용은 docker-compose와 동일하다.

 

이후 

powershell을 yml을 만든 프로젝트 폴더로 간후 

kubectl apply -f pods/spring-boot-pods.yaml 이와 같은 명령어를 실행한다. 여기서 sprig-boot-pods.yaml은 파일명이다, 

그러면 created되었다는 대답이 돌아온다 !!!

이후 

kubectl get pod 라는 명령어를 실행하면 pod가 생성한것을 볼수있다 .그러나 지금은 ready가 0/1 이라는 게 보이는데 실행이 될준비가 안되었다는 것이다. 이후 계속 실행해보면 status가  ImagePullBackOff이렇게 되어있는 것을 볼수있다. 수정해야할듯....

 

이러한 에러가 발생하면 

 kubectl describe pod spring-boot-pod로 확인을 해볼수있다. spring-boot-pod이놈은 pods의 이름이다,

Name:             spring-boot-pod
Namespace:        default
Priority:         0
Service Account:  default
Node:             minikube/172.26.158.74
Start Time:       Wed, 11 Dec 2024 11:21:14 +0900
Labels:           <none>
Annotations:      <none>
Status:           Pending
IP:               10.244.0.3
IPs:
  IP:  10.244.0.3
Containers:
  spring-boot-container:
    Container ID:
    Image:          spring-boot-app:latest
    Image ID:
    Port:           8080/TCP
    Host Port:      0/TCP
    State:          Waiting
      Reason:       ImagePullBackOff
    Ready:          False
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-mkc2n (ro)
Conditions:
  Type                        Status
  PodReadyToStartContainers   True
  Initialized                 True
  Ready                       False
  ContainersReady             False
  PodScheduled                True
Volumes:
  kube-api-access-mkc2n:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   BestEffort
Node-Selectors:              <none>
Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type     Reason     Age                   From               Message
  ----     ------     ----                  ----               -------
  Normal   Scheduled  4m3s                  default-scheduler  Successfully assigned default/spring-boot-pod to minikube
  Normal   Pulling    2m30s (x4 over 4m3s)  kubelet            Pulling image "spring-boot-app:latest"
  Warning  Failed     2m27s (x4 over 4m)    kubelet            Failed to pull image "spring-boot-app:latest": Error response from daemon: pull access denied for spring-boot-app, repository does not exist or may require 'docker login': denied: requested access to the resource is denied
  Warning  Failed     2m27s (x4 over 4m)    kubelet            Error: ErrImagePull
  Warning  Failed     2m1s (x6 over 4m)     kubelet            Error: ImagePullBackOff
  Normal   BackOff    107s (x7 over 4m)     kubelet            Back-off pulling image "spring-boot-app:latest"

위와 같이 발생한것을 확인할수있다. 스케줄러가 정상적 동작했으나 잘모르겠다... 그냥 삭제후 재실행 해보자 

kubectl delete pod spring-boot-pod 로 삭제한다. 다시 위와 같은 것을 했는데도 같은 에러이다.....ㅠㅠ

 

그래서 강사님의 킥은 imagePullPolicy: Never이것을 추가해서 local것만을 사용하겠다는 의미라고 한다. 

apiVersion: v1
kind: Pod
metadata:
  name: spring-boot-pod
spec:
  containers:
    - name: spring-boot-container
      image: spring-boot-app:latest
      imagePullPolicy: Never
      ports:
        - containerPort: 8080

yaml을 위와 같이 수정하니 정상작동한다. 

NAME              READY   STATUS    RESTARTS   AGE
spring-boot-pod   1/1     Running   0          3s

이와 같이 정상작동하는 것을 볼 수 있다.

 

kubectl port-forward pod/spring-boot-pod 8080:8080

이렇게 포트로 전환을 시켜달라는 포트 포워딩을 실행해야 한다. 이렇게 해야 요청이 가능하다. 

 

http://localhost:8080/hello 이렇게 주소창에 입력하면 정상작동하고 있는 것을 확인해 볼수있다. 

단, 백그라운드로 미니쿠버네티스는 사용이 불가하기에 다른실습이 불가 하다. 

 

     livenessprobe:
        httpGet:
          path: /merong
          port: 8080
         initialDelaySeconds: 5
         timeoutSeconds: 2
         periodSeconds: 5
         failureThreshold: 1
      readinesssprobe:
        httpGet:
          path: /merong
          port: 8080
         initialDelaySeconds: 5
         timeoutSeconds: 2
         periodSeconds: 5
         failureThreshold: 1

 

이렇게 spec 안에 추가할수있다.

livenessprobe의 /merong은 사실상 healthcheck로 사용할수있다 이는 컨테이너를 새로이 만들어 버린다 

readinessprobe은 오류가 발생하면 제외를 시켜버리고 요청을 다른 곳으로 보내버린다. 

 

자, 이제 deplyment를 한번 만들어 봅시다 . 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-boot-deployment
spec:
  replicas: 3# 복제 할 수
  selector:
    matchLavels:
      app: spring-boot
  template:
    metadata:
      lables:
        app: spring-boot
    spec:
      containers:
        - name: spring-boot-container
          image: spring-boot-container-app:latest
          imagePullPolicy: Never
          ports:
            -containerPort: 8080

 

사실상 pod와 비슷해 보이지만 label을 통해서 pod들을 묶을 수있고 이를 또 deployment가 묶어서 관리를 진행할수있다. 호우!!!

따라서 pod의 구성도 어떻게  될지를 알 수 있어야 한다 .

이렇게  kubectl apply -f .\deployments\spring-boot-deployment.yaml 명령어를 실행하면 3개가 계속 유지된다. 다시말해서

지워도 3개가 다시 유지하게 새로 생성된다.