Kubernetes 配置Pod以使用PersistentVolume作為存儲

2022-06-09 13:54 更新

配置 Pod 以使用 PersistentVolume 作為存儲

本文介紹如何配置 Pod 使用 PersistentVolumeClaim 作為存儲。 以下是該過程的總結(jié):

  1. 你作為集群管理員創(chuàng)建由物理存儲支持的 PersistentVolume。你不會將卷與任何 Pod 關(guān)聯(lián)。
  2. 你現(xiàn)在以開發(fā)人員或者集群用戶的角色創(chuàng)建一個 PersistentVolumeClaim, 它將自動綁定到合適的 PersistentVolume。
  3. 你創(chuàng)建一個使用 PersistentVolumeClaim 作為存儲的 Pod。

在開始之前

  • 你需要一個包含單個節(jié)點(diǎn)的 Kubernetes 集群,并且必須配置 kubectl 命令行工具以便與集群交互。 如果還沒有單節(jié)點(diǎn)集群,可以使用 Minikube 創(chuàng)建一個。
  • 熟悉持久卷中的材料。

在你的節(jié)點(diǎn)上創(chuàng)建一個 index.html 文件 

打開集群中節(jié)點(diǎn)的一個 Shell。 如何打開 Shell 取決于集群的設(shè)置。 例如,如果你正在使用 Minikube,那么可以通過輸入 ?minikube ssh? 來打開節(jié)點(diǎn)的 Shell。

在 Shell 中,創(chuàng)建一個 ?/mnt/data? 目錄:

# 這里假定你的節(jié)點(diǎn)使用 "sudo" 來以超級用戶角色執(zhí)行命令
sudo mkdir /mnt/data

在 ?/mnt/data? 目錄中創(chuàng)建一個 index.html 文件:

# 這里再次假定你的節(jié)點(diǎn)使用 "sudo" 來以超級用戶角色執(zhí)行命令
sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html"

Note: 如果你的節(jié)點(diǎn)使用某工具而不是 ?sudo ?來完成超級用戶訪問,你可以將上述命令 中的 ?sudo ?替換為該工具的名稱。

測試 ?index.html? 文件確實(shí)存在:

cat /mnt/data/index.html

輸出應(yīng)該是:

Hello from Kubernetes storage

現(xiàn)在你可以關(guān)閉節(jié)點(diǎn)的 Shell 了。

創(chuàng)建 PersistentVolume

在本練習(xí)中,你將創(chuàng)建一個 hostPath 類型的 PersistentVolume。 Kubernetes 支持用于在單節(jié)點(diǎn)集群上開發(fā)和測試的 hostPath 類型的 PersistentVolume。 hostPath 類型的 PersistentVolume 使用節(jié)點(diǎn)上的文件或目錄來模擬網(wǎng)絡(luò)附加存儲。

在生產(chǎn)集群中,你不會使用 hostPath。 集群管理員會提供網(wǎng)絡(luò)存儲資源,比如 Google Compute Engine 持久盤卷、NFS 共享卷或 Amazon Elastic Block Store 卷。 集群管理員還可以使用 StorageClasses 來設(shè)置動態(tài)提供存儲。

下面是 hostPath PersistentVolume 的配置文件:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

創(chuàng)建 PersistentVolume:

kubectl apply -f https://k8s.io/examples/pods/storage/pv-volume.yaml

查看 PersistentVolume 的信息:

kubectl get pv task-pv-volume

輸出結(jié)果顯示該 PersistentVolume 的狀態(tài)(?STATUS?) 為 ?Available?。 這意味著它還沒有被綁定給 PersistentVolumeClaim。

NAME             CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
task-pv-volume   10Gi       RWO           Retain          Available             manual                   4s

創(chuàng)建 PersistentVolumeClaim

下一步是創(chuàng)建一個 PersistentVolumeClaim。 Pod 使用 PersistentVolumeClaim 來請求物理存儲。 在本練習(xí)中,你將創(chuàng)建一個 PersistentVolumeClaim,它請求至少 3 GB 容量的卷, 該卷至少可以為一個節(jié)點(diǎn)提供讀寫訪問。

下面是 PersistentVolumeClaim 的配置文件:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

創(chuàng)建 PersistentVolumeClaim:

kubectl create -f https://k8s.io/examples/pods/storage/pv-claim.yaml

創(chuàng)建 PersistentVolumeClaim 之后,Kubernetes 控制平面將查找滿足申領(lǐng)要求的 PersistentVolume。 如果控制平面找到具有相同 StorageClass 的適當(dāng)?shù)?nbsp;PersistentVolume, 則將 PersistentVolumeClaim 綁定到該 PersistentVolume 上。

再次查看 PersistentVolume 信息:

kubectl get pv task-pv-volume

現(xiàn)在輸出的 ?STATUS ?為 ?Bound?。

NAME             CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS    CLAIM                   STORAGECLASS   REASON    AGE
task-pv-volume   10Gi       RWO           Retain          Bound     default/task-pv-claim   manual                   2m

查看 PersistentVolumeClaim:

kubectl get pvc task-pv-claim

輸出結(jié)果表明該 PersistentVolumeClaim 綁定了你的 PersistentVolume ?task-pv-volume?。

NAME            STATUS    VOLUME           CAPACITY   ACCESSMODES   STORAGECLASS   AGE
task-pv-claim   Bound     task-pv-volume   10Gi       RWO           manual         30s

創(chuàng)建 Pod 

下一步是創(chuàng)建一個 Pod, 該 Pod 使用你的 PersistentVolumeClaim 作為存儲卷。

下面是 Pod 的 配置文件:

apiVersion: v1
kind: Pod
metadata:
  name: task-pv-pod
spec:
  volumes:
    - name: task-pv-storage
      persistentVolumeClaim:
        claimName: task-pv-claim
  containers:
    - name: task-pv-container
      image: nginx
      ports:
        - containerPort: 80
          name: "http-server"
      volumeMounts:
        - mountPath: "/usr/share/nginx/html"
          name: task-pv-storage


注意 Pod 的配置文件指定了 PersistentVolumeClaim,但沒有指定 PersistentVolume。 對 Pod 而言,PersistentVolumeClaim 就是一個存儲卷。

創(chuàng)建 Pod:

kubectl apply -f https://k8s.io/examples/pods/storage/pv-pod.yaml

檢查 Pod 中的容器是否運(yùn)行正常:

kubectl get pod task-pv-pod

打開一個 Shell 訪問 Pod 中的容器:

kubectl exec -it task-pv-pod -- /bin/bash

在 Shell 中,驗(yàn)證 nginx 是否正在從 hostPath 卷提供 ?index.html? 文件:

# 一定要在上一步 "kubectl exec" 所返回的 Shell 中執(zhí)行下面三個命令
root@task-pv-pod:/# apt-get update
root@task-pv-pod:/# apt-get install curl
root@task-pv-pod:/# curl localhost

輸出結(jié)果是你之前寫到 hostPath 卷中的 ?index.html? 文件中的內(nèi)容:

Hello from Kubernetes storage

如果你看到此消息,則證明你已經(jīng)成功地配置了 Pod 使用 PersistentVolumeClaim 的存儲。

清理 

刪除 Pod、PersistentVolumeClaim 和 PersistentVolume 對象:

kubectl delete pod task-pv-pod
kubectl delete pvc task-pv-claim
kubectl delete pv task-pv-volume

如果你還沒有連接到集群中節(jié)點(diǎn)的 Shell,可以按之前所做操作,打開一個新的 Shell。

在節(jié)點(diǎn)的 Shell 上,刪除你所創(chuàng)建的目錄和文件:

# 這里假定你使用 "sudo" 來以超級用戶的角色執(zhí)行命令
sudo rm /mnt/data/index.html
sudo rmdir /mnt/data

你現(xiàn)在可以關(guān)閉連接到節(jié)點(diǎn)的 Shell。

在兩個地方掛載相同的 persistentVolume 


apiVersion: v1
kind: Pod
metadata:
  name: test
spec:
  containers:
    - name: test
      image: nginx
      volumeMounts:
        # 網(wǎng)站數(shù)據(jù)掛載
        - name: config
          mountPath: /usr/share/nginx/html
          subPath: html
        # Nginx 配置掛載
        - name: config
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
  volumes:
    - name: config
      persistentVolumeClaim:
        claimName: test-nfs-claim

你可以在 nginx 容器上執(zhí)行兩個卷掛載:

?/usr/share/nginx/html? 用于靜態(tài)網(wǎng)站 ?/etc/nginx/nginx.conf? 作為默認(rèn)配置

訪問控制 

使用組 ID(GID)配置的存儲僅允許 Pod 使用相同的 GID 進(jìn)行寫入。 GID 不匹配或缺失將會導(dǎo)致無權(quán)訪問錯誤。 為了減少與用戶的協(xié)調(diào),管理員可以對 PersistentVolume 添加 GID 注解。 這樣 GID 就能自動添加到使用 PersistentVolume 的任何 Pod 中。

使用 ?pv.beta.kubernetes.io/gid? 注解的方法如下所示:

kind: PersistentVolume
apiVersion: v1
metadata:
  name: pv1
  annotations:
    pv.beta.kubernetes.io/gid: "1234"

當(dāng) Pod 使用帶有 GID 注解的 PersistentVolume 時(shí),注解的 GID 會被應(yīng)用于 Pod 中的所有容器, 應(yīng)用的方法與 Pod 的安全上下文中指定的 GID 相同。 每個 GID,無論是來自 PersistentVolume 注解還是來自 Pod 規(guī)約,都會被應(yīng)用于每個容器中 運(yùn)行的第一個進(jìn)程。

Note: 當(dāng) Pod 使用 PersistentVolume 時(shí),與 PersistentVolume 關(guān)聯(lián)的 GID 不會在 Pod 資源本身的對象上出現(xiàn)。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號