Infra/Kubernetes

쿠버네티스를 활용한 네이티브 데브옵스 - 4장 오브젝트 다루기

wave35 2024. 9. 27. 11:56

4.1 디플로이먼트

관리와 스케줄링

- 쿠버네티스는 각 프로그램을 관리하기 위해 디플로이먼트 오브젝트를 생성한다.

- 컨테이너 이미지명, 레플리카 수 등 컨테이너를 실행하기 위한 정보가 기록된다.

- 쿠버네티스 컨트롤러는 디플로이먼트 리소스를 관리하며, 디플로이먼트 리소스가 특별한 이유 없이 

레플리카 수를 채우지 못하고 실행 중이면, 컨트롤러는 새로운 레플리카를 생성한다.

 

컨테이너 재시작하기

- 컨테이너가 비정상적이나, 정상적으로 kubectl로 컨테이너를 종료하는 경우에도

디플로이먼트는 컨테이너를 재시작을 시킨다.

- 쿠버네티스는 오래 실행되고 신뢰할 수 있도록 설계되어있기 때문에, 재시작을 기본 작동으로 수행한다.

- 디플로이먼트의 역할을 관련된 컨테이너를 감시하고 지정된 수 만큼 항상 실행 중인지를 확인한다.

 

디플로이먼트 조회하기 

현재 namespace에 활성화된 디플로이먼트 확인

kubectl get deployments
>>>
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
hello-minikube   1/1     1            1           22s

특정 디플로이먼트의 자세한 내용 확인

kubectl describe deployments/hello-minikube
>>>
Name:                   hello-minikube
Namespace:              default
CreationTimestamp:      Fri, 27 Sep 2024 08:53:23 +0900
Labels:                 app=hello-minikube
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=hello-minikube
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=hello-minikube
  Containers:
   echo-server:
    Image:        kicbase/echo-server:1.0
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   hello-minikube-77b6f68484 (1/1 replicas created)
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  113s  deployment-controller  Scaled up replica set hello-minikube-77b6f68484 to 1

 

4.2 파드

- 파드는 하나 이상의 컨테이너 그룹으로 구성된 쿠버네티스 오브젝트이다.

- 컨테이너 집합은 함께 스케줄링, 저장공간 공유 등 같이 움직이기에 파드로 관리한다.

- 디플로이먼트가 파드를 실행된다.

 

4.3 레프리카셋

- 정확히는 디플로이먼트가 레플리카셋을 관리하며 레플리카셋은 동일한 파드 집합을 관리한다.

 

4.4 의도한 상태 유지하기

- 파드를 종료해도 '의도한 상태'를 유지하기 위해 컨트롤러는 지속적인 동기화( 조정 루프 )를 진행한다.

- 디플로이먼트를 종료하면 조정 루프를 진행하지 않는다.

 

4.5 쿠버네티스 스케줄러

- 스케줄러는 대기열에서 스케줄링되지 않은 파드를 찾아 배치하고 실행할 노드는 찾는다.

- 디플로이먼트가 파드를 실행할 때, 요청된 파드를 적정할 노드에 실행하는 역할을 한다.

- 조정루프를 위해 파드가 삭제됬을 때 다시 새로운 파드를 올리는 것은 kubelet이다.

 

4.6 YAML 형식의 리소스 매니페스트

- 디플로이먼트, 파드와 같은 리소스는 내부 DB에 기록되며, 조정 루프시 해당 DB를 참조한다.

- kubectl run 명령어를 사용하여 새로운 레코드를 DB에 등록할 수 있다.

- 리소스 매니페스트를 직정 생성함을 통해 위와 같은 역할을 동일하게 할 수 있다.

 

디플로이먼트 YAML 매니페스트

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
  labels:
    app: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
        - name: demo
          image: cloudnatived/demo:hello
          ports:
          - containerPort: 8888

 

kubectl apply 사용하여 배포

kubectl apply -f k8s/deployment.yaml        
>>>
deployment.apps/demo created

 

서비스 리소스

- 생성한 demo파드를 웹 브라우저에서 접속 가능하게 하려면 '서비스 리소스'를 사용한다.

- 서비스 리소스란 재시작할 때마다 동적으로 변경되는 파드의 IP에 맵핑할 수 있게 한다.

- 서비스 리소스는 파드에 라우팅되는 영구적 IP주소과 DNS 주소를 제공한다.

 

- 서비스 YAML 매니페스트 ( 9999포드를 파드의 8888 포트로 포워딩 )

apiVersion: v1
kind: Service
metadata:
  name: demo
  labels:
    app: demo
spec:
  ports:
  - port: 9999
    protocol: TCP
    targetPort: 8888
  selector:
    app: demo
  type: ClusterIP

 

 

4.7 헬름: 쿠버네티스 패키지 매니저

- helm 명령어를 사용하면 헬름차트 패키지로 애플리케이션을 실행할 수 있다.

- 헬름차트 패키지는 YAML 매니페스트를 룰러싼 래퍼(wrapper)이다.

- 리소스, 의존성, 구성가능변수 등을 지정할 수 있다.

 

helm version

헬름 설치 및 확인

# 설치
brew install helm

# 버전 확인
helm version
>>>
version.BuildInfo{Version:"v3.13.1", GitCommit:"3bf5edbdf122sefa552a42aa", GitTreeState:"clean", GoVersion:"go1.21.3"}

 

helm install <name> <path>

헬름 차트 설치하기 

helm install demo ./k8s/demo
>>>
NAME: demo
LAST DEPLOYED: Fri Sep 27 14:23:54 2024
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

패키지 참고 코드 : https://github.com/cloudnativedevops/demo/tree/main/hello-helm

 

helm list

헬름 릴리스 목록 확인하기

helm list   
>>>
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
demo    default         1               2024-09-27 14:23:54.938714 +0900 KST    deployed        demo-1.0.1