이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

52. Kubernetes Volume [Dynamic Provisioning]

이쿠우우 2020. 12. 3. 13:34
반응형

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

 

 

 

 

 

 

 

반응형