W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
本文介紹如何配置 Pod 使用 PersistentVolumeClaim 作為存儲。 以下是該過程的總結(jié):
打開集群中節(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 了。
在本練習(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。 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, 該 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。
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)。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: