기본적인 kubernetes resource, option 등을 설명한 블로그입니다. 추가적인 기능을 보고싶으시면 docs를 참고바랍니다.
https://kubernetes.io/docs/home/
- Volume은 kubernetes 스토리지의 추상화 개념. container는 pod에 바인딩 되는 volume을 마운트한다.
kind: Pod
...
spec:
...
volumes:
- name: [volume name]
hostPath: # NFS, EBS, FC 등등 많은 종류의 volume이 있다.
path: [path, file or dir in Node]
type: DirectoryOrCreate # directory이며 없으면 생성. File, FileOrCreate, Directory가 있다.
containers:
...
volumeMounts:
- name: [volume name]
mountPath: [Mount path in container]
- 만약 노드가 많을 경우 각각의 노드에 hostpath가 마운트되기 때문에 nfs나 aws같은 다른 volume types을 찾는 것이 좋다.
volumes:
- name: data-volume
awsElasticBlockStore:
volumeID: [volume id]
fsType: ext4
kind: Pod
...
spec:
...
volumes:
- name: [volume name]
emptyDir: {} # 한 파드안의 여러 container가 share하는 빈 mount 공간.
kind: Pod
...
spec:
...
volumes:
- name: [volume name]
nfs: # nfs server의 파일 공간을 mount해서 사용하도록 하여, 노드끼리 shared 공간을 사용하도록.
server: nfs.server.name # nfs server ip.
path: /share/dir/path # nfs server의 mount dir
- fc, nfs, iscs2, hostpath 등등 volume이 굉장히 많아서 이러한 것들을 각각 파드마다 환경에 따라 관리를 해줘야하기 때문에 volume들을 pv1, pv2 ... 로 묶어서 pool을 만든다.
- kubernetes가 pod를 생성할 때 필요한 디스크를 요청할때 조건(1TB, rwo)과 함께 pvc를 주면 pv pool에서 해당하는 volume을 준다.
# PersistentVolume 생성
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv
spec:
capacity:
storage: [storage_size, ex) 2Gi]
accessModes:
- ReadWriteOnce
- ReadOnlyMany
storageClassNmae: "manual"
persistentVolumeReclaimPolicy: Retain
nfs:
server: [nfs server]
path: [mount path]
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myclain
spec:
resources:
requests:
storage: [size]
accessModes:
- ReadWriteOnce
- ReadOnlyMany
storageClassNmae: "manual"
selector:
matchLabels:
release: "stable"
persistentVolumeReclaimPolicy: Recycle #default로 retain
# retain: pvc가 delete되도 pv는 manual하게 삭제하지 않으면 남아있으며,
# 다른 claim에 재사용되어지지 않는다.
# delete: pvc가 delete되면 pv도 delete된다.
# recycle: pvc가 delete되면 다른 claim이 쓸 수 있게된다.
- kubectl get pv, kubectl get pvc로 볼 수 있다.
...
spec:
...
volumes:
- name: name
persistentVolumeClaim:
claimName: [pvc name]
- 하지만 static provisioning은 storage를 직접 할당하여 주는것이며, dynamic provisioning을 통해 pv를 생성하지 않고 pvc에 해당 provisioner를 넘겨주면 자동으로 volume이 할당된다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: google-storage
provisioner: kubernetes.io/gce-pd
parameters:
type: pd-standard
replication-type: none
- 따라서 pv definition은 필요없고 아래와 같이 pvc에 넣어주면 자동으로 할당된다.
apiVersion: v1
kind: persistentVolumeClaim
metadata:
name: myclaim
spec:
accessModes:
- ReadWriteOnce
storageClassName: google-storage
resources:
requests:
storage: 500Mi
- pod에 할당된 pvc를 delete시키면 terminating상태에 있는데, pod가 delete되면 pvc도 그때서야 없어진다. pvc에 bound되어진 pv는 access mode가 retain이라면 released상태로 된다.
- PV는 storageClassName 속성을 스토리지클래스의 이름으로 설정하여 지정하는 클래스를 가질 수 있다. 특정 클래스의 PV는 해당 클래스를 요청하는 PVC에만 바인딩될 수 있다. storageClassName이 없는 PV에는 클래스가 없으며 특정 클래스를 요청하지 않는 PVC에만 바인딩할 수 있다.
'kubernetes, helm, rancher' 카테고리의 다른 글
kubernetes cluster upgrade (0) | 2022.01.02 |
---|---|
kubernetes Auto Scaling, metric server (0) | 2021.12.08 |
kubernetes auth, certificates (0) | 2021.12.02 |
kubernetes scheduling (0) | 2021.12.01 |
kubernetes configmap, secret (0) | 2021.11.30 |