我是宝煜 發表於 2020-11-4 14:35:00

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>&nbsp;</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>&nbsp;</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>&nbsp;</p>
<p>  修改cluster.yaml文件</p>
<p>&nbsp;</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 --&gt; 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 --&gt; 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>&nbsp;</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>&nbsp; &nbsp; &nbsp; &nbsp;创建集群</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 &amp; 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>&nbsp;</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>&nbsp;</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    &lt;none&gt;      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   &lt;none&gt;   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>&nbsp;</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 &amp;&amp; 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>&nbsp;</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>&nbsp;</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>&nbsp;</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>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/bigberg/p/13925677.html
頁: [1]
查看完整版本: Kubernetes Rook + Ceph