brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jul 11. 2021

쿠버1탄-25.쿠버네티스-스토리지 pv , pvc(선택

다음은 쿠버네티스 스터디 자료를 참고해  정리한 내용입니다.


<1>  Kops로 K8S 클러스터 배포 

<2> EBS 볼륨 생성

<3> pv 생성 과 확인

<4>  PVC 파드 생성 

<5> 삭제



쿠버네티스-도메인 없이 kops로 aws쿠버설치

https://brunch.co.kr/@topasvga/1681



파드 YAML 에 볼륨을 정의는  불편하다.

스토리지 종류(NFS, iSCSI 등)이 달라지면 여러가지 YAML 생성 및 관리 필요

따라서, PV, PVC 오브젝트가 나옴






<1>  Kops로 K8S 클러스터 배포 

쿠버네티스-도메인 없이 kops로 aws쿠버설치

https://brunch.co.kr/@topasvga/1681



<2> EBS 볼륨 생성


1

터미널1

watch -d kubectl get pod,pv,pvc,sc -o wide


기본 툴 설치

sudo apt install awscli jq tree -y


2

awscli 로 5Gi EBS 생성(서울 리전)

kpos 로 설치한 쿠버네티스의 경우 EBS 볼륨을 퍼시스턴트 볼륨으로 사용하려면 해당 EBS 볼륨에 KubernetesCluster=<클러스터 이름> 형식의 특수한 태그가 필요함


export VOLUME_ID=$(aws ec2 create-volume --size 5 --region ap-northeast-2 --availability-zone ap-northeast-2a --volume-type gp3 \

--tag-specifications 'ResourceType=volume,Tags=[{Key=KubernetesCluster,Value=<자신의 도메인 네임>}]' |jq '.VolumeId' -r)


// 도쿄 리전에 생성 

export VOLUME_ID=$(aws ec2 create-volume --size 5 --region ap-northeast-1 --availability-zone ap-northeast-1a --volume-type gp3 --tag-specifications 'ResourceType=volume,Tags=[{Key=KubernetesCluster,Value=seo9.cndk.k8s}]' |jq '.VolumeId' -r)


3

echo $VOLUME_ID

ubuntu@ip-172-20-60-135:~$ echo $VOLUME_ID

vol-0cdbf5a67cbbbd156



<3> pv 생성 과 확인


1

cat << EOF > ebs-pv.yaml

apiVersion: v1

kind: PersistentVolume

metadata:

  name: ebs-pv

spec:

  capacity:

    storage: 5Gi      

  accessModes:

    - ReadWriteOnce    

  awsElasticBlockStore:

    fsType: ext4

    volumeID: vol-0cdbf5a67cbbbd156

EOF


2

pv 생성 과 확인


PV 퍼시스턴트 볼륨 생성

k apply -f ebs-pv.yaml


ubuntu@ip-172-20-60-135:~$ k apply -f ebs-pv.yaml

persistentvolume/ebs-pv created


확인

kubectl  get pv -o wide


ubuntu@ip-172-20-60-135:~$ kubectl  get pv -o wide

NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE   VOLUMEMODE

ebs-pv   5Gi        RWO            Retain           Available                                   28s   Filesystem


kubectl describe pv ebs-pv





<4>  PVC 파드 생성 


PVC 파드 생성 


1

cat << EOF > ebs-pvc-pod.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: ebs-pvc        

spec:

  storageClassName: ""

  accessModes:

    - ReadWriteOnce       

  resources:

    requests:

      storage: 5Gi        

---

apiVersion: v1

kind: Pod

metadata:

  name: ec2-pod

spec:

  containers:

    - name: container

      image: ubuntu

      args: [ "tail", "-f", "/dev/null" ]

      volumeMounts:

      - name: ebs-volume

        mountPath: /mnt

  volumes:

  - name : ebs-volume

    persistentVolumeClaim:

      claimName: ebs-pvc

EOF



2

PVC 파드 생성 


# 생성

kubectl apply -f ebs-pvc-pod.yaml


ubuntu@ip-172-20-60-135:~$ kubectl apply -f ebs-pvc-pod.yaml

persistentvolumeclaim/ebs-pvc created

pod/ec2-pod created


3

확인

 k get pod

ubuntu@ip-172-20-60-135:~$ k get pod

NAME      READY   STATUS    RESTARTS   AGE

ec2-pod   1/1     Running   0          47s


4

kubectl get pv


ubuntu@ip-172-20-60-135:~$ kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY  STATUS  CLAIM STORAGECLASS REASON  AGE

ebs-pv   5Gi        RWO            Retain           Bound    default/ebs-pvc                           4m56s



5

kubectl get pvc


ubuntu@ip-172-20-60-135:~$ kubectl get pvc

NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE

ebs-pvc   Bound    ebs-pv   5Gi        RWO                           92s




6

파드 Shell 에서 확인

kubectl exec -it ec2-pod -- bash

df -hT --type ext4

root@ec2-pod:/#  df -hT --type ext4

Filesystem     Type  Size  Used Avail Use% Mounted on

/dev/nvme1n1   ext4  4.9G   20M  4.9G   1% /mnt

/dev/root      ext4  125G  4.7G  120G   4% /etc/hosts


fallocate -l 1G /mnt/1G.dummy

 for i in {1..100}; do touch /mnt/deleteme.$i; done;


root@ec2-pod:/mnt# ls

1G.dummy      deleteme.15  deleteme.22  deleteme.3   deleteme.37  deleteme.44  deleteme.51  deleteme.59  deleteme.66  deleteme.73  deleteme.80  deleteme.88  deleteme.95

deleteme.1    deleteme.16  deleteme.23  deleteme.30  deleteme.38  deleteme.45  deleteme.52  deleteme.6   deleteme.67  deleteme.74  deleteme.81  deleteme.89  deleteme.96

deleteme.10   deleteme.17  deleteme.24  deleteme.31  deleteme.39  deleteme.46  deleteme.53  deleteme.60  deleteme.68  deleteme.75  deleteme.82  deleteme.9   deleteme.97

deleteme.100  deleteme.18  deleteme.25  deleteme.32  deleteme.4   deleteme.47  deleteme.54  deleteme.61  deleteme.69  deleteme.76  deleteme.83  deleteme.90  deleteme.98

deleteme.11   deleteme.19  deleteme.26  deleteme.33  deleteme.40  deleteme.48  deleteme.55  deleteme.62  deleteme.7   deleteme.77  deleteme.84  deleteme.91  deleteme.99

deleteme.12   deleteme.2   deleteme.27  deleteme.34  deleteme.41  deleteme.49  deleteme.56  deleteme.63  deleteme.70  deleteme.78  deleteme.85  deleteme.92  lost+found

deleteme.13   deleteme.20  deleteme.28  deleteme.35  deleteme.42  deleteme.5   deleteme.57  deleteme.64  deleteme.71  deleteme.79  deleteme.86  deleteme.93

deleteme.14   deleteme.21  deleteme.29  deleteme.36  deleteme.43  deleteme.50  deleteme.58  deleteme.65  deleteme.72  deleteme.8   deleteme.87  deleteme.94

exit



7

파드 삭제 ?

kubectl delete pod ec2-pod

ubuntu@ip-172-20-60-135:~$ kubectl delete pod ec2-pod

pod "ec2-pod" deleted


kubectl get pv

ubuntu@ip-172-20-60-135:~$ kubectl get pv

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS   REASON   AGE

ebs-pv   5Gi        RWO            Retain           Bound    default/ebs-pvc                           10m


kubectl get pvc

ubuntu@ip-172-20-60-135:~$ kubectl get pvc

NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE

ebs-pvc   Bound    ebs-pv   5Gi        RWO                           8m11s



8

PVC 삭제?

kubectl delete pvc ebs-pvc


 kubectl get pv

ubuntu@ip-172-20-60-135:~$  kubectl get pv

NAME CAPACITY ACCESS MODES  RECLAIM POLICY STATUS CLAIM STORAGECLASS  REASON   AGE

ebs-pv   5Gi        RWO            Retain           Released   default/ebs-pvc                           13m


9

pvc 재생성

kubectl apply -f ebs-pvc-pod.yaml


확인 ?

파드 Pending 상태

kubectl get pod

ubuntu@ip-172-20-60-135:~$ kubectl get pod

NAME      READY   STATUS    RESTARTS   AGE

ec2-pod   0/1     Pending   0          108s


PVC Pending 상태

kubectl get pv,pvc


ubuntu@ip-172-20-60-135:~$ kubectl get pv,pvc

NAME CAPACITY  ACCESS MODES  RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON   AGE

persistentvolume/ebs-pv   5Gi        RWO   Retain  Released   default/ebs-pvc                           16m


NAME                  STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE

persistentvolumeclaim/ebs-pvc   Pending                                                     2m7s


10

# PV 상태가 Released 로 바로 사용이 안된다 > PV를 삭제 후 다시 PV만생성하자! >> 조금 시간이 지나면 알아서 컨트롤러가 파드를 정상 생성 완료해준다!

kubectl delete pv ebs-pv

cat ebs-pv.yaml | sed "s/<VOLUME_ID>/$VOLUME_ID/g" | kubectl apply -f -


확인

k get pod

ubuntu@ip-172-20-60-135:~$ k get pod

NAME      READY   STATUS    RESTARTS   AGE

ec2-pod   1/1     Running   0          6m6s


11

파드에서 PV 마운트 볼륨 확인 > 데이터가 보존되어있다!

kubectl exec -it ec2-pod -- ls /mnt


ubuntu@ip-172-20-60-135:~$ kubectl exec -it ec2-pod -- ls /mnt

1G.dummy      deleteme.23  deleteme.39  deleteme.54  deleteme.7   deleteme.85

deleteme.1    deleteme.24  deleteme.4   deleteme.55  deleteme.70  deleteme.86

deleteme.10   deleteme.25  deleteme.40  deleteme.56  deleteme.71  deleteme.87

deleteme.100  deleteme.26  deleteme.41  deleteme.57  deleteme.72  deleteme.88

deleteme.11   deleteme.27  deleteme.42  deleteme.58  deleteme.73  deleteme.89

deleteme.12   deleteme.28  deleteme.43  deleteme.59  deleteme.74  deleteme.9





<5> 삭제


1

 kubectl delete pod,pvc,pv --all

 kubectl delete ns,no,po,svc,deploy,rs,ing,ep,pv,pvc --all 


 k get ns,no,po,svc,deploy,rs,ing,ep,pv,pvc


2

클러스터 삭제 

echo $NAME

kops delete cluster $NAME --yes




다음 과정

https://brunch.co.kr/@topasvga/1724


https://brunch.co.kr/@topasvga/1656


감사합니다.

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari