作者: 为少 2021-08-04 13:19:28
存储
存储软件
云原生 Rook 是一个开源 cloud-native storage orchestrator(云原生存储编排器),为各种存储解决方案提供平台、框架和支持,以与云原生环境进行原生集成。
按需网站开发可以根据自己的需求进行定制,成都网站设计、网站建设构思过程中功能建设理应排到主要部位公司成都网站设计、网站建设的运用实际效果公司网站制作网站建立与制做的实际意义
本文转载自微信公众号「黑客下午茶」,作者为少。转载本文请联系黑客下午茶公众号。
Rook 是一个开源 cloud-native storage orchestrator(云原生存储编排器),为各种存储解决方案提供平台、框架和支持,以与云原生环境进行原生集成。
Rook 将存储软件转变为自我管理(self-managing)、自我扩展(self-scaling)和自我修复(self-healing)的存储服务。它通过自动化部署(automating deployment)、引导(bootstrapping)、配置(configuration)、供应(provisioning)、 扩展(scaling)、升级(upgrading)、迁移(migration)、灾难恢复(disaster recovery)、监控(monitoring)和资源管理(resource management)来实现这一点。 Rook 使用底层云原生容器管理、调度和编排平台提供的设施来执行其职责。
Rook 利用扩展点深度集成到云原生环境中,并为调度、生命周期管理、资源管理、安全、监控和用户体验提供无缝体验。
Cassandra 是一个高可用、容错、对等的 NoSQL 数据库,具有闪电般的性能和可调的一致性。它提供了无单点故障的大规模可扩展性。
Scylla 是在 C++ 中对 Cassandra 的接近硬件重写。它采用无共享架构,可实现真正的线性扩展和主要硬件优化,从而实现超低延迟和极高吞吐量。它是 Cassandra 的直接替代品,并使用相同的接口,因此 Rook 也支持它。
运行 Rook Cassandra operator 需要 Kubernetes 集群。为了确保你有一个为 Rook 准备好的 Kubernetes 集群(Cassandra 不需要 flexvolume 插件)
部署 Cassandra Operator
首先使用以下命令部署 Rook Cassandra Operator:
- $ git clone --single-branch --branch v1.6.8 https://github.com/rook/rook.git
- cd rook/cluster/examples/kubernetes/cassandra
- kubectl apply -f operator.yaml
这将在命名空间 rook-cassandra-system 中安装 operator。您可以检查 operator 是否已启动并运行:
- kubectl -n rook-cassandra-system get pod
现在 operator 正在运行,我们可以通过创建 clusters.cassandra.rook.io 资源的实例来创建 Cassandra/Scylla 集群的实例。该资源的某些值是可配置的,因此请随意浏览 cluster.yaml 并根据自己的喜好调整设置。
当你准备创建一个 Cassandra 集群时,只需运行:
- kubectl create -f cluster.yaml
我们可以使用以下命令验证是否已创建代表我们新 Cassandra 集群的 Kubernetes 对象。这很重要,因为它表明 Rook 已成功扩展 Kubernetes,使 Cassandra 集群成为 Kubernetes 云原生环境中的一等公民。
- kubectl -n rook-cassandra get clusters.cassandra.rook.io
要检查是否所有所需的成员都在运行,您应该从以下命令中看到与 cluster.yaml 中指定的成员数量相同的条目数:
- kubectl -n rook-cassandra get pod -l app=rook-cassandra
您还可以从其状态跟踪 Cassandra 集群的状态。要检查集群的当前状态,请运行:
- kubectl -n rook-cassandra describe clusters.cassandra.rook.io rook-cassandra
访问数据库
要在新集群中获取 cqlsh shell:
- kubectl exec -n rook-cassandra -it rook-cassandra-east-1-east-1a-0 -- cqlsh
- > DESCRIBE KEYSPACES;
当你创建一个新的集群时,Rook 会自动为客户端创建一个服务来访问集群。服务的名称遵循约定 -client。您可以通过运行以下命令在集群中查看此服务:
- kubectl -n rook-cassandra describe service rook-cassandra-client
在 Kubernetes 集群中运行的 Pod 可以使用此服务连接到 Cassandra。这是使用 Python Driver 的示例:
- from cassandra.cluster import Cluster
- cluster = Cluster(['rook-cassandra-client.rook-cassandra.svc.cluster.local'])
- session = cluster.connect()
operator 支持扩展机架(rack)以及添加新机架(rack)。要进行更改,您可以使用:
- kubectl edit clusters.cassandra.rook.io rook-cassandra
- kubectl -n rook-cassandra describe clusters.cassandra.rook.io rook-cassandra
operator 支持按比例缩小 rack。要进行更改,您可以使用:
- kubectl edit clusters.cassandra.rook.io rook-cassandra
- kubectl -n rook-cassandra describe clusters.cassandra.rook.io rook-cassandra
要清理与此演练相关的所有资源,您可以运行以下命令。
注意:这将破坏您的数据库并删除其所有相关数据。
- kubectl delete -f cluster.yaml
- kubectl delete -f operator.yaml
如果集群没有出现,第一步是检查 operator 的日志:
- kubectl -n rook-cassandra-system logs -l app=rook-cassandra-operator
如果 operator 日志中一切正常,您还可以查看 Cassandra 实例之一的日志:
- kubectl -n rook-cassandra logs rook-cassandra-0
要为 cassandra rack 启用 jmx_exporter,您应该在 CassandraCluster CRD 中为 rack 指定 jmxExporterConfigMapName 选项。
例如:
- apiVersion: cassandra.rook.io/v1alpha1
- kind: Cluster
- metadata:
- name: my-cassandra
- namespace: rook-cassandra
- spec:
- ...
- datacenter:
- name: my-datacenter
- racks:
- - name: my-rack
- members: 3
- jmxExporterConfigMapName: jmx-exporter-settings
- storage:
- volumeClaimTemplates:
- - metadata:
- name: rook-cassandra-data
- spec:
- storageClassName: my-storage-class
- resources:
- requests:
- storage: 200Gi
获取所有指标的简单 config map 示例:
- apiVersion: v1
- kind: ConfigMap
- metadata:
- name: jmx-exporter-settings
- namespace: rook-cassandra
- data:
- jmx_exporter_config.yaml: |
- lowercaseOutputLabelNames: true
- lowercaseOutputName: true
- whitelistObjectNames: ["org.apache.cassandra.metrics:*"]
ConfigMap 的数据字段必须包含带有 jmx exporter 设置的 jmx_exporter_config.yaml key。
当 config map 更新时,Pod 没有自动重新加载机制。 configmap 更改后,您应该手动重新启动所有 rack pods:
- NAMESPACE=
- CLUSTER=
- RACKS=$(kubectl get sts -n ${NAMESPACE} -l "cassandra.rook.io/cluster=${CLUSTER}")
- echo ${RACKS} | xargs -n1 kubectl rollout restart -n ${NAMESPACE}
本指南将引导您完成 Ceph 集群的基本设置,并使您能够使用集群中运行的其他 pod 中的块、对象和文件存储。
Rook 支持 Kubernetes v1.11 或更高版本。
Important 如果您使用的是 K8s 1.15 或更早版本,则需要创建不同版本的 Rook CRD。创建在示例清单的 pre-k8s-1.16 子文件夹中找到的 crds.yaml。
为确保您拥有可用于 Rook 的 Kubernetes 集群。
为了配置 Ceph 存储集群,至少需要以下本地存储选项之一:
您可以使用以下命令确认您的分区或设备是否已格式化文件系统。
- lsblk -f
- NAME FSTYPE LABEL UUID MOUNTPOINT
- vda
- └─vda1 LVM2_member >eSO50t-GkUV-YKTH-WsGq-hNJY-eKNf-3i07IB
- ├─ubuntu--vg-root ext4 c2366f76-6e21-4f10-a8f3-6776212e2fe4 /
- └─ubuntu--vg-swap_1 swap 9492a3dc-ad75-47cd-9596-678e8cf17ff9 [SWAP]
- vdb
如果 FSTYPE 字段不为空,则在相应设备的顶部有一个文件系统。在这种情况下,您可以将 vdb 用于 Ceph,而不能使用 vda 及其分区。
如果幸运的话,可以使用以下 kubectl 命令和示例 yaml 文件创建一个简单的 Rook 集群。
- $ git clone --single-branch --branch v1.6.8 https://github.com/rook/rook.git
- cd rook/cluster/examples/kubernetes/ceph
- kubectl create -f crds.yaml -f common.yaml -f operator.yaml
- kubectl create -f cluster.yaml
Rook 文档侧重于在生产环境中启动 Rook。还提供了一些示例来放宽测试环境的一些设置。在本指南后面创建集群时,请考虑以下示例集群清单:
第一步是部署 Rook operator。检查您是否正在使用与您的 Rook 版本相对应的示例 yaml 文件。
- cd cluster/examples/kubernetes/ceph
- kubectl create -f crds.yaml -f common.yaml -f operator.yaml
- # verify the rook-ceph-operator is in the `Running` state before proceeding
- kubectl -n rook-ceph get pod
在生产中启动 Operator 之前,您可能需要考虑一些设置:
现在 Rook operator 正在运行,我们可以创建 Ceph 集群。为了使集群在重新启动后继续存在,请确保设置对主机有效的 dataDirHostPath 属性。
创建集群:
- kubectl create -f cluster.yaml
使用 kubectl 列出 rook-ceph 命名空间中的 pod。一旦它们全部运行,您应该能够看到以下 pod。 osd pod 的数量将取决于集群中的节点数量和配置的设备数量。如果没有修改上面的 cluster.yaml,预计每个节点会创建一个 OSD。CSI、rook-ceph-agent(flex driver)和 rook-discover pod 也是可选的,具体取决于您的设置。
- kubectl -n rook-ceph get pod
- NAME READY STATUS RESTARTS AGE
- csi-cephfsplugin-provisioner-d77bb49c6-n5tgs 5/5 Running 0 140s
- csi-cephfsplugin-provisioner-d77bb49c6-v9rvn 5/5 Running 0 140s
- csi-cephfsplugin-rthrp 3/3 Running 0 140s
- csi-rbdplugin-hbsm7 3/3 Running 0 140s
- csi-rbdplugin-provisioner-5b5cd64fd-nvk6c 6/6 Running 0 140s
- csi-rbdplugin-provisioner-5b5cd64fd-q7bxl 6/6 Running 0 140s
- rook-ceph-crashcollector-minikube-5b57b7c5d4-hfldl 1/1 Running 0 105s
- rook-ceph-mgr-a-64cd7cdf54-j8b5p 1/1 Running 0 77s
- rook-ceph-mon-a-694bb7987d-fp9w7 1/1 Running 0 105s
- rook-ceph-mon-b-856fdd5cb9-5h2qk 1/1 Running 0 94s
- rook-ceph-mon-c-57545897fc-j576h 1/1 Running 0 85s
- rook-ceph-operator-85f5b946bd-s8grz 1/1 Running 0 92m
- rook-ceph-osd-0-6bb747b6c5-lnvb6 1/1 Running 0 23s
- rook-ceph-osd-1-7f67f9646d-44p7v 1/1 Running 0 24s
- rook-ceph-osd-2-6cd4b776ff-v4d68 1/1 Running 0 25s
- rook-ceph-osd-prepare-node1-vx2rz 0/2 Completed 0 60s
- rook-ceph-osd-prepare-node2-ab3fd 0/2 Completed 0 60s
- rook-ceph-osd-prepare-node3-w4xyz 0/2 Completed 0 60s
要验证集群是否处于健康状态,请连接到 Rook toolbox 并运行 ceph status 命令。
- ceph status
- cluster:
- id: a0452c76-30d9-4c1a-a948-5d8405f19a7c
- health: HEALTH_OK
- services:
- mon: 3 daemons, quorum a,b,c (age 3m)
- mgr: a(active, since 2m)
- osd: 3 osds: 3 up (since 1m), 3 in (since 1m)
- ..
有关 Rook 公开的三种存储类型的演练,请参阅以下指南:
Ceph 有一个仪表板,您可以在其中查看集群的状态。
我们创建了一个 toolbox 容器,其中包含用于调试和排除 Rook 集群故障的全套 Ceph 客户端。
每个 Rook 集群都有一些内置的指标收集器(collectors)/导出器(exporters),用于使用 Prometheus 进行监控。
完成测试集群后,请参阅这些说明以清理集群。
NFS 允许远程主机通过网络挂载文件系统并与这些文件系统交互,就像它们是在本地挂载一样。这使系统管理员能够将资源整合到网络上的中央服务器上。
要暴露的卷,需要通过 PVC 附加到 NFS server pod。
可以被附加(attached)和导出(exported)任何类型的 PVC,例如 Host Path、AWS Elastic Block Store、GCP Persistent Disk、CephFS、Ceph RBD 等。这些卷的限制(limitations)在它们由 NFS 共享时也适用。您可以在 Kubernetes docs 中进一步了解这些卷的详细信息和限制。3. NFS client packages 必须安装在 Kubernetes 可能运行挂载 NFS 的 pod 的所有节点上。在 CentOS 节点上安装 nfs-utils 或在 Ubuntu 节点上安装 nfs-common。
首先使用以下命令部署 Rook NFS operator:
- $ git clone --single-branch --branch v1.6.8 https://github.com/rook/rook.git
- cd rook/cluster/examples/kubernetes/nfs
- kubectl create -f common.yaml
- kubectl create -f operator.yaml
您可以检查 operator 是否已启动并运行:
- kubectl -n rook-nfs-system get pod
NAME READY STATUS RESTARTS AGE
- NAME READY STATUS RESTARTS AGE
- rook-nfs-operator-879f5bf8b-gnwht 1/1 Running 0 29m
Admission webhooks 是 HTTP 回调,用于接收对 API 服务器的准入请求。两种类型的 admission webhooks 是验证 admission webhook 和 mutating admission webhook。 NFS Operator 支持验证 admission webhook,它在存储到 etcd(持久化)之前验证发送到 API server 的 NFSServer 对象。
要在 NFS 上启用 admission webhook,例如验证 admission webhook,您需要执行以下操作:
首先,确保安装了 cert-manager。如果尚未安装,您可以按照 cert-manager 安装文档中的说明进行安装。或者,您可以简单地运行以下单个命令:
- kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.1/cert-manager.yaml
这将轻松安装最新版本 (v0.15.1) 的 cert-manager。完成后,确保 cert-manager 组件部署正确并处于 Running 状态:
- kubectl get -n cert-manager pod
- NAME READY STATUS RESTARTS AGE
- cert-manager-7747db9d88-jmw2f 1/1 Running 0 2m1s
- cert-manager-cainjector-87c85c6ff-dhtl8 1/1 Running 0 2m1s
- cert-manager-webhook-64dc9fff44-5g565 1/1 Running 0 2m1s
一旦 cert-manager 运行,您现在可以部署 NFS webhook:
- kubectl create -f webhook.yaml
验证 webhook 已启动并正在运行:
- kubectl -n rook-nfs-system get pod
- NAME READY STATUS RESTARTS AGE
- rook-nfs-operator-78d86bf969-k7lqp 1/1 Running 0 102s
- rook-nfs-webhook-74749cbd46-6jw2w 1/1 Running 0 102s
创建 Openshift 安全上下文约束(可选)
在 OpenShift 集群上,我们需要创建一些额外的安全上下文约束。如果您未在 OpenShift 中运行,则可以跳过此部分并转到下一部分。
要为 nfs-server pod 创建安全上下文约束,我们可以使用以下 yaml,它也可以在 /cluster/examples/kubernetes/nfs 下的 scc.yaml 中找到。
注意:旧版本的 OpenShift 可能需要 apiVersion: v1
- kind: SecurityContextConstraints
- apiVersion: security.openshift.io/v1
- metadata:
- name: rook-nfs
- allowHostDirVolumePlugin: true
- allowHostIPC: false
- allowHostNetwork: false
- allowHostPID: false
- allowHostPorts: false
- allowPrivilegedContainer: false
- allowedCapabilities:
- - SYS_ADMIN
- - DAC_READ_SEARCH
- defaultAddCapabilities: null
- fsGroup:
- type: MustRunAs
- priority: null
- readOnlyRootFilesystem: false
- requiredDropCapabilities:
- - KILL
- - MKNOD
- - SYS_CHROOT
- runAsUser:
- type: RunAsAny
- seLinuxContext:
- type: MustRunAs
- supplementalGroups:
- type: RunAsAny
- volumes:
- - configMap
- - downwardAPI
- - emptyDir
- - persistentVolumeClaim
- - secret
- users:
- - system:serviceaccount:rook-nfs:rook-nfs-server
您可以使用以下命令创建 scc:
- oc create -f scc.yaml
创建 Pod 安全策略(推荐)
我们建议您也创建 Pod 安全策略
- apiVersion: policy/v1beta1
- kind: PodSecurityPolicy
- metadata:
- name: rook-nfs-policy
- spec:
- privileged: true
- fsGroup:
- rule: RunAsAny
- allowedCapabilities:
- - DAC_READ_SEARCH
- - SYS_RESOURCE
- runAsUser:
- rule: RunAsAny
- seLinux:
- rule: RunAsAny
- supplementalGroups:
- rule: RunAsAny
- volumes:
- - configMap
- - downwardAPI
- - emptyDir
- - persistentVolumeClaim
- - secret
- - hostPath
使用名称 psp.yaml 保存此文件并使用以下命令创建:
- kubectl create -f psp.yaml
现在 operator 正在运行,我们可以通过创建 nfsservers.nfs.rook.io 资源的实例来创建 NFS 服务器的实例。NFS server resource 的各种字段和选项可用于配置要导出的服务器及其卷。
在我们创建 NFS Server 之前,我们需要创建 ServiceAccount 和 RBAC 规则
- ---
- apiVersion: v1
- kind: Namespace
- metadata:
- name: rook-nfs
- ---
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- name: rook-nfs-server
- namespace: rook-nfs
- ---
- kind: ClusterRole
- apiVersion: rbac.authorization.k8s.io/v1
- metadata:
- name: rook-nfs-provisioner-runner
- rules:
- - apiGroups: [""]
- resources: ["persistentvolumes"]
- verbs: ["get", "list", "watch", "create", "delete"]
- - apiGroups: [""]
- resources: ["persistentvolumeclaims"]
- verbs: ["get", "list", "watch", "update"]
- - apiGroups: ["storage.k8s.io"]
- resources: ["storageclasses"]
- verbs: ["get", "list", "watch"]
- - apiGroups: [""]
- resources: ["events"]
- verbs: ["create", "update", "patch"]
- - apiGroups: [""]
- resources: ["services", "endpoints"]
- verbs: ["get"]
- - apiGroups: ["policy"]
- resources: ["podsecuritypolicies"]
- resourceNames: ["rook-nfs-policy"]
- verbs: ["use"]
- - apiGroups: [""]
- resources: ["endpoints"]
- verbs: ["get", "list", "watch", "create", "update", "patch"]
- - apiGroups:
- - nfs.rook.io
- resources:
- - "*"
- verbs:
- - "*"
- ---
- kind: ClusterRoleBinding
- apiVersion: rbac.authorization.k8s.io/v1
- metadata:
- name: rook-nfs-provisioner-runner
- subjects:
- - kind: ServiceAccount
- name: rook-nfs-server
- # replace with namespace where provisioner is deployed
- namespace: rook-nfs
- roleRef:
- kind: ClusterRole
- name: rook-nfs-provisioner-runner
- apiGroup: rbac.authorization.k8s.io
使用名称 rbac.yaml 保存此文件并使用以下命令创建:
- kubectl create -f rbac.yaml
本指南有 3 个主要示例,用于演示使用 NFS 服务器导出卷(exporting volumes):
第一个示例将逐步创建一个 NFS server 实例,该实例导出由您碰巧运行的环境的默认 StorageClass 支持的存储。在某些环境中,这可能是主机路径(host path),在其他环境中,它可能是云提供商虚拟磁盘(cloud provider virtual disk)。无论哪种方式,此示例都需要存在默认的 StorageClass。
首先将以下 NFS CRD 实例定义保存到名为 nfs.yaml 的文件中:
- ---
- # A default storageclass must be present
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: nfs-default-claim
- namespace: rook-nfs
- spec:
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 1Gi
- ---
- apiVersion: nfs.rook.io/v1alpha1
- kind: NFSServer
- metadata:
- name: rook-nfs
- namespace: rook-nfs
- spec:
- replicas: 1
- exports:
- - name: share1
- server:
- accessMode: ReadWrite
- squash: "none"
- # A Persistent Volume Claim must be created before creating NFS CRD instance.
- persistentVolumeClaim:
- claimName: nfs-default-claim
- # A key/value list of annotations
- annotations:
- rook: nfs
保存了 nfs.yaml 文件后,现在创建 NFS server,如下所示:
- kubectl create -f nfs.yaml
Rook NFS 通过 xfs_quota 支持磁盘配额。因此,如果您需要为卷指定磁盘配额,则可以按照此示例进行操作。
在这个例子中,我们将使用一个带有 prjquota 选项的作为 xfs 挂载的底层卷。在创建底层卷(underlying volume)之前,您需要使用 xfs 文件系统和 prjquota mountOptions 创建 StorageClass。Kubernetes 的许多分布式存储提供商都支持 xfs 文件系统。通常通过在 storageClass 参数中定义 fsType: xfs 或 fs: xfs。但实际上如何指定 storage-class 文件系统类型取决于它自己的存储提供者。您可以查看 https://kubernetes.io/docs/concepts/storage/storage-classes/ 了解更多详情。
这是 GCE PD 和 AWS EBS 的示例 StorageClass
- apiVersion: storage.k8s.io/v1
- kind: StorageClass
- metadata:
- name: standard-xfs
- parameters:
- type: pd-standard
- fsType: xfs
- mountOptions:
- - prjquota
- provisioner: kubernetes.io/gce-pd
- reclaimPolicy: Delete
- volumeBindingMode: Immediate
- allowVolumeExpansion: true
- apiVersion: storage.k8s.io/v1
- kind: StorageClass
- metadata:
- name: standard-xfs
- provisioner: kubernetes.io/aws-ebs
- parameters:
- type: io1
- iopsPerGB: "10"
- fsType: xfs
- mountOptions:
- - prjquota
- reclaimPolicy: Delete
- volumeBindingMode: Immediate
一旦您已经拥有带有 xfs 文件系统和 prjquota mountOptions 的 StorageClass,您就可以使用以下示例创建 NFS server 实例。
- ---
- # A storage class with name standard-xfs must be present.
- # The storage class must be has xfs filesystem type and prjquota mountOptions.
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: nfs-xfs-claim
- namespace: rook-nfs
- spec:
- storageClassName: "standard-xfs"
- accessModes:
- - ReadWriteOnce
- resources:
- requests:
- storage: 1Gi
- ---
- apiVersion: nfs.rook.io/v1alpha1
- kind: NFSServer
- metadata:
- name: rook-nfs
- namespace: rook-nfs
- spec:
- replicas: 1
- exports:
- - name: share1
- server:
- accessMode: ReadWrite
- squash: "none"
- # A Persistent Volume Claim must be created before creating NFS CRD instance.
- persistentVolumeClaim:
- claimName: nfs-xfs-claim
- # A key/value list of annotations
- annotations:
- rook: nfs
将此 PVC 和 NFS Server 实例保存为 nfs-xfs.yaml 并使用以下命令创建。
- kubectl create -f nfs-xfs.yaml
在这个替代示例中,我们将使用不同的基础卷(underlying volume)作为 NFS server 的 export。这些步骤将引导我们导出 Ceph RBD block volume,以便客户端可以通过网络访问它。
在 Rook Ceph 集群启动并运行后,我们可以继续创建 NFS server。
将此 PVC 和 NFS 服务器实例保存为 nfs-ceph.yaml:
- ---
- # A rook ceph cluster must be running
- # Create a rook ceph cluster using examples in rook/cluster/examples/kubernetes/ceph
- # Refer to https://rook.io/docs/rook/master/ceph-quickstart.html for a quick rook cluster setup
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: nfs-ceph-claim
- namespace: rook-nfs
- spec:
- storageClassName: rook-ceph-block
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 2Gi
- ---
- apiVersion: nfs.rook.io/v1alpha1
- kind: NFSServer
- metadata:
- name: rook-nfs
- namespace: rook-nfs
- spec:
- replicas: 1
- exports:
- - name: share1
- server:
- accessMode: ReadWrite
- squash: "none"
- # A Persistent Volume Claim must be created before creating NFS CRD instance.
- # Create a Ceph cluster for using this example
- # Create a ceph PVC after creating the rook ceph cluster using ceph-pvc.yaml
- persistentVolumeClaim:
- claimName: nfs-ceph-claim
- # A key/value list of annotations
- annotations:
- rook: nfs
创建您保存在 nfs-ceph.yaml 中的 NFS server 实例:
- kubectl create -f nfs-ceph.yaml
我们可以使用以下命令验证是否已创建代表我们的新 NFS server 及其导出的 Kubernetes 对象。
- kubectl -n rook-nfs get nfsservers.nfs.rook.io
- NAME AGE STATE
- rook-nfs 32s Running
验证 NFS server pod 是否已启动并正在运行:
- kubectl -n rook-nfs get pod -l app=rook-nfs
- NAME READY STATUS RESTARTS AGE
- rook-nfs-0 1/1 Running 0 2m
如果 NFS server pod 处于 Running 状态,那么我们已经成功创建了一个暴露的 NFS 共享,客户端可以开始通过网络访问。
从 Rook 版本 v1.0 开始,Rook 支持 NFS 的动态配置(dynamic provisioning)。此示例将展示如何将动态配置功能用于 nfs。
部署 NFS Operator 和 NFSServer 实例后。必须创建类似于以下示例的 storageclass 来动态配置卷。
- apiVersion: storage.k8s.io/v1
- kind: StorageClass
- metadata:
- labels:
- app: rook-nfs
- name: rook-nfs-share1
- parameters:
- exportName: share1
- nfsServerName: rook-nfs
- nfsServerNamespace: rook-nfs
- provisioner: nfs.rook.io/rook-nfs-provisioner
- reclaimPolicy: Delete
- volumeBindingMode: Immediate
您可以将其另存为文件,例如:名为 sc.yaml 然后使用以下命令创建 storageclass。
- kubectl create -f sc.yaml
注意:StorageClass 需要传递以下 3 个参数。
创建上述 storageclass 后,您可以创建引用 storageclass 的 PV claim,如下面给出的示例所示。
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: rook-nfs-pv-claim
- spec:
- storageClassName: "rook-nfs-share1"
- accessModes:
- - ReadWriteMany
- resources:
- requests:
- storage: 1Mi
您也可以将其保存为文件,例如:名为 pvc.yaml 然后使用以下命令创建 PV claim。
- kubectl create -f pvc.yaml
现在我们可以通过创建一个示例 web server app 来使用刚刚创建的 PV, 该应用程序使用上述 PersistentVolumeClaim 声明导出的卷。有 2 个 pod 构成此示例:
将读取和显示 NFS 共享内容的 Web server pod
将随机数据写入 NFS 共享的 writer pod,以便网站不断更新
从 cluster/examples/kubernetes/nfs 文件夹启动 busybox pod(writer)和 web server:
- kubectl create -f busybox-rc.yaml
- kubectl create -f web-rc.yaml
让我们确认预期的 busybox writer pod 和 Web server pod 都已启动并处于 Running 状态:
- kubectl get pod -l app=nfs-demo
为了能够通过网络访问 Web server,让我们为它创建一个 service:
- kubectl create -f web-service.yaml
然后我们可以使用我们之前启动的 busybox writer pod 来检查 nginx
本文题目:快速上手Rook,入门云原生存储编排
文章起源:http://www.csdahua.cn/qtweb/news17/499667.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网