iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 15
0
DevOps

從題目中學習k8s系列 第 15

【從題目中學習k8s】-【Day15】第七題 - Volume


title: 【從題目中學習k8s】-【Day15】第七題 - Volume
description: 以無比的恆毅力堅持30天鍊成鐵人--連續30天,一天發表一篇IT技術文章

【從題目中學習k8s】-【Day15】第七題 - Volume

tags: DevOps CICD K8s Docker

Question

Create a Pod called redis-storage with image: redis:alpine with a Volume of type emptyDir that lasts for the life of the Pod. Specs on the right

  • Pod named ‘redis-storage’ created
  • Pod ‘redis-storage’ uses Volume type of emptyDir
  • Pod ‘redis-storage’ uses volumeMount with mountPath = /data/redis

概念

這題就是前面看到過很多次的Volume的考題啦,前幾天一直看到Volume,但是一直沒有介紹,今天終於要來介紹了。那麼甚麼是Volume呢?

在容器的世界中,容器是非常容易被重啟的(因為容器通常是針對特殊任務存在,執行完任務就沒有存在的價值,可以掰掰了),容器一旦被刪除,其中的data也會隨之刪除,也就是說,Container內的資料是隨著Container存在而存在的;當然也隨著Container消失而消失。槍在人在,槍亡人亡

你可以想像成是揮發性記憶體和非揮發性記憶體,揮發性記憶體只在通電時能儲存資料,一旦斷電資料就消失,有點類似這個概念

那要如何將Container的資料保存下來,就需要透過Volume了。

Volume可以是一個Node或是一個雲端儲存平台,是K8s實現儲存資料的方式。透過將Volume mount 到Pod上,就可以實現儲存Pod的資料
多個Pod可以同時mount同一個Volume

Pod要如何mount到Volume呢?我們來舉個例子,下面是一個亂數產生器的Pod YAML,會將結果輸出到容器的/opt/result.out這個檔案下,但是容器的資料會消失,所以我們要將輸出資料mount到test-volume這個Volume上,這個Volume的type是hostPath,也就是掛載 /data 這個目錄。也就是說這個Pod所在Node的 /data 目錄就是我們的Volume

apiVersion: v1
kind: Pod
metadata:
  name: random-number-generator
spec:
  containers:
  - image: alpine
    name: alpine
    command: ["/bin/bash", "-c"]
    args: ["shuf -i 0-50 -n 1 >> /opt/result.out"]
    ##  container中要mount到volume上的目錄
    volumeMounts:
    - mountPath: /opt
      name: test-volume
  ## vloume的名稱、路徑及類別
  volumes:
  - name: test-volume
    hostPath:
      path: /data
      type: Directory

上面YAML檔中有個欄位spec.volumes.type,也就是Vloume的類型。K8s提供的Vloume類型非常多,一共有以下幾種:

  • awsElasticBlockStore
  • azureDisk
  • azureFile
  • cephfs
  • cinder
  • configMap
  • csi
  • downwardAPI
  • emptyDir
  • fc (fibre channel)
  • flexVolume
  • flocker
  • gcePersistentDisk
  • gitRepo (deprecated)
  • glusterfs
  • hostPath
  • iscsi
  • local
  • nfs
  • persistentVolumeClaim
  • projected
  • portworxVolume
  • quobyte
  • rbd
  • scaleIO
  • secret
  • storageos
  • vsphereVolume

很多對不對? 但是筆者認為目前只要了解其中幾個就行了,其他的等需要用到再學也不遲。筆者認為必須知道的類型有:

  • emptyDir
    Pod調度某給Node時,首先創建emptyDir Volume,並且該Pod在該Node上運行時就存在。顧名思義,它最初是空的。Pod中的容器都可以在emptyDir Volume中讀取和寫入相同的文件,儘管該Volume可以安裝在每個Container中的相同或不同路徑上。當PodNode中被刪除時,emptyDir中的數據也將被刪除。
    emptyDir的用途包含:
    • 臨時空間,例如用於某些應用程式執行階段所需的臨時目錄,且無須永久保存
    • 長時間工作的中間過程CheckPoint的臨時儲存目錄
    • 多容器共用目錄

Container crash不會從Node上刪除Pod,因此,在Container crash期間,emptyDir Volume中的資料是安全的

範例YAML:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}
  • hostPath
    hostPath VolumeNode檔案系統中的檔案或目錄mount到Pod中。hostPath 的生命週期與 Node 相同,並不會隨著 Pod消失而消失。hostPath的用途包含:
    • 容器應用程式產生的紀錄檔需要永久儲存時,可以使用Node的檔案系統進行儲存
    • 需要存取NodeDocker內部資料結構的容器應用時,可以透過定義hostPathNode 的 /var/lib/docker 目錄,使容器可以直接存取Docker的檔案系統

範例YAML:

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host
      path: /data
      # this field is optional
      type: Directory
  • persistentVolumeClaim
    這種type的Volume過幾天我們之後會再詳細介紹的~

那這題其實就很明瞭啦~ 步驟如下:

  1. 創建一個Pod
  2. mount到類型為emptyDirVolume中。

Answer

$ kubectl run redis-storage --image=redis:alpine --restart=Never --dry-run=client -o yaml > q7.yaml
$ vim q7.yaml

## 改成以下
apiVersion: v1
kind: Pod
metadata:
  name: redis-storage
spec:
  containers:
  - image: redis:alpine
    name: redis-storage
    volumeMounts:
    - mountPath: /data/redis
      name: test-volume
  volumes:
  - name: test-volume
    emptyDir: {}
    
$ kubectl apply -f q7.yaml

結論

今天介紹了K8s中儲存資料的方式 - Volume,其實Volume內容非常多,我們之後還會繼續看到的。好啦,今天就到這囉~ 謝謝大家~

參考資料

Volumes
[Kubernetes] Volume Overview

Thank you!

You can find me on

  • george4908090@gmail.com

上一篇
【從題目中學習k8s】-【Day14】第六題 - etcd backup
下一篇
【從題目中學習k8s】-【Day16】第八題 - Security Context for a Pod
系列文
從題目中學習k8s31

尚未有邦友留言

立即登入留言