KubernetesシリーズKubernetesのストレージボリューム

第一章、はじめに

ドッカーでボリューム永続データ記憶のためのメカニズムを提供するように、容器の崩壊も、データの損失に続いた後、デフォルトのデータコンテナは、非永続的なケースです。同様の、Kubernetesは容器と容器共有データとの間のデータの永続性の問題を解決するために、より強力な、豊富なプラグボリューム機構を提供します。
ポッドライフサイクル異なるドッカー、Kubernetesボリュームは、コンテナを結合し、ポッドを再びKubeletコンテナ、ボリュームデータがまだ残っている場合、再起動後にハングアップして削除すると、ボリュームがクリーンアップされます。
データが失われたかどうかは、PVのデータが失われることはありませんしながら、emptyDirデータは、失われるなど、ボリュームのタイプによって異なり
PersistentVolume(PV)とPersistentVolumeClaim(PVC)を抽象詳細を格納するために設けられた二つのAPI資源K8Sです。管理者は、ユーザーが唯一の技術の使用は、ストレージボリュームを達成するためにどのように焦点を当てる必要なしに容器にPVCをマウントする必要が同じユーザーを使用する方法に注意することなく、PVによってストレージ機能を提供する方法に焦点を当てました。
ポッドとノードとPV PVC関係や関係は前者、後者の消費リソースと同様です。PVのPVCはアクセスモードを設定し、指定されたサイズおよびストレージリソースに適用される場合があります。

第二章では、PV PVC知識

ライフサイクル

:PVとPVCのライフサイクルに従う
準備1.電源を。管理者は、クラスタ内のユーザーに利用可能な複数のPVを作成します。
 2.結合。塩ビユーザーが作成し、リソースの割り当てと希望のモードにアクセスします。使用可能なPVを見つける前に、PVCは結合していない状態のままです。
 3.。塩ビユーザーは、ポッドと同じボリュームを使用することができます。
 4.リリース。削除されたストレージリソースを回復するためのPVCユーザーが、PVは「解放」状態になります。データが前に保持されているので、これらのデータは、これらのストレージ・リソースそれ以外の場合は、他のPVCが使用することができない、異なる戦略に従って処理する必要があります。
 5.回復しました。(削除)予約(保持)、(リサイクル)をリサイクルして、削除します。PV次の3つの回復戦略を設定することができます。
   保持ポリシーは、データ保持マニュアル処理を可能にします。
   削除しますポリシーおよび外部のストレージリソースはプラグインに対応PVの必要性が関連します。
   復旧戦略は、クリーンアップ操作を実行します、それは新しいPVCの後に使用することができ、プラグインのサポートが必要。

PVプロパティ

PVは次の属性があります
  能力を。現在、唯一のストレージ・サイズをサポートし、将来的には、IOPSとスループットをサポートすることができます。
  アクセスモード。ReadWriteOnce:単一ノードを記述します。ReadOnlyMany:マルチノードは読み取り専用です。ReadWriteMany:読み書きする複数のノード。マウントする唯一のモードです。
  回復戦略。現在、NFSとホストパスサポートリサイクル。AWS、EBS、GCE、PDや燃えがらのサポートが削除さ。
  ステージ。(バインド)バウンド(結合していないPVC)、利用可能な分割、リリース</ PRE>(PVCリソースは削除ではなく、回復された)、失敗(自動回復に失敗)

PVCプロパティ

アクセスモード。同じ意味のPV。リソースを要求するときに特定のパターンを使用しました。
リソース。ストレージリソースのアプリケーションの数</ PRE>

PVタイプ

emptyDir
ホストパス
gcePersistentDisk
awsElasticBlockStore
NFS
のiSCSI
flocker
GlusterFS
RBD
cephfs
gitRepo
秘密
persistentVolumeClaim
downwardAPI
azureFileVolume
................
........(以下省略)

現在使用されてボリュームタイプ 

emptyDir

ポッドはemptyDirタイプのボリュームを設定した場合、ポッドは、ノード時間に割り当てられていた、そこ(コンテナがハングアップデータemptyDirが失われていません)になりますが、ポッドがノードから削除された場合、長いノード上のポッドランなどとして、emptyDirをemptyDirを作成します(ポッドを削除、またはポッド移行される)、emptyDirは削除され、完全に失われます。

ホストパス

内部に行くポッドノード上のファイルシステムをマウントすることができホストパス。あなたはポッドノード上のファイルを使用する必要がある場合は、ホストパス</プリ>を使用することができます

NFS

NFSは、ネットワーク・ファイル・システムで、ネットワーク・ファイル・システムの略です。簡単な構成でKubernetesはNFS、NFSでポッドに装着することができると同時に、NFS書き込み動作をサポートしながら、データが永続的に格納されます。

gcePersistentDisk

gcePersistentDiskディスクがコンテナにGCEに恒久的に取り付けることができ、あなたはGCEでVM Kubernetesを実行する必要があります

awsElasticBlockStore

awsElasticBlockStore EBSのディスクがコンテナAWS上に取り付けることができ、KubernetesはAWS EC2で実行する必要があります。

gitRepo

容器内で指定されたパスへのgitダウンのgitRepo体積

写し出されたボリューム

投影された同一のディレクトリにマップされたソースのボリュームボリューム複数、支持秘密、downwardAPI及びconfigMap </ PRE>

第三章で、簡単な例

1、emptyDir(ノード・レベル・ストレージ、ライフサイクルと同じポッド)

# cat emptydir.yaml  #pod中有两个container挂载同一个emptyDir,nginx提供web服务,busybox则循环向挂载目录下的index.html文件写入数据
apiVersion: v1
kind: Pod
metadata:
  name: emptydir
  namespace: default
  labels:
    app: myapp
    tier: frontend
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    ports:
    - name: myapp
      containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  - name: busybox
    image: busybox:latest
    volumeMounts:     #见pod的volume挂载到container中
    - name: html      #名称需要和 volumes中的name一致
      mountPath: /data   #挂载volume在container中的路径
    command:
    - "/bin/sh"
    - "-c"
    - "while true; do echo $(date) >> /data/index.html; sleep 2; done"
  volumes:    #创建pod可以使用的volume,可以有多个
  - name: html  
    emptyDir: {}  #volume类型,默认不限制使用空间

ビューポッドランニングとアクセス

# kubectl apply -f emptydir.yaml
pod/emptydir created

# kubectl get pods -o wide
NAME       READY   STATUS    RESTARTS   AGE   IP            NODE               
emptydir   2/2     Running   0          76s   10.244.3.34   huoban-k8s-node01

# while true; do curl 10.244.3.34; sleep 1; done
Fri Sep 20 03:34:38 UTC 2019
Fri Sep 20 03:34:40 UTC 2019
Fri Sep 20 03:34:42 UTC 2019
......

2、ホストパス(ノード・レベル・ストレージ、ライフサイクルと同じノード)

#cat host-path.yaml
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-hostpath
  namespace: default 
spec:
  containers: - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts: - name: html
      mountPath: /usr/share/nginx/html
  volumes: - name: html
    hostPath:
      path: "/data/pod/volumel"  #依据type的值来确定挂载路径是否需要创建 type: DirectoryOrCreate  #挂载目录不存在则创建

# kubectl apply -f host-path.yaml
pod/pod-hostpath created

# kubectl get pods -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP            NODE               
pod-hostpath   1/1     Running   0          58s   10.244.5.11   huoban-k8s-node03

手動でディレクトリを作成し、HTMLファイルのテストを追加

# ssh node3 "ls -l /data/pod/volumel"
.
# ssh node03 "touch /data/pod/volumel/index.html"
# ssh node03 "ls -al /data/pod/volumel"
total 8
drwxr-xr-x 2 root root 4096 Sep 20 15:00 .
drwxr-xr-x 3 root root 4096 Sep 20 14:56 ..
-rw-r--r-- 1 root root    0 Sep 20 15:00 index.html

# echo "node03" > /data/pod/volumel/index.html  #在node03服务器上执行
# cat /data/pod/volumel/index.html
node03

# curl 10.244.5.11
node03

#删除服务,数据还在
# kubectl delete -f host-path.yaml
pod "pod-hostpath" deleted
# ssh node03 "ls -al /data/pod/volumel"
total 12
drwxr-xr-x 2 root root 4096 Sep 20 15:00 .
drwxr-xr-x 3 root root 4096 Sep 20 14:56 ..
-rw-r--r-- 1 root root    7 Sep 20 15:04 index.html

3、NFS(永続ストレージ、ライフサイクルと同じNFSサーバ、削除されません)

1、在master上操作
# cat pod-nfs-vol.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nfs
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    nfs:
      path: "/data/volumes/v1"  #该目录在NFS server上必须存在并可以被集群中node节点可以挂载,node节点需要安装nfs-utils,可以执行NFS 挂载操作      
      server: 172.16.17.10 #该server需要安装NFS 服务,并共享path中的目录或文件

2、在其中一台node节点上做测试
# mount -t nfs 172.16.17.10:/data/volumes/v1 /mnt  在任意一节点上进行挂载测试,确定可以挂载是否可以成功,需要安装nfs-utils工具包
# df -h |grep mnt  #查看挂载状态
172.16.17.10:/data/volumes/v1 77G 3.5G 74G 5% /mnt
# umount /mnt  #确认没有问题后卸载

3、测试运行
# kubectl apply -f pod-nfs-vol.yaml #创建pod
pod "pod-nfs" created
# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
pod-nfs 1/1 Running 0 17s 10.244.1.154 huoban-k8s-node01 

4、在节点上测试创建文件
#在NFS server上添加一个测试HTML文件
# cd /data/volumes/v1/   #挂载目录
# echo "<h1>NFS Server volume v1</h1>" > index.html

5、访问一下并测试数据是否丢失
# curl 10.244.1.154
<h1>NFS Server volume v1</h1>
# kubectl delete pod pod-nfs   #删除刚刚创建的pod
pod "pod-nfs" deleted
# kubectl apply -f pod-nfs-vol.yaml  #再重新创建
pod "pod-nfs" created

# kubectl get pod -o wide #查看新创建后pod所在的node节点级IP地址
NAME READY STATUS RESTARTS AGE IP NODE
pod-nfs 1/1 Running 0 17s 10.244.2.192 huoban-k8s-node02

# curl 10.244.2.192  #再次访问一下,文件依然存在,文件不会随着pod的终结而销毁
<h1>NFS Server volume v1</h1>

4、作成PV及びPVC(NFSで作成)

NFS server上创建多个挂载目录,并共享

# cat /etc/exports
/data/volumes/v1  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v2  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v3  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v4  172.16.0.0/16(rw,no_root_squash)
/data/volumes/v5  172.16.0.0/16(rw,no_root_squash)

# ll /data/volumes/
总用量 0
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v1
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v2
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v3
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v4
drwxr-xr-x 2 root root 24 2019-09-20 16:28 v5

# exportfs 
/data/volumes/v1 172.16.0.0/16
/data/volumes/v2 172.16.0.0/16
/data/volumes/v3 172.16.0.0/16
/data/volumes/v4 172.16.0.0/16
/data/volumes/v5 172.16.0.0/16
# showmount -e
Export list for huoban-k8s-nfs:
/data/volumes/v5 172.16.0.0/16
/data/volumes/v4 172.16.0.0/16
/data/volumes/v3 172.16.0.0/16
/data/volumes/v2 172.16.0.0/16
/data/volumes/v1 172.16.0.0/16

将NFS server共享的目录创建为PV
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-vol-001   #不允许定义名称空间,应为pv是属于集群级别的
spec:
  capacity: #pv的大小
    storage: 5Gi
  accessModes:    #访问的模型,具体访问模型官方文档链接: https://kubernetes.io/docs/concepts/storage/persistent-volumes#access-modes
    - ReadWriteOnce  #支持的访问模型与具体的共享存储设备类型有关,具体见上方链接
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v1
    server: 172.16.17.10
---
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-02
spec:
  capacity: 
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v2
    server: 172.16.17.10
---  
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-03
spec:
  capacity: 
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v3
    server: 172.16.17.10
---  
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-04
spec:
  capacity: 
    storage: 15Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v4
    server: 172.16.17.10
---  
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: nfs-vol-05
spec:
  capacity: 
    storage: 20Gi
  accessModes:
    - ReadWriteOnce
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /data/volumes/v5
    server: 172.16.17.10

# kubectl apply -f nfs-vol.yaml 
persistentvolume "nfs-vol-01" created
persistentvolume "nfs-vol-02" created
persistentvolume "nfs-vol-03" created
persistentvolume "nfs-vol-04" created
persistentvolume "nfs-vol-05" created

# kubectl get pv
NAME               CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS        CLAIM                       STORAGECLASS   REASON    AGE
nfs-vol-01         5Gi        RWO,RWX        Recycle          Available                                                          7s
nfs-vol-02         5Gi        RWO            Recycle          Available                                                          7s
nfs-vol-03         10Gi       RWO,RWX        Recycle          Available                                                          7s
nfs-vol-04         15Gi       RWO            Recycle          Available                                                          7s
nfs-vol-05         20Gi       RWO,RWX        Recycle          Available                                                          7s

#创建一个PVC
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
  namespace: default
spec:
  accessModes: ["ReadWriteOnce"] #pvc的访问模式一定是pv访问模式的子集
  resources:
    requests:
      storage: 5Gi

---
apiVersion: v1
kind: Pod
metadata:
  name: pod-pvc
  namespace: default
spec:
  containers:
  - name: myapp
    image: ikubernetes/myapp:v1
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
  volumes:
  - name: html
    persistentVolumeClaim:
      claimName: my-pvc

# kubectl apply -f pod-pvc-vol.yaml
persistentvolumeclaim "my-pvc" created
pod "pod-pvc" created

# kubectl get pvc
NAME      STATUS    VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc    Bound     nfs-vol-02   5Gi        RWO                           1m

# kubectl get pv  #查看pv状态的变化,nfs-vol-02被 default名称空间下my-pvc申请并绑定
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON    A
nfs-vol-01   5Gi        RWO,RWX        Recycle          Available                                             9
nfs-vol-02   5Gi        RWO            Recycle          Bound       default/my-pvc                            9
nfs-vol-03   10Gi       RWO,RWX        Recycle          Available                                             9
nfs-vol-04   15Gi       RWO            Recycle          Available                                             9
nfs-vol-05   20Gi       RWO,RWX        Recycle          Available                                       

# 查看下pod的创建信息
# kubectl describe pod pod-pvc 
......
Volumes:
  html:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  my-pvc
    ReadOnly:   false
  default-token-tcwjz:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-tcwjz
    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
  ----     ------                 ----             ----                 -------
  Warning  FailedScheduling       8m (x2 over 8m)  default-scheduler    pod has unbound PersistentVolumeClaims (repeated 2 times)
  Normal   Scheduled              8m               default-scheduler    Successfully assigned pod-pvc to huoban-k8s-node01
  Normal   SuccessfulMountVolume  8m               kubelet, huoban-k8s-node01  MountVolume.SetUp succeeded for volume "default-token-tcwjz"
  Normal   SuccessfulMountVolume  8m               kubelet, huoban-k8s-node01  MountVolume.SetUp succeeded for volume "nfs-vol-02"
  Normal   Pulled                 8m               kubelet, huoban-k8s-node01  Container image "ikubernetes/myapp:v1" already present on machine
  Normal   Created                7m               kubelet, huoban-k8s-node01  Created container
  Normal   Started                7m               kubelet, huoban-k8s-node01  Started container

#注意:处于绑定状态下的pv无法直接被删除,如果需要删除被绑定的pv,需要先删除申请绑定的PVC

おすすめ

転載: blog.51cto.com/79076431/2478686