文章連結
PV
和 PVC
模式要先建立好 PV
,然後再定義好 PVC
進行一對一的繫結。那麼如果遇到大叢集,也一一的建立嗎?這樣來說維護成本很高,工作量大。這個時候就有了 Kubernetes
提供一種自動建立 PV
的機制,叫 StorageClass
,它的作用就是建立 PV
的模板。
StorageClass
會定義兩部分:
- PV的屬性:
比如儲存的大小、型別等 - PV需要使用到的儲存外掛
比如Ceph等;
有了這兩部分資訊,Kubernetes
就能夠根據使用者提交的 PVC
,找到對應的 StorageClass
,然後 Kubernetes
就會呼叫 StorageClass
宣告的儲存外掛,自動建立 PV
。
不過要使用 NFS
,我們就需要一個 nfs-client
的外掛。這個外掛會使 NFS
服務自動幫我們建立 PV
。
自動建立的 PV
會以 ${namespace}-${pvcName}-${pvName}
的格式儲存
如果 PV
被回收,則會以 archieved-${namespace}-${pvcName}-${pvName}
的格式儲存
詳細可以參考 Github
PV、PVC、NFS不再介紹,沒有完成的請檢視 kubernetes使用PV和PVC管理資料儲存
建立ServiceAccount
建立 ServiceAccount
的目的是為了給 nfs-client
授權。
# 下載 rbac.yaml
wget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/rbac.yaml
部署 rbac.yaml
kubectl apply -f rbac.yaml
# 輸出如下
serviceaccount/nfs-client-provisioner created
clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
建立 nfs-client
使用 Deployment 來建立 nfs-client
# 下載 deployment.yaml
wget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/deployment.yaml
修改 yaml 如下
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-client-provisioner
labels:
app: nfs-client-provisioner
# replace with namespace where provisioner is deployed
namespace: default
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs # 這裡的供應者名稱必須和class.yaml中的provisioner的名稱一致,否則部署不成功
- name: NFS_SERVER
value: 10.0.10.51 # 這裡寫NFS伺服器的IP地址或者能解析到的主機名
- name: NFS_PATH
value: /home/bsh/nfs # 這裡寫NFS伺服器中的共享掛載目錄(強調:這裡的路徑必須是目錄中最後一層的資料夾,否則部署的應用將無許可權建立目錄導致Pending)
volumes:
- name: nfs-client-root
nfs:
server: 10.0.10.51 # NFS伺服器的IP或可解析到的主機名
path: /home/bsh/nfs # NFS伺服器中的共享掛載目錄(強調:這裡的路徑必須是目錄中最後一層的資料夾,否則部署的應用將無許可權建立目錄導致Pending)
⚠️ 注意
value: fuseim.pri/ifs
# 這裡的供應者名稱必須和 class.yaml 中的 provisioner 的名稱一致,否則部署不成功
建立檢查
# 部署 nfs-client
kubectl apply -f deployment.yaml
# 輸出如下
deployment.apps/nfs-client-provisioner created
檢視pod
kubectl get pod
# 輸出如下
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-fd74f99b4-wr58j 1/1 Running 1 30s
建立 StorageClass
class.yaml
內容比較少,可以不用下載,具體內容如下
class.yaml 下載地址
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:
archiveOnDelete: "false"
⚠️ 注意
provisioner 必須和上面得 Deployment 的 YAML 檔案中 PROVISIONER_NAME 的值保持一致。
建立 storageclass
# 建立
kubectl apply -f class.yaml
# 輸出如下
storageclass.storage.k8s.io/managed-nfs-storage created
檢視狀態
kubectl get storageclass
# 輸出如下
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
managed-nfs-storage fuseim.pri/ifs Delete Immediate false 53s
建立 PVC
建立 tomcat-storageclass-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: tomcat
annotations:
volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 500Mi
部署 yaml
kubectl apply -f tomcat-storageclass-pvc.yaml
# 輸出如下
persistentvolumeclaim/tomcat created
檢視狀態
kubectl get pvc
# 輸出如下
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
tomcat Bound pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec 500Mi RWX managed-nfs-storage 48s
pod 使用新增 pvc
還拿之前的 tomcat 做實驗,我們把 tomcat 目錄下的 logs 拿到本地 nfs 中。
⚠️ 注意
如果遇到使用PVC 建立 pod 的時候發現無法建立成功。出現一下報錯的時候請參考 kubernetes 使用 PCV 建立 pod 報錯 persistentvolume-controller waiting for a volume to be created
具體 yaml 如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deployment
labels:
app: tomcat
spec:
replicas: 3
selector:
matchLabels:
app: tomcat
minReadySeconds: 1
progressDeadlineSeconds: 60
revisionHistoryLimit: 2
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: wenlongxue/tomcat:tomcat-demo-62-123xw2
imagePullPolicy: Always
ports:
- containerPort: 8080
resources:
requests:
memory: "2Gi"
cpu: "80m"
limits:
memory: "2Gi"
cpu: "80m"
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 180
periodSeconds: 5
timeoutSeconds: 3
successThreshold: 1
failureThreshold: 30
volumeMounts:
- mountPath: "/usr/local/tomcat/logs"
name: tomcat
# pvc 部分
volumes:
- name: tomcat
persistentVolumeClaim:
claimName: tomcat
---
# Service 服務部分
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat
spec:
selector:
app: tomcat
ports:
- name: tomcat-port
protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP
---
# ingress 服務部分
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tomcat
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls:
- hosts:
- tomcat.cnsre.cn
secretName: tls-secret
rules:
- host: tomcat.cnsre.cn
http:
paths:
- path: "/"
pathType: Prefix
backend:
service:
name: tomcat-service
port:
number: 8080
部署 pod 服務
kubectl apply -f tomcatc.yaml
# 輸出如下
deployment.apps/tomcat-deployment created
檢視狀態
kubectl get pod
# 輸出如下
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-fd74f99b4-wr58j 1/1 Running 0 76m
tomcat-deployment-7588b5c8fd-cnwvt 1/1 Running 0 59m
tomcat-deployment-7588b5c8fd-kl8fj 1/1 Running 0 59m
tomcat-deployment-7588b5c8fd-ksbg9 1/1 Running 0 59m
檢視 PV PVC
[root@master tomccat]# kubectl get pv,pvc
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec 500Mi RWX Delete Bound default/tomcat managed-nfs-storage 65m
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/tomcat Bound pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec 500Mi RWX managed-nfs-storage 65m
檢視 nfs server 目錄中資訊
[root@node1 ~]# ll /home/bsh/nfs/default-tomcat-pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec/
總用量 220
-rw-r-----. 1 root root 22217 9月 3 14:49 catalina.2021-09-03.log
-rw-r-----. 1 root root 0 9月 3 14:41 host-manager.2021-09-03.log
-rw-r-----. 1 root root 2791 9月 3 14:49 localhost.2021-09-03.log
-rw-r-----. 1 root root 118428 9月 3 15:31 localhost_access_log.2021-09-03.txt
-rw-r-----. 1 root root 0 9月 3 14:41 manager.2021-09-03.log