728x90
emptyDir
- Pod 내에서 여러 컨테이너들이 데이터를 일시적으로 저장하는데 사용된다.
- Pod 수명동안 존재하며, Pod가 삭제되면 emptyDir 내용도 사라진다.
- 로컬 디스크 또는
tmpfs
(메모리 기반 파일 시스템)을 사용학 떄문에 높은 속도를 제공할 수 있다.
예시
container-1
은/data/hello.txt
파일을 생성한다.container-2
는 동일한/data
경로를 마운트하여,container-1
이 생성한hello.txt
파일을 읽는다.- 두 컨테이너가 동일한
emptyDir
볼륨을 마운트하여 데이터를 공유할 수 있습니다.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: container-1
image: busybox
command: ["sh", "-c", "echo 'Hello World' > /data/hello.txt"]
volumeMounts:
- mountPath: /data
name: shared-data
- name: container-2
image: busybox
command: ["sh", "-c", "cat /data/hello.txt"]
volumeMounts:
- mountPath: /data
name: shared-data
volumes:
- name: shared-data
emptyDir: {}
medium: "Memory"
- 메모리 기반으로 설정하는 옵션이며, 디스크가 아닌 RAM 을 사용하여 데이터를 저장한다.
- 메모리 리소스 사이즈는 Pod 리소스 요청에 따라 할당된다.
- 일시적인 캐시, 세션 데이터, 연산 결과, 로그 버퍼, 미디어 파일 중간 결과 저장 등에 사용된다.
apiVersion: v1
kind: Pod
metadata:
name: memory-based-pod
spec:
containers:
- name: app
image: your-image
volumeMounts:
- mountPath: /tmp/data
name: memory-volume
volumes:
- name: memory-volume
emptyDir:
medium: "Memory" # 이 볼륨은 메모리에서 데이터가 처리됩니다.
hostpath
- 노드의 로컬 파일 시스템을 Pod에 마운트하는 방식으로, 노드의 특정 경로를 Pod에 직접 연결할 수 있다.
- 그래서 일반적으로 DaemonSet 에 많이 사용된다.
hostpath가 DaemonSet에 많이 사용되는 이유
DaemonSet
은ReplicaSet
가 다르게 모든 노드에 Pod를 배포하기 떄문에 유용하다.ReplicaSet
은 모든 노드에 배포된다는 보장이 없기 때문이다.- 호스트 노드 자체에 의존하게 되고, 만약 노드 간 데이터 공유가 필요하다면 PersistentVolume(PV) 과 PersistentVolumeClaim(PVC) 를 써야한다.
- 사실 특정 노드에 의존하는 경우를 모르겠다. 특정 노드에 의존할 정도면 다른 Pod 로 만드는게 맞지 않나 싶다. 🔨
PV (Persistent Volume) 와 PVC (Persistent Volume Claim) 그리고 동적 프로비저닝
PV는 실제로 존재하는 스토리지(예: EBS, NFS, 로컬 디스크 등)를 정의하고, PVC는 "나는 10Gi 용량과 ReadWriteOnce 모드를 가진 스토리지가 필요해"라는 요구를 표현한다.
PV
- 클러스터 내의 실제 스토리지 리소스를 나타낸다.
- 스토리지 자원은 클러스터 관리자가 제공하거나, 동적 프로비저닝을 통해 생성할 수 있다.
주요 구성 요소
- capacity: PV가 제공하는 스토리지 용량 (10Gi, 100Gi 등)
- accessModes: PV에 대한 액세스 모드 (
ReadWriteOnce
,ReadOnlyMany
,ReadWriteMany
등) - persistentVolumeReclaimPolicy: PV가 삭제될 때의 처리 방식. 기본적으로 ()
Retain
,Recycle
,Delete
)Recycle
은 공식문서에서 권장하지 않음
- storageClassName: PV가 속한 스토리지 클래스
- volumeMode: PV에서 데이터를 어떻게 저장할지에 대한 설정 (
Filesystem
또는Block
이 사용)- 기본적으로 파라미터가 생략하면
Filesystem
이며,Block
으로 사용하는 경우는 DB 같이 성능이 중요한 서비스의 경우 파일 시스템 없이 원시 디스크 블록에 직접 접근할 수 있도록 쓸 수 있다.
- 기본적으로 파라미터가 생략하면
예시
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-manual-pv
spec:
capacity:
storage: 10Gi # PV 용량
accessModes:
- ReadWriteOnce # Pod에서 읽기/쓰기 권한
persistentVolumeReclaimPolicy: Retain # PVC가 삭제되도 PV는 유지
storageClassName: manual # StorageClass 설정
volumeMode: Filesystem
hostPath:
path: /mnt/data # 수동으로 지정한 로컬 디렉토리
PVC
- 사용자가 필요한 스토리지 자원을 요청하는 객체 다.
- PV가 실제 스토리지 정의라고 생각하면 추상화해서 접근하는 방식으로 보인다.
주요 구성 요소
- accessModes: PVC에 대한 액세스 모드 (
ReadWriteOnce
,ReadOnlyMany
,ReadWriteMany
등) - resources.requests.storage: PVC가 요청하는 스토리지 용량. (예: 10Gi)
- PVC 가 요구하는 용량은 PV 설정을 넘어갈 수 없다.
- storageClassName: PVC가 요청하는 스토리지 클래스. 스토리지 종류를 구분
- volumeMode: PVC에서 요구하는 데이터의 저장 모드입니다.
Filesystem
이나Block
으로 설정
예시
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: manual-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: manual # 해당 StorageClass 사용
동적 프로비저닝
- 수동으로 PV를 정의할 필요없이 PVC 생성시 자동으로
StorageClass
와 연결하여 생성한다.
예시
AWS EBS로 만든 예시이다.
StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ebs-sc # StorageClass 이름
provisioner: kubernetes.io/aws-ebs # AWS EBS 프로비저너 사용
parameters:
type: gp2 # EBS 볼륨 타입 (일반 SSD)
reclaimPolicy: Retain # PVC 삭제 시 PV 유지
allowVolumeExpansion: true # 볼륨 크기 확장 가능
PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ebs-pvc-dynamic
spec:
accessModes:
- ReadWriteOnce # Pod에서 읽기/쓰기 권한
resources:
requests:
storage: 10Gi # 요청하는 스토리지 용량
storageClassName: ebs-sc # 동적 프로비저닝을 위한 StorageClass
VolumeClaimTemplate
StatefulSet
에서 사용되는 특별한 리소스로 각 Pod 에 대해서 PVC를 생성하는 데 사용된다.StatefulSet
은 고유한 상태를 가지므로 고유한 스토리지를 제공할 수 있게 한다.
ReadWriteOnce
로 각각 의 PV의 독립성을 보장한다.
예시
- mysql 레플리카와 VolumeClaimTemplate의 사용 예시
- StatefulSet
replicas: 3
:replicas
가 3으로 설정되어 있습니다. 따라서mysql-0
,mysql-1
,mysql-2
세 개의 Pod이 생성된다. 이들 각각은 MySQL의 마스터와 두 개의 슬레이브로 동작할 수 있다.
volumeClaimTemplates
:volumeClaimTemplates
는 각 Pod에 대해 고유한 PersistentVolumeClaim(PVC) 을 생성합니다. 예를 들어,mysql-0
Pod는mysql-pvc-0
,mysql-1
Pod는mysql-pvc-1
,mysql-2
Pod는mysql-pvc-2
라는 이름의 PVC를 생성하게 된다. 이 PVC는 각 Pod에 고유한 PersistentVolume(PV) 와 연결됩니다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: "mysql"
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
initContainers:
- name: init-replication
image: mysql:5.7
command:
- sh
- -c
- |
if [ "$MYSQL_REPLICATION_MODE" == "mysql-0" ]; then
echo "Initializing Master..."
mysql -u root -p$MYSQL_ROOT_PASSWORD -e "CREATE USER 'replica'@'%' IDENTIFIED BY 'replica_password'; GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';"
else
echo "Initializing Slave..."
mysql -u root -p$MYSQL_ROOT_PASSWORD -e "CHANGE MASTER TO MASTER_HOST='mysql-0.mysql', MASTER_USER='replica', MASTER_PASSWORD='replica_password'; START SLAVE;"
fi
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpassword"
- name: MYSQL_REPLICATION_MODE
valueFrom:
fieldRef:
fieldPath: metadata.name
containers:
- name: mysql
image: mysql:5.7
env:
- name: MYSQL_ROOT_PASSWORD
value: "rootpassword"
- name: MYSQL_DATABASE
value: "mydb"
- name: MYSQL_USER
value: "myuser"
- name: MYSQL_PASSWORD
value: "mypassword"
- name: MYSQL_REPLICATION_MODE
valueFrom:
fieldRef:
fieldPath: metadata.name
ports:
- containerPort: 3306
volumeMounts:
- name: mysql-pvc
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-pvc # PVC 이름
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 5Gi
storageClassName: standard
- Service
clusterIP: None
: 이는 Headless Service로 설정되어,mysql-0
,mysql-1
,mysql-2
와 같은 각 Pod에 대해 고유한 DNS 이름을 제공할 수 있다.- 예를 들어,
mysql-0.mysql
,mysql-1.mysql
,mysql-2.mysql
로 접근할 수 있게 된다.
- 예를 들어,
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
clusterIP: None # Headless Service 설정
selector:
app: mysql
ports:
- port: 3306
728x90
'Engineering > K8S' 카테고리의 다른 글
application Probe (0) | 2024.12.20 |
---|---|
Control Plane 컴포넌트와 Node 컴포넌트 (+ taint, toleration, affinity, anti-affinity) (1) | 2024.12.19 |
Service with NodePort, ClusterIP, LoadBalancer, Ingress (0) | 2024.12.02 |
StatefulSet (1) | 2024.11.27 |
DaemonSet (0) | 2024.11.27 |