白日放歌须纵酒,青春作伴好还乡。这篇文章主要讲述Kubernetes 持久化数据存储 StorageClass相关的知识,希望能为你提供帮助。
https://www.cnsre.cn/posts/210903445142/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
kubectlapply-frbac.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
kubectlapply-fdeployment.yaml
# 输出如下
deployment.apps/nfs-client-provisioner created
查看pod
kubectl get pod
# 输出如下
NAMEREADYSTATUSRESTARTSAGE
nfs-client-provisioner-fd74f99b4-wr58j1/1Running130s
创建 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
# 创建
kubectlapply-fclass.yaml
# 输出如下
storageclass.storage.k8s.io/managed-nfs-storage created
查看状态
kubectl get storageclass
# 输出如下
NAMEPROVISIONERRECLAIMPOLICYVOLUMEBINDINGMODEALLOWVOLUMEEXPANSIONAGE
managed-nfs-storagefuseim.pri/ifsDeleteImmediatefalse53s
创建 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
kubectlapply-f tomcat-storageclass-pvc.yaml
# 输出如下
persistentvolumeclaim/tomcat created
查看状态
kubectl get pvc
# 输出如下
NAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGE
tomcatBoundpvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec500MiRWXmanaged-nfs-storage48s
pod 使用添加 pvc【Kubernetes 持久化数据存储 StorageClass】还拿之前的 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 服务
kubectlapply-f tomcatc.yaml
# 输出如下
deployment.apps/tomcat-deployment created
查看状态
kubectl get pod
# 输出如下
NAMEREADYSTATUSRESTARTSAGE
nfs-client-provisioner-fd74f99b4-wr58j1/1Running076m
tomcat-deployment-7588b5c8fd-cnwvt1/1Running059m
tomcat-deployment-7588b5c8fd-kl8fj1/1Running059m
tomcat-deployment-7588b5c8fd-ksbg91/1Running059m
查看 PV PVC
[root@master tomccat]# kubectlgetpv,pvc
NAMECAPACITYACCESS MODESRECLAIM POLICYSTATUSCLAIMSTORAGECLASSREASONAGE
persistentvolume/pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec500MiRWXDeleteBounddefault/tomcatmanaged-nfs-storage65mNAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGE
persistentvolumeclaim/tomcatBoundpvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec500MiRWXmanaged-nfs-storage65m
查看 nfs server 目录中信息
[root@node1 ~]# ll /home/bsh/nfs/default-tomcat-pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec/
总用量 220
-rw-r-----. 1 root root22217 9月3 14:49 catalina.2021-09-03.log
-rw-r-----. 1 root root0 9月3 14:41 host-manager.2021-09-03.log
-rw-r-----. 1 root root2791 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 root0 9月3 14:41 manager.2021-09-03.log
文章链接
推荐阅读
- 万字干货(IM 会话列表卡顿优化实践)
- try_files $uri $uri/ @router
- ansbile
- GitLab Jenkins CI/CD 自动化部署
- 马士兵mca架构师全套
- Centos7下用户登录失败N次后锁定用户禁止登陆的方法
- 每天学点Linux命令之umask
- Linux虚拟机常见使用及常见问题
- 等保咨询