iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
DevOps

從認識Docker到精通系列 第 24

第二十四天 - Storage In K8s

  • 分享至 

  • xImage
  •  

Storage In K8s

我們在前幾天花了一些 Controller, Scheduler 的特性和設置,相信大家應該都已經理解了(吧?)
接下來就來講 K8s 儲存資料的部分吧!

像 docker 一樣,k8s中的pod都是以映像檔 image 建立的,因此他和docker的 container 有著一樣的特性:資料不會永久儲存,若是遇到 pod 崩潰, kubectl 會自動去重啟這個 pod,但這個 pod 只會含有最初映像檔的資料,其他的資料會一去不復返。

K8s 中和 docker 有著一樣的 Volume,且k8s 中的 volume 是與 pod 綁定的,和 pod 有著一樣的生命週期,且是一樣的資源物件,當 pod 需要使用volume中存儲的資料時,使用 volumeMount 便可將volume 掛載至 pod 中,使 pod 得以使用內部的資料。

目前 K8s 支援的 Volume包含以下幾種:

  • K8s 內部資源物件類型
  • 開放原始碼共用儲存類型
  • 硬體儲存裝置
  • 公有雲儲存服務

有一些資源類型也會被映射為檔案或目錄:

  • ConfigMap:應用設定
  • Secret:加密資料
  • DownwardAPI:Pod 或 Container 中的中繼資訊
  • ServiceAccountToken:Service Account的Token 資料
  • Projected Volume:特殊的儲存卷冊類型,用於將一個或多個上列的資源類型掛載到容器中的同一個目錄之下

K8s 管理的宿主機本機存放區類型分為:

  • EmptyDir:用於存放臨時存放的資料
  • HostPath:用於存放在宿主機目錄的資料

今天先來介紹 ConfigMapSecret

ConfigMap

ConfigMap 是一種用來存放非機密性設置資料的 API 物件,所有的資料會被存在 k8s 的 etcd中,在這邊不會細講 ConfigMap 的內容,僅會講解如何設置及掛載到k8s上,對於ConfigMap內容有興趣的人可以到ConfigMaps | Kubernetes 查看

這是一個官方示例的 ConfigMap文件

apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # property-like keys; each key maps to a simple value
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"

  # file-like keys
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true 

在 pod 的設定YAML中,我們可以這樣設置volumeMounts,讓pod抓到這個ConfigMap檔,並放到 /configs

apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
    - name: demo
      image: alpine
      command: ["sleep", "3600"]
      env:
        # Define the environment variable
        - name: PLAYER_INITIAL_LIVES # Notice that the case is different here
                                     # from the key name in the ConfigMap.
          valueFrom:
            configMapKeyRef:
              name: game-demo           # The ConfigMap this value comes from.
              key: player_initial_lives # The key to fetch.
        - name: UI_PROPERTIES_FILE_NAME
          valueFrom:
            configMapKeyRef:
              name: game-demo
              key: ui_properties_file_name
      volumeMounts:
      - name: config
        mountPath: "/config"
        readOnly: true
  volumes:
    # You set volumes at the Pod level, then mount them into containers inside that Pod
    - name: config
      configMap:
        # Provide the name of the ConfigMap you want to mount.
        name: game-demo
        # An array of keys from the ConfigMap to create as files
        items:
        - key: "game.properties"
          path: "game.properties"
        - key: "user-interface.properties"
          path: "user-interface.properties"

待pod啟動後,便可以在/configs下看見我們設定的資訊了!

Secret

和 ConfigMap 類似
若今日有一個 Secret 已建立

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file, it will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
  username: YWRtaW4=
  password: MWYyZDFlMmU2N2Rm
kind: Secret
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: { ... }
  creationTimestamp: 2020-01-22T18:41:56Z
  name: mysecret
  namespace: default
  resourceVersion: "164619"
  uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque

則將pod的YAML檔中的 volumes 部分改成這樣即可

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
      readOnly: true
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      optional: false # default setting; "mysecret" must exist

一樣不著墨於Secret,有興趣的人可以看這份文件:Secrets | Kubernetes

明天講完剩下的三種儲存用的資源類型後,將進入k8s 存儲的重頭戲PV, PVC和CSI


上一篇
第二十三天 - Taints and Tolerations
下一篇
第25天 - Storage In K8s
系列文
從認識Docker到精通30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言