Docker是無狀态的不管被銷毀多少次都會恢複到最初的狀态,但是這就意味着在程式過程中産生的配置也好檔案也好會丢失,對于Docker我們經常會使用磁盤挂載的方式來儲存一些重要的内容,比如運作在Docker下的資料庫的源資料,比如程式的日志檔案等,在K8S中也提供同樣的配置方式
PS: 磁盤使用中1.8 和 1.9存在差異,1.8需要建立PersistentVolume在建立之後才能建立PersistentVolumeClaim,1.9之後隻需要建立PersistentVolumeClaim就可以了
Kubernetes官方文檔:
https://kubernetes.io/docs/reference/Kubernetes官方Git位址:
https://github.com/kubernetes/kubernetesPS:本系列中使用 KubernetesV1.8 RancherV1.6.14
1.本地磁盤
> vim local-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv-1
labels:
type: local
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /tmp/data/pv-1
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: redis-pv-claim
labels:
app: redis
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
> kubectl create -f local-pv.yaml
persistentvolume "local-pv-1" created
persistentvolumeclaim "mysql-pv-claim" created
然後我們就可以對對進行進行挂載了
> vim volume-local.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume-local-pod
spec:
containers:
- name: mypod
image: redis
volumeMounts: # 磁盤挂載
- name: redis-pv-claim
mountPath: "/etc/redis"
volumes: # 磁盤挂載别稱定義
- name: redis-pv-claim
persistentVolumeClaim:
claimName: redis-pv-claim
> kubectl create -f volume-local.yaml
pod "volume-local-pod" created
這個時候容器的節點在K8S-S1上我們看一下是否儲存到了K8S-S1的磁盤上了嗎
2.NAS網絡盤
但是這樣做有一個很大的弊端,如果這個Pod重新開機可能會被排程到其他的節點上,那麼對應挂載盤的就會情況,這裡有兩種方式解決,第一種就是固定Pod運作的節點,在就是使用共享磁盤(首先你需要建立一個NAS盤)
一般用的比較頻繁的就是NAS盤作為挂載盤,用法如下
> vim nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteMany
nfs:
server: xxxxxx.cn-hangzhou.nas.aliyuncs.com # nfs的位址
path: "/" # nfs的挂載目錄(一定需要有這個檔案目錄)
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pv
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
resources:
requests:
storage: 5Gi
> kubectl create -f nfs-pv.yaml
persistentvolume "nfs-pv" created
persistentvolumeclaim "nfs-pv" created
我們建立兩個Pod共享一個NAS盤
> vim volume-nfs.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: volume-nfs
spec:
replicas: 2
template:
metadata:
labels: # 容器的标簽 可和service關聯
app: volume-nfs
spec:
containers:
- name: mypod
image: redis
volumeMounts: # 磁盤挂載
- name: nfs-pv
mountPath: "/etc/redis"
volumes: # 磁盤挂載别稱定義
- name: nfs-pv
persistentVolumeClaim:
claimName: php-general-test
> kubectl create -f volume-nfs.yaml
deployment "volume-nfs" created
兩個Pod分别在不同的節點中
3. 其他Volume支援類型
具體使用明細可以參考官方文檔:
Volumes | Kubernetes- awsElasticBlockStore
- azureDisk
- azureFile
- cephfs
- downwardAPI
- emptyDir
- fc (光纖通道)
- flocker
- gcePersistentDisk
- gitRepo
- glusterfs
- hostPath
- iscsi
- local
- nfs
- persistentVolumeClaim
- projected
- portworxVolume
- quobyte
- rbd
- scaleIO
- secret
- storageos
- vsphereVolume