Kubernetes Rook + Ceph
<h2>一、简介</h2><p><strong>容器的持久化存储</strong></p>
<p> 容器的持久化存储是保存容器存储状态的重要手段,存储插件会在容器里挂载一个基于网络或者其他机制的远程数据卷,使得在容器里创建的文件,实际上是保存在远程存储服务器上,或者以分布式的方式保存在多个节点上,而与当前宿主机没有任何绑定关系。这样,无论你在其他哪个宿主机上启动新的容器,都可以请求挂载指定的持久化存储卷,从而访问到数据卷里保存的内容。<br>由于 Kubernetes 本身的松耦合设计,绝大多数存储项目,比如 Ceph、GlusterFS、NFS 等,都可以为 Kubernetes 提供持久化存储能力。<br><strong>Ceph分布式存储系统</strong><br> Ceph是一种高度可扩展的分布式存储解决方案,提供对象、文件和块存储。在每个存储节点上,您将找到Ceph存储对象的文件系统和Ceph OSD(对象存储守护程序)进程。在Ceph集群上,您还可以找到Ceph MON(监控)守护程序,它们确保Ceph集群保持高可用性。<br><strong>Rook</strong><br> Rook 是一个开源的cloud-native storage编排, 提供平台和框架;为各种存储解决方案提供平台、框架和支持,以便与云原生环境本地集成。<br>Rook 将存储软件转变为自我管理、自我扩展和自我修复的存储服务,它通过自动化部署、引导、配置、置备、扩展、升级、迁移、灾难恢复、监控和资源管理来实现此目的。<br> Rook 使用底层云本机容器管理、调度和编排平台提供的工具来实现它自身的功能。Rook 目前支持Ceph、NFS、Minio Object Store和CockroachDB。</p>
<p> </p>
<h2>二、安装</h2>
<p>地址:https://rook.io/docs/rook/v1.4/ceph-quickstart.html</p>
<h3>2.1 集群环境准备</h3>
<p>在集群中至少有三个节点可用,满足ceph高可用要求</p>
<p>rook使用存储方式</p>
<p>rook默认使用所有节点的所有资源,rook operator自动在所有节点上启动OSD设备,Rook会用如下标准监控并发现可用设备:</p>
<ul>
<li>设备没有分区</li>
<li>设备没有格式化的文件系统</li>
</ul>
<p>Rook不会使用不满足以上标准的设备。另外也可以通过修改配置文件,指定哪些节点或者设备会被使用。</p>
<p>选择需要的节点新增3块裸盘,不需要对裸盘进行额外操作,确保挂载到节点即可</p>
<p> </p>
<h3>2.2 部署Rook + Ceph</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">git clone --single-branch --branch v1.4.6 https://github.com/rook/rook.git
cd rook/cluster/examples/kubernetes/ceph
kubectl create -f common.yaml
kubectl create -f operator.yaml
</pre>
</div>
<p> </p>
<p> 修改cluster.yaml文件</p>
<p> </p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_b918945d-c259-4573-ad28-9a72b7533f1b" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_b918945d-c259-4573-ad28-9a72b7533f1b" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_b918945d-c259-4573-ad28-9a72b7533f1b" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">#################################################################################################################
# Define the settings </span><span style="color: rgba(0, 0, 255, 1)">for</span> the rook-ceph cluster with common settings <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> a production cluster.
# All nodes with available raw devices will be used </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> the Ceph cluster. At least three nodes are required
# </span><span style="color: rgba(0, 0, 255, 1)">in</span> this example. See the documentation <span style="color: rgba(0, 0, 255, 1)">for</span> <span style="color: rgba(0, 0, 255, 1)">more</span><span style="color: rgba(0, 0, 0, 1)"> details on storage settings available.
# For example, to create the cluster:
# kubectl create </span>-<span style="color: rgba(0, 0, 0, 1)">f common.yaml
# kubectl create </span>-<span style="color: rgba(0, 0, 0, 1)">f operator.yaml
# kubectl create </span>-<span style="color: rgba(0, 0, 0, 1)">f cluster.yaml
#################################################################################################################
apiVersion: ceph.rook.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1
kind: CephCluster
metadata:
name: rook</span>-<span style="color: rgba(0, 0, 0, 1)">ceph
namespace: rook</span>-<span style="color: rgba(0, 0, 0, 1)">ceph
spec:
cephVersion:
# The container image used to launch the Ceph daemon pods (mon, mgr, osd, mds, rgw).
# v13 is mimic, v14 is nautilus, and v15 is octopus.
# RECOMMENDATION: In production, use a specific version tag instead of the general v14 flag, </span><span style="color: rgba(0, 0, 255, 1)">which</span> pulls the latest release and could result <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> different
# versions running within the cluster. See tags available at https:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">hub.docker.com/r/ceph/ceph/tags/.</span>
# If you want to be <span style="color: rgba(0, 0, 255, 1)">more</span> precise, you can always use a timestamp tag such ceph/ceph:v15.<span style="color: rgba(128, 0, 128, 1)">2.4</span>-<span style="color: rgba(128, 0, 128, 1)">20200630</span><span style="color: rgba(0, 0, 0, 1)">
# This tag might not contain a new Ceph version, just security fixes from the underlying operating system, </span><span style="color: rgba(0, 0, 255, 1)">which</span><span style="color: rgba(0, 0, 0, 1)"> will reduce vulnerabilities
image: ceph</span>/ceph:v15.<span style="color: rgba(128, 0, 128, 1)">2.4</span><span style="color: rgba(0, 0, 0, 1)">
# Whether to allow unsupported versions of Ceph. Currently `nautilus` and `octopus` are supported.
# Future versions such as `pacific` would require this to be set to `</span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">`.
# Do not set to </span><span style="color: rgba(0, 0, 255, 1)">true</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> production.
allowUnsupported: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
# The path on the host where configuration files will be persisted. Must be specified.
# Important: </span><span style="color: rgba(0, 0, 255, 1)">if</span> you reinstall the cluster, <span style="color: rgba(0, 0, 255, 1)">make</span> sure you delete this directory from each host or <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> the mons will fail to start on the new cluster.
# In Minikube, the </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/data</span><span style="color: rgba(128, 0, 0, 1)">'</span> directory is configured to persist across reboots. Use <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/data/rook</span><span style="color: rgba(128, 0, 0, 1)">"</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> Minikube environment.
dataDirHostPath: </span>/var/lib/<span style="color: rgba(0, 0, 0, 1)">rook
# Whether or not upgrade should continue even </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> a check fails
# This means Ceph</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s status could be degraded and we don</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">t recommend upgrading but you might decide otherwise
# Use at your OWN risk
# To understand Rook</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s upgrade process of Ceph, read https://rook.io/docs/rook/master/ceph-upgrade.html#ceph-version-upgrades</span>
skipUpgradeChecks: <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
# Whether or not continue </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> PGs are not clean during an upgrade
continueUpgradeAfterChecksEvenIfNotHealthy: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
# set the amount of mons to be started
mon:
count: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
allowMultiplePerNode: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
#mgr:
#modules:
# Several modules should not need to be included </span><span style="color: rgba(0, 0, 255, 1)">in</span> this list. The <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">dashboard</span><span style="color: rgba(128, 0, 0, 1)">"</span> and <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">monitoring</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> modules
# are already enabled by other settings </span><span style="color: rgba(0, 0, 255, 1)">in</span> the cluster CR and the <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">rook</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> module is always enabled.
# </span>-<span style="color: rgba(0, 0, 0, 1)"> name: pg_autoscaler
# enabled: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
# enable the ceph dashboard </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> viewing cluster status
dashboard:
enabled: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
# serve the dashboard under a subpath (useful when you are accessing the dashboard via a reverse proxy)
# urlPrefix: </span>/ceph-<span style="color: rgba(0, 0, 0, 1)">dashboard
# serve the dashboard at the given port.
# port: </span><span style="color: rgba(128, 0, 128, 1)">8443</span><span style="color: rgba(0, 0, 0, 1)">
# serve the dashboard using SSL
ssl: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
# enable prometheus alerting </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> cluster
monitoring:
# requires Prometheus to be pre</span>-<span style="color: rgba(0, 0, 0, 1)">installed
enabled: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
# namespace to deploy prometheusRule </span><span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)">. If empty, namespace of the cluster will be used.
# Recommended:
# If you have a single rook</span>-<span style="color: rgba(0, 0, 0, 1)">ceph cluster, set the rulesNamespace to the same namespace as the cluster or keep it empty.
# If you have multiple rook</span>-ceph clusters <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> the same k8s cluster, choose the same namespace (ideally, namespace with prometheus
# deployed) to set rulesNamespace </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> all the clusters. Otherwise, you will get duplicate alerts with multiple alert definitions.
rulesNamespace: rook</span>-<span style="color: rgba(0, 0, 0, 1)">ceph
network:
# enable host networking
#provider: host
# EXPERIMENTAL: enable the Multus network provider
#provider: multus
#selectors:
# The selector keys are required to be `public` and `cluster`.
# Based on the configuration, the operator will </span><span style="color: rgba(0, 0, 255, 1)">do</span><span style="color: rgba(0, 0, 0, 1)"> the following:
# </span><span style="color: rgba(128, 0, 128, 1)">1</span>. <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> only the `public` selector key is specified both public_network and cluster_network Ceph settings will listen on that interface
# </span><span style="color: rgba(128, 0, 128, 1)">2</span>. <span style="color: rgba(0, 0, 255, 1)">if</span> both `public` and `cluster` selector keys are specified the first one will point to <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">public_network</span><span style="color: rgba(128, 0, 0, 1)">'</span> flag and the second one to <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">cluster_network</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
#
# In order to work, each selector value must match a NetworkAttachmentDefinition </span><span style="color: rgba(0, 0, 255, 1)">object</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> Multus
#
#public: public</span>-conf --> NetworkAttachmentDefinition <span style="color: rgba(0, 0, 255, 1)">object</span> name <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> Multus
#cluster: cluster</span>-conf --> NetworkAttachmentDefinition <span style="color: rgba(0, 0, 255, 1)">object</span> name <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> Multus
# Provide internet protocol version. IPv6, IPv4 or empty </span><span style="color: rgba(0, 0, 255, 1)">string</span> are valid options. Empty <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> would mean IPv4
#ipFamily: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IPv6</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
# enable the crash collector </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> ceph daemon crash collection
crashCollector:
disable: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
cleanupPolicy:
# cleanup should only be added to the cluster when the cluster is about to be deleted.
# After any field of the cleanup policy is set, Rook will stop configuring the cluster as </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> the cluster is about
# to be destroyed </span><span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> order to prevent these settings from being deployed unintentionally.
# To signify that automatic deletion is desired, use the value </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">yes-really-destroy-data</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">. Only this and an empty
# </span><span style="color: rgba(0, 0, 255, 1)">string</span> are valid values <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> this field.
confirmation: </span><span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">
# sanitizeDisks represents settings </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> sanitizing OSD disks on cluster deletion
sanitizeDisks:
# method indicates </span><span style="color: rgba(0, 0, 255, 1)">if</span> the entire disk should be sanitized or simply ceph<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s metadata</span>
# <span style="color: rgba(0, 0, 255, 1)">in</span> both <span style="color: rgba(0, 0, 255, 1)">case</span>, re-<span style="color: rgba(0, 0, 255, 1)">install</span><span style="color: rgba(0, 0, 0, 1)"> is possible
# possible choices are </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">complete</span><span style="color: rgba(128, 0, 0, 1)">'</span> or <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">quick</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> (default)
method: quick
# dataSource indicate where to get random bytes from to </span><span style="color: rgba(0, 0, 255, 1)">write</span><span style="color: rgba(0, 0, 0, 1)"> on the disk
# possible choices are </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">zero</span><span style="color: rgba(128, 0, 0, 1)">'</span> (default) or <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">random</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
# using random sources will consume entropy from the system and will take much </span><span style="color: rgba(0, 0, 255, 1)">more</span> <span style="color: rgba(0, 0, 255, 1)">time</span> <span style="color: rgba(0, 0, 255, 1)">then</span><span style="color: rgba(0, 0, 0, 1)"> the zero source
dataSource: zero
# iteration overwrite N times instead of the default (</span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
# takes an integer value
iteration: </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">
# allowUninstallWithVolumes defines how the uninstall should be performed
# If set to </span><span style="color: rgba(0, 0, 255, 1)">true</span>, cephCluster deletion does not <span style="color: rgba(0, 0, 255, 1)">wait</span> <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> the PVs to be deleted.
allowUninstallWithVolumes: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
# To control where various services will be scheduled by kubernetes, use the placement configuration sections below.
# The example under </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">all</span><span style="color: rgba(128, 0, 0, 1)">'</span> would have all services scheduled on kubernetes nodes labeled with <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">role=storage-node</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)"> and
# tolerate taints with a key of </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">storage-node</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">.
#placement:
# all:
# nodeAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# nodeSelectorTerms:
# </span>-<span style="color: rgba(0, 0, 0, 1)"> matchExpressions:
# </span>-<span style="color: rgba(0, 0, 0, 1)"> key: role
# operator: In
# values:
# </span>- storage-<span style="color: rgba(0, 0, 0, 1)">node
# podAffinity:
# podAntiAffinity:
# topologySpreadConstraints:
# tolerations:
# </span>- key: storage-<span style="color: rgba(0, 0, 0, 1)">node
# operator: Exists
# The above placement information can also be specified </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> mon, osd, and mgr components
# mon:
# Monitor deployments may contain an anti</span>-affinity rule <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> avoiding monitor
# collocation on the same node. This is a required rule when host network is used
# or when AllowMultiplePerNode is </span><span style="color: rgba(0, 0, 255, 1)">false</span>. Otherwise this anti-<span style="color: rgba(0, 0, 0, 1)">affinity rule is a
# preferred rule with weight: </span><span style="color: rgba(128, 0, 128, 1)">50</span><span style="color: rgba(0, 0, 0, 1)">.
# osd:
# mgr:
# cleanup:
annotations:
# all:
# mon:
# osd:
# cleanup:
# prepareosd:
# If no mgr annotations are set, prometheus scrape annotations will be set by default.
# mgr:
labels:
# all:
# mon:
# osd:
# cleanup:
# mgr:
# prepareosd:
resources:
# The requests and limits set here, allow the mgr pod to use half of one CPU core and </span><span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)"> gigabyte of memory
# mgr:
# limits:
# cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">500m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
# memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1024Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
# requests:
# cpu: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">500m</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
# memory: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1024Mi</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
# The above example requests</span>/<span style="color: rgba(0, 0, 0, 1)">limits can also be added to the mon and osd components
# mon:
# osd:
# prepareosd:
# crashcollector:
# cleanup:
# The option to automatically remove OSDs that are out and are safe to destroy.
removeOSDsIfOutAndSafeToRemove: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
#priorityClassNames:
# all: rook</span>-ceph-default-priority-<span style="color: rgba(0, 0, 0, 1)">class
# mon: rook</span>-ceph-mon-priority-<span style="color: rgba(0, 0, 0, 1)">class
# osd: rook</span>-ceph-osd-priority-<span style="color: rgba(0, 0, 0, 1)">class
# mgr: rook</span>-ceph-mgr-priority-<span style="color: rgba(0, 0, 0, 1)">class
storage: # cluster level storage configuration and selection
useAllNodes: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
useAllDevices: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
#deviceFilter:
config:
# metadataDevice: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">md0</span><span style="color: rgba(128, 0, 0, 1)">"</span> # specify a non-rotational storage so ceph-<span style="color: rgba(0, 0, 0, 1)">volume will use it as block db device of bluestore.
# databaseSizeMB: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1024</span><span style="color: rgba(128, 0, 0, 1)">"</span> # uncomment <span style="color: rgba(0, 0, 255, 1)">if</span> the disks are smaller than <span style="color: rgba(128, 0, 128, 1)">100</span><span style="color: rgba(0, 0, 0, 1)"> GB
# journalSizeMB: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1024</span><span style="color: rgba(128, 0, 0, 1)">"</span># uncomment <span style="color: rgba(0, 0, 255, 1)">if</span> the disks are <span style="color: rgba(128, 0, 128, 1)">20</span><span style="color: rgba(0, 0, 0, 1)"> GB or smaller
# osdsPerDevice: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> # this value can be overridden at the node or device level
# encryptedDevice: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span> # the default value <span style="color: rgba(0, 0, 255, 1)">for</span> this option is <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">false</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
# Individual nodes and their config can be specified as well, but </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">useAllNodes</span><span style="color: rgba(128, 0, 0, 1)">'</span> above must be set to <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">. Then, only the named
# nodes below will be used as storage resources.Each node</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">s </span><span style="color: rgba(128, 0, 0, 1)">'</span>name<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)"> field should match their </span><span style="color: rgba(128, 0, 0, 1)">'</span>kubernetes.io/<span style="color: rgba(0, 0, 255, 1)">hostname</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)"> label.</span>
<span style="color: rgba(0, 0, 0, 1)"> nodes:
</span>- name: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">k8s-master1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
devices: # specific devices to use </span><span style="color: rgba(0, 0, 255, 1)">for</span> storage can be specified <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> each node
</span>- name: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sdb</span><span style="color: rgba(128, 0, 0, 1)">"</span>
- name: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">k8s-master3</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
devices:
</span>- name: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sdb</span><span style="color: rgba(128, 0, 0, 1)">"</span>
- name: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">node01</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
devices:
</span>- name: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sdb</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
# The section </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> configuring management of daemon disruptions during upgrade or fencing.
disruptionManagement:
# If </span><span style="color: rgba(0, 0, 255, 1)">true</span>, the operator will create and manage PodDisruptionBudgets <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> OSD, Mon, RGW, and MDS daemons. OSD PDBs are managed dynamically
# via the strategy outlined </span><span style="color: rgba(0, 0, 255, 1)">in</span> the (https:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">github.com/rook/rook/blob/master/design/ceph/ceph-managed-disruptionbudgets.md). The operator will</span>
<span style="color: rgba(0, 0, 0, 1)"> # block eviction of OSDs by default and unblock them safely when drains are detected.
managePodBudgets: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
# A duration </span><span style="color: rgba(0, 0, 255, 1)">in</span> minutes that determines how <span style="color: rgba(0, 0, 255, 1)">long</span> an entire failureDomain like `region/zone/host` will be held <span style="color: rgba(0, 0, 255, 1)">in</span> `noout` (<span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> addition to the
# default DOWN</span>/OUT interval) when it is draining. This is only relevant when`managePodBudgets` is `<span style="color: rgba(0, 0, 255, 1)">true</span>`. The default value is `<span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">` minutes.
osdMaintenanceTimeout: </span><span style="color: rgba(128, 0, 128, 1)">30</span><span style="color: rgba(0, 0, 0, 1)">
# If </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">, the operator will create and manage MachineDisruptionBudgets to ensure OSDs are only fenced when the cluster is healthy.
# Only available on OpenShift.
manageMachineDisruptionBudgets: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
# Namespace </span><span style="color: rgba(0, 0, 255, 1)">in</span> <span style="color: rgba(0, 0, 255, 1)">which</span> to watch <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> the MachineDisruptionBudgets.
machineDisruptionBudgetNamespace: openshift</span>-machine-<span style="color: rgba(0, 0, 0, 1)">api
# healthChecks
# Valid values </span><span style="color: rgba(0, 0, 255, 1)">for</span> daemons are <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">mon</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">osd</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">status</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
healthCheck:
daemonHealth:
mon:
disabled: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
interval: 45s
osd:
disabled: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
interval: 60s
status:
disabled: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
interval: 60s
# Change pod liveness probe, it works </span><span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> all mon,mgr,osd daemons
livenessProbe:
mon:
disabled: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
mgr:
disabled: </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">
osd:
disabled: </span><span style="color: rgba(0, 0, 255, 1)">false</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p> </p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># 不使用所有节点作为存储
storage: # cluster level storage configuration and selection
useAllNodes: false
useAllDevices: false
# 作为存储的节点,添加裸盘的方式,取 'kubernetes.io/hostname' label作为name
nodes:
- name: "k8s-master1"
devices: # specific devices to use for storage can be specified for each node
- name: "sdb"
- name: "k8s-master3"
devices:
- name: "sdb"
- name: "node01"
devices:
- name: "sdb"
</pre>
</div>
<p> 可以使用节点亲和性选择相应的节点部署</p>
<p> 创建集群</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">kubectl create -f cluster.yaml
</pre>
</div>
<p> 最终完成</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># kubectl get pods -n rook-ceph
NAME READY STATUS RESTARTS AGE
csi-cephfsplugin-5w6bd 3/3 Running 0 35m
csi-cephfsplugin-ffg2g 3/3 Running 0 35m
csi-cephfsplugin-m9c5p 3/3 Running 0 35m
csi-cephfsplugin-provisioner-5c65b94c8d-mzq7c 6/6 Running 9 35m
csi-cephfsplugin-provisioner-5c65b94c8d-sk292 6/6 Running 2 35m
csi-cephfsplugin-xbr9d 3/3 Running 0 35m
csi-rbdplugin-mlvf2 3/3 Running 0 35m
csi-rbdplugin-provisioner-569c75558-fbxxg 6/6 Running 0 35m
csi-rbdplugin-provisioner-569c75558-r5rtz 6/6 Running 10 35m
csi-rbdplugin-qjc56 3/3 Running 0 35m
csi-rbdplugin-tssf8 3/3 Running 0 35m
csi-rbdplugin-x8hfs 3/3 Running 0 35m
rook-ceph-crashcollector-k8s-master1-69f6c6484b-xgv8m 1/1 Running 1 17h
rook-ceph-crashcollector-k8s-master2-845f75b57f-x7kb7 1/1 Running 1 10h
rook-ceph-crashcollector-k8s-master3-78f56b85dd-8n7x2 1/1 Running 1 17h
rook-ceph-crashcollector-node01-dccc44cf5-8tx7d 1/1 Running 1 17h
rook-ceph-mgr-a-6758f456d-qv4tz 1/1 Running 1 11h
rook-ceph-mon-a-775b697f6-ghrnz 1/1 Running 43 11h
rook-ceph-operator-69d45cb679-2g7vf 1/1 Running 2 18h
rook-ceph-osd-0-6fcdc8b979-z8zrc 1/1 Running 3 17h
rook-ceph-osd-1-856bc66fb8-v2lpn 1/1 Running 3 17h
rook-ceph-osd-2-94ffbf9b4-bmhqr 1/1 Running 3 17h
rook-ceph-osd-prepare-k8s-master1-f8bct 0/1 Completed 0 9m43s
rook-ceph-osd-prepare-k8s-master3-x8xn2 0/1 Completed 0 9m25s
rook-ceph-osd-prepare-node01-dmppz 0/1 Completed 0 9m22s
rook-discover-5xgpz 1/1 Running 1 18h
rook-discover-6mkgh 1/1 Running 1 18h
rook-discover-7czrl 1/1 Running 2 18h
rook-discover-cg6fb 1/1 Running 2 18h
</pre>
</div>
<p> </p>
<p>它会创建如下资源:</p>
<ol>
<li>namespace:rook-ceph,之后的所有Ceph集群相关的pod都会创建在该namespace下</li>
<li>serviceaccount:ServiceAccount资源,给Ceph集群的Pod使用</li>
<li>role & rolebinding:用户资源控制</li>
<li>cluster:rook-ceph,创建的Ceph集群</li>
</ol>
<p>部署的Ceph集群有:</p>
<ol>
<li>Ceph Monitors:默认启动三个ceph-mon,可以在cluster.yaml里配置</li>
<li>Ceph Mgr:默认启动一个,可以在cluster.yaml里配置</li>
<li>Ceph OSDs:根据cluster.yaml里的配置启动,默认在所有的可用节点上启动</li>
</ol>
<p> </p>
<h2>三、Dashboard</h2>
<p><span class="md-plain md-expand">地址:<span class="md-link md-pair-s md-expand">https://rook.io/docs/rook/v1.4/ceph-dashboard.html</span></span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># pwd
/data/rook/rook/cluster/examples/kubernetes/ceph
# 选择ingress方式(前提是已经部署了ingress)
# kubectl create -f dashboard-ingress-https.yaml
#没有ingress可以使用NodePort
</pre>
</div>
<p> </p>
<p>查看</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># kubectl get svc -n rook-ceph | grep dashboard
rook-ceph-mgr-dashboard ClusterIP 10.108.53.200 <none> 8443/TCP 18h
# kubectl get ingress -n rook-ceph
Warning: extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress
NAME CLASS HOSTS ADDRESS PORTS AGE
rook-ceph-mgr-dashboard <none> rook-ceph.example.com 10.101.32.165 80, 443 18h
</pre>
</div>
<p> </p>
<p><span class="md-plain md-expand">修改hosts文件,将服务器IP地址指向 <span class="md-pair-s md-expand"><code>rook-ceph.example.com</code></span></span></p>
<p><img src="https://img2020.cnblogs.com/blog/821560/202011/821560-20201104141732087-763139008.jpg" alt="" loading="lazy"></p>
<p> </p>
<p><span class="md-plain md-expand">默认用户<span class="md-pair-s"><code>admin</code><span class="md-plain md-expand">,获取password</span></span></span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">kubectl -n rook-ceph get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo
</pre>
</div>
<p> </p>
<h2>四、安装Toolbox</h2>
<p>默认启动的Ceph集群,是开启Ceph认证的,这样你登陆Ceph组件所在的Pod里,是没法去获取集群状态,以及执行CLI命令,这时需要部署Ceph toolbox</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># pwd
/data/rook/rook/cluster/examples/kubernetes/ceph</pre>
<pre class="brush:bash;gutter:true;"># kubectl create -f toolbox.yaml
deployment.apps/rook-ceph-tools created
</pre>
</div>
<p> </p>
<p>测试toolbox</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># kubectl exec -it rook-ceph-tools-5ccd9c8d5b-8bgkm -n rook-ceph -- bash
# ceph status
cluster:
id: 908157b5-fbf4-408c-b32c-f1542b92a4aa
health: HEALTH_WARN
43 daemons have recently crashed
services:
mon: 1 daemons, quorum a (age 77m)
mgr: a(active, since 49m)
osd: 3 osds: 3 up (since 73m), 3 in (since 11h)
data:
pools: 1 pools, 1 pgs
objects: 3 objects, 0 B
usage: 3.0 GiB used, 21 GiB / 24 GiB avail
pgs: 1 active+clean
</pre>
</div>
<p> </p>
<h2>五、存储</h2>
<p class="md-end-block md-p"><span class="md-plain md-expand">Rook三种存储类型:</span></p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">Block:创建Pod使用的块存储</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">Object:创建一个在Kubernetes集群内部或外部均可访问的对象存储</span></p>
</li>
<li class="md-list-item">
<p class="md-end-block md-p"><span class="md-plain">Shared Filesystem:多个Pod之间<span class="md-pair-s "><strong><span class="md-meta-i-cmd-link"><span class="md-plain">共享的文件</span></span></strong><span class="md-plain">系统</span></span></span></p>
</li>
</ul>
<p> </p>
<h3><span class="md-plain"><span class="md-pair-s "><span class="md-plain">5.1 Block块存储</span></span></span></h3>
<p><span class="md-plain"><span class="md-pair-s "><span class="md-plain">在提供(Provisioning)块存储之前,需要先创建StorageClass和存储池。K8S需要这两类资源,才能和Rook交互,进而分配持久卷(PV)</span></span></span></p>
<p><span class="md-plain"><span class="md-pair-s "><span class="md-plain">ceph-block-pool.yaml</span></span></span></p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
name: replicapool
namespace: rook-ceph
spec:
failureDomain: host
replicated:
size: 1
</pre>
</div>
<p> </p>
<ul class="ul-list" data-mark="-">
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">failureDomain: host:副本会分散在不同的节点上</span></p>
</li>
<li class="md-list-item md-focus-container">
<p class="md-end-block md-p md-focus"><span class="md-plain md-expand">size:副本数,默认3</span></p>
</li>
</ul>
<p> </p>
<p>创建存储池</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># kubectl create -f ceph-block-pool.yaml
# kubectl get cephblockpool -n rook-ceph
NAME AGE
replicapool 65s
</pre>
</div>
<ul>
<li>cephblockpool:是rook自定义的kind</li>
</ul>
<p> </p>
<p>创建storageClass</p>
<p>ceph-block-storageClass.yaml</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;">apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: rook-ceph-block
# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
# clusterID is the namespace where the rook cluster is running
clusterID: rook-ceph
# Ceph pool into which the RBD image shall be created
pool: replicapool
# RBD image format. Defaults to "2".
imageFormat: "2"
# RBD image features. Available for imageFormat: "2". CSI RBD currently supports only `layering` feature.
imageFeatures: layering
# The secrets contain Ceph admin credentials.
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
# Specify the filesystem type of the volume. If not specified, csi-provisioner
# will set default as `ext4`. Note that `xfs` is not recommended due to potential deadlock
# in hyperconverged settings where the volume is mounted on the same node as the osds.
csi.storage.k8s.io/fstype: ext4
# Delete the rbd volume when a PVC is deleted
reclaimPolicy: Delete
</pre>
</div>
<p> </p>
<p>创建</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># kubectl create -f ceph-block-storageClass.yaml
# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
rook-ceph-block rook-ceph.rbd.csi.ceph.com Delete Immediate false 2m21s
</pre>
</div>
<p> </p>
<h3>5.2 创建一个statefulset</h3>
<p>test-sts.yaml</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;collapse:true;;gutter:true;">apiVersion: apps/v1
kind: StatefulSet
metadata:
labels:
app: test-block-sc
name: test-block-sc
namespace: default
spec:
replicas: 2
revisionHistoryLimit: 10
selector:
matchLabels:
app: test-block-sc
serviceName: test-block-sc
template:
metadata:
labels:
app: test-block-sc
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- test-block-sc
topologyKey: kubernetes.io/hostname
weight: 100
containers:
- env:
- name: TZ
value: Asia/Shanghai
- name: LANG
value: C.UTF-8
image: nginx:1.15.2
imagePullPolicy: Always
lifecycle: {}
livenessProbe:
failureThreshold: 2
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 2
name: test-block-sc
ports:
- containerPort: 80
name: nginx-web
protocol: TCP
readinessProbe:
failureThreshold: 2
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 2
resources:
limits:
cpu: 100m
memory: 100Mi
requests:
cpu: 10m
memory: 10Mi
tty: true
volumeMounts:
- mountPath: /usr/share/zoneinfo/Asia/Shanghai
name: tz-config
- mountPath: /etc/localtime
name: tz-config
- mountPath: /usr/share/nginx/html/items
name: test-block-sts
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
terminationGracePeriodSeconds: 30
volumes:
- hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
type: ""
name: tz-config
updateStrategy:
rollingUpdate:
partition: 0
type: RollingUpdate
volumeClaimTemplates:
- apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-block-sts
spec:
accessModes:
- ReadWriteOnce
resources:
limits:
storage: 5Gi
requests:
storage: 1Gi
storageClassName: rook-ceph-block
volumeMode: Filesystem
---
apiVersion: v1
kind: Service
metadata:
labels:
app: test-block-sc
name: test-block-sc
namespace: default
spec:
clusterIP: None
ports:
- name: container-1-nginx-web-1
port: 80
protocol: TCP
targetPort: 80
selector:
app: test-block-sc
sessionAffinity: None
type: ClusterIP
</pre>
</div>
<p> </p>
<p>查看pv和pvc</p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
test-block-sts-test-block-sc-0 Bound pvc-cff04799-5735-4243-aef0-8ed6725521d1 1Gi RWO rook-ceph-block 48m
test-block-sts-test-block-sc-1 Bound pvc-28d34f2c-21ac-4f58-b4f1-3923bea1de91 1Gi RWO rook-ceph-block 45m
</pre>
</div>
<p> </p>
<div class="cnblogs_Highlighter">
<pre class="brush:bash;gutter:true;"># kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-28d34f2c-21ac-4f58-b4f1-3923bea1de91 1Gi RWO Delete Bound default/test-block-sts-test-block-sc-1 rook-ceph-block 45m
pvc-cff04799-5735-4243-aef0-8ed6725521d1 1Gi RWO Delete Bound default/test-block-sts-test-block-sc-0 rook-ceph-block 48m
</pre>
</div>
<p> </p>
<p> </p><br><br>
来源:https://www.cnblogs.com/bigberg/p/13925677.html
頁:
[1]