网站推广苏州,wordpress纯净版下载地址,平顶山建设局网站,鲜花网站建设图片配置 Pod 以使用 PersistentVolume 作为存储
关于持久卷的介绍#xff0c;可以看官方文档 https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
持久卷根据存储位置#xff0c;可以使用本地存储和云存储#xff0c;如果有云服务平台#xff0c…配置 Pod 以使用 PersistentVolume 作为存储
关于持久卷的介绍可以看官方文档 https://kubernetes.io/zh-cn/docs/concepts/storage/persistent-volumes/
持久卷根据存储位置可以使用本地存储和云存储如果有云服务平台可以动态使用配置云资源如Google Cloud Platform (GCP) 、 AWS、Azure使用的云提供商需要使用相应的 provisioner 和参数
provisioner: 指定存储插件Provisioner根据你实际环境调整。例如
NFS 使用 nfs.csi.k8s.ioCeph 使用 cephfs.csi.ceph.comAWS 使用 kubernetes.io/aws-ebs
云存储服务需要集群运行在云服务商提供的平台如在 GCP 上运行 Kubernetes kubernetes.io/gce-pdkubernetes.io/aws-ebs适用于 AWS或者 kubernetes.io/azure-disk适用于 Azure云存储服务有自带的 provisioner
如果使用的是本地环境可以使用以下几种方式来配置存储
本地存储Local StorageNFS 存储网络存储如 iSCSI
hostPath 类型
hostPath: 定义主机节点文件系统上的路径作为存储位置。这里指定路径为 /mnt/repositoryhostPath 类型的 PersistentVolume 使用节点上的文件或目
录来模拟网络附加存储
hostPath 卷 通常用于本地测试或单节点集群在生产环境中并不推荐使用因为它依赖于特定节点上的路径。在生产集群中你不会使用 hostPath。 集群管理员会提供网络存储资源比如 Google Compute Engine 持久盘卷、NFS 共享卷或 Amazon Elastic Block Store 卷。 集群管理员还可以使用 StorageClass 来设置动态制备存储
确保在主机节点上存在 /mnt/repository 目录并且 Kubernetes 进程对该目录有访问权限。
创建 PersistentVolume
hostPath PersistentVolume 的配置文件
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-volumelabels:type: local
spec:storageClassName: manualcapacity:storage: 20GiaccessModes:- ReadWriteOncehostPath:path: /mnt/repository 这里是不使用动态分配的因此是没有存储分配器来动态分配存储资源即 kubernetes.io/no-provisioner 配置文件指定卷位于集群节点上的 /mnt/repository 路径其配置还指定了卷的容量大小为 20 GB访问模式为 ReadWriteOnce 这意味着该卷可以被单个节点以读写方式安装。 此配置文件还在 PersistentVolume 中定义了 StorageClass 的名称为 manual。 它将用于将 PersistentVolumeClaim 的请求绑定到此 PersistentVolume
创建 PersistentVolume查看 PersistentVolume 信息 输出结果显示该 PersistentVolume 的状态STATUS为 Available。 这意味着它还没有被绑定给 PersistentVolumeClaim
创建 PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pv-claim
spec:storageClassName: manualaccessModes:- ReadWriteOnceresources:requests:storage: 20Gi 创建 PersistentVolumeClaim 之后Kubernetes 控制平面将查找满足申领要求的 PersistentVolume。 如果控制平面找到具有相同 StorageClass 的适当的 PersistentVolume 则将 PersistentVolumeClaim 绑定到该 PersistentVolume 上。
再次查看 PersistentVolume 信息 创建 Pod
创建一个使用 PersistentVolumeClaim 作为存储卷的 Pod
apiVersion: apps/v1
kind: Deployment
metadata:name: httpd-deployment
spec:replicas: 1selector:matchLabels:app: httpdtemplate:metadata:labels:app: httpdspec:containers:- name: httpdimage: m.daocloud.io/docker.io/httpd:latestports:- containerPort: 80volumeMounts:- name: httpd-pvcmountPath: /usr/local/apache2/htdocs # 挂载路径volumes:- name: httpd-pvcpersistentVolumeClaim:claimName: pv-claim # PVC 名称 创建好之后可以看到容器内部的文件夹与宿主机的文件夹的文件是同步的 NFS 存储
在官方文档中并不建议使用 hostPath 卷或者通常用于本地测试或单节点集群在生产环境中并不推荐使用因为我们显然可以发现一些问题Pod 想要挂载本地磁盘只能指定当前节点的文件路径作为存储非常不灵活且路径必须由管理员手动指定无法动态分配存储资源
解决动态分配可以使用存储资源自动调配器想要灵活选择存储位置可以使用 NFS 不局限于本地存储路径
NFS Subdir External Provisioner
nfs-subdir-external-provisioner 是一个存储资源自动调配器它可将现有的 NFS 服务器通过持久卷声明来支持 Kubernetes 持久卷的动态分配。该组件是对 Kubernetes NFS-Client Provisioner 的扩展
安装 NFS Client
所有的集群节点都需要安装客户端
sudo apt-get update sudo apt-get install -y nfs-commonHelm 安装
# 添加 Helm 源
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner命令行安装 NFS Subdir External Provisioner
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set storageClass.namenfs-sc --set nfs.server172.100.0.109 --set nfs.path/mnt/nfs-repository -n nfs-system说明 –set storageClass.namenfs-sc指定 storageClass 的名字没有的话会自己创建 –set nfs.server192.168.9.81指定 NFS 服务器的地址 –set nfs.path/data/k8s指定 NFS 导出的共享数据目录 –set storageClass.defaultClasstrue指定为默认的 sc本示例没使用 -n nfs-system指定命名空间 这里是会默认下载一个镜像 registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2
自定义 values 安装 NFS Subdir External Provisioner
有更多定制化需求时可以选择自定义 values.yaml 的方式进行安装实际使用中与命令行安装 NFS Subdir External Provisioner 并无区别如果网络限制无法下载镜像建议使用
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisionertar xvf nfs-subdir-external-provisioner-4.0.18.tgz查看 values.yaml 文件
cat nfs-subdir-external-provisioner/values.yaml | egrep -v #|^$replicaCount: 1
strategyType: Recreate
image:repository: registry.k8s.io/sig-storage/nfs-subdir-external-provisionertag: v4.0.2pullPolicy: IfNotPresent
imagePullSecrets: []
nfs:server:path: /nfs-storagemountOptions:volumeName: nfs-subdir-external-provisioner-rootreclaimPolicy: Retain
storageClass:create: truedefaultClass: falsename: nfs-clientallowVolumeExpansion: truereclaimPolicy: DeletearchiveOnDelete: trueonDelete:pathPattern:accessModes: ReadWriteOncevolumeBindingMode: Immediateannotations: {}
leaderElection:enabled: true
rbac:create: true
podSecurityPolicy:enabled: false
podAnnotations: {}
podSecurityContext: {}
securityContext: {}
serviceAccount:create: trueannotations: {}name:
resources: {}
nodeSelector: {}
tolerations: []
affinity: {}
labels: {}
podDisruptionBudget:enabled: falsemaxUnavailable: 1根据自己集群实际配置更改
# 主要修改内容如下
image:repository: registry.k8s.io/sig-storage/nfs-subdir-external-provisioner #镜像拉取地址默认可能拉取不下来建议替换成本地或是其他可正常访问的仓库也可以使用我DockerHub上的的 unopsman/nfs-subdir-external-provisionertag: v4.0.2 #镜像 tag 默认为 v4.0.2可根据实际情况替换
nfs:server: 172.100.0.109 #指定 NFS 服务器的地址path: /mnt/nfs-repository #指定 NFS 导出的共享数据目录
storageClass:defaultClass: false #是否设置为默认的 StorageClass本示例没设置有需要的可以设置为 truename: nfs-sc #指定 storageClass 的名字 这里的挂载路径需要提前共享导出
/mnt/nfs-repository *(rw,sync,no_subtree_check,no_root_squash)应用更改后的 values.yaml 安装下载
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner -f nfs-subdir-external-provisioner/values.yaml -n nfs-system
正常情况下查看 pod 的状态应该是 Running 如果出现一直为容器创建中的情况查看日志报错为如下情况需要在集群每一个节点不只是 master 上安装 nfs 客户端 # 安装 客户端
sudo apt-get update sudo apt-get install -y nfs-common验证测试
因为我们现在有了 NFS Subdir External Provisioner 分配器我们就需要向上面一样先申请 pv 再定义 pvc 绑定然后 Pod 再挂载 PVC 了我们可以直接创建 pvc 分配器可以动态分配相应的 pv 来绑定我们的 pvc分配规则是由 storageClass 配置决定的
创建测试 PVC
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: test-nfs-pvc
spec:storageClassName: nfs-scaccessModes:- ReadWriteManyresources:requests:storage: 1Gi 正常情况下查看 pvc 应该是绑定的状态如果不是有几种常见的错误 如果是这两种情况检查配置的路径是否共享导出了编辑 /etc/exports 文件并且重新导出 /mnt/nfs-repository *(rw,sync,no_subtree_check,no_root_squash) 如果是这种情况只要把存储目录的权限放开就好 这是情况下的状态 创建测试 Pod
apiVersion: v1
kind: Pod
metadata:name: test-nfs-pod
spec:volumes:- name: test-nfs-pvcpersistentVolumeClaim:claimName: test-nfs-pvccontainers:- name: test-nfs-containerimage: nginx:latestports:- containerPort: 80name: http-servervolumeMounts:- mountPath: /usr/share/nginx/htmlname: test-nfs-pvc 如果 pod 运行正常在指定的目录下会自动创建目录文件并挂载到容器的指定目录下面 测试 参考官网
配置 Pod 以使用 PersistentVolume 作为存储
持久存储设计文档