Table of Contents
Kubernetes – local-storage
우선 여기 를 참조하여,
local-storage 에 어떤 제약사항이 있고,
회피하기 위해서는 어떤 조치를 취해야 하는지 확인해야 합니다.
아래 내용은 데이타를 저장하기 위한 용도로 local-storage
를 사용했고,
제약사항을 회피하기 위해,
각 node 에 각각 하나의 PV 를 생성하고,
또 node 에 Pod 도 하나씩만 생성되도록 하는 설정입니다.
StorageClass 생성
StorageClass 에는 namespace 를 지정할 수 없다.
vi local-storage-class.yaml
---------------------------
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---------------------------
kubectl create -f local-storage-class.yaml
디렉토리 생성
모든 노드에 동일한 디렉토리를 생성해야 한다.
sudo mkdir -p /data/my-app
# docker image 상의 계정 user/group 이 필요하다.
# ex : 472:472 for grafana
# sudo chown -R 유저:그룹 /data/my-app
# chmod 755 /data/my-app
chmod 777 /data/my-app
PV 생성
PV 를 여러개 생성해야 하면,
my-app-pv-0, my-app-pv-1, my-app-pv-2 … 로 만들어줍니다.
claimRef 는 {volumeClaimTemplate 이름}-{statefulset 이름}-숫자 형식입니다.
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-app-pv-0
namespace: my-app
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
claimRef:
name: myappvol-my-app-0
namespace: my-app
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/my-app # 호스트 폴더경로
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- mynode-0 # 노드 이름(hostname, 소문자로 입력)
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: my-app-pv-1
namespace: my-app
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
claimRef:
name: myappvol-my-app-1
namespace: my-app
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/my-app # 호스트 폴더경로
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- mynode-1 # 노드 이름(hostname, 소문자로 입력)
StatefulSet 생성
volumeClaimTemplates 에 의해,
myappvol-my-app-0, myappvol-my-app-1 형식의 PVC 를 자동으로 생성합니다.
replicas 갯수 이상의 PV 를 미리 만들어 두어야 합니다.
부족한 경우 pending 이 됩니다.
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-app ## Statefulset 이름
namespace: my-app
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 2
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: myappvol
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: myappvol # volumeClaimTemplate 이름
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: local-storage
resources:
requests:
storage: 100Gi
Headless Service
만약 외부에 서버를 오픈해야 한다면,
아이피 대신 도메인을 이용해 접근하도록 변경해 주어야 한다.
각각의 Pod 에 각각 다른 데이타가 저장되므로,
특정서버로 접속해야 하기 때문이다.