Docker 컨테이너에 저장된 데이터는 일시적입니다. 즉, 컨테이너가 살아있을 때까지만 존재합니다.
Kubernetes는 실패하거나 충돌 한 컨테이너 (동일한 포드에서)를 다시 시작할 수 있지만 컨테이너 파일 시스템에 저장한 데이터는 손실됩니다.
Kubernetes는 Volumes의 도움으로 문제를 해결합니다. 외부 클라우드 스토리지 (예 : Azure Disk, Amazon EBS, GCE Persistent Disk 등), Ceph, GlusterFS 등과 같은 네트워크 파일 시스템을 포함한 다양한 유형의 볼륨을 지원합니다.
출처 : https://itnext.io/learn-about-the-basics-of-kubernetes-persistence-part-1-b1fa2847768f
mysql my.cnf 파일의 datadir이 데이터가 저장되는 위치이다.
[mysqld]
user = root
datadir = /var/lib/mysql
spec:
restartPolicy: Always
containers:
- image: mysql:latest
imagePullPolicy: Never
name: mysql
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-pv
mountPath: /var/lib/mysql
volumes:
- name: mysql-pv
persistentVolumeClaim:
claimName: mysql-pv
spec.volumes : 사용 가능한 볼륨 이름 (예 : mysql-pv) 및 기타 특성을 선언합니다.
spec.containers.volumeMounts :
spec.volumes (예 : mysql-pv)에 선언 된 볼륨을 가리키고 컨테이너 파일 시스템 (예 : /var/lib/mysql) 내에서 해당 볼륨을 마운트하려는 위치를 정확히 지정합니다.
Pod에는 spec.volumes에 선언 된 볼륨이 두 개 이상있을 수 있습니다. 이러한 각 볼륨은 pod의 모든 컨테이너에서 액세스 할 수 있지만 모든 컨테이너가 모든 볼륨을 마운트하거나 사용하는 것이 필수는 아닙니다.
필요한 경우 pod 내의 컨테이너는 파일 시스템의 다른 경로에 둘 이상의 볼륨을 마운트 할 수 있습니다. 또한 여러 컨테이너가 동시에 단일 볼륨을 마운트 할 수 있습니다.
apiVersion: v1
kind: Service
metadata:
name: mysql
labels:
app: mysql
spec:
type: ClusterIP
selector:
app: mysql
ports:
- name: mysql
port: 3306
protocol: TCP
targetPort: 3306
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv
labels:
app: mysql
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
실행
cd ../mysql
echo "mysql image build"
docker build -t mysql:latest .
echo "apply yaml"
kubectl apply -f mysql.yaml
결과
deployment.apps/mysql created
service/mysql created
persistentvolumeclaim/mysql-pv created