Kubernetes(七) - Volume
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/kubernetes
PS:本系列中使用 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