웹사이트 검색

Kubernetes의 스토리지


이 페이지에서

  1. 전제 조건
  2. 무엇을 할 것인가?\n
  3. 다양한 유형의 볼륨이 마운트된 포드 만들기\n
    1. 유형이 있는 호스트 경로 볼륨: 디렉터리\n
    2. 유형이 있는 호스트 경로 볼륨: DirectoryOrCreate\n
    3. emptyDir 볼륨

    포드에 데이터를 저장할 수 없으며, 포드가 삭제되거나 종료되면 포드 내의 데이터는 시스템에 남아 있지 않습니다. 클러스터의 포드에 장기 및 임시 스토리지를 제공하기 위해 Kubernetes는 다양한 유형의 스토리지 메커니즘을 제공합니다.

    이 기사에서는 두 가지 유형의 스토리지 메커니즘에 대한 예만 볼 것입니다.

    1. hostPath:
      hostPath 볼륨은 호스트 노드 파일 시스템의 파일 또는 디렉터리를 포드에 마운트합니다. 이 유형의 볼륨은 Pod가 실행되기 전에 특정 hostPath가 존재해야 하는지 또는 생성되어야 하는지를 Pod가 지정하도록 허용하는 데 사용할 수 있습니다. 이 볼륨 유형은 대부분의 포드에 필요한 것이 아닙니다. DirectoryOrCreate 유형은 권한이 0755로 설정된 경우 존재하지 않는 경우 빈 디렉터리를 생성하고 디렉터리 유형은 포드가 생성되기 전에 지정된 경로에 디렉터리가 있는지 확인하는 데 도움이 됩니다.\n
    2. emptyDir:
      emptyDir 볼륨은 포드가 노드에 할당될 때 처음 생성되며 포드가 해당 노드에서 실행되는 동안 존재합니다. 기본적으로 emptyDir 볼륨은 환경에 있는 스토리지 유형에 저장됩니다. 또한 emptyDir.medium 필드를 Memory로 설정하여 Kubernetes에게 RAM 지원 파일 시스템을 마운트하도록 지시할 수 있습니다

      \n

    Kubernetes의 다른 스토리지 메커니즘에 대해 알아보려면 여기를 클릭하십시오.

    전제 조건

    1. 워커 노드가 1개 이상 있는 Kubernetes 클러스터.
      Kubernetes 클러스터를 만드는 방법을 알아보려면 여기를 클릭하세요. 이 안내서는 AWS Ubuntu 18.04 EC2 인스턴스에서 1개의 마스터와 2개의 노드가 있는 Kubernetes 클러스터를 생성하는 데 도움이 됩니다.\n

    우리는 무엇을 할 것인가?

    1. 다양한 유형의 볼륨이 마운트된 포드를 생성합니다.\n

    다양한 유형의 볼륨이 마운트된 포드 만들기

    다음 유형의 호스트 경로 볼륨: 디렉터리

    팟(Pod)에 기존 디렉토리를 마운트하기 위한 오브젝트 정의 파일을 작성하십시오.

    vim volume-hostpath-1.yml
    apiVersion: v1
    kind: Pod
    metadata:
      name: volume-hostpath-example-1
    spec:
      containers:
      - image: nginx
        name: my-container
        volumeMounts:
        - mountPath: /opt/mounted-here
          name: my-volume-1
      volumes:
      - name: my-volume-1
        hostPath:
          path: /dir
          type: Directory

    포드 목록을 가져오고 호스트에서 "/dir"의 포드 내에 "/opt/mounted-here"를 마운트할 포드를 생성합니다.

    kubectl  get pods
    kubectl  create -f volume-hostpath-1.yml
    kubectl  get pods
    kubectl  describe pod volume-hostpath-example-1

    이제 포드를 설명하면 포드 생성이 실패했음을 알 수 있습니다. 호스트에 "/dir" 디렉토리가 없기 때문에 마운트에 실패했습니다. "유형: 디렉터리"를 사용하여 포드에 볼륨을 마운트하려면 호스트 디렉터리가 있어야 합니다.

    이제 호스트 즉, 작업자 노드에 "/dir" 디렉토리를 생성하겠습니다.

    sudo mkdir /dir

    작업자 노드에 디렉터리를 만든 후에는 이전에 만든 포드를 삭제하고 새 포드를 다시 만들 수 있습니다.

    kubectl  delete -f volume-hostpath-1.yml
    kubectl  create -f volume-hostpath-1.yml
    kubectl  get pods
    kubectl  describe pod volume-hostpath-example-1

    이번에는 팟(Pod)이 성공적으로 생성되었고 볼륨 아래에 마운트된 경로 "/dir"가 표시되는 것을 볼 수 있습니다.

    이제 포드에 로그인하고 파일을 만들 수 있습니다.

    kubectl  get pods
    kubectl  exec -it volume-hostpath-example-1  /bin/bash
    touch /opt/mounted-here/new-file

    포드에서 생성한 파일은 이제 마운트된 디렉터리 "/dir" 아래의 작업자 노드에서 볼 수 있습니다.

    ll /dir/ #Execute this command on the worker node

    이번에는 우리가 만든 포드를 삭제하고 파일이 호스트 디렉터리 "/dir"에 여전히 존재하는지 확인합니다.

    exit
    kubectl  get pods
    kubectl delete pod volume-hostpath-example-1

    작업자 노드의 "/dir" 아래에 파일을 나열합니다.

    ll /dir/ #Execute this command on the worker node

    포드를 삭제한 후에도 작업자 노드의 "/dir" 아래에 파일이 여전히 존재하는 것을 볼 수 있습니다. 이는 포드가 삭제되거나 종료된 후에도 데이터가 지속됨을 의미합니다.

    이 예제에서는 포트 내에 마운트해야 하는 호스트 디렉토리가 있어야 한다는 것을 관찰했습니다.

    다음 유형의 호스트 경로 볼륨: DirectoryOrCreate

    마운트하기 전에 호스트 디렉토리를 사용할 수 있는지 확인하려면 호스트 경로 볼륨에서 "type: Directory" 대신 "type: DirectoryOrCreate"를 사용할 수 있습니다.

    "유형: DirectoryOrCreate" 유형으로 새 파일을 만듭니다.

    vim volume-hostpath-2.yml
    apiVersion: v1
    kind: Pod
    metadata:
      name: volume-hostpath-example-2
    spec:
      containers:
      - image: nginx
        name: my-container
        volumeMounts:
        - mountPath: /opt/mounted-here
          name: my-volume-2
      volumes:
      - name: my-volume-2
        hostPath:
          # directory location on host
          path: /mount-this
          type: DirectoryOrCreate

    기존 Pod 목록을 가져와서 위 상태에서 생성한 파일로 새 Pod를 생성합니다.

    kubectl  get pods
    kubectl create -f volume-hostpath-2.yml
    kubectl  get pods
    kubectl  describe pod volume-hostpath-example-2

    포드를 설명하면 포드가 성공적으로 생성되었음을 알 수 있습니다. 그리고 호스트/작업자 노드에 존재하지 않는 "/mount-this" 디렉토리가 호스트를 볼륨에 마운트하는 동안 호스트에 생성되었습니다.

    작업자 노드로 이동하여 디렉터리가 생성되었는지 확인합니다.

    ll /mount-this/ #Execute this command on the worker node

    이제 포드에 마운트된 \/mount-this\ 디렉터리의 작업자 노드에 새 파일을 만듭니다.

    sudo touch /mount-this/created-on-host #Execute this command on the worker node

    pod에 로그인하고 "/opt/mounted-here/" 디렉터리를 확인하여 작업 노드에서 생성한 "/mount-this/created-on-host" 파일이 pod에 있는지 확인합니다.

    kubectl  get pods
    kubectl  exec -it volume-hostpath-example-2 /bin/bash
    ls -l /opt/mounted-here/

    이제 포드를 삭제하고 "/mount-this/"의 작업자 노드에 파일이 여전히 존재하는지 확인합니다.

    exit
    kubectl  get pods
    kubectl delete pod volume-hostpath-example-2

    다음 명령을 실행하여 "/mount-this/"에 있는 작업자 노드의 파일을 나열합니다.

    sudo ls -lt /mount-this/ #Execute this command on the worker node

    이 예제에서는 호스트 디렉터리가 존재하지 않더라도 포드에 마운트되기 전에 호스트 컴퓨터에 생성되는 것을 확인했습니다.

    emptyDir 볼륨

    다음을 사용하여 개체 정의 파일을 만듭니다.

    vim volume-emptydir.yml
    apiVersion: v1
    kind: Pod
    metadata:
      name: volume-emptydir-example
    spec:
      containers:
      - image: nginx
        name: my-container
        volumeMounts:
        - mountPath: /opt/this
          name: my-volume-3
      volumes:
      - name: my-volume-3
        emptyDir: {}

    pod 목록을 가져오고 "emptyDir" 유형으로 볼륨을 마운트할 새 pod를 만듭니다.

    kubectl  get pods
    kubectl  create -f volume-emptydir.yml #Create an object using the file
    kubectl  get pods
    kubectl  describe pod volume-emptydir-example #Get details  of the specified pod

    위의 스크린샷에서 포드가 생성되고 볼륨을 사용할 수 있음을 확인할 수 있습니다.

    이제 포드에 로그인하고 마운트 경로 "/opt/this" 아래에 디렉터리를 만듭니다. 이번에는 호스트의 볼륨이 없습니다.

    kubectl exec -it volume-emptydir-example /bin/bash #Login into the Pod

    이제 더 이상 필요하지 않은 포드를 삭제할 수 있습니다.

    kubectl get pods #Get a list of Pods
    kubectl  delete pod volume-emptydir-example #Delete the specified pod

    결론

    이 도움말에서는 hostPath 및 emptyDir 유형의 볼륨이 있는 pod를 만드는 단계와 예시 파일을 확인했습니다. hostPath 볼륨 유형 아래의 "type:DirectoryOrCreate"가 작업자 노드/호스트에 존재하지 않는 디렉토리를 마운트하는 데 어떻게 도움이 되는지 살펴보았습니다.