[kubernetes] 쿠버네티스 오브젝트 (3)

쿠버네티스 > 스토리지

develop, kubernetes
written byzuhern1zuhern

in

2021. 04. 11


공부하는 책
알면 더 쉬운 도커 쿠버네티스 복습을 위해 요약한 것.
kubernetes.io
kubernetes basic Run a Single-Instance Stateful Application

목표

kubernetes 책 3장 내용 숙지

  • 쿠버네티스 오브젝트
  • 쿠버네티스의 구성 요소를 가볍게 알아보자

3.3 쿠버네티스의 오브젝트

  • 쿠버네티스는 모든 요소를 yaml 파일로 생성하여 관리

3.3.6 스토리지

  • 컨테이너의 가장 큰 장점은 가벼움
  • 컨테이너를 가볍게 하기 위해서는 상태가 없는 부분만 컨테이너화 해야한다. (실행환경O, 데이터X)
  • 쿠버네티스는 볼륨 추상화 기능을 제공함

리눅스와 비교

  • 리눅스: 볼륨을 지정하고 마운트만 하면 됌
  • 쿠버네티스: PV, PVC가 존재. 사용법이 난해할 수 있음.

볼륨를 사용하는 방식

  1. PV (Persistent Volume)

    • 볼륨 리소스 그 자체
    • 파드의 생명주기와는 별도로 PV를 지정하고 사용할 수 있음.
  2. PVC (ersistent Volume Claim)

    • 사용자가 볼륨에 요청하는 방식을 정의한 것
    • PVC로 인해 파드와 PV의 의존성을 줄일 수 있다.

3.3.6.1 PV 생성

PV 예제소스

# 생성
% kubectl apply -f mysql-pv.yaml
persistentvolume/mysql-pv-volume created
# 생성확인
% kubectl get pv
NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   REASON   AGE
mysql-pv-volume   20Gi       RWO            Retain           Bound    default/mysql-pv-claim   manual                  96s

3.3.6.2 PVC 생성

사용자가 퍼시스턴트볼륨클레임을 생성한 후에,
쿠버네티스 컨트롤 플레인은 클레임의 요구사항을 만족하는 퍼시스턴트볼륨을 찾는다.
컨트롤 플레인이 동일한 스토리지클래스(storageClassName)를 갖는 적절한 퍼시스턴트볼륨을 찾으면, 볼륨에 클레임을 바인딩한다.

PVC 예제소스

# 1. 생성
% kubectl apply -f mysql-pvc.yaml
persistentvolumeclaim/mysql-pv-claim created

# 2. 생성확인
get pvc
NAME             STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound    mysql-pv-volume   20Gi       RWO            manual         93s

# 3. describe 로 확인
% kubectl describe pvc
Name:          mysql-pv-claim
Namespace:     default
StorageClass:  manual
Status:        Bound
Volume:        mysql-pv-volume
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      20Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       <none>
Events:        <none>

성공적으로 생성되지 않으면 STATUS: Pending 상태가 되어 변경되지 않는다.

3.3.6.3 deployment를 이용하여 volumn을 포함하는 mysql pod 생성

PVC 예제소스

# 파드 생성
% kubectl apply -f mysql-deployment.yaml
service/mysql created
deployment.apps/mysql created

# 파드 생성 확인
% kubectl get pods -l app=mysql
NAME                     READY   STATUS    RESTARTS   AGE
mysql-68579b78bb-4nl7c   1/1     Running   0          2m16s

3.3.6.4 작동확인 및 데이터베이스 mysql 에 데이터베이스 생성

# mysql 명령을 실행해서 정상적으로 작동하는지 확인
% kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
If you don't see a command prompt, try pressing enter.
show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.01 sec)

mysql> create database pv
    -> ;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| pv                 |
+--------------------+
4 rows in set (0.00 sec)

mysql>

3.3.6.5 mysql 디플로이먼트 삭제

% kubectl delete -f mysql-deployment.yaml
service "mysql" deleted
deployment.apps "mysql" deleted

디플로이먼트 delete 하니 pod, service, deployment 삭제됌

3.3.6.6 pv, pvc 어떤 상태인지 확인

# pod 확인 > mysql 없어짐
% kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
nodejs-app                    1/1     Running   1          6d22h
nodejs-app-7649479df8-76w2n   1/1     Running   1          7d1h
nodejs-app-7649479df8-phb77   1/1     Running   1          7d1h

# pv 확인
% kubectl get pv
NAME              CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS   REASON   AGE
mysql-pv-volume   20Gi       RWO            Retain           Bound    default/mysql-pv-claim   manual                  63m

# pvc 확인
% kubectl get pvc
NAME             STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound    mysql-pv-volume   20Gi       RWO            manual         62m

디플로이먼트, 파드를 삭제했음에도 pv, pvc는 남아있다.

3.3.6.6 다시 deployment 생성하고 아까 생성한 database 가 그대로 있는지 확인

kubectl apply -f mysql-deployment.yaml
service/mysql created
deployment.apps/mysql created
% kubectl run -it --rm --image=mysql:5.6 --restart=Never mysql-client -- mysql -h mysql -ppassword
If you don't see a command prompt, try pressing enter.
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| pv                 |
+--------------------+
4 rows in set (0.00 sec)

mysql>

database에 아까 생성한 pv 그대로 있음

생명주기

  1. 프로비저닝 (Provisioning)

    • PV1를 생성하는 단계
    • static, dynamic 두가지 방법이 있음.

      • static: 프로비저닝할 때 미리 PV을 만들어 놓고 PVC2를 통해 사용하는 파드에 연결하는 것
      • dynamic: PVC를 통해 사용하려고 할 때 권한이나 용량을 정해서 유동적으로 사용할 수 있도록 하는 방법
  2. 바인딩 (Binding)

    • 프로비저닝을 통해 생성된 PV를 PVC에 바인딩하는 단계
  3. 사용중 (Using)

    • PVC가 파드에 설정되어 PV가 실직적으로 사용되는 단계
    • 파드가 사용하고 있는 PVC는 임의로 삭제할 수 없음

3.3.6.7 상태 확인

# 파드 상태 확인
% kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
mysql-68579b78bb-vbt8f        1/1     Running   0          19m

# 파드의 PVC 확인
% kubectl describe pod mysql
...bash
Volumes:
  mysql-persistent-storage:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  mysql-pv-claim
    ReadOnly:   false
  default-token-2n8mz:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-2n8mz
    Optional:    false
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
...

volumes 부분을 보면 ‘mysql-pv-claim’ PVC를 사용하고 있는 것을 알 수 있음

# PVC 확인
% kubectl get pvc
NAME             STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Bound    mysql-pv-volume   20Gi       RWO            manual         99m

3.3.6.8 PVC 삭제 해보자

# PVC 삭제
% kubectl delete pvc mysql-pv-claim
persistentvolumeclaim "mysql-pv-claim" deleted
# 멈춤

# PVC 상태 확인
% kubectl get pvc
NAME             STATUS        VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
mysql-pv-claim   Terminating   mysql-pv-volume   20Gi       RWO            manual         102m

# PVC 상세 확인
% kubectl describe pvc
Name:          mysql-pv-claim
Namespace:     default
StorageClass:  manual
Status:        Terminating (lasts 2m6s)
Volume:        mysql-pv-volume
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed: yes
               pv.kubernetes.io/bound-by-controller: yes
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      20Gi
Access Modes:  RWO
VolumeMode:    Filesystem
Used By:       mysql-68579b78bb-vbt8f
Events:        <none>
  • mysql-pv-claim 의 STATUS 가 Terminating 이 되었음
  • Finalizers: [kubernetes.io/pvc-protection] 적용 됨

  1. PV 퍼시스턴트 볼륨 (Persistent Volume)

  2. PVC 퍼시스턴트 볼륨 클레임 (Persistent Volume Claim)