기초 용어
- Drive: 저장 장치
- Volume: Logical한 Drive. Drive를 논리적으로 쪼개서 만들어짐. Kubernetes에서 컨테이너가 데이터를 읽고 쓸 수 있는 공간
- Pod 중에서 어떤 것은 Storage가 필요할 수도 있다.
- => Storage를 이용 가능하게 Pod에 Volume을 붙여준다. (Mount Volume)
- Pod는 하나 이상의 Container로 구성되어 있고, 이 컨테이너들 간에 데이터를 주고 받으려면, Volume을 사용해 Storage를 연결해야 한다.
- Pod 중에서 어떤 것은 Storage가 필요할 수도 있다.
emptyDir, hostPath
- emptyDir
- 임시적인 Volume. 캐시나 로그 등 임시 데이터를 저장하는데 쓰인다.
- Pod가 죽었다가 살아나면 사라진다.
- hostPath
- Pod 내에 Volume을 만드는게 아니라, Node의 파일 시스템을 볼륨으로 만들어서 이것을 Pod(Container)에 마운트 시켜주는 것이다.
- Node의 Life Cycle에 영향을 받는다.
- Node가 죽었다 살아나면 사라진다.
- Node의 Life Cycle에 영향을 받는다.
- Pod 내에 Volume을 만드는게 아니라, Node의 파일 시스템을 볼륨으로 만들어서 이것을 Pod(Container)에 마운트 시켜주는 것이다.
- 그래서 보통 Remote Storage를 사용해서, 더 안정적인 PV와 PVC, StorageClass를 사용한다.
Storage Requirement
- Storage는 Pod의 Life Cycle에 영향을 받지 않아야 한다.
- Storage는 모든 Node에서 접근 가능해야 한다.
- Pod를 Deploy할 때, scheduler가 어느 노드에 돌릴지 결정하니까.
- Pod가 죽었다가 살아날 때 같은 Node에서 실행되는게 아니니까.
- Storage는 Cluster가 crash가 나도 살아남아야 한다.
- Pod가 동작하는 Cluster 말고 다른 곳에 있어야 한다.
- Pod와 Storage는 다른 곳에 두어야 한다.
PersistentVolume, PersistentVolumeClaim
- 엔지니어가 PV를 만들면, Volume 사용자가 PVC로 PV를 사용하겠다고 한다.
- PersistentVolume은 어느 namespace에도 속해있으면 안된다. 모든 노드가 접근 가능해야 하니까.
- PersistentVolumeClaim은 그것을 사용할 Pod와 같은 네임스페이스에 있어야 한다.
- PVC에서 사용자는 필요한 스토리지의 크기와 접근 방식을 명시하면, K8S가 알아서 적절한 PV와 연결해준다.
- PVC는 PV와 연결되어야만 사용할 수 있다.
# PV yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: test-pv-3
spec:
capacity:
storage: 3Gi
accessModes:
-ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
local:
path: /tmp
nodeAffinity:
required:
nodeSelectorTerms:
-matchExpressions:
key: kubernetes.io/hostname
operator: In
value:
hostname
# PVC yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc-2
namespace: a
spec:
resources:
requests:
storage: 2Gi
accessModes:
-ReadWriteOnce
# Pod yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pod-a
namespace: a
spec:
containers:
-name: test-container
image: kubetm/init
volumeMounts:
name: test-pvc
mountPath: /test
volumes:
name: test-pvc
persistentVolumeClaim:
-claimName: test-pvc-2
- volumeMounts:
- mountPath:
- 이를 통해 container가 volume을 갖게 된다.
- mountPath:
StorageClass
PVC를 만들었는데 적절한 PV가 없으면 PVC를 사용하지 못함. 그러면 엔지니어가 PV를 빨리 만들어야 하는데, 이는 너무 번거롭고 비효율적임. 그래서 PVC를 만들면 동적으로 PV가 만들어지게 하는 것이 StorageClass.
# StorageClass yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: storage-class-name
provisoner: kubernetes.io/aws-ebs
parameters:
type: io1
iopsPerGB: "10"
fsType: ext4
# PVC yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mypvc
spec:
accessModes:
-ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: storage-class-name
PVC의 storageClassName 필드에 미리 만들어둔 StorageClass의 name을 적어 동적으로 요청한다.
Secret, ConfigMap
- 이 두가지는 누구나 써야하는, 무조건 있어야 하는 특별한 용도의 Volume이다.
- Secret과 ConfigMap은 만들지 않아도 자동으로 존재한다.
- Secret
- 민감한 데이터를 저장하고 관리하는 데 사용된다.
- 예를 들어, 패스워드, API 키, 인증서 같은 데이터를 Secret에 저장하여, 애플리케이션이 안전하게 해당 데이터를 참조할 수 있게 한다.
- Secret은 일반적으로 base64로 인코딩되며, 클러스터 내에서 접근 제어를 통해 보호된다.
- ConfigMap
- 민감하지 않은 설정 데이터를 저장하는 데 사용된다.
- 예를 들어, 환경 변수, 구성 파일, 커맨드라인 옵션 등을 관리할 수 있으며, 애플리케이션이 이를 참조하여 동작 방식을 제어할 수 있다.
728x90
'클라우드' 카테고리의 다른 글
Kubernetes Principles (0) | 2024.10.15 |
---|---|
K8S 네트워킹 (1) | 2024.10.11 |
Deployment 리소스 생성시 흐름 (0) | 2024.10.10 |
Kubernetes Basic - 2 (2) | 2024.10.08 |
Restful API (1) | 2024.10.06 |