kubernetes 기본사용법
💾 kubernetes의 기본 사용법을 정리한 내용입니다. 자세한 내용은 링크에서 확인할 수 있습니다.
🎯 Pod
쿠버네티스와 도커의 차이점은 도커는 컨테이너를 만들지만, 쿠버네티스는 Pod를 만듭니다.
Pod는 한 개 또는 여러 개의 컨테이너를 포함합니다.
Pod 생성
# 생성
kubectl run nginx-pod --image=nginx
# 확인
kubectl get pod
# 출력
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 35s
kubernetes v1.18 이상은 run명령어가 pod을 만들지만 v1.17 이하는 deployment를 만듭니다.
Pod 제거
kubectl delete pod/nginx-pod
YAML으로 파드 생성
YAML 파일 정의
# simple-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx-pod
spec:
  containers:
    - name: app
      image: nginx
필수 요소
| 정의 | 설명 | 예 | 
|---|---|---|
| version | 오브젝트 버전 | v1, app/v1, networking.k8s.io/v1, … | 
| kind | 종류 | Pod, ReplicaSet, Deployment, Service, … | 
| metadata | 메타데이터 | name과 label, annotation(주석)으로 구성 | 
| spec | 상세명세 | 리소스 종류마다 다름 | 
version, kind, metadata, spec 는 리소스를 정의할 때 반드시 필요한 요소입니다.
Pod 생성
kubectl apply -f simple-pod.yaml
컨테이너 상태 모니터링
컨테이너 생성과 실제 서비스 준비는 약간의 차이가 있습니다. 서버를 실행하면 바로 접속할 수 없고 짧게는 수초, 길게는 수분의 초기화 시간이 필요한데 실제로 접속이 가능할 때 서비스가 준비되었다고 말할 수 있습니다.

livenessProbe
컨테이너가 정상적으로 동작하는지 체크하고 정상적으로 동작하지 않는다면 컨테이너를 재시작하여 문제를 해결합니다.
정상이라는 것은 여러가지 방식으로 체크할 수 있는데, 여기서는 httpGet 요청을 보내 확인하는 방법을 사용합니다.
상태체크
httpGet 외에 tcpSocket, exec 방법으로 체크할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
  name: echo-lp
  labels:
    app: echo
spec:
  containers:
    - name: app
      image: ghcr.io/subicura/echo:v1
      livenessProbe:
        httpGet:
          path: /actuator/health
          port: 8080
        initialDelaySeconds: 5
        timeoutSeconds: 2        # Default 1
        periodSeconds: 5         # Defaults 10
        failureThreshold: 1      # Defaults 3
정상적으로 응답하지 않는다면 Pod가 여러번 재시작되고, CrashLoopBackOff 상태로 변경됩니다.
NAME      READY   STATUS             RESTARTS      AGE
echo-lp   0/1     CrashLoopBackOff   4 (15s ago)   60s
readinessProbe
컨테이너가 준비되었는지 체크하고 정상적으로 준비되지 않았다면 Pod으로 들어오는 요청을 제외합니다.
livenessProbed와 차이점은 문제가 있어도 Pod를 재시작하지 않고 요청만 제외한다는 점입니다.
apiVersion: v1
kind: Pod
metadata:
  name: echo-rp
  labels:
    app: echo
spec:
  containers:
    - name: app
      image: ghcr.io/subicura/echo:v1
      readinessProbe:
        httpGet:
          path: /actuator/health
          port: 8080
        initialDelaySeconds: 5
        timeoutSeconds: 2               # Default 1
        periodSeconds: 5                # Defaults 10
        failureThreshold: 1             # Defaults 3
상태 확인
NAME      READY   STATUS    RESTARTS   AGE
echo-rp   0/1     Running   0          14s
livenessProbe + readinessProbe
보통 livenessProbe와 readinessProbe를 같이 적용합니다. 상세한 설정은 애플리케이션 환경에 따라 적절하게 조정합니다.
apiVersion: v1
kind: Pod
metadata:
  name: echo-health
  labels:
    app: echo
spec:
  containers:
    - name: app
      image: ghcr.io/subicura/echo:v1
      livenessProbe:
        httpGet:
          path: /actuator/health
          port: 3000
      readinessProbe:
        httpGet:
          path: /actuator/health
          port: 3000
다중 컨테이너
대부분 1 Pod = 1 컨테이너지만 여러 개의 컨테이너를 가진 경우도 꽤 흔합니다. 
하나의 Pod에 속한 컨테이너는 서로 네트워크를 localhost로 공유하고 동일한 디렉토리를 공유할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
  name: counter
  labels:
    app: counter
spec:
  containers:
    - name: app
      image: ghcr.io/subicura/counter:latest
      env:
        - name: REDIS_HOST
          value: "localhost"
    - name: db
      image: redis
환경변수 설정
env는 name과 value를 별도로 정의합니다.
🎯 ReplicaSet
Pod을 단독으로 만들면 어떤 문제가 생겼을 때 자동으로 복구되지 않습니다. Pod을 정해진 수만큼 복제하고 관리하는 것이 ReplicaSet입니다.
ReplicaSet YAML
# echo-rs.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: echo-rs
spec:
  replicas: 1            # 원하는 pod 개수
  selector:              # lebel 체크 조건
    matchLabels:
      app: echo
      tier: app
  template:              # 생성할 pod의 명세
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1
ReplicaSet 생성 및 확인
생성
# ReplicaSet 생성
kubectl apply -f echo-rs.yml
확인
# 리소스 확인
kubectl get po,rs
# 리소스 확인 결과
NAME                READY   STATUS    RESTARTS   AGE
pod/echo-rs-tcdwj   1/1     Running   0          61s
NAME                      DESIRED   CURRENT   READY   AGE
replicaset.apps/echo-rs   1         1         1       61s
# pod 라벨 확인
kubectl get pod --show-labels
# pod 라벨 확인 결과
NAME            READY   STATUS    RESTARTS   AGE   LABELS
echo-rs-tcdwj   1/1     Running   0          3m    app=echo,tier=app
ReplicaSet과 Pod이 같이 생성된 것을 볼 수 있습니다. ReplicaSet은 label을 체크해서 원하는 수의 Pod이 없으면 새로운 Pod을 생성합니다.
스케일 아웃
ReplicaSet을 이용하면 손쉽게 Pod을 여러개로 복제할 수 있습니다.
replicas 변경
# echo-rs-scaled.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: echo-rs
spec:
  replicas: 4            # pod 개수 4개로 설정
  selector:
    matchLabels:
      app: echo
      tier: app
  template:
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1
실행 및 결과
# 실행
kubectl apply -f echo-rs-scaled.yml
# 확인
kubectl get pod,rs
# 확인 결과
NAME                READY   STATUS    RESTARTS   AGE
pod/echo-rs-h4q86   1/1     Running   0          12m
pod/echo-rs-4wk6t   1/1     Running   0          2m12s
pod/echo-rs-nkgf2   1/1     Running   0          2m12s
pod/echo-rs-xpqnc   1/1     Running   0          2m12s
NAME                      DESIRED   CURRENT   READY   AGE
replicaset.apps/echo-rs   4         4         4       12m
🎯 Deployment
Deployment는 쿠버네티스에서 가장 널리 사용되는 오브젝트입니다. ReplicaSet을 이용하여 Pod을 업데이트하고 이력을 관리하여 롤백하거나 특정 버전(revision)으로 돌아갈 수 있습니다.
Deployment YAML
# echo-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: echo
      tier: app
  template:
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1
Deployment 생성 및 확인
생성
# Deployment 생성
kubectl apply -f echo-deployment.yml
확인
# 리소스 확인
kubectl get po,rs,deploy
# 리소스 확인 결과
NAME                               READY   STATUS    RESTARTS   AGE
pod/echo-deploy-76dcd9f4f9-clx78   1/1     Running   0          17s
pod/echo-deploy-76dcd9f4f9-jxnzx   1/1     Running   0          17s
pod/echo-deploy-76dcd9f4f9-kfl25   1/1     Running   0          17s
pod/echo-deploy-76dcd9f4f9-p8b85   1/1     Running   0          17s
NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/echo-deploy-76dcd9f4f9   4         4         4       17s
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/echo-deploy   4/4     4            4           17s
ReplicaSet과 비슷해 보이지만 Deployment는 Pod을 새로운 이미지로 업데이트할 때 동작이 다릅니다.
Deployment 업데이트
Pod의 이미지를 변경합니다.
# echo-deployment.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deploy
spec:
  replicas: 4
  selector:
    matchLabels:
      app: echo
      tier: app
  template:
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v2  # 이미지 변경
업데이트
# 새로운 이미지 업데이트
kubectl apply -f echo-deployment-v2.yml
확인
# 리소스 확인
kubectl get po,rs,deploy
# 리소스 확인 결과
NAME                               READY   STATUS    RESTARTS   AGE
pod/echo-deploy-77cd7699f4-jg7ws   1/1     Running   0          33s
pod/echo-deploy-77cd7699f4-rpbjx   1/1     Running   0          20s
pod/echo-deploy-77cd7699f4-rtgcv   1/1     Running   0          19s
pod/echo-deploy-77cd7699f4-rw29n   1/1     Running   0          33s
NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/echo-deploy-76dcd9f4f9   0         0         0       3m35s
replicaset.apps/echo-deploy-77cd7699f4   4         4         4       33s
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/echo-deploy   4/4     4            4           3m35s
모두 새로운 Pod으로 변경된 것을 확인할 수 있습니다.
참고
Pod은 업데이트라는 개념이 없고 새로운 버전을 생성하고, 기존 Pod을 제거합니다.
스케일링
Deployment는 스케일링을 설정할 수 있습니다.
# Pod의 수를 10개로 지정
kubectl scale deployment/nginx-deployment --replicas=10
클러스터에서 horizontal Pod Autoscaling를 설정 한 경우 Deployment에 대한 오토스케일러를 설정할 수 있습니다. 아래는 Pod의 CPU 사용률을 기준으로 실행할 최소 Pod 및 최대 Pod의 수를 설정한 예입니다.
kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80
버전관리
Deployment는 변경된 상태를 기록합니다.
# 히스토리 확인
kubectl rollout history deploy/echo-deploy
# revision 1 히스토리 상세 확인
kubectl rollout history deploy/echo-deploy --revision=1
# 바로 전으로 롤백
kubectl rollout undo deploy/echo-deploy
# 특정 버전으로 롤백
kubectl rollout undo deploy/echo-deploy --to-revision=2
배포 전략 설정
Deployment는 다양한 방식의 배포 전략(Rolling Update, Blue-Green, Canary)이 있습니다. 이 중 Rolling Update를 설명합니다.
Rolling Update방식을 사용할 때 동시에 업데이트하는 Pod의 개수를 변경하는 예입니다.
# echo-strategy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deploy-st
spec:
  replicas: 4
  selector:
    matchLabels:
      app: echo
      tier: app
  minReadySeconds: 5
  strategy:
    type: RollingUpdate        # 배포 전략 설정
    rollingUpdate:
      maxSurge: 3
      maxUnavailable: 3
  template:
    metadata:
      labels:
        app: echo
        tier: app
    spec:
      containers:
        - name: echo
          image: ghcr.io/subicura/echo:v1
          livenessProbe:
            httpGet:
              path: /
              port: 3000
Deployment를 생성하고 결과를 확인
# 실행
kubectl apply -f echo-strategy.yml
# 조회
kubectl get po,rs,deploy
# 이미지 변경 (명령어로)
kubectl set image deploy/echo-deploy-st echo=ghcr.io/subicura/echo:v2
# 이벤트 확인
kubectl describe deploy/echo-deploy-st
# 이벤트 확인 결과
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
  Normal  ScalingReplicaSet  59s   deployment-controller  Scaled up replica set echo-deploy-st-679749cb78 to 4
  Normal  ScalingReplicaSet  29s   deployment-controller  Scaled up replica set echo-deploy-st-6754948699 to 3
  Normal  ScalingReplicaSet  29s   deployment-controller  Scaled down replica set echo-deploy-st-679749cb78 to 1
  Normal  ScalingReplicaSet  29s   deployment-controller  Scaled up replica set echo-deploy-st-6754948699 to 4
  Normal  ScalingReplicaSet  19s   deployment-controller  Scaled down replica set echo-deploy-st-679749cb78 to 0
Pod를 하나씩 생성하지 않고 3개씩 생성되는 것을 확인할 수 있습니다.
참고
maxSurge와 maxUnavailable의 기본값은 25%입니다. 대부분의 상황에서 적당하지만 상황에 따라 적절하게 조정이 필요합니다.
작성중….
댓글남기기