OpenShift 4 - 在单节点的 OpenShift 上用 NFS Operator 实现以 RWX 访问存储

article/2025/9/27 4:54:11

《OpenShift / RHEL / DevSecOps 汇总目录》
文本已在 OpenShift Local 4.12 环境中进行验证。

文章目录

  • OpenShift 支持的存储访问模式
  • 用 NFS Provisioner Operator 实现 RWX 访问存储
    • 安装 NFS Operator
    • 解决安装 Operator 过程无法访问谷歌 gcr.io 上的容器镜像
    • 配置 NFSProvisioner
    • 验证
  • 参考

OpenShift 支持的存储访问模式

红帽 OpenShift 4 内置支持的 PV 插件和访问模式如下表。另外 OpenShift 也可支持其他第三方存储 ,一般是通过 OperatorHub 进行安装。
根据下表可以看出 ReadWriteOnce - RWO 模式支持也为最广泛,而 ReadWriteMany - RWX 模式却只有少量插件才支持。而在支持 RWX 的环境中 NFS 无疑是最容易获得的,因为其他支持 RWX 存储要么只能在公有云上使用,要么就是通常需要较为复杂的存储硬件和软件才能支持。
在这里插入图片描述

用 NFS Provisioner Operator 实现 RWX 访问存储

下面介绍如何通过 NFS Provisioner Operator 在单节点 OpenShift 中(例如 OpenShift Local)使用节点的本地存储提供基于 NFS 的 PV。

安装 NFS Operator

  1. 可以在 OpenShift 控制台的 OperatorHub 中找到 NFS Provisioner Operator,然后使用缺省配置安装该 Operator。
    在这里插入图片描述
    也可运行以下命令通过 nfs-provisioner-operator 订阅安装。
$ cat << EOF | oc apply -f -  
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:name: nfs-provisioner-operatornamespace: openshift-operators
spec:channel: alphainstallPlanApproval: Automaticname: nfs-provisioner-operatorsource: community-operatorssourceNamespace: openshift-marketplace
EOF
  1. 安装成功后可查看 Operator 的状态。
    在这里插入图片描述

解决安装 Operator 过程无法访问谷歌 gcr.io 上的容器镜像

由于在安装过程会用到谷歌 gcr.io 上的容器镜像,因此在国内安装 NFS Operator 的时候会遇到失败的情况。解决方案如下:

  1. 运行命令查看在 nfs-provisioner-operator 中使用到来自谷歌的镜像,应该有 kube-rbac-proxy 和 kube-rbac-proxy 两个镜像。
$ oc get ClusterServiceVersion
NAME                              DISPLAY                      VERSION      REPLACES                          PHASE
nfs-provisioner-operator.v0.0.7   NFS Provisioner Operator     0.0.7        nfs-provisioner-operator.v0.0.6   Installing$ oc get ClusterServiceVersion nfs-provisioner-operator.v0.0.7 -oyaml | grep gcr.io"image": "k8s.gcr.io/sig-storage/nfs-provisioner@sha256:e943bb77c7df05ebdc8c7888b2db289b13bf9f012d6a3a5a74f14d4d5743d439",image: gcr.io/kubebuilder/kube-rbac-proxy@sha256:e10d1d982dd653db74ca87a1d1ad017bc5ef1aeb651bdea089debf16485b080b- image: k8s.gcr.io/sig-storage/nfs-provisioner@sha256:e943bb77c7df05ebdc8c7888b2db289b13bf9f012d6a3a5a74f14d4d5743d439- image: gcr.io/kubebuilder/kube-rbac-proxy@sha256:e10d1d982dd653db74ca87a1d1ad017bc5ef1aeb651bdea089debf16485b080b
  1. 在 OpenShift 控制台的 OperatorHub 中进入 NFS Provisioner Operator,然后在 YAML 中替换以下用到的 2 个镜像,最后保存。
    1)将 gcr.io/kubebuilder/kube-rbac-proxy@sha256:e10d1d982dd653db74ca87a1d1ad017bc5ef1aeb651bdea089debf16485b080b
    替换为 quay.io/dawnskyliu/kube-rbac-proxy:latest
    2)将 k8s.gcr.io/sig-storage/nfs-provisioner@sha256:e943bb77c7df05ebdc8c7888b2db289b13bf9f012d6a3a5a74f14d4d5743d439
    替换为 quay.io/dawnskyliu/nfs-provisioner:latest
    在这里插入图片描述
  2. 由于前面部署 nfs-provisioner-operator-controller-manager 用的是谷歌镜像,因此即便是在更换镜像后可能还一直不会 READY。
$ oc get deployment nfs-provisioner-operator-controller-manager -n openshift-operators
  1. 这是由于 nfs-provisioner-operator-controller-manager 部署的生命周期是由 NFS Provisioner Operator 维护的,因此可执行以下命令先删除 nfs-provisioner-operator-controller-manager 部署,稍后 NFS Provisioner Operator 会自动根据前面更新的镜像重新创建该部署。
$ oc delete deployment nfs-provisioner-operator-controller-manager -n openshift-operators
  1. 查看 nfs-provisioner-operator-controller-manager 部署的状态到 READY 即可。
$ oc get deployment -n openshift-operators
NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE
nfs-provisioner-operator-controller-manager   1/1     1            1           9m
  1. 确认 NFS Provisioner Operator 已经安装成功。
$ oc get clusterserviceversion
NAME                              DISPLAY                    VERSION   REPLACES                          PHASE
nfs-provisioner-operator.v0.0.7   NFS Provisioner Operator   0.0.7     nfs-provisioner-operator.v0.0.6   Succeeded

配置 NFSProvisioner

  1. 执行命令,对节点打标签。
$ target_node=$(oc get node --no-headers -o name|cut -d'/' -f2)
$ oc label node/${target_node} app=nfs-provisioner
node/crc-pbwlw-master-0 labeled
  1. 执行命令进入集群的节点内部。
$ oc debug node/${target_node}
Starting pod/crc-pbwlw-master-0-debug ...
To use host binaries, run `chroot /host`Pod IP: 192.168.126.11
If you don't see a command prompt, try pressing enter.
  1. 在节点内部创建 NFS 使用的目录,然后退出。
sh-4.4# chroot /host
sh-4.4# mkdir -p /home/core/nfs
sh-4.4# chcon -Rvt svirt_sandbox_file_t /home/core/nfs
changing security context of '/home/core/nfs'
sh-4.4# exit
exit
sh-4.4# exit
exitRemoving debug pod ...
  1. 创建 NFSProvisioner 对象,会创建对应的 deployment 和 storageclass 对象。
$ oc new-project nfsprovisioner-operator
$ cat << EOF | oc apply -f -  
apiVersion: cache.jhouse.com/v1alpha1
kind: NFSProvisioner
metadata:name: nfsprovisioner-samplenamespace: nfsprovisioner-operator
spec:nodeSelector: app: nfs-provisionerhostPathDir: "/home/core/nfs"
EOF$ oc get deployment
NAME              READY   UP-TO-DATE   AVAILABLE   AGE
nfs-provisioner   1/1     1            1           5h18m
  1. 注意:如果是在国内部署而前面采用了手动修改的 NFS Provisioner Operator 的配置,此处还需额外手动修改 nfs-provisioner 部署的配置。
    将 k8s.gcr.io/sig-storage/nfs-provisioner@sha256:e943bb77c7df05ebdc8c7888b2db289b13bf9f012d6a3a5a74f14d4d5743d439
    替换为 quay.io/dawnskyliu/nfs-provisioner:latest
  2. 查看集群包含的 storageclass 对象。
$ oc get storageclass
NAME                                     PROVISIONER                        RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
crc-csi-hostpath-provisioner (default)   kubevirt.io.hostpath-provisioner   Delete          WaitForFirstConsumer   false                  36d
nfs                                      example.com/nfs                    Delete          Immediate              false                  3m38s
  1. 由上一步的结果可知,名为 nfs 的 storageclass 不是集群缺省的,而 crc-csi-hostpath-provisioner 是缺省的 storageclass。可以执行下面命令将 nfs 设为缺省的 storageclass。
$ oc patch storageclass crc-csi-hostpath-provisioner -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
$ oc patch storageclass nfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'$ oc get storageclass
NAME                                     PROVISIONER                        RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
crc-csi-hostpath-provisioner             kubevirt.io.hostpath-provisioner   Delete          WaitForFirstConsumer   false                  36d
nfs (default)                            example.com/nfs                    Delete          Immediate              false                  4m20s

验证

  1. 执行命令,创建测试 PVC。
$ cat << EOF | oc apply -f -  
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: nfs-pvc-example
spec:accessModes:- ReadWriteManyresources:requests:storage: 1MistorageClassName: nfs
EOF
  1. 确认 PV 和 PVC 已经是可用状态。
$ oc get pvc
NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc-example   Bound    pvc-1399650c-8c58-4057-8693-1c4f4d80efa0   1Mi        RWX            nfs            35s$ oc get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                 STORAGECLASS                   REASON   AGE
pvc-1399650c-8c58-4057-8693-1c4f4d80efa0   1Mi        RWX            Delete           Bound    nfsprovisioner-operator/nfs-pvc-example               nfs                                     32s

参考

https://developers.redhat.com/articles/2022/04/20/create-and-manage-local-persistent-volumes-codeready-containers#set_up_persistent_volumes_anywhere


http://chatgpt.dhexx.cn/article/nVRifinI.shtml

相关文章

Linux文件的rwx含义,文件(目录)rwx权限的意义

我们知道不同的角色针对同一个文件(目录)可能会有不同的权限&#xff0c;那么rwx权限的意义是什么呢&#xff1f; 对于文件 文件是包含实际数据的地方&#xff0c;包括一般文本文件、数据库内容文件、二进制可执行文件等。对于文件来说&#xff0c;rwx权限的意义为&#xff1a;…

Linux文件的rwx含义,Linux文件权限rwx简单了解

Ⅰ 了解Linux下的文件权限 如上图所示,ll命令详细展示当前目录下的文件或者子目录信息 红框标注的即为此文件或者目录的权限 【第一行文件10.c的权限以-开头,用来说明这是一个文件;第四行code目录的权限以字母d开头,用来标注code是目录】 关于文件权限,我们要先了解有那些…

chmod,rwx Linux文件属性笔记221107

Linux的文件属性包含文件类型和文件权限 文件类型 -表示文件d表示文件夹l表示软链接 文件权限 r 读权限w 写权限x 执行权限 文件所属 u代表所属用户g代表所属组o代表其它用户 chmod 命令可以修改用户权限 可以通过 r w x 字母修改也可以用 3位0到7 的数字修改 chmod 用 …

关于Linux文件权限rwx的通俗解释

在Linux中&#xff0c;每个文件都有它所对应的权限 我们可以通过在终端输入ls -ahl的方式来查看 这是一个文件列表&#xff0c;每一行都对应一个文件的详细信息 第一个字符&#xff0c;对应的是类型 &#xff08;1&#xff09;如果是d&#xff0c;那么对应的是directory&…

linux中文件权限为drwxr,linux drwxr-xr-x 什么意思 ?

第一位表示文件类型。d是目录文件&#xff0c;l是链接文件&#xff0c;-是普通文件&#xff0c;p是管道 第2-4位表示这个文件的属主拥有的权限&#xff0c;r是读&#xff0c;w是写&#xff0c;x是执行。 第5-7位表示和这个文件属主所在同一个组的用户所具有的权限。 第8-10位表…

Linux_rwx权限

L i n u x _ r w x 权限 \color{blue}{\huge{Linux\_rwx权限}} Linux_rwx权限 Ⅰ.概述 ①. 第 0 0 0代表文件类型( d 、 l 、 c 、 b 、 a 、 − d、l、c、b、a、- d、l、c、b、a、−) l l l&#xff1a;代表连接(快捷方式) d d d&#xff1a;代表目录 c c c&#xff1a;代…

Linux的文件权限说明(rwx)

一、权限说明 在Linux中r是可读权限&#xff0c;w是可写权限&#xff0c;x是可执行权限。4表示可读权限r&#xff0c;2表示可写权限w&#xff0c;1表示可执行权限x&#xff0c;然后将其相加。 注&#xff1a;R的值等于4 W的值等于2 X的值等于1 完全权限&#xff1a;4217 读写权…

drwxrwx--x代表什么

DDMS视图的File Explorer和Android文件管理器里面可以看到这一串字母. 代表的是文件访问权限. 第一位: -表示这是一个文件 d表示这是一个文件夹 l表示这是一个链接 后9位分成三组, 都是rwx, 也就是: r读 w写 x执行 三个组分别是: 所有者 用户组 其他 看下这张图就能明白…

linux中的文件权限类、rwx 作用文件和目录的不同解释

1.6 文件权限类 1.6.1 文件属性 Linux系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做 了不同的规定。在Lin…

Linux文件信息中的rwx表示什么?Linux权限理解

目录 文件访问者的分类 Q&#xff1a;为什么要有所属组这个概念&#xff1f; 文件的权限属性分类 文件的权限属性的设置 1.chmod&#xff08;change mode&#xff09; 2.chgrp&#xff08;change group&#xff09; 3.chown&#xff08;change owner&#xff09; 文件权…

rwx权限介绍

一、rwx权限的基本介绍 0-9位说明&#xff1a;0位确定文件类型&#xff08;d&#xff0c;-&#xff0c;l,c,b&#xff09; d是目录&#xff0c;相当于Windows中的文件夹。 -是普通文件 l是链接&#xff0c;相当于Windows中的快捷方式。 c是字符设备文件&#xff0c;鼠标…

Linux文件权限(rwx权限)的使用

组管理和权限管理 组 Linux中每个用户都属于一个组&#xff1b;每个文件都有所有者、所在组、其他组的概念 所有者 改变文件的所有者&#xff1a;chown 新用户 文件名 所在组 修改文件(或目录)所在组&#xff1a;chgrp 组名 文件名 文件权限 基本介绍 0-9 位说明 第0 位…

日均亿次广告投放的FreeWheel如何实践机器学习?

FreeWheel 创建于 2007 年&#xff0c;总部位于美国硅谷&#xff0c;作为一家提供互联网视频广告投放、监测、预测、增值等解决方案的 IT 公司&#xff0c;其已为 CBS、Warner Brothers、Turner、Discovery 等公司提供服务&#xff0c;日均广告投放已超过上亿次&#xff0c;并且…

FreeWheel是一家怎样的公司?| 人物志

戳蓝字“CSDN云计算”关注我们哦&#xff01; 人物志&#xff1a;观云、盘点、对话英雄。以云计算风云人物为核心&#xff0c;聚焦个人成长、技术创新、产业发展&#xff0c;还原真实与鲜活&#xff01; 作者 | 孙浩峰 在知乎上有一个帖子&#xff0c;题目就是“FreeWheel是一家…

FreeWheel创始人/CTO于晶纯访谈:具备大局观方能洞若观火

记者 / 常政 文 / 卢鸫翔 于晶纯(Diane Yu)女士早年曾在在线广告巨头DoubleClick工作&#xff0c;勤奋努力使她突破了“亚裔女性”的“职业玻璃天花板”&#xff0c;成为高级技术管理者。然而却在Google收购DoubleClick之际选择了毅然离开&#xff0c;与几位朋友共同创立了Free…

FreeWheel业务系统微服务化过程经验分享

2016 年下半年开始&#xff0c;FreeWheel 开始将其业务系统从 Rails 单体应用逐步迁移到微服务&#xff0c;同时技术栈从 Rails 改为 Golang&#xff0c;两年之后&#xff0c;整个迁移接近尾声&#xff0c;FreeWheel 业务系统技术团队对外分享了它们在微服务化过程中的经验。 原…

Istio在FreeWheel微服务中的实践

导读 近日&#xff0c;CNUTCon全球运维技术大会在上海举行&#xff0c;FreeWheel具有实战经验的一线技术专家受邀出席大会的“解决方案”专场。会上&#xff0c;专家就FreeWheel 微服务演化过程中因模块之间数据流不断调整而产生的挑战&#xff0c;以及为解决该问题进行的技术…

FreeWheel 首席工程师:我对软件分层设计的思考

在刚刚圆满落幕的亚马逊云科技中国峰会上海站&#xff0c;FreeWheel的Tech Lead曹宇先生和大家分享了现代化应用和无服务器的奥秘。点击下方视频&#xff0c;一探究竟。 今天&#xff0c;我们为大家带来FreeWheel首席工程师杨敏关于软件分层设计的思考和见解&#xff0c;以下为…

freewheel面试java经验

freewheel 一面 自我介绍介绍下对freewheel的认识项目介绍&#xff0c;项目的流量大小&#xff0c;QPS&#xff0c;每天处理多少数据的流量sql题&#xff0c;1 查询表中1-5&#xff0c;2020-08-26 00:00:00的rate&#xff08;汇率&#xff09;&#xff1b;2 根据rate表&#x…

迈向云原生:名企FreeWheel应用架构演进

FreeWheel是美国传媒巨头康卡斯特&#xff08;Comcast&#xff09;集团旗下的高端视频广告技术供应商&#xff0c;90%以上的美国主流电视媒体和运营商都在使用FreeWheel的广告平台和技术。本文将带你了解名企FreeWheel核心业务系统研发团队将单体应用改造成云原生微服务应用的演…