根據應用本身是否 需要持久存儲數據,以及某一此請求和此前的請求是否有關聯性,可以分為四類應用:
1.有狀態要存儲 2.有狀態無持久存儲 3.無狀態無持久存儲4.無狀態有持久存儲
在k8s上的數據持久性:1.emptyDir:只在節點本地使用,一旦pod刪除存儲卷也刪除。只是用來做臨時目錄,可是做緩存用 沒有任何持久性
2.hostPath:主機路徑,直接在宿主機上找一個目錄與容器建立關聯關系,也不具有真正意義上的持久性
3.網絡連接性存儲 1)傳統意義上的存儲設備,本地的san(iscsi),nas(nfs,cifs)
2) 分布式存儲 文件系統級別的(glusterfs,cephfs) 塊存儲級別的(ceph)
3)雲存儲 EBS、Azure Disk、
可以通過命令 kubectl explain pod.spec.volumes
一、emptyDir:同一個pod內的多個容器可以共享同一個存儲卷,pod刪除存儲卷也刪除。不能實現數據存儲化
apiVersion: v1 kind: Pod metadata: name: pod-volume namespace: default labels: app: myapp tier: frontend annotations: create_by: yiruiduan spec: containers: - name: nginx image: ikubernetes/myapp:v1 imagePullPolicy: IfNotPresent ports: - name: http containerPort: 80 volumeMounts: - name: html mountPath: /usr/share/nginx/html/ - name: busybox image: busybox:latest imagePullPolicy: IfNotPresent volumeMounts: - name: html mountPath: /data command: ['/bin/sh','-c',"while true;do echo $(date) >>/data/index.html;sleep 2;done"] volumes: - name: html emptyDir: {}
訪問nginx就可以看到動態生成的index.html
二、hostPathsu宿主機路徑,把pod所在的宿主機之上的文件 系統的某一目錄,與pod建立關系,在pod被刪除的時候,這個存儲卷是不會被刪除的。所以只要同一個pod能夠調度到同一個節點上,對應的數據依然是存在的。這只是節點及的持久,節點down了數據也就沒有了。存在數據丟失
apiVersion: v1 kind: Pod metadata: name: pod-vol-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/volume1 type: DirectoryOrCreate #如果目錄不存在就創建
三、nfs共享存儲,節點掛在共享存儲。無論調度在那個節點上所有數據能共享訪問。
apiVersion: v1 kind: Pod metadata: name: pod-vol-nfs namespace: default spec: containers: - name: myapp image: ikubernetes/myapp:v1 volumeMounts: - name: html mountPath: /usr/share/nginx/html volumes: - name: html nfs: path: /k8s #nfs所共享的目錄 server: 192.168.1.120 #nfs服務器地址
四、pvc(persistentVolumeClaim)
首先要制作pv,它是不包含名稱空間中的。通過nfs共享目錄的形式
apiVersion: v1 kind: PersistentVolume metadata: name: pv001 labels: name: pv001 spec: nfs: path: /k8s/v1 server: 192.168.1.120 accessModes: ["ReadWriteMany","ReadWriteOnce"] #訪問模式
capacity: #設置pv的大小 storage: 2Gi
制作pvc
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mypvc namespace: default spec: accessModes: ["ReadWriteMany"] #是pv的訪問模式的子集 resources: #所需pv的大小 requests: storage: 6Gi
pod 使用pvc
apiVersion: v1 kind: Pod metadata: name: pod-vol-pvc namespace: default spec: containers: - name: myapp image: ikubernetes/myapp:v1 volumeMounts: - name: html mountPath: /usr/share/nginx/html volumes: - name: html persistentVolumeClaim: claimName: mypvc