天天看點

k8s初級實戰01--資料卷

k8s初級實戰01--資料卷

  • ​​1 基礎概念​​
  • ​​2 常見用法​​
  • ​​2.1 pod 直接挂載​​
  • ​​2.1.1 pod 直接挂載emptyDir​​
  • ​​2.1.2 pod 直接挂載hostPath​​
  • ​​2.1.3 pod 直接挂載nfs​​
  • ​​2.1.4 通過 medium: Memory 挂載shm​​
  • ​​2.2 pod+pv+pvc挂載​​
  • ​​2.2.1 localPath​​
  • ​​2.2.2 nfs​​
  • ​​3 注意事項​​
  • ​​4 說明​​

1 基礎概念

Container 中的檔案在磁盤上是臨時存放的,這給 Container 中運作的較重要的應用程式帶來一些問題。問題一:當容器崩潰時檔案丢失,kubelet 會重新啟動容器, 但容器會以幹淨的狀态重新開機。 問題二:會在同一 Pod 中運作多個容器并共享檔案時出現。 Kubernetes 卷(Volume) 這一抽象概念能夠解決這兩個問題。

卷的核心是包含一些資料的一個目錄,Pod 中的容器可以通路該目錄。

使用卷時, 在 .spec.volumes 字段中設定為 Pod 提供的卷,并在 .spec.containers[*].volumeMounts 字段中聲明卷在容器中的挂載位置。

資料卷的常見概念包括PV、PVC、StorageClass:

持久卷(Persistent Volume,PV)是叢集中的一塊存儲,可以由管理者事先供應,或者使用存儲類(Storage Class)來動态供應。PV 屬于叢集資源,不屬于某個命名空間。

持久卷申領(PersistentVolumeClaim,PVC)表達的是使用者對存儲的請求。概念上與 Pod 類似。 Pod 會耗用節點資源,而 PVC 申領會耗用 PV 資源。PVC 可以請求特定大小和通路模式(ReadWriteOnce、ReadOnlyMany 或 ReadWriteMany )。

存儲類(StorageClass)為管理者提供了描述存儲 “類” 的方法。 不同的類型可能會映射到不同的服務品質等級或備份政策,或是由叢集管理者制定的任意政策。

k8s 中支援很多類型卷,具體如下:

名稱 功能說明
awsElasticBlockStore
azureDisk
azureFile
cephfs
cinder
configMap
downwardAPI
emptyDir 在pod中建立空檔案夾
fc (光纖通道)
flocker (已棄用)
gcePersistentDisk
gitRepo (已棄用)
glusterfs
hostPath 挂載主控端器目錄
iscsi
local 代表的是某個被挂載的本地儲存設備,例如磁盤、分區或者目錄
nfs 挂載nfs目錄
persistentVolumeClaim
portworxVolume
projected
quobyte
rbd
scaleIO (已棄用)
secret
storageOS
vsphereVolume

2 常見用法

2.1 pod 直接挂載

2.1.1 pod 直接挂載emptyDir

emptyDir 多用于在同一個pod内的不同容器之間共享資料,它僅僅在pod建立的時候被建立,随着pod的删除而消失(資料也會被永久删除);以下為emptyDir的使用案例:

vim pod-busybox-emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox-emptydir
spec:
  containers:
  - image: busybox:1.32
    name: busybox-nfs
    resources: {}
    command:
    - sh
    - -c
    - 'sleep 6000'
    volumeMounts:
    - name: vol-empty
      mountPath: /data-empty
      readOnly: false
  volumes:
  - name: vol-empty
    emptyDir: {}      

測試效果:

k8s初級實戰01--資料卷

2.1.2 pod 直接挂載hostPath

hostPath 卷能将主機節點檔案系統上的檔案或目錄挂載到你的 Pod 中。 雖然這不是大多數 Pod 需要的,但是它為一些應用程式提供了強大的逃生艙;以下為 hostPath 的使用案例:

vim pod-busybox-localpath.yaml
apiVersion: v1
kind: Pod
metadata:
  name: busybox-local
spec:
  containers:
  - image: busybox:1.32
    name: busybox-nfs
    resources: {}
    command: [sh,-c,'sleep 6000']
    volumeMounts:
    - name: data-local
      mountPath: /data-local
  volumes:
  - name: data-local 
    hostPath:
     path: /disk0
     type:      

測試效果:

k8s初級實戰01--資料卷

2.1.3 pod 直接挂載nfs

nfs 卷能将 NFS (網絡檔案系統) 挂載到你的 Pod ,不像 emptyDir 那樣會在删除 Pod 的同時也會被删除,nfs 卷的内容在删除 Pod 時會被儲存,卷隻是被解除安裝。 這意味着 nfs 卷可以被預先填充資料,并且這些資料可以在 Pod 之間共享;以下為nfs 的使用案例:

此需要預先建立nfs,具體建立方式可以參考筆者博文: ​​​shell程式設計筆記2–nfs挂載​​

vim pod-busybox-nfs.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: busybox-nfs
spec:
  containers:
  - image: busybox:1.32
    name: busybox-nfs
    resources: {}
    command: [sh,-c,'sleep 6000']
    volumeMounts:
    - name: data-nfs
      mountPath: /data-nfs
  volumes:
  - name: data-nfs
    nfs:
      readOnly: false
      server: 10.120.75.102
      path:      

測試效果:

k8s初級實戰01--資料卷

2.1.4 通過 medium: Memory 挂載shm

預設情況下,pod 中容器shm為64m,但是實際有些業務需要更大量的shm,是以可以通過emptyDir 的 medium: Memory 來挂載主控端的shm,進而提高容器的shm大小。

vim pod_shm.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-shm
spec:
  containers:
  - image: busybox:1.32
    name: busybox
    command:
      - /bin/sh
      - '-c'
      - 'sleep 3600'
    volumeMounts:
    - mountPath: /dev/shm
      name: v-dev-shm
    resources:
      requests:
        cpu: '100m'
        memory: '10Mi'
  volumes:
  - name: v-dev-shm
    emptyDir:
      medium:      

測試效果:

2.2 pod+pv+pvc挂載

2.2.1 localPath

vim pv-mysql-local.yaml 
apiVersion: v1
kind: PersistentVolume  #資源類型
metadata:
  name: mysql-local-pv
spec:
  capacity:
    storage: 20Gi 
  accessModes:
    - ReadWriteMany  #通路模式,多個用戶端讀寫
  persistentVolumeReclaimPolicy: Recycle #回收政策-可以回收
  hostPath: 
    path: /disk0/mysql01
    
vim pvc-mysql-local.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-local-pvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests: 
      storage: 5Gi

vim pod-mysql-localpath.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mysql-local
spec:
  containers:
  - image: busybox:1.32
    name: busybox-nfs
    resources: {}
    command: [sh,-c,'sleep 10000']
    volumeMounts:
    - name: data-local
      mountPath: /data-local
  volumes:
  - name: data-local
    persistentVolumeClaim:     
      claimName: mysql-local-pvc      

2.2.2 nfs

vim pv-mysql-nfs.yaml 
apiVersion: v1
kind: PersistentVolume  #資源類型
metadata:
  name: mysql-nfs-pv
spec:
  capacity:
    storage: 20Gi 
  accessModes:
    - ReadWriteMany  #通路模式,多個用戶端讀寫
  persistentVolumeReclaimPolicy: Recycle #回收政策-可以回收
  nfs:
    path: "/mnt/mysql01"
    server: 10.120.75.102 #k8s-nfs matser
    readOnly: false  #隻讀

vim pvc-mysql-nfs.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: mysql-nfs-pvc
  namespace: default
spec:
  accessModes: ["ReadWriteMany"]
  resources:
    requests: 
      storage: 5Gi

vim pod-mysql-nfs.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: mysql-nfs
spec:
  containers:
  - image: busybox:1.32
    name: busybox-nfs
    resources: {}
    command: [sh,-c,'sleep 10000']
    volumeMounts:
    - name: data-nfs
      mountPath: /data-nfs
  volumes:
  - name: data-nfs
    persistentVolumeClaim:
      claimName: mysql-nfs-pvc      

3 注意事項

  1. 使用emptyDir 挂載shm的時候,盡量不要設定limitSize,否則當使用達到上限後會導緻pod被驅逐。

4 說明