智能农田作业机器人“中科原动力”完成数千万元A轮融资
06-17
今天安装Kubesphere时,发现StorageClass缺失,导致无法创建依赖的PVC。作为StorageClass,CBS具有不错的性能,但对于非在线应用来说,成本太高。
每个PVC后面都会创建一个独立的CBS硬盘,并且根据申报数量创建多少个磁盘,不划算。使用NFS比较合适,比如腾讯云的CFS。
普通版的读写性能为MB/s,已经足够了。 K8S版本:v1.29.2 我们先看一下PV和PVC的设计原理。
PV和PVC的设计原理抵得上千言万语。 1. 创建NFS。
由于K8S部署在腾讯云上,因此NFS选择了腾讯云的CFS创建文件系统,并选择了与CVM相同的可用区和VPC。创建完成后,关键看容量上限是TB,吞吐量上限是MB/s。
IP地址为:10.0.0.68,以下示例中将使用该地址。接下来,您需要安装 NFS Provisioner,以便 K8S 可以读写 CFS,并作为集群的默认存储类。
2. 安装NFS Provisioner,请参考K8S工作组提供的nfs-subdir-external-provisioner。准备安装必备的下载仓库,后面会用到里面的配置文件。
代码语言: bash copy $ git clone cd nfs-subdir-external-provisioner2.1 配置认证代码语言: bash copy # 将RBAC对象的主题设置为当前部署provisioner的命名空间 $ NS=$(kubectl config get-contexts|grep -e "^\*" |awk '{print $5}')$ NAMESPACE=${NS:-default}$ sed -i'' "s/命名空间:.*/命名空间: $NAMESPACE / g" ./deploy/rbac.yaml ./deploy/deployment.yaml$ kubectl create -f deploy/rbac.yamldeploy/rbac.yaml 有以下内容,定义了 NFS 配置器依赖的权限。代码语言:yaml复制apiVersion: v1kind: ServiceAccountmetadata: name: nfs-client-provisioner # 替换为部署provisioner的命名空间namespace: default---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata: name: nfs- client-provisioner-runnerrules: - apiGroups: [""] 资源: ["nodes"] 动词: ["get", "list", "watch"] - apiGroups: [""] 资源: ["persistentvolumes"] 动词:[“get”、“list”、“watch”、“create”、“delete”] - apiGroups:[“”]资源:[“persistentvolumeclaims”]动词:[“get”、“list”、“watch” , "update"] - apiGroups: ["storage.k8s.io"] 资源: ["storageclasses"] 动词: ["get", "list", "watch"] - apiGroups: [""] 资源: ["事件”]动词:[“创建”、“更新”、“补丁”]---种类:ClusterRoleBindingapi版本:rbac.authorization.k8s.io/v1metadata:名称:run-nfs-client-provisionersubjects:-种类:ServiceAccount名称:nfs- client-provisioner # 替换为部署配置程序的命名空间 namespace: defaultroleRef: kind: ClusterRole name: nfs-client-provisioner-runner apiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io /v1metadata: name:leader-locking-nfs-client-provisioner # 替换为部署配置程序的命名空间 namespace: defaultrules: - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "list" , "watch", "create", "update", "patch"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata: name:leader-locking-nfs-client-provisioner # 替换为命名空间 where临时条件部署了一个名称空间:defaultsubjects:- kind:ServiceAccount名称:nfs-client-provisioner#替换为部署provisioner的名称空间namespace:defaultroleRef:kind:角色名称:leader-locking-nfs-client-provisioner apiGroup:rbac.authorization。
k8s.io2.2configurenfsprovisioner配置nfsprovisioner部署配置(deploy/deployment.yaml),有三处需要修改: NFS_SERVER: 10.0.0.68(10.0.0.68是我的NFS地址) NFS_PATH:/(由于将创建的NFS(K8S专用)作为StorageClass,所以直接选择根目录) image:默认镜像仓库在国内无法访问。可以通过代理pull,然后push到自己的仓库。
代码语言:yaml 复制种类:DeploymentapiVersion:apps/v1metadata:名称:nfs -client-provisionerspec:副本:1 选择器:matchLabels:app:nfs-client-provisioner 策略:类型:重新创建模板:元数据:标签:app:nfs-客户端配置规范:serviceAccountName:nfs-client-provisioner 容器:-名称:nfs-client-provisioner 镜像:registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2 volumeMounts: - 名称:nfs-client-root mountPath: /persistentvolumes env: - 名称:PROVISIONER_NAME 值:k8s-sigs.io/nfs-subdir-external-provisioner - 名称:NFS_SERVER 值:10.0。 0.68 -- name: NFS_PATH value: /volumes: -- name: nfs-client-root nfs: server: 10.0.0.68 path: /创建部署代码语言: bash copy kubectl apply -f deploy/deployment.yaml 检查是否部署部署代码正常 Language: bash copy # kubectl get deployment nfs-client-provisionerNAME READY UP-TO-DATE AVAILABLE AGenfs-client-provisioner 1/1 1 1 63m2.3 Deploy StorageClass 修改deploy/class.yaml,添加 is- 语句default-class ,将 nfs-client 设置为默认 storageclass 代码语言:yaml copy apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: nfs-client comments: storageclass.kubernetes.io/is-default-class: "true" provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # 或者选择其他名称,必须与部署的env PROVISIONER_NAME'parameters: archiveOnDelete: "false" 代码语言: bash copy kubectl apply -f deploy/检查class.yaml,可以看到nfs-client(默认)包含默认识别码语言: bash copy # kubectl get scNAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEnfs-client (default) k8s-sigs.io/nfs-subdir-external-provisioner删除 立即 false 66m2.4 测试代码语言:bash copy $ kubectl create -f deploy/test-claim.yaml -f deploy/test-pod.yaml 查看状态,一切正常代码语言:bash copy # kubectl get pvc,podNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGEpersistentvolumeclaim/test-claim Bound pvc-dcc5a-d58b-a-bc21-0ea61b8b7c9f 1Mi RWX nfs-client
FAQ0/2 节点可用:pod 具有未绑定的立即 PersistentVolumeClaims。测试Pod时,发现由于pvc绑定失败导致调度失败。
最终排查是因为镜像问题导致nfs Provisioner部署失败。代码语言:bash copy kubectl describe pod test-pod...Events: Type Reason Age From Message ---- ------ ---- ---- ------- 警告 FailedScheduling 34s 默认-scheduler 0/2 个节点可用:pod 具有未绑定的即时 PersistentVolumeClaims。
抢占: 0/2 个节点可用: 2 抢占对调度没有帮助。mount.nfs: 挂载:/ifs/kubernetes failed, Reason by server: No 此类文件或directorynfs 配置器部署失败的原因是NFS_PATH指定了/ifs/kubernetes,但是nfs上没有这个文件。
改成 / 后,正常代码语言: bash copy # kubectl describe pod nfs-client-provisioner-7f9bc6b- cr7cj...Events: Type Reason Age From Message ---- ------ ---- ---- ---------- 正常 预定 7m14s default-scheduler 已成功将 default/nfs-client-provisioner-7f9bc6b-cr7cj 分配给 hadoop-30.com 警告 FailedMount 26s (x11 over 7m10s) kubelet MountVolume.SetUp 卷“nfs-client-root”失败:安装失败:退出状态 32安装命令:安装安装参数:-t nfs 10.0.0.68:/ifs/kubernetes /var/lib/kubelet /pods/b7d9-23c4-9d55-fbc85/volumes/kubernetes.io~nfs/nfs-client-root输出:mount.nfs:安装10.0.0.68:/ifs/kubernetes失败,服务器给出的原因:没有这样的文件或目录失败拉取并解压镜像“registry.k8s.io/sig-storage/nfs-subdir-external-provisioner:v4.0.2”国内无法访问镜像仓库。需要自己更改标签或者推送到自己的镜像仓库。
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
标签:
相关文章
06-08
06-17
06-17
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用