공부하는 책
알면 더 쉬운 도커 쿠버네티스 복습을 위해 요약한 것.
kubernetes.io
kubernetes basic Run a Single-Instance Stateful Application
목표
kubernetes 책 3장 내용 숙지
- 쿠버네티스 오브젝트
- 쿠버네티스의 구성 요소를 가볍게 알아보자
3.3 쿠버네티스의 오브젝트
- 쿠버네티스는 모든 요소를 yaml 파일로 생성하여 관리
3.3.6 스토리지
- 컨테이너의 가장 큰 장점은 가벼움
- 컨테이너를 가볍게 하기 위해서는 상태가 없는 부분만 컨테이너화 해야한다. (실행환경O, 데이터X)
- 쿠버네티스는 볼륨 추상화 기능을 제공함
리눅스와 비교
- 리눅스: 볼륨을 지정하고 마운트만 하면 됌
- 쿠버네티스: PV, PVC가 존재. 사용법이 난해할 수 있음.
볼륨를 사용하는 방식
-
PV (Persistent Volume)
- 볼륨 리소스 그 자체
- 파드의 생명주기와는 별도로 PV를 지정하고 사용할 수 있음.
-
PVC (ersistent Volume Claim)
- 사용자가 볼륨에 요청하는 방식을 정의한 것
- PVC로 인해 파드와 PV의 의존성을 줄일 수 있다.
3.3.6.1 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)를 갖는 적절한 퍼시스턴트볼륨을 찾으면, 볼륨에 클레임을 바인딩한다.
# 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 생성
# 파드 생성
% 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 그대로 있음
생명주기
-
프로비저닝 (Provisioning)
-
바인딩 (Binding)
- 프로비저닝을 통해 생성된 PV를 PVC에 바인딩하는 단계
-
사용중 (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] 적용 됨