第一章、はじめに
ドッカーでボリューム永続データ記憶のためのメカニズムを提供するように、容器の崩壊も、データの損失に続いた後、デフォルトのデータコンテナは、非永続的なケースです。同様の、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