Kubernetesでは、2つの一般的なタイプのVolume深さの実践

5550 ワード

一.背景
ストレージ・リソースは、すべてのコンピューティング・リソースにおいて非常に重要な役割を果たしており、ほとんどのビジネス・シーンでは、さまざまなストレージ・リソースが使用される可能性があります.Kubernetesでは、システムはVolumeを介してクラスタ内のコンテナに対して動的または静的にストレージリソースを提供する.通常,容器またはPodのライフサイクルは短く,容器が破棄されると容器内部のデータも同時に消去されると考えられる.保存容器のデータを永続化するために,KubernetesはVolumeを導入し,Dockerに似たVolume(Docker also has a concept of volumes, though it is somewhat looser and less managed. In Docker, a volume is simply a directory on disk or in another Container. Lifetimes are not managed and until very recently there were only local-disk-backed volumes. Docker now provides volume drivers, but the functionality is very limited for now).このVolumeがあるPodにマウントされた後、このPodの中のすべての容器がこのVolumeを使用することができます.Kubernetesが現在サポートしているvolumeタイプは、文末の公式資料を参照することができます.
二.2つのVolumeの使用例
2.1 emptyDir
emptyDir:emptyDirは最も基本的なVolumeタイプです.各emptyDir Volumeは、Pod内のすべてのコンテナで共有できるホスト上の空のディレクトリです.それは容器にとって永続的であり,Podにとってはそうではない.コンテナの削除は影響しません.Pod全体を削除すると削除され、そのライフサイクルはマウントされたPodと一致します.簡単に言えば、emptyDirタイプのVolumeはPodがノードに割り当てられたときに作成され、Kubernetesはノードホストに自動的にディレクトリを割り当てるので、ノードホスト上の対応するディレクトリファイルを指定する必要はありません.このディレクトリの初期内容は空で、Podがノードから削除されるとemptyDirのデータは永続的に削除されます.EmptyDirは、一時ディレクトリ、マルチコンテナ共有ディレクトリなど、永続的に保持する必要のないデータに主に使用されます.実例を通して理解すると、Pod gyslのyamlは以下の通りである.
apiVersion: v1
kind: Pod
metadata:
  name: gysl
spec:
  containers:
  - image: busybox
    name: gysl-01
    volumeMounts:
    - mountPath: /gysl-01
      name: gysl-volume
    args:
    - /bin/sh
    - -c
    - echo "This is a test file.">/gysl-01/test.gysl;sleep 20000

  - image: busybox
    name: gysl-02
    volumeMounts:
    - mountPath: /gysl-02
      name: gysl-volume
    args:
    - /bin/sh
    - -c
    - cat /gysl-02/test.gysl;sleep 20000

  volumes:
  - name: gysl-volume
    emptyDir: {}

Pod gyslを作成し、関連情報を表示します.
[root@k8s-m k8s-volumes]# kubectl apply -f emptyDir.yaml
pod/gysl created
[root@k8s-m k8s-volumes]# kubectl get pod
NAME   READY   STATUS    RESTARTS   AGE
gysl   2/2     Running   0          10m
[root@k8s-m k8s-volumes]# kubectl logs gysl gysl-02
This is a test file.

この例では、gysl-01とgysl-02の2つのコンテナを含むgyslというPodを作成し、この2つのコンテナにはgysl-volumeというemptyDirが同時にマウントされ、gysl-01のマウントポイントは/gysl-01、gysl-02のマウントポイントはgysl-02、コンテナgysl-01はtestを作成する.gyslのファイルは、「This is a test file.」コンテナgysl-02にgysl-01で作成したファイルの内容が正常に表示されました.
2.2 hostPath
hostPath:hostPathの主な役割は、ホストのファイルまたはディレクトリをPodのコンテナにマウントして使用することであり、コンテナがより良好なパフォーマンスでデータを格納できるようにすることです.次に、Pod gysl-hostpathを例にhostPathに関する概念を理解します.YAMLファイルは以下の通りです.
apiVersion: v1
kind: Pod
metadata:
  name: gysl-hostpath
spec:
  nodeSelector: 
    role: test
  containers:
  - image: ubuntu:18.04
    name: gysl-hostpath-container
    volumeMounts:
    - mountPath: /etc/gysl-test-01
      name: gysl-02
    - mountPath: /etc/gysl-test-02
      name: gysl-01
    - mountPath: /gysl-test-dir
      name: gysl-dir
    args:
    - /bin/bash
    - -c 
    - cat /etc/gysl-test-01 /etc/gysl-test-02;ls -l /gysl-test-dir;sleep 3600
  volumes:
  - hostPath: 
      path: /root/gysl-01
    name: gysl-01
  - hostPath:
      path: /root/gysl-02
    name: gysl-02
  - hostPath:
      path: /root/gysl-dir
    name: gysl-dir

Node k 8 s-n 1の/rootディレクトリの下に、次のファイルとディレクトリを作成します.
[root@k8s-n1 ~]# ll
    8
-rw-r--r-- 1 root root 16 11  21 20:31 gysl-01
-rw-r--r-- 1 root root 16 11  21 20:31 gysl-02
drwxr-xr-x 2 root root 51 11  21 20:32 gysl-dir

2つのファイルの内容は次のとおりです.
[root@k8s-n1 ~]# cat gysl-01
This is gysl-01
[root@k8s-n1 ~]# cat gysl-02
This is gysl-02

ディレクトリgysl-dirの内容は次のとおりです.
[root@k8s-n1 ~]# ll gysl-dir/
    12
-rw-r--r-- 1 root root 16 11  21 20:32 gysl-01
-rw-r--r-- 1 root root 16 11  21 20:32 gysl-02
-rw-r--r-- 1 root root 16 11  21 20:32 gysl-03

Node k 8 s-n 1にラベルを指定します.applyこのPod:
[root@k8s-m k8s-Volumes]# kubectl label node k8s-n1 role=test
node/k8s-n1 labeled
[root@k8s-m k8s-Volumes]# kubectl apply -f hostPath.yaml
pod/gysl-hostpath created
[root@k8s-m k8s-Volumes]# kubectl get pod -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE
gysl-hostpath   1/1     Running   0          17s   10.244.1.177   k8s-n1   
[root@k8s-m k8s-Volumes]# kubectl logs gysl-hostpath
This is gysl-02
This is gysl-01
total 12
-rw-r--r-- 1 root root 16 Nov 21 12:32 gysl-01
-rw-r--r-- 1 root root 16 Nov 21 12:32 gysl-02
-rw-r--r-- 1 root root 16 Nov 21 12:32 gysl-03

この例では、gysl-02というhostPathファイルをコンテナのファイル/etc/gysl-test-01にマウントし、gysl-01というhostPathファイルをコンテナのファイル/etc/gysl-test-02にマウントし、gysl-dirというhostPathディレクトリを/gysl-test-dirの下にマウントしました.logsコマンドにより、目標が達成されたことがわかります.
このマウント方式は、ノードに障害が発生しない限り、emptyDirよりも永続的である.ただし、いくつかのプロファイル/バイナリファイルをマウントする以外は、このようなマウント方式は一般的に採用されません.このようなマウント操作は、Podファイルとノードホストファイルの結合を増加させ、統一管理に不利であるためです.
三.まとめ
3.1 volumeの構成過程において、特定のマウント経路に関する必要性は一定の規則に従って構成される.たとえば、ファイルまたはディレクトリには絶対パスを書く必要があります.ルールに従って構成しないと、次のエラーが発生します.
Warning  Failed     8s (x3 over 20s)  kubelet, k8s-n1    Error: Error response from daemon: create ~/gysl: "~/gysl-dir" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path

3.2 emptyDirとhostPathは比較的一般的な2種類のvolumeであり、使用時には状況に応じて構成する必要がある.他のタイプのvolumeは、上記の2つのタイプと公式ドキュメントを参照して構成できます.関連する公式ドキュメントは文末に表示されます.
四.関連資料
5.1 Volumes基本概念
5.2 KubernetesがサポートするVolumeタイプ
5.3記事に関するYAMLファイル