다음은 쿠버네티스 스터디 자료를 참고해 정리한 내용입니다.
<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
감사합니다.