k8s資料儲存

misakivv發表於2024-08-02

目錄
  • 一、引言
  • 二、基本儲存
    • 1、EmptyDir
      • 1.1、示例
      • 1.2、建立資源清單
      • 1.3、建立Pod
      • 1.4、檢視Pod
      • 1.5、透過PodIP訪問nginx
      • 1.6、檢視容器的標準輸出
    • 2、HostPath
      • 2.1、建立資源清單
      • 2.2、.spec.volumes[*].hostPath.type
      • 2.3、建立Pod
      • 2.4、檢視Pod
      • 2.5、透過PodIP訪問nginx
      • 2.6、到host的/root/logs目錄下檢視儲存的檔案
      • 2.7、host下建立檔案觀察容器內部變化
      • 2.8、刪除Pod觀察host本地檔案是否存在
    • 3、NFS
      • 3.1、準備NFS伺服器
        • 3.1.1、master節點安裝nfs服務
        • 3.1.2、準備一個共享目錄
        • 3.1.3、將共享目錄以讀寫許可權暴露給同一網段中的所有主機
        • 3.1.4、啟動nfs服務
      • 3.2、每個節點安裝nfs
      • 3.3、編寫資源清單
      • 3.4、建立Pod
      • 3.5、檢視Pod
      • 3.6、透過PodIP訪問nginx
      • 3.7、檢視nfs伺服器的共享目錄
  • 三、高階儲存
    • 1、引言
    • 2、PV
      • 2.1、資源清單
      • 2.2、欄位解釋
      • 2.3、核心概念
        • 2.3.1、訪問模式(accessModes)
        • 2.3.2、回收策略(persistentVolumeReclaimPolicy)
        • 2.3.3、狀態
      • 2.4、使用NFS作為儲存,演示PV的使用
        • 2.4.1、準備NFS環境
        • 2.4.2、編寫資源清單
        • 2.4.3、建立PV
        • 2.4.4、檢視PV
    • 3、PVC
      • 3.1、資源清單
      • 3.2、欄位解釋
      • 3.3、示例
        • 3.3.1、編寫PVC資源清單,申請PV
        • 3.3.2、建立PVC
        • 3.3.3、檢視PVC
        • 3.3.4、檢視PV
        • 3.3.5、編寫Pod資源清單,使用PVC
        • 3.3.6、建立Pod
        • 3.3.7、檢視Pod,PVC,PV
        • 3.3.8、檢視nfs中的檔案儲存
        • 3.3.9、刪除pod和pvc,檢視pv狀態
      • 3.4、生命週期
  • 四、配置儲存
    • 1、ConfigMap
      • 1.1、資源清單
      • 1.2、欄位解釋
      • 1.3、使用場景
        • 1.3.1、作為環境變數
        • 1.3.2、掛載為檔案
        • 1.3.3、掛載為 Volume 中的檔案
      • 1.4、示例
        • 1.4.1、編寫configmap資源清單
        • 1.4.2、建立ConfigMap
        • 1.4.3、檢視ConfigMap詳細資訊
        • 1.4.4、編寫pod-configmap.yaml,將建立的configmap掛載進去
        • 1.4.5、建立Pod,並進入容器檢視
        • 1.4.6、線上修改configmap的內容,檢視容器中變化
    • 2、Secret
      • 2.1、Secret的型別
      • 2.2、示例
        • 2.2.1、使用base64對資料進行編碼
        • 2.2.2、編寫Secret資源清單並建立Secret
        • 2.2.3、檢視secret詳情
        • 2.2.4、建立Pod,將上面建立的Secret掛載上去
        • 2.2.5、進入容器檢視Secret資訊

一、引言

容器的生命週期可能很短,會被頻繁地建立和銷燬。容器在銷燬時,儲存在容器中的資料也會被清除。這種結果對使用者來說,在某些情況下是不樂意看到的。為了持久化儲存容器的資料,kubernetes引入了Volume的概念。

Volume是Pod中能夠被多個container訪問的共享目錄。它被定義在Pod上,然後被一個Pod裡的多個容器掛載到具體的檔案目錄下。Kubernetes透過Volume實現:

  1. 同一個Pod中不同容器之間的資料共享
  2. 資料的持久化儲存。

Volume的生命週期不與Pod中單個container的生命週期相關聯。當container終止或重啟時,Volume中的資料也不會丟失。

Kubernetes的Volume支援多種型別,常見的有:

  • 簡單儲存EmptyDirHostPathNFS
  • 高階儲存PVPVC
  • 配置儲存ConfigMapSecret

二、基本儲存

1、EmptyDir

最基礎的Volume型別,一個EmptyDir就是Host上的一個空目錄。

EmptyDir是在Pod分配到Node時建立的,它的初始內容為空,並且無需指定宿主機上對應的目錄檔案,因為kubernetes會自動分配一個目錄。當Pod銷燬時,EmptyDir中的資料也會被永久刪除。EmptyDir用途為:

  • 臨時空間,例如用於某些應用程式執行時所需的臨時目錄,且無需永久保留
  • 一個容器需要從另一個容器中獲取資料的目錄(多容器共享目錄)
  • 快取空間,例如基於磁碟的歸併排序。
  • 為耗時較長的計算任務提供檢查點,以便任務能方便地從崩潰前狀態恢復執行。
  • 在 Web 伺服器容器服務資料時,儲存內容管理器容器獲取的檔案。

1.1、示例

下面演示一個示例:在一個Pod中準備2個容器:nginx和busybox,然後宣告一個Volume分別掛在2個容器的目錄中。Nginx負責向Volume中寫日誌,busybox中透過命令將日誌內容讀到控制檯。

如下圖所示:

image-20240801002333395

1.2、建立資源清單

volume-emptydir.yaml

apiVersion: v1
kind: Pod
metadata:
   name: volume-emptydir
   namespace: default
spec:
   containers:
   - name: nginx
     image: nginx:1.17.1
     ports:
     - containerPort: 80
     volumeMounts:
     - name: logs-volume
       mountPath: /var/log/nginx
   - name: busybox
     image: busybox:1.30
     command: ["/bin/sh", "-c", "tail -f /logs/access.log"]
     volumeMounts:
     - name: logs-volume
       mountPath: /logs
   volumes:
   - name: logs-volume
     emptyDir: {}

1.3、建立Pod

kubectl apply -f volume-emptydir.yaml

image-20240730154218490

1.4、檢視Pod

kubectl get pods -o wide

image-20240730154423817

1.5、透過PodIP訪問nginx

curl 10.244.2.10

image-20240730154621781

1.6、檢視容器的標準輸出

kubectl logs -f volume-emptydir -n default -c busybox

image-20240730154756275

2、HostPath

上面EmptyDir提到,EmptyDir中資料不會被持久化,它會隨著Pod的結束而銷燬,如果想簡單的將資料持久化到主機中,可以選擇HostPath。

HostPath就是將Node主機中一個實際目錄掛在到Pod中,以供容器使用,這樣的設計就可以保證Pod銷燬了,但是資料依據可以存在於Node主機上。

image-20240801234925204

2.1、建立資源清單

volume-hostpath.yaml

apiVersion: v1
kind: Pod
metadata:
  name: volume-hostpath
  namespace: default
spec:
  containers:
    - name: nginx
      image: nginx:1.17.1
      ports:
        - containerPort: 80
      volumeMounts:
        - name: logs-volume
          mountPath: /var/log/nginx
    - name: busybox
      image: busybox:1.30
      command: [ "/bin/sh","-c","tail -f /logs/access.log" ]
      volumeMounts:
        - name: logs-volume
          mountPath: /logs
  volumes:
    - name: logs-volume
      hostPath:
        path: /root/logs
        type: DirectoryOrCreate  # 目錄存在就使用,不存在就先建立後使用

2.2、.spec.volumes[*].hostPath.type

關於type型別的說明:

型別 說明
DirectoryOrCreate 目錄存在就使用,不存在就先建立
Directory 目錄必須存在
FileOrCreate 檔案存在就使用,不存在就先建立
File 檔案必須存在
Socket unix套接字必須存在
CharDevice 字元裝置必須存在
BlockDevice 塊裝置必須存在

2.3、建立Pod

kubectl apply -f volume-hostpath.yaml

image-20240730155231004

2.4、檢視Pod

kubectl get pods -n default -o wide

image-20240730155605815

2.5、透過PodIP訪問nginx

curl 10.244.1.9

image-20240730155835120

2.6、到host的/root/logs目錄下檢視儲存的檔案

下面的操作需要到Pod所在的節點執行(案例中是k8s-node1)

tail -f /root/logs/access.log

image-20240730160208446

2.7、host下建立檔案觀察容器內部變化

echo "hello HostPath" > test
在host本地建立檔案驗證同步
image-20240730160540528
分別進入nginx和busybox容器檢視
image-20240730161126477

2.8、刪除Pod觀察host本地檔案是否存在

kubectl delete pods volume-hostpath -n default

image-20240730162352540

3、NFS

HostPath可以解決資料持久化的問題,但是一旦Node節點故障了,Pod如果轉移到了別的節點,又會出現問題了(會有新的hostpath volume在別的Node建立,但是原來的資料丟失了),此時需要準備單獨的網路儲存系統,比較常用的用NFS、CIFS。
NFS是一個網路檔案儲存系統,可以搭建一臺NFS伺服器,然後將Pod中的儲存直接連線到NFS系統上,這樣的話,無論Pod在節點上怎麼轉移,只要Node跟NFS的對接沒問題,資料就可以成功訪問。

image-20240801235341867

3.1、準備NFS伺服器

3.1.1、master節點安裝nfs服務

master節點做nfs伺服器

yum install -y nfs-utils

3.1.2、準備一個共享目錄

mkdir -pv /root/data/nfs

3.1.3、將共享目錄以讀寫許可權暴露給同一網段中的所有主機

echo "/root/data/nfs 192.168.112.0/24(rw,sync,no_subtree_check)" >> /etc/exports

3.1.4、啟動nfs服務

systemctl start nfs && systemctl enable nfs

3.2、每個節點安裝nfs

不需要啟動

yum install -y nfs-utils

3.3、編寫資源清單

volume-nfs.yaml

apiVersion: v1
kind: Pod
metadata:
  name: volume-nfs
  namespace: default
spec:
  containers:
    - name: nginx
      image: nginx:1.17.1
      ports:
        - containerPort: 80
      volumeMounts:
        - name: logs-volume
          mountPath: /var/log/nginx
    - name: busybox
      image: busybox:1.30
      command: [ "/bin/sh","-c","tail -f /logs/access.log" ]
      volumeMounts:
        - name: logs-volume
          mountPath: /logs
  volumes:
    - name: logs-volume
      nfs:
        server: 192.168.112.10  #nfs伺服器地址
        path: /root/data/nfs #共享檔案路徑

3.4、建立Pod

kubectl apply -f volume-nfs.yaml

image-20240730164943423

3.5、檢視Pod

kubectl get pods -o wide

image-20240730173745582

3.6、透過PodIP訪問nginx

curl 10.244.2.3

image-20240730174005173

3.7、檢視nfs伺服器的共享目錄

cd /root/data/nfs && ls

cat access.log

image-20240730174137541

三、高階儲存

1、引言

為了能夠遮蔽底層儲存實現的細節,方便使用者使用,kubernetes引入了PV和PVC兩種資源物件。

持久卷(PersistentVolume,PV)是叢集中由管理員配置的一段網路儲存。它是叢集中的資源,就像節點是叢集資源一樣。一般情況下PV由kubernetes管理員進行建立和配置,它與底層具體的共享儲存技術有關。PV持久卷和普通的Volume一樣,也是使用卷外掛來實現的,只是它們擁有獨立於任何使用PV的Pod的生命週期。此API物件捕獲儲存實現的詳細資訊,包括NFS,iSCSI或特定於雲提供程式的儲存系統。

持久卷申領(PersistentVolumeClaim,PVC)表達的是使用者對儲存的請求。概念上與Pod類似。Pod會耗用節點資源,而PVC申領會耗用PV資源。Pod可以請求特定數量的資源(CPU 和記憶體);同樣 PVC 申領也可以請求特定的大小和訪問模式 。

img

對於使用者來說,只提儲存需求(PVC),專業的具體儲存配置細節(PV)由管理員完成。

使用了PV和PVC後,工作可以進一步細分:

  • 儲存:儲存工程師維護
  • PV:kubernetes管理員維護
  • PVC:kubernetes使用者維護

2、PV

PV是儲存資源的抽象

2.1、資源清單

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs-storage
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    path: /nfs/data
    server: nfs-server.example.com

2.2、欄位解釋

  • apiVersion: Kubernetes API 版本,這裡是 v1。
  • kind: 資源型別,這裡是 PersistentVolume。
  • metadata: PV 的後設資料,包括名稱。
  • spec: PV 的具體規格。
    • capacity: PV 的容量大小。
    • volumeMode: PV 的模式,這裡為 Filesystem 表示這是一個檔案系統型別的 PV。
    • accessModes: PV 的訪問模式列表。
    • persistentVolumeReclaimPolicy: 當 PV 不再被任何 PVC 使用時的回收策略。
    • storageClassName: PV 所屬的儲存類名稱,可以為空表示無類。
    • mountOptions: NFS 掛載選項。
    • nfs: NFS 具體配置。
    • path: 在 NFS 伺服器上的路徑。
    • server: NFS 伺服器的地址

2.3、核心概念

2.3.1、訪問模式(accessModes)

用於描述使用者應用對儲存資源的訪問許可權,訪問許可權包括

  • ReadWriteOnce(RWO):只僅允許單個節點以讀寫方式掛載
  • ReadOnlyMany(ROX):可以被許多節點以只讀方式掛載
  • ReadWriteMany(RWX):可以被許多節點以只讀方式掛載
  • ReadWriteOncePod(RWOP k8s v1.29):卷可以被單個 Pod 以讀寫方式掛載。

2.3.2、回收策略(persistentVolumeReclaimPolicy)

  • Retain:保留,該策略允許手動回收資源,當刪除PVC時,PV仍然存在,PV被視為已釋放,管理員可以手動回收卷。
  • Delete:刪除,如果Volume外掛支援,刪除PVC時會同時刪除PV,動態卷預設為Delete,目前支援Delete的儲存後端包括AWS EBS,GCE PD,Azure Disk,OpenStack Cinder等。
  • Recycle:回收,如果Volume外掛支援,Recycle策略會對卷執行rm -rf清理該PV,並使其可用於下一個新的PVC,但是本策略將來會被棄用,目前只有NFS和HostPath支援該策略。

2.3.3、狀態

  • Available,表示pv已經建立正常,處於可用狀態;
  • Bound,表示pv已經被某個pvc繫結,注意,一個pv一旦被某個pvc繫結,那麼該pvc就獨佔該pv,其他pvc不能再與該pv繫結;
  • Released,表示pvc被刪除了,pv狀態就會變成已釋放;
  • Failed,表示pv的自動回收失敗;

2.4、使用NFS作為儲存,演示PV的使用

2.4.1、準備NFS環境

  • 建立目錄
mkdir -pv /root/data/pv{1..3}

image-20240730192514329

  • 暴露服務
echo -e "/root/data/pv1\t192.168.112.0/24(rw,no_root_squash)\n/root/data/pv2\t192.168.112.0/24(rw,no_root_squash)\n/root/data/pv3\t192.168.112.0/24(rw,no_root_squash)" > /root/data/nfs_exports

image-20240730193113143

  • 重啟nfs服務
systemctl restart nfs

2.4.2、編寫資源清單

pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv1
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /root/data/pv1
    server: 192.168.112.10

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv2
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /root/data/pv2
    server: 192.168.112.10

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name:  pv3
spec:
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /root/data/pv3
    server: 192.168.112.10

2.4.3、建立PV

kubectl apply -f pv.yaml

image-20240730193752934

2.4.4、檢視PV

kubectl get pv -o wide

image-20240730193847790

3、PVC

PVC作為使用者對儲存資源的需求申請,主要包括儲存空間請求、訪問模式、PV選擇條件和儲存類別等資訊的設定。

3.1、資源清單

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Filesystem
  resources:
    requests:
      storage: 8Gi
  storageClassName: slow
  selector:
    matchLabels:
      release: "stable"
    matchExpressions:
      - {key: environment, operator: In, values: [dev]}

3.2、欄位解釋

  • apiVersion: Kubernetes API 版本,這裡是 v1。

  • kind: 資源型別,這裡是 PersistentVolumeClaim。

  • metadata:

    • name: PVC 的名稱,這裡是 myclaim。
  • spec: PVC 的具體規格。

    • accessModes: PVC 請求的訪問模式列表。這裡請求的是 ReadWriteOnce,意味著 PVC 只能被單個節點以讀寫方式掛

    • volumeMode: PVC 請求的 PV 的模式,這裡為 Filesystem 表示這是一個檔案系統型別的 PV。

    • resources:

      • requests: PVC 請求的資源量,這裡是 storage: 8Gi,即請求 8GiB 的儲存空間。
    • storageClassName: PVC 請求的儲存類名稱,這裡是 slow。如果未指定,則使用預設儲存類。

    • selector: PVC 可以選擇特定的 PV。如果指定,PVC 只能繫結到符合這些選擇器條件的 PV。

      • matchLabels: 標籤選擇器。這裡的 PVC 將僅繫結到帶有標籤 release: stable 的 PV。
      • matchExpressions: 表示式選擇器。這裡的 PVC 將僅繫結到帶有標籤 environment 並且值為 dev 的 PV。

3.3、示例

3.3.1、編寫PVC資源清單,申請PV

pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc1
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Gi

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc2
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 3Gi

---

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc3
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

3.3.2、建立PVC

kubectl applpy -f pvc.yaml

image-20240730200946288

3.3.3、檢視PVC

kubectl get pvc -o wide

image-20240730201347410

3.3.4、檢視PV

kubectl get pv -o wide

image-20240730201517699

3.3.5、編寫Pod資源清單,使用PVC

pods.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod1
  namespace: default
spec:
  containers:
    - name: busybox
      image: busybox:1.30
      command: [ "/bin/sh","-c","while true;do echo pod1 >> /root/out.txt; sleep 10; done;" ]
      volumeMounts:
        - name: volume
          mountPath: /root/
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: pvc1
        readOnly: false
---
apiVersion: v1
kind: Pod
metadata:
  name: pod2
  namespace: default
spec:
  containers:
    - name: busybox
      image: busybox:1.30
      command: [ "/bin/sh","-c","while true;do echo pod2 >> /root/out.txt; sleep 10; done;" ]
      volumeMounts:
        - name: volume
          mountPath: /root/
  volumes:
    - name: volume
      persistentVolumeClaim:
        claimName: pvc2
        readOnly: false

3.3.6、建立Pod

kubectl apply -f pods.yaml

image-20240730202113136

3.3.7、檢視Pod,PVC,PV

kubectl get pods,pvc,pv -o wide

image-20240730202510890

3.3.8、檢視nfs中的檔案儲存

cat /root/data/pv1/out.txt
cat /root/data/pv2/out.txt
cat /root/data/pv3/out.txt
/root/data/pv1/out.txt
image-20240730203551447
/root/data/pv2/out.txt
image-20240730203651579
/root/data/pv3/out.txt
image-20240730203830479

Pod1 使用了 PVC1,PVC1 繫結了 PV1。因此,Pod1 寫入的檔案位於 /root/data/pv1/out.txt。
Pod2 使用了 PVC2,PVC2 繫結了 PV3。因此,Pod2 寫入的檔案位於 /root/data/pv3/out.txt。
PV2 未被使用,因此 /root/data/pv2/out.txt 檔案不存在。

3.3.9、刪除pod和pvc,檢視pv狀態

kubectl delete -f pods.yaml

kubectl delete -f pvc.yaml

kubectl get pv -o wide

image-20240730204255191

3.4、生命週期

PVC和PV是一一對應的,PV和PVC之間的相互作用遵循以下生命週期

1、資源供應:管理員手動建立底層儲存和PV

2、資源繫結:使用者建立PVC,kubernetes負責根據PVC的宣告去尋找PV,並繫結在使用者定義好PVC之後,系統將根據PVC對儲存資源的請求在已存在的PV中選擇一個滿足條件的

  • 一旦找到,就將該PV與使用者定義的PVC進行繫結,使用者的應用就可以使用這個PVC了。PV一旦繫結到某個PVC上,就會被這個PVC獨佔,不能再與其他PVC進行繫結了

  • 如果找不到,PVC則會無限期處於Pending狀態,直到等到系統管理員建立了一個符合其要求的PV

3、資源使用:使用者可在pod中像volume一樣使用pvc

Pod使用Volume的定義,將PVC掛載到容器內的某個路徑進行使用。

4、資源釋放:使用者刪除pvc來釋放pv

當儲存資源使用完畢後,使用者可以刪除PVC,與該PVC繫結的PV將會被標記為“已釋放”,但還不能立刻與其他PVC進行繫結。透過之前PVC寫入的資料可能還被留在儲存裝置上,只有在清除之後該PV才能再次使用。

5、資源回收:kubernetes根據pv設定的回收策略進行資源的回收

對於PV,管理員可以設定回收策略,用於設定與之繫結的PVC釋放資源之後如何處理遺留資料的問題。只有PV的儲存空間完成回收,才能供新的PVC繫結和使用

image-20240802001743014

四、配置儲存

1、ConfigMap

ConfigMap 是 Kubernetes 中的一種 API 物件,用於儲存非敏感的配置資料。它允許開發者將配置資料與應用程式容器分離,從而使得配置可以在不重新構建容器映象的情況下進行更改。ConfigMap 可以儲存簡單的鍵值對或者一組檔案,並且可以透過多種方式被應用程式容器訪問。

1.1、資源清單

apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # 類屬性鍵;每一個鍵都對映到一個簡單的值
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"

  # 類檔案鍵
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true    

1.2、欄位解釋

apiVersion: v1

  • 說明: 指定 ConfigMap 的 API 版本。在這個例子中,我們使用的是 Kubernetes API 的第一個版本。

kind: ConfigMap

  • 說明: 指定此資源的型別為 ConfigMap。

metadata:

  • 說明: 包含後設資料資訊,比如名稱。
    • name: game-demo
      • 說明: ConfigMap 的名稱。在同一個名稱空間內必須唯一。

data:

  • 說明: 儲存配置資料的部分,支援鍵值對的形式。
    • player_initial_lives: "3"
      • 說明: 一個鍵值對,鍵為 player_initial_lives,值為 "3"。這個鍵值對錶示玩家初始的生命值為 3。
    • ui_properties_file_name: "user-interface.properties"
      • 說明: 一個鍵值對,鍵為 ui_properties_file_name,值為 "user-interface.properties"。這個鍵值對錶示 UI 屬性檔案的名稱。
    • game.properties: |
      • 說明: 一個多行配置檔案的示例。這裡使用了 YAML 的|符號來表示一個塊文字(block text),允許你直接嵌入多行文字而不必使用換行符。
        • enemy.types=aliens,monsters
          • 說明: 表示敵人型別為外星人和怪物。
        • player.maximum-lives=5
          • 說明: 表示玩家的最大生命值為 5。
    • user-interface.properties: |
      • 說明: 另一個多行配置檔案的示例。
        • color.good=purple
          • 說明: 表示好的顏色為紫色。
        • color.bad=yellow
          • 說明: 表示壞的顏色為黃色。
        • allow.textmode=true
          • 說明: 表示是否允許文字模式。

1.3、使用場景

官方示例的 ConfigMap 可以透過多種方式被 Pod 使用

1.3.1、作為環境變數

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    env:
    - name: PLAYER_INITIAL_LIVES
      valueFrom:
        configMapKeyRef:
          name: game-demo
          key: player_initial_lives
    - name: UI_PROPERTIES_FILE_NAME
      valueFrom:
        configMapKeyRef:
          name: game-demo
          key: ui_properties_file_name

1.3.2、掛載為檔案

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: config-volume
      mountPath: /etc/game-demo
    volumes:
    - name: config-volume
      configMap:
        name: game-demo

1.3.3、掛載為 Volume 中的檔案

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    volumeMounts:
    - name: config-volume
      mountPath: /etc/game-demo
    volumes:
    - name: config-volume
      configMap:
        name: game-demo
        items:
        - key: player_initial_lives
          path: player_initial_lives.properties
        - key: ui_properties_file_name
          path: ui_properties_file_name.properties
        - key: game.properties
          path: game.properties
        - key: user-interface.properties
          path: user-interface.properties

1.4、示例

1.4.1、編寫configmap資源清單

apiVersion: v1
kind: ConfigMap
metadata:
  name: configmap
  namespace: default
data: # info是key,後面的都是value
  info: | # | 代表保留換行符
    username:admin
    password:123456

1.4.2、建立ConfigMap

kubectl apply -f configmap.yaml

image-20240730234833147

1.4.3、檢視ConfigMap詳細資訊

kubectl describe configmap configmap

image-20240730235135501

1.4.4、編寫pod-configmap.yaml,將建立的configmap掛載進去

apiVersion: v1
kind: Pod
metadata:
  name: pod-configmap
  namespace: default
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
    volumeMounts: # 將configmap掛載到目錄
    - name: config
      mountPath: /configmap/config
  volumes: # 引用configmap
  - name: config
    configMap:
      name: configmap # 注意這裡的name就是上面建立好的configmap

1.4.5、建立Pod,並進入容器檢視

kubectl apply -f pod-configmap.yaml

kubectl exec -it pod-configmap -c nginx /bin/bash

cd configmap/config/ && ls && cat info

image-20240730235840604

可以看到對映已經成功,每個configmap都對映成了一個目錄

key--->檔案 value---->檔案中的內容

1.4.6、線上修改configmap的內容,檢視容器中變化

kubectl edit configmap configmap

kubectl exec -it pod-configmap -c nginx /bin/bash

cd configmap/config/ && ls && cat change info
kubectl edit 線上修改ConfigMap
image-20240731000447888
進入到容器檢視內容變化
image-20240731000647467

2、Secret

在kubernetes中,還存在一種和ConfigMap非常類似的物件,稱為Secret物件。用於儲存敏感資訊,如密碼、金鑰和其他機密資料。Secret 的設計目的是為了安全地管理這些敏感資訊,避免它們被硬編碼到配置檔案或原始碼中。

2.1、Secret的型別

建立 Secret 時,你可以使用 Secret 資源的 type 欄位,或者與其等價的 kubectl 命令列引數(如果有的話)為其設定型別。 Secret 型別有助於對 Secret 資料進行程式設計處理。

Kubernetes 提供若干種內建的型別,用於一些常見的使用場景。 針對這些型別,Kubernetes 所執行的合法性檢查操作以及對其所實施的限制各不相同。

內建型別 用法
Opaque 使用者定義的任意資料
kubernetes.io/service-account-token 服務賬號令牌
kubernetes.io/dockercfg ~/.dockercfg 檔案的序列化形式
kubernetes.io/dockerconfigjson ~/.docker/config.json 檔案的序列化形式
kubernetes.io/basic-auth 用於基本身份認證的憑據
kubernetes.io/ssh-auth 用於 SSH 身份認證的憑據
kubernetes.io/tls 用於 TLS 客戶端或者伺服器端的資料
bootstrap.kubernetes.io/token 啟動引導令牌資料

透過為 Secret 物件的 type 欄位設定一個非空的字串值,你也可以定義並使用自己 Secret 型別(如果 type 值為空字串,則被視為 Opaque 型別)。

Kubernetes 並不對型別的名稱作任何限制。不過,如果你要使用內建型別之一, 則你必須滿足為該型別所定義的所有要求。

如果你要定義一種公開使用的 Secret 型別,請遵守 Secret 型別的約定和結構, 在型別名前面新增域名,並用 / 隔開。 例如:cloud-hosting.example.net/cloud-api-credentials

2.2、示例

2.2.1、使用base64對資料進行編碼

echo -n 'root' | base64

echo -n 'zhangsan' | base64

image-20240731231850202

在建立 Kubernetes Secret 時,使用 -n 引數可以確保 base64 編碼的字串不會包含不必要的換行符,因為換行符可能會導致 base64 編碼的結果不正確。

2.2.2、編寫Secret資源清單並建立Secret

secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: secret
  namespace: default
type: Opaque
data:
  username: cm9vdA==
  password: emhhbmdzYW4=
kubectl apply -f secret.yaml

image-20240731232538345

2.2.3、檢視secret詳情

kubectl get secret secret -o yaml

image-20240731232749287

2.2.4、建立Pod,將上面建立的Secret掛載上去

pod-secret.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod-secret
  namespace: default
spec:
  containers:
    - name: nginx
      image: nginx:1.17.1
      volumeMounts: # 將secret掛載到目錄
        - name: config
          mountPath: /secret/config
  volumes:
    - name: config
      secret:
        secretName: secret
kubectl apply -f pod-secret.yaml

kubectl get pods -o wide

image-20240731233719383

2.2.5、進入容器檢視Secret資訊

kubectl exec -it pod-secret -- bash

image-20240731234835852

相關文章