Kubernetes Volume [Dynamic Provisioning]
[kubernetes volume 관련 글 목록]
Kubernetes Volume Object 개념
Kubernetes Volume [Static Provisioning]
Kubernetes Volume [Dynamic Provisioning]
Kubernetes StatefulSet Controller
목표
각 Public Cloud 사(예 : AWS의 EKS, GCP의 GKE)에서
Kubernetes를 사용할 시 Default로
각 Public Cloud에서 제공하는 Storage와 매칭되어있는
StorageClass가 생성되어 있음
하지만 on-premise 환경의 Kubernetes의 경우 default StorageClass 는 없음
on-premise 환경에서 Volume을 Dynamic Provisioning 방식으로 사용하기 위해
StorageClass를 Public Cloud에서 제공하는 Storage로 설정할 수도 있지만
Test환경에서 과금을 피하기 위해
NFS Server를 Dynamic Provisioning StorageClass로 사용해봄.
Kubernetes Volume을 이해하기 위해
Dynamic Provisioning 방식으로
on-premise 환경에서 NFS Server Volume을 사용해봄.
kubernetes volume 개념 글을 반드시 이해해야함.
해당 글에서 Dynamic Provisioning 과 StorageClass를 알아야함.
환경
Master Node server
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
Worker Node server
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
Kubernetes version
1.18
Dynamic Provisioning NFS Server 사용.
NFS Server를 Dynamic Provisioning으로 사용해보겠음.
On-premise 환경에서 kubernetes Test 중 이라서
NFS Server를 Dynamic Provisioning 으로 사용하기 위해
NFS Provisioner Pod가 Dynamic 방식으로 PV를 생성 해주는 방식을 사용.
1. NFS Server 구성
Volume 종류 중 외부 디스크 (Network Stroage)를 사용하는 방법 중 하나인
NFS를 구성해놓아야함.
NFS란?
네트워크 상에서 다른 컴퓨터의 파일 시스템을 마운트해서 공유하는 것을 의미.
다른 컴퓨터의 파일 시스템을 사용할 수 있음
Network Attached Storage
1:N 지원
NFS 서버 구성
1. NFS서버 패키지 설치
yum install -y portmap nfs-utils libssapi
2. NFS서버 exports 설정
mkdir /k8sNFS
vi /etc/exports
NFS 서버의 특정 IP 호스트 접속을 허용하는 설정
/k8sNFS 아이피(rw,sync,no_root_squash)
주의 옵션에 띄워쓰기 없어야함
[괄호에 들어가는 옵션 설명 참고]
rw : 읽기, 쓰기 가능
ro : 읽기만 가능
secure : 클라이언트 마운트 요청시 포트를 1024 이하로 함
noaccess : 액세스 거부
root_squach : 클라이언트의 root가 서버의 root권한을 획득하는 것을 막음
no_root_squash : 클라이언트의 root와 서버의 root를 동일하게 함
sync : 파일 시스템이 변경되면 즉시 동기화.
all_squach : root를 제외하고 서버와 클라이언트의 사용자를 동일한 권한으로 설정.
no_all_squach : root를 제외하고 서버와 클라이언트의 사용자들을 하나의 권한을 가지도록 설정.
3. NFS 실행
systemctl start nfs
systemctl start rpcbind
4. NFS 공유 디렉토리 정상동작 확인
exportfs -v
NFS 클라이언트 구성
client에서 진행
1. NFS 패키지 설치
yum install -y nfs-utils
2. mount 후 정상동작 확인
mount -t nfs 10.0.2.5:/k8sNFS /kubeYamlTest/volume_test/k8sNfsMount
df -h
정상동작 확인 후 mount 해제
umount -t nfs 10.0.2.5:/k8sNFS /kubeYamlTest/volume_test/k8sNfsMount
2. Service Account 생성.
NFS Provisioner Pod가 kubernetes cluster에 PV를 배포할 수 있는 권한이 필요함.
PV를 배포할 수 있는 ClusterRole, Role을 가진 Service Account 를 생성함.
해당 SA는 이후 NFS Provisioner Deployment에서 사용할 것임.
[sa.yaml]
kind: ServiceAccount apiVersion: v1 metadata: name: nfs-pod-provisioner-sa --- kind: ClusterRole # Role of kubernetes apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-provisioner-clusterRole rules: - apiGroups: [""] # rules on persistentvolumes resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["create", "update", "patch"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-provisioner-rolebinding subjects: - kind: ServiceAccount name: nfs-pod-provisioner-sa namespace: default roleRef: # binding cluster role to service account kind: ClusterRole name: nfs-provisioner-clusterRole # name defined in clusterRole apiGroup: rbac.authorization.k8s.io --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-pod-provisioner-otherRoles rules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list", "watch", "create", "update", "patch"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: nfs-pod-provisioner-otherRoles subjects: - kind: ServiceAccount name: nfs-pod-provisioner-sa # same as top of the file # replace with namespace where provisioner is deployed namespace: default roleRef: kind: Role name: nfs-pod-provisioner-otherRoles apiGroup: rbac.authorization.k8s.io |
3. NFS Provisioner Deployment 배포.
NFS Server를 Dynamic Provisioning으로 사용할 수 있도록 해주는
NFS Provisioner Pod를 Deployment로 배포함.
[ provisioner.yaml]
kind: Deployment apiVersion: apps/v1 metadata: name: nfs-pod-provisioner spec: selector: matchLabels: app: nfs-pod-provisioner replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-pod-provisioner spec: serviceAccountName: nfs-pod-provisioner-sa # name of service account containers: - name: nfs-pod-provisioner image: quay.io/external_storage/nfs-client-provisioner:latest volumeMounts: - name: nfs-provisioner mountPath: /persistentvolumes env: - name: PROVISIONER_NAME # do not change value: iksoon-nfs-test # SAME AS PROVISIONER NAME VALUE IN STORAGECLASS - name: NFS_SERVER # do not change value: 10.0.2.5 # Ip of the NFS SERVER - name: NFS_PATH # do not change value: /k8sNFS # path to nfs directory setup volumes: - name: nfs-provisioner # same as volumemouts name nfs: server: 10.0.2.5 path: /k8sNFS |
running 상태 확인
4. StorageClass 생성
Dynamic Provisioning을 위한 StorageClass 생성.
[ storageClass.yaml ]
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: iksoon-nfs-storageclass provisioner: iksoon-nfs-test parameters: archiveOnDelete: "false" |
생성 상태
5. PVC 생성
상위에서 생성한 Storage를 바라보는 PVC를 생성
[pvc.yaml]
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: iksoon-pvc-nfs-dynamic spec: storageClassName: iksoon-nfs-storageclass # SAME NAME AS THE STORAGECLASS accessModes: - ReadWriteMany # must be the same as PersistentVolume resources: requests: storage: 1Gi |
생성상태를 확인해보면
pvc가 상위에서 생성한 storageclass와 매칭되어있는것을 확인가능.
그리고 상위에서 PV를 직접생성한적이 없지만
PV가 생성되어서 PVC와 Bound되어있는 것을 확인할 수 있음
그리고 10.0.2.5 의 NFS Server에 가보면
NFS Provisioner pod를 통해서 생성된 directory 확인가능.
6. Deployment 생성
이제 상위 Dynamic Provisioning 인 StorageClass와 연동되어있는
PVC를 사용하는 Deployment를 배포해보겠음.
[deployment.yaml]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment labels: app: iksoon-tomcat spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.4 ports: - containerPort: 8080 volumeMounts: - mountPath: /IksoonVolumeTest name: iksoon-volume volumes: - name: iksoon-volume persistentVolumeClaim: claimName: iksoon-pvc-nfs-dynamic |
생성확인
7. 생성된 Deployment 중 하나에 들어가서 Volume mount확인
/IksoonVolumeTest 경로에 마운트 된것을 확인 할 수 있음
해당 경로에 test.log파일을 생성해봄.
그리고 같은 PVC가 mount되어있는 다른Pod로 들어가서
상위에서 생성한 파일이 있는지 확인
replicaset으로 생성된 모든 pod에서 동일한 파일 확인 가능.
Public Cloud환경에서 Dynamic Provisioning .
GCP or EKS Default Storage 를 사용해서 volume Mount
GCP 의 GKE 혹은 AWS EKS 를 사용하면
kubectl get storageclass 명령 확인 시
default storage 가 존재함.
이럴 경우
PV 를 생성하지 않고 PVC 만 생성하게 되면
PVC정의 이후 PVC의 내용에 따라서 kubernetes가 물리 Disk를 생성하고 이에 연결된 PV를 자동으로 생성함.
StorageClass를 지정하지 않으면 Default로 설정된 StorageClass 값을 사용하게 됨
GCP or EKS Storage Class 사용
Public Cloud에서 제공하는 Storage를
StorageClass로 사용한 예제
[GcpStorage.yaml]
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow provisioner: kubernetes.io/gce-pd parameters: type: pd-standard zone: us-central1-a |
[AwsStorage.yaml]
kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: slow provisioner: kubernetes.io/aws-ebs parameters: type: io1 iopsPerGB: "10" fsType: ext4 |
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
[ on-premise 환경 Dynamic Provisioning 참고]
https://gruuuuu.github.io/cloud/k8s-volume/#
[Dynamic Provisioning 참고]
https://timewizhan.tistory.com/entry/Kubernetes-Storage-StorageClass
https://medium.com/@myte/kubernetes-nfs-and-dynamic-nfs-provisioning-97e2afb8b4a9
'Kubernetes > Volume' 카테고리의 다른 글
Kubernetes Volume [Static Provisioning] (0) | 2020.12.03 |
---|---|
Kubernetes Volume 개념 (0) | 2020.08.17 |