1. 程式人生 > 其它 >k8s基礎概念之六 volumes

k8s基礎概念之六 volumes

自動建立

……
spec:
  containers:
  ……
    volumeMounts:      #掛載一個數據卷
    - name: app-logs   #掛載資料卷名字
      mountPath: /logs #掛載路徑
  ……
  volumes:          #定義一個數據卷
  - name: app-logs  #定義一個數據卷名字
    emptyDir: {}    # volume的型別,emryDir的引數設定為{}  
---
#註解:
"emptyDir: 無需指定宿主機目錄,由pod自動建立,pod移除時候資料會永久刪除,作為容器間的共享目錄
" --- #擴充套件: apiVersion: v1 kind: Pod metadata: name: volume-pod spec: containers: - name: tomcat image: tomcat ports: - containerPort: 8080 volumeMounts: - name: app-logs mountPath: /usr/local/tomcat/logs # 容器中的日誌目錄 - name: logreader # 容器名稱,使用kubectl指定容器時需要使用此名稱,無法使用容器ID image: busybox command: [
"sh","-c","tail -f /logs/catalina*.log"] volumeMounts: - name: app-logs mountPath: /logs volumes: # volume設定的具體資訊 - name: app-logs emptyDir: {} # volume的型別,emryDir的引數設定為{} #這裡的示例是將tomcat容器的日誌目錄和logreader的log目錄共享,通過在logreader執行檢視日誌的命令,就可以在logreader中看到tomcat的啟動日誌。

手動建立掛載目錄

hostPath: Pod掛載宿主機上的檔案和目錄,可用於永久儲存日誌,容器內部訪問宿主機資料,

……
spec:
  containers:
  ……
    volumeMounts:      #掛載一個數據卷
    - name: app-logs   #掛載資料卷名字
      mountPath: /logs #掛載路徑
  ……
  volumes:          #定義一個數據卷
  - name: app-logs  #定義一個數據卷名字
    emptyDir: {}    # volume的型別,emryDir的引數設定為{}  
------------------------------------------------
apiVersion: v1
kind: Pod
metadata:
  name: volume-pod
spec:
  containers:
  - name: tomcat
    image: tomcat
    ports:
    - containerPort: 8080
    volumeMounts:
    - name: app-logs
      mountPath: /usr/local/tomcat/logs
  volumes:
  - name: app-logs
    hostPath:
      # 宿主機的本地目錄,需要事先建立,否則pod無法啟動
      path: /logs
      # this field is optional
      type: Directory
#當pod刪除時,資料依舊儲存在宿主機目錄中。

網路儲存

apiVersion: v1
kind: Pod
metadata:
  name: cephfs
spec:
  containers:
  - name: cephfs-rw
    image: kubernetes/pause
    volumeMounts:
    - mountPath: "/mnt/cephfs"
      name: cephfs
  volumes:
  - name: cephfs
    cephfs:
      monitors:
      - 10.16.154.78:6789
      - 10.16.154.82:6789
      - 10.16.154.83:6789
      # by default the path is /, but you can override and mount a specific path of the filesystem by using the path attribute
      # path: /some/path/in/side/cephfs   #更改掛載
      user: admin
      secretFile: "/etc/ceph/admin.secret"
      readOnly: true

什麼情況下會使用到valumes

一些需要持久化資料的程式才會使用到valmes,或者一些需要資料共享的容器需要volumes

日誌收集的需求

需要在應用程式裡面加一個sidecar,這個容器是一個收集日誌的容器

emptyDir

……
spec:
  containers:
  ……
  volumesMounts:
  - mountPath: /etc/timezone    #掛載到容器的目錄
    name: timezone     #需要掛載持久卷的名字
  ……
  volumes:
  - name :timezone  #定義一個持久卷,可以寫多個,多加一個name即可
    hostPath:
      path: /etc/timezone  #宿主機的目錄
      emptyDir: {}         #和以下不同的是,將type換成這個即可
"
    和volumes不同的是,如果刪除pod,emptyDir卷中的資料也將被刪除,一般emptyDir卷用於pod中的不同容器共享資料
,他可以掛在到相同或者不同的路徑上 預設情況下,emptyDir卷支援節點上的任何介質,可能是SSD、磁碟、或網路儲存,具體取決於自身的環境,
可以將emptyDir、medium欄位設定為Memory欄位設定為memory,讓kubernetes使用tmpfs,碎肉tmpfs非常快,但是tmpfs在節點重啟時
,資料同樣會被清除,並且設定的大小會被記入到COntainer的記憶體限制當中
"

hostPath

將節點或者主機上的目錄掛載到pod上

……
spec:
  containers:
  ……
  volumesMounts:
  - mountPath: /etc/timezone    #掛載到容器的目錄
    name: timezone     #需要掛載持久卷的名字
  ……
  volumes:
  - name :timezone  #定義一個持久卷,可以寫多個,多加一個name即可
    hostPath:
      path: /etc/timezone  #宿主機的目錄
      type: File           #掛載型別
   """
   type的型別:
           type為空字串:預設選項,以為這掛載hostPath之前不會執行任何檢查
           DirectotyOrCreate:如果給定的path不存在任何東西,name將根據需要建立一個許可權為0755的空目錄,和kubelet具有相同的組合許可權。
           FileOrCreate:如果給定的路徑不儲存任何內容,則會根據需要建立一個空檔案,許可權設定為0655,和kubelet具有相同的組合所有權
           File:檔案不許存在給定的路徑中。
           Socket:Unix套接子,必須存在於給定路徑中。
           CharDevice:字元裝置,必須存在於給定路徑中
           BlockDevice:塊裝置,必須存在於給定路徑中
   """

nfs掛載至容器

#nfs伺服器搭建跳過
……
spec:
  containers:
    ……
    volumesMounts:
    - mountPath: /mnt
      name: nfs-volumes
  volumes:
  -name: nfs-volumes
   nfs: 
     server: 192.168.159.14     #nfs伺服器ip
     path: /data/nfs/test-dp     #/data/nfs是nfs共享的目錄