IT/쿠버네티스 / / 2020. 2. 3.

[kubernetes-실습] PV 와 PVC 생성

포스팅 목차

    # NFS Server/Client 세팅

    # NFS Server/Client 세팅
    
    # ----------------------------------
    # master node : NFS Server
    # worker node : NFS Client
    # ----------------------------------
    # master node : NFS Server 세팅
    ps0107@k8smaster1:~$ sudo apt-get update && sudo apt-get install -y nfs-kernel-server
    ps0107@k8smaster1:~$ sudo mkdir /opt/sfw
    ps0107@k8smaster1:~$ sudo chmod 1777 /opt/sfw
    ps0107@k8smaster1:~$ sudo bash -c 'echo software > /opt/sfw/hello.txt'
    ps0107@k8smaster1:~$
    ps0107@k8smaster1:~$ sudo vi /etc/exports
    ps0107@k8smaster1:~$ cat /etc/exports
    /opt/sfw/	*(rw,sync,no_root_squash,subtree_check)
    ps0107@k8smaster1:~$ sudo exportfs -ra
    
    # worker node : NFS Client 세팅
    ps0107@k8sworker1:~$ sudo apt-get -y install nfs-common
    ps0107@k8sworker1:~$ showmount -e k8smaster
    Export list for k8smaster:
    /opt/sfw *
    ps0107@k8sworker1:~$ sudo mount k8smaster:/opt/sfw /mnt
    ps0107@k8sworker1:~$ ls -l /mnt
    total 4
    -rw-r--r-- 1 root root 9 Feb  3 14:12 hello.txt

    # Creating a Persistent NFS Volume (PV)

    # PV 생성을 위한 yaml 파일 생성
    ps0107@k8smaster1:~$ cat PVol.yaml
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: pvvol-1
    spec:
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteMany
      persistentVolumeReclaimPolicy: Retain
      nfs:
        path: /opt/sfw
        server: k8smaster
        readOnly: false
    
    # PV 생성
    ps0107@k8smaster1:~$ kubectl create -f PVol.yaml
    persistentvolume/pvvol-1 created
    
    # PV 생성 확인
    ps0107@k8smaster1:~$ kubectl get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
    pvvol-1   1Gi        RWX            Retain           Available                                   7s

    # Creating a Persistent Volume Claim (PVC)

    # pvc 리소스 확인. 현재는 아무것도 없음.
    ps0107@k8smaster1:~$ kubectl get pvc
    No resources found.
    
    # pvc 생성을 위한 yaml 파일 생성
    # pvc 200Mi 요청
    ps0107@k8smaster1:~$ vi pvc.yaml
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-one
    spec:
      accessModes:
      - ReadWriteMany
      resources:
         requests:
           storage: 200Mi
    
    # pvc 생성
    ps0107@k8smaster1:~$ kubectl create -f pvc.yaml
    persistentvolumeclaim/pvc-one created
    
    # pvc-one Bound 상태 확인
    ps0107@k8smaster1:~$ kubectl get pvc
    NAME      STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-one   Bound    pvvol-1   1Gi        RWX                           7s
    
    # pvvol-1 이 CLAIM 에 보면 pvc-one 에 할당됨을 확인 가능
    ps0107@k8smaster1:~$ kubectl  get pv
    NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
    pvvol-1   1Gi        RWX            Retain           Bound    default/pvc-one                           9m6s
    
    # 실제 pvc를 사용하기 위해 새로운 deployment를 생성해 보자.
    ps0107@k8smaster1:~$ vi nfs-pod.yaml
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      annotations:
        deployment.kubernetes.io/revision: "1"
      generation: 1
      labels:
        run: nginx
      name: nginx-nfs
      namespace: default
      resourceVersion: "1411"
    spec:
      replicas: 1
      selector:
        matchLabels:
          run: nginx
      strategy:
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 1
        type: RollingUpdate
      template:
        metadata:
          creationTimestamp: null
          labels:
            run: nginx
        spec:
          containers:
          - image: nginx
            imagePullPolicy: Always
            name: nginx
            volumeMounts:
            - name: nfs-vol
              mountPath: /opt
            ports:
            - containerPort: 80
              protocol: TCP
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          volumes:                           # <- volumes 설정
          - name: nfs-vol
            persistentVolumeClaim:
              claimName: pvc-one
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    
    # deployment 생성
    ps0107@k8smaster1:~$ kubectl create -f nfs-pod.yaml
    deployment.apps/nginx-nfs created
    
    # pod 생성 확인
    ps0107@k8smaster1:~$ kubectl get pods
    NAME                         READY   STATUS    RESTARTS   AGE
    ds-one-65r2h                 1/1     Running   0          11h
    ds-one-hpx96                 1/1     Running   0          11h
    nginx-nfs-86845f4d55-fxqkt   1/1     Running   0          5s
    
    # 생성된 pod에 mount, volume 확인
    ps0107@k8smaster1:~$ kubectl describe pod nginx-nfs-86845f4d55-fxqkt
    Name:           nginx-nfs-86845f4d55-fxqkt
    Namespace:      default
    Priority:       0
    Node:           k8sworker1/10.146.0.4
    Start Time:     Mon, 03 Feb 2020 14:51:15 +0000
    Labels:         pod-template-hash=86845f4d55
                    run=nginx
    Annotations:    cni.projectcalico.org/podIP: 192.168.1.84/32
    Status:         Running
    IP:             192.168.1.84
    Controlled By:  ReplicaSet/nginx-nfs-86845f4d55
    Containers:
      nginx:
        Container ID:   docker://e3eb8a022421675c8a323dea8c1c4b6eb9a5f2b060f4231cd587a6bd821c7ff1
        Image:          nginx
        Image ID:       docker-pullable://nginx@sha256:ad5552c786f128e389a0263104ae39f3d3c7895579d45ae716f528185b36bc6f
        Port:           80/TCP
        Host Port:      0/TCP
        State:          Running
          Started:      Mon, 03 Feb 2020 14:51:19 +0000
        Ready:          True
        Restart Count:  0
        Environment:    <none>
        Mounts:
          /opt from nfs-vol (rw)
          /var/run/secrets/kubernetes.io/serviceaccount from default-token-76w5h (ro)
    Conditions:
      Type              Status
      Initialized       True
      Ready             True
      ContainersReady   True
      PodScheduled      True
    Volumes:
      nfs-vol:
        Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
        ClaimName:  pvc-one
        ReadOnly:   false
      default-token-76w5h:
        Type:        Secret (a volume populated by a Secret)
        SecretName:  default-token-76w5h
        Optional:    false
    QoS Class:       BestEffort
    Node-Selectors:  <none>
    Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                     node.kubernetes.io/unreachable:NoExecute for 300s
    Events:
      Type    Reason     Age   From                 Message
      ----    ------     ----  ----                 -------
      Normal  Scheduled  22s   default-scheduler    Successfully assigned default/nginx-nfs-86845f4d55-fxqkt to k8sworker1
      Normal  Pulling    21s   kubelet, k8sworker1  Pulling image "nginx"
      Normal  Pulled     18s   kubelet, k8sworker1  Successfully pulled image "nginx"
      Normal  Created    18s   kubelet, k8sworker1  Created container nginx
      Normal  Started    18s   kubelet, k8sworker1  Started container nginx
    
    # pvc 상태를 확인 해본다. 정상적으로 bound 되었는지 확인 가능
    ps0107@k8smaster1:~$ kubectl get pvc
    NAME      STATUS   VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc-one   Bound    pvvol-1   1Gi        RWX                           2m7s
    

    • 네이버 블로그 공유
    • 네이버 밴드 공유
    • 페이스북 공유
    • 카카오스토리 공유