Kubernetes(k8s) 1.24 csi-ceph rbd使用手册

释放双眼,带上耳机,听听看~!
在Kubernetes中经常需要持久化的地方,很早之前都是使用nfs。但是nfs不支持rbd格式,不支持块存储级别。ceph目前是在kubernetes属于比较流行的存储引擎,支持rbd、cephfs等。本次我使用最新版kubernetes 1.24以及N版ceph进行演示
🤖 由 ChatGPT 生成的文章摘要

Ceph相关文档

Kubernetes(k8s) 1.24 csi-ceph rbd使用手册
Kubernetes(k8s) 1.24 csi-ceph rbd使用手册

Ceph-deploy 快速部署Ceph集群

本次环境使用Kubernetes 1.24,相关搭建文档见下方

Kubernetes(k8s) 1.24 csi-ceph rbd使用手册
Kubernetes(k8s) 1.24 csi-ceph rbd使用手册

Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群

Kubernetes 和Ceph集成提供了三种实现方式

  • volumes存储卷
  • PV/PVC 持久化卷/持久化卷声明ß
  • Storageclass 动态存储,动态创建pv、pvc

目前Ceph支持Kubernetes存储有两种类型,一般来说用RBD比较多

  • Cephfs
  • Ceph RBD

本文章主要介绍Ceph RBD使用场景ß

目前StorageClass 驱动器(Provisioner),可以使用的卷类型, 该字段必须指定

当我们需要使用StorageClass来动态创建pv,pvc时,需要指定一个Provisioner,k8s支持Provisioner的服务有以下几种类型

卷插件 内置制备器 配置例子
AWSElasticBlockStore AWS EBS
AzureFile Azure File
AzureDisk Azure Disk
CephFS - -
Cinder OpenStack Cinder
FC - -
FlexVolume - -
Flocker -
GCEPersistentDisk GCE PD
Glusterfs Glusterfs
iSCSI - -
Quobyte Quobyte
NFS - NFS
RBD Ceph RBD
VsphereVolume vSphere
PortworxVolume Portworx Volume
ScaleIO ScaleIO
StorageOS StorageOS
Local - Local

官方文档说明
https://kubernetes.io/zh/docs/concepts/storage/storage-classes/

环境准备

Ceph环境信息

[root@ceph-01 ~]# ceph version
ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautilus (stable)

#Ceph集群状态
[root@ceph-01 ~]# ceph -s
  cluster:
    id:     c8ae7537-8693-40df-8943-733f82049642
    health: HEALTH_OK

  services:
    mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 5h)
    mgr: ceph-02(active, since 5d), standbys: ceph-03, ceph-01
    mds: cephfs-abcdocker:1 {0=ceph-01=up:active} 2 up:standby
    osd: 4 osds: 4 up (since 5h), 4 in (since 5h)
    rgw: 2 daemons active (ceph-01, ceph-02)

  task status:

  data:
    pools:   9 pools, 384 pgs
    objects: 3.16k objects, 11 GiB
    usage:   36 GiB used, 144 GiB / 180 GiB avail
    pgs:     384 active+clean

Kubernetes版本相关信息

☁  ~  kubectl get node -o wide
NAME     STATUS   ROLES           AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
k8s-01   Ready    control-plane   11d   v1.24.0   192.168.31.10   <none>        CentOS Linux 7 (Core)   5.17.8-1.el7.elrepo.x86_64    containerd://1.6.4
k8s-02   Ready    control-plane   11d   v1.24.0   192.168.31.11   <none>        CentOS Linux 7 (Core)   5.17.8-1.el7.elrepo.x86_64    containerd://1.6.4
k8s-03   Ready    control-plane   11d   v1.24.0   192.168.31.12   <none>        CentOS Linux 7 (Core)   5.17.8-1.el7.elrepo.x86_64    containerd://1.6.4
k8s-04   Ready    <none>          11d   v1.24.0   192.168.31.13   <none>        CentOS Linux 7 (Core)   5.17.8-1.el7.elrepo.x86_64    containerd://1.6.4
k8s-05   Ready    <none>          11d   v1.24.0   192.168.31.14   <none>        CentOS Linux 7 (Core)   3.10.0-1160.62.1.el7.x86_64   containerd://1.6.4

Ceph Csi 驱动部署

CSI全称Container Storage Interface(容器存储接口)

CSI的目的是定义行业标准"容器存储接口",使存储供应商(SP)可以开发一个符合CSI标准的插件并使其能够在多个容器编排(CO)系统中工做。CO包括Cloud Foundry, Kubernetes, Mesos等

Ceph块设备rbd与Kubernetes v1.13以及更高版本通过 ceph -csi一起使用,它动态地提供 RBD 映像以支持 Kubernetes 卷并将这些 RBD 映像映射为工作节点上的块设备(可选地挂载映像中包含的文件系统)运行引用 RBD 支持的卷的pod 。

要将 Ceph 块设备与 Kubernetes v1.13 及更高版本一起使用,ceph-csi需要安装在Kubernetes 环境中

Kubernetes(k8s) 1.24 csi-ceph rbd使用手册

通过kubernetes sidecar部署provisioner, attacher, resizer, driver-registrar 和 snapshotter 组件,以支持CSI功能。

Ceph CSI插件实现了支持CSI的Container Orchestrator (CO)和Ceph集群之间的接口。它允许动态供应Ceph卷并将它们附加到工作负载

ceph-csi默认使用RBD内核模块,可能不支持所有 Ceph CRUSH 可调参数或RBD 映像特性。

安装ceph-csi驱动

#默认情况下,Ceph 块设备使用rbd池。为 Kubernetes 卷存储创建一个池。确保您的 Ceph 集群正在运行,然后创建池。

[root@ceph-01 ~]# ceph osd pool create kubernetes 128 128
pool 'kubernetes' created

新创建的池必须在使用前进行初始化。使用该rbd工具初始化池:

[root@ceph-01 ~]# rbd pool init kubernetes

配置CEPH-CSI

设置 CEPH 客户端身份验证

为 Kubernetes 和 ceph -csi创建一个新用户,当然也可以直接使用client.admin用户

[root@ceph-01 ~]# ceph auth get-or-create client.kubernetes mon 'profile rbd' osd 'profile rbd pool=kubernetes' mgr 'profile rbd pool=kubernetes'
[client.kubernetes]
    key = AQBYpZRiY/JmHRAAD6/jr3cE9E0B/7QjLGi8/w==

接下来我们执行 ceph auth list就可以看到

Kubernetes(k8s) 1.24 csi-ceph rbd使用手册

生成CEPH-CSI CONFIGMAP

ceph -csi需要一个存储在 Kubernetes 中的ConfigMap对象来定义Ceph集群的 Ceph mon地址

[root@ceph-01 ~]# ceph mon dump
epoch 3
fsid c8ae7537-8693-40df-8943-733f82049642           #集群ID,后面需要使用
last_changed 2022-01-10 22:52:57.150281
created 2022-01-10 22:45:09.178972
min_mon_release 14 (nautilus)
0: [v2:192.168.31.20:3300/0,v1:192.168.31.20:6789/0] mon.ceph-01   #mon节点
1: [v2:192.168.31.21:3300/0,v1:192.168.31.21:6789/0] mon.ceph-02
2: [v2:192.168.31.80:3300/0,v1:192.168.31.80:6789/0] mon.ceph-03
dumped monmap epoch 3
...

#当然ceph -s也可以看到
[root@ceph-01 ~]# ceph -s |grep mon
    mon: 3 daemons, quorum ceph-01,ceph-02,ceph-03 (age 16h)
    rgw: 2 daemons active (ceph-01, ceph-02)

修改ceph mon节点ip地址,修改集群clusterID。

[root@k8s-01 ~]# mkdir /root/ceph

#将cpeh configmap存储在/root/ceph目录中
#clusterID需要和上面获取到的id保持一致,并且需要修改mon地址,多个地址后面需要使用逗号分隔。

cat <<EOF > /root/ceph/csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    [
      {
        "clusterID": "c8ae7537-8693-40df-8943-733f82049642",
        "monitors": [
          "192.168.31.21:6789",
          "192.168.31.22:6789",
          "192.168.31.23:6789"
        ]
      }
    ]
metadata:
  name: ceph-csi-config
EOF

在Kubernetes中创建

[root@k8s-01 ceph]# cd /root/ceph
[root@k8s-01 ceph]# kubectl apply -f csi-config-map.yaml
configmap/ceph-csi-config created

在Kubernetes中就可以看到已经创建的configmap

Kubernetes(k8s) 1.24 csi-ceph rbd使用手册

最新版本的ceph-csi还需要一个额外的ConfigMap对象来定义密钥管理服务 (KMS) 提供者的详细信息。如果未设置 KMS,请将空配置放入csi-kms-config-map.yaml

必须填写,后面可以不使用,但是要有这个configmap,下面的pod会调用

cat <<EOF > /root/ceph/csi-kms-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  config.json: |-
    {}
metadata:
  name: ceph-csi-encryption-kms-config
EOF

#创建空配置文件即可
[root@k8s-01 ceph]# kubectl apply -f csi-kms-config-map.yaml

ceph-csi还需要创建一个configmap,用于读取ceph节点中的ceph.conf中的配置文件,csi容器会读取这个配置文件

cat <<EOF > /root/ceph/ceph-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  ceph.conf: |
    [global]
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
  # keyring is a required key and its value should be empty
  keyring: |
metadata:
  name: ceph-config
EOF

ceph-csi还需要另一个ConfigMap对象来定义 Ceph 配置以添加到 CSI 容器内的 ceph.conf 文件中

 cat <<EOF > /root/ceph/ceph-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
  ceph.conf: |
    [global]
    auth_cluster_required = cephx
    auth_service_required = cephx
    auth_client_required = cephx
  # keyring is a required key and its value should be empty
  keyring: |
metadata:
  name: ceph-config
EOF

[root@k8s-01 ~]# kubectl  apply -f ceph-config-map.yaml

#请注意,所有的yaml文件都放在/root/ceph目录中

ceph -csi需要 cephx 凭据才能与 Ceph 集群通信。使用新创建的 Kubernetes 用户 id 和 cephx 密钥生成类似于以下示例的csi-rbd-secret.yaml文件

ceph auth list 获取ceph用户,找到admin用户,复制后面的Key

使用kubernetes用户会存在pvc创建失败的问题

 cat <<EOF > /root/ceph/csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: default
stringData:
  userID: admin
  userKey: JmHRAAD6/jr3cE9E0B/7QjLGi8/w==
EOF

#创建secret
[root@k8s-01 ~]# kubectl apply -f csi-rbd-secret.yaml

到目前为止,ceph-csi的相关配置文件已经创建完毕

[root@k8s-01 ~]# kubectl get secret
NAME             TYPE     DATA   AGE
csi-rbd-secret   Opaque   2      79s
[root@k8s-01 ~]# kubectl get cm
NAME                             DATA   AGE
ceph-config                      2      6m32s
ceph-csi-config                  1      28m
ceph-csi-encryption-kms-config   1      20m

CEPH-CSI RBD 创建

ceph中不推荐在ceph rbd模式下使用RWX访问控制,如果应用层没有访问锁机制,可能会造成数据损坏。所以rbd模式我们只可以使用一个节点

部署CEPH-CSI RBAC

ceph-csi需要创建ServiceAccount和RBAC用于访问Kubernetes集群内部信息

#官方下载地址
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml

#abcdocker提供下载地址
kubectl apply -f https://d.frps.cn/file/tools/ceph-csi/csi-provisioner-rbac.yaml
kubectl apply -f https://d.frps.cn/file/tools/ceph-csi/csi-nodeplugin-rbac.yaml

部署ceph-csi provisioner

默认情况下,provisioner和节点插件YAML将拉取ceph -csi容器的开发版本 (quay.io/cephcsi/cephcsi:canary)

这里需要我们提前导入镜像

#在k8s-01上下载,scp到其他节点
wget -P /tmp/ https://d.frps.cn/file/tools/ceph-csi/k8s_1.24_ceph-csi.tar
#在k8s-01导入镜像
ctr -n k8s.io i import  k8s_1.24_ceph-csi.tar

#在其他节点导入镜像,根据需求修改for循环即可
for i in  k8s-02 k8s-03 k8s-04 k8s-05;
do
    scp /tmp/k8s_1.24_ceph-csi.tar root@$i:/tmp/
    ssh root@$i ctr -n k8s.io i import  /tmp/k8s_1.24_ceph-csi.tar
done

导入完镜像就可以安装deployment

#官方下载地址
cd /root/ceph
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml

#abcdocker提供下载地址
wget https://d.frps.cn/file/tools/ceph-csi/csi-rbdplugin.yaml
wget https://d.frps.cn/file/tools/ceph-csi/csi-rbdplugin-provisioner.yaml

创建provisioner

[root@k8s-01 ~]# cd /root/ceph
[root@k8s-01 ceph]# kubectl apply -f csi-rbdplugin.yaml
[root@k8s-01 ceph]# kubectl apply -f csi-rbdplugin-provisioner.yaml

查看pod和deployment状态

Kubernetes(k8s) 1.24 csi-ceph rbd使用手册

Ceph Storageclass 动态存储

ceph-csi定义好之后,我们就可以定义storageClass

  • 首先要获取集群id ceph -s|grep id|awk -F "[ ]+" '{print $3}'

需要根据实际情况修改集群id

cat <<EOF > /root/ceph/csi-rbd-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc     #storageclass名称
provisioner: rbd.csi.ceph.com   #驱动器
parameters:
   clusterID: c8ae7537-8693-40df-8943-733f82049642    #ceph集群id
   pool: kubernetes       #pool空间
   imageFeatures: layering   #rbd特性
   csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
   csi.storage.k8s.io/provisioner-secret-namespace: default
   csi.storage.k8s.io/controller-expand-secret-name: csi-rbd-secret
   csi.storage.k8s.io/controller-expand-secret-namespace: default
   csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
   csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete   #pvc回收机制
allowVolumeExpansion: true   #对扩展卷进行扩展
mountOptions:           #StorageClass 动态创建的 PersistentVolume 将使用类中 mountOptions 字段指定的挂载选项
   - discard
EOF
kubectl apply -f /root/ceph/csi-rbd-sc.yaml

layering特性使得克隆image的时候,父子image之间采用COW,他们之间的对象文件存在依赖关系,flatten操作的目的是解除父子image的依赖关系,但是子image的快照并没有解除依赖,deep-flatten特性使得快照的依赖也解除。

ceph支持 layering,striping exclusive lock, object map,fast diff ,deep-flatten 等新的new features

类型 特性
layering image的克隆操作。可以对image创建快照并保护,然后从快照克隆出新的image出来,父子image之间采用COW技术,共享对象数据。
striping v2 条带化对象数据,类似raid 0,可改善顺序读写场景较多情况下的性能。
exclusive lock 保护image数据一致性,对image做修改时,需要持有此锁。这个可以看做是一个分布式锁,在开启的时候,确保只有一个客户端在访问image,否则锁的竞争会导致io急剧下降。 主要应用场景是qemu live-migration。
object map 此特性依赖于exclusive lock。因为image的对象分配是thin-provisioning,此特性开启的时候,会记录image所有对象的一个位图,用以标记对象是否真的存在,在一些场景下可以加速io。
fast diff 此特性依赖于object map和exlcusive lock。快速比较image的snapshot之间的差异。
deep-flatten layering特性使得克隆image的时候,父子image之间采用COW,他们之间的对象文件存在依赖关系,flatten操作的目的是解除父子image的依赖关系,但是子image的快照并没有解除依赖,deep-flatten特性使得快照的依赖也解除。
journaling 依赖于exclusive lock。将image的所有修改操作进行日志化,并且复制到另外一个集群(mirror),可以做到块存储的异地灾备。这个特性在部署的时候需要新部署一个daemon进程,目前还在试验阶段,不过这个特性很重要,可以做跨集群/机房容灾。
Exclusive Lock 从上面可以看出,很多特性都依赖于exclusive lock,重点介绍一下。
exclusive lock 是分布式锁,实现的时候默认是客户端在第一次写的时候获取锁,并且在收到其他客户端的锁请求时自动释放锁。这个特性在jewel默认开启后,本身没什么问题, 客户端可以自动获取和释放锁,在客户端crash后也能够正确处理。

查看StorageClass状态

[root@k8s-01 ~]# kubectl get sc
NAME         PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
csi-rbd-sc   rbd.csi.ceph.com   Delete          Immediate           true                   3m26s

创建pvc测试

cat <<EOF > /root/ceph/raw-block-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: raw-block-pvc     #pvc名称
spec:
  accessModes:
    - ReadWriteOnce     #访问模式
  volumeMode: Block     #数据卷类型
  resources:
    requests:
      storage: 1Gi      #存储空间
  storageClassName: csi-rbd-sc   #后端storageclass名称
EOF
kubectl apply -f /root/ceph/raw-block-pvc.yaml

查看pvc创建情况

当我们创建pvc后,pv会自动帮我们创建好

[root@k8s-01 ~]# kubectl get pvc
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
raw-block-pvc   Bound    pvc-20bc551a-2e28-44f1-94f4-7025a0e01aa5   1Gi        RWO            csi-rbd-sc     82s
[root@k8s-01 ~]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                   STORAGECLASS   REASON   AGE
pvc-20bc551a-2e28-44f1-94f4-7025a0e01aa5   1Gi        RWO            Delete           Bound    default/raw-block-pvc   csi-rbd-sc              84s

我ceph中的pool里,就可以看到新创建的rbd

[root@ceph-01 ~]# rbd ls kubernetes
csi-vol-88e24aae-e279-11ec-867c-562ca7dbc101
[root@ceph-01 ~]# ceph df

RAW STORAGE:
    CLASS     SIZE        AVAIL       USED       RAW USED     %RAW USED
    hdd       180 GiB     144 GiB     32 GiB       36 GiB         20.06
    TOTAL     180 GiB     144 GiB     32 GiB       36 GiB         20.06

POOLS:
    POOL                          ID     PGS     STORED      OBJECTS     USED        %USED     MAX AVAIL
    abcdocker                      1      64     618 MiB         350     1.8 GiB      1.39        43 GiB
    .rgw.root                      2      32     1.2 KiB           4     768 KiB         0        43 GiB
    default.rgw.control            3      32         0 B           8         0 B         0        43 GiB
    default.rgw.meta               4      32     1.7 KiB           7     1.1 MiB         0        43 GiB
    default.rgw.log                5      32         0 B         207         0 B         0        43 GiB
    default.rgw.buckets.index      6      32         0 B           2         0 B         0        43 GiB
    default.rgw.buckets.data       7      32         0 B           0         0 B         0        43 GiB
    cephfs_data                    8      64      10 GiB       2.56k      30 GiB     18.87        43 GiB
    cephfs_metadata                9      64     671 KiB          23     3.6 MiB         0        43 GiB
    kubernetes                    11     128        36 B           8     384 KiB         0        43 GiB

我们可以详细的看一下ceph rbd中的镜像使用情况

[root@ceph-01 ~]# rbd info kubernetes/csi-vol-88e24aae-e279-11ec-867c-562ca7dbc101
rbd image 'csi-vol-88e24aae-e279-11ec-867c-562ca7dbc101':
    size 1 GiB in 256 objects
    order 22 (4 MiB objects)
    snapshot_count: 0
    id: 4565b1a1dbd46
    block_name_prefix: rbd_data.4565b1a1dbd46
    format: 2
    features: layering
    op_features:
    flags:
    create_timestamp: Thu Jun  2 21:40:15 2022
    access_timestamp: Thu Jun  2 21:40:15 2022
    modify_timestamp: Thu Jun  2 21:40:15 2022

在ceph中不推荐在ceph rbd模式下使用RWX访问控制,如果应用层没有访问锁机制,可能会造成数据损坏。所以rbd模式我们只可以使用一个节点

首先创建一个pvc

[root@k8s-01 nginx]# cat pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc-abcdocker
  labels:
    app: abcdocker-test
spec:
  storageClassName: csi-rbd-sc   #这里的storageclass是我们之前申请的
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

创建nginx配置文件

[root@k8s-01 nginx]# cat nginx-pvc.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-frontend-abcdocker
  name: nginx-frontend-abcdocker
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: nginx-frontend-abcdocker
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: nginx-frontend-abcdocker
    spec:
      containers:
      - image: nginx:latest
        imagePullPolicy: IfNotPresent
        name: nginx-frontend-abcdocker
        ports:
        - containerPort: 80
          protocol: TCP
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: abcdocker-volume
      restartPolicy: Always
      volumes:
      - name: abcdocker-volume
        persistentVolumeClaim:
          claimName: nginx-pvc-abcdocker
          readOnly: false
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-frontend-abcdocker
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-frontend-abcdocker
  sessionAffinity: None
  type: NodePort

kubectl apply -f .
当我们创建好pvc和deployment的时候,我们就可以访问看一下

[root@k8s-01 ~]# kubectl exec -it nginx-frontend-abcdocker-6d797446f4-djjgb bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx-frontend-abcdocker-6d797446f4-djjgb:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          79G   11G   69G  14% /
tmpfs            64M     0   64M   0% /dev
tmpfs           3.9G     0  3.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda3        79G   11G   69G  14% /etc/hosts
/dev/rbd0       974M   28K  958M   1% /usr/share/nginx/html
tmpfs           7.7G   12K  7.7G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           3.9G     0  3.9G   0% /proc/acpi
tmpfs           3.9G     0  3.9G   0% /proc/scsi
tmpfs           3.9G     0  3.9G   0% /sys/firmware

#我们可以看到已经挂载好的/dev/rbd0目录

容器events没有报错以及异常

StatefulSet使用StorageClass生产实践

生产环境中,StatefulSet一般直接在Kubernetes使用volumeClaimTemplates来申请存储空间,用而减少pvc的创建步骤

cat >/root/ceph/nginx-st.yaml <<EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  replicas: 3
  revisionHistoryLimit: 10
  serviceName: nginx
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:  #name没写,会默认生成的
      labels:  
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        volumeMounts:
        - name: web #填vcp名字
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: web
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: csi-rbd-sc
      volumeMode: Filesystem
      resources:
        requests:
          storage: 512M
EOF

#创建持久化存储
[root@k8s-01 nginx]# kubectl apply -f /root/ceph/nginx-st.yaml

默认会创建3个pod,为有序

[root@k8s-01 nginx]# kubectl get pod|grep web
web-0                                        1/1     Running   0               101m
web-1                                        1/1     Running   0               101m
web-2                                        1/1     Running   0               100m

并且会为每一个pod创建一个rbd文件

[root@k8s-01 nginx]# kubectl get pvc
NAME                  STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nginx-pvc-abcdocker   Bound    pvc-5e314f99-c0c4-45b7-9c08-3a3a39ea9bb3   1Gi        RWO            csi-rbd-sc     135m
raw-block-pvc         Bound    pvc-be023d3f-af00-4207-b804-d531ffcaa421   1Gi        RWO            csi-rbd-sc     151m
web-web-0             Bound    pvc-332a937f-f97d-4270-9115-081cb3d60a44   489Mi      RWO            csi-rbd-sc     102m
web-web-1             Bound    pvc-ea192941-fc9b-4e3e-8142-b531e7ead8da   489Mi      RWO            csi-rbd-sc     102m
web-web-2             Bound    pvc-09ad9cae-9207-4e68-8c58-5cfe38c40dc3   489Mi      RWO            csi-rbd-sc     101m
[root@k8s-01 nginx]# kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                         STORAGECLASS   REASON   AGE
pvc-09ad9cae-9207-4e68-8c58-5cfe38c40dc3   489Mi      RWO            Delete           Bound    default/web-web-2             csi-rbd-sc              101m
pvc-332a937f-f97d-4270-9115-081cb3d60a44   489Mi      RWO            Delete           Bound    default/web-web-0             csi-rbd-sc              102m
pvc-5e314f99-c0c4-45b7-9c08-3a3a39ea9bb3   1Gi        RWO            Delete           Bound    default/nginx-pvc-abcdocker   csi-rbd-sc              135m
pvc-be023d3f-af00-4207-b804-d531ffcaa421   1Gi        RWO            Delete           Bound    default/raw-block-pvc         csi-rbd-sc              151m
pvc-ea192941-fc9b-4e3e-8142-b531e7ead8da   489Mi      RWO            Delete           Bound    default/web-web-1             csi-rbd-sc              102m

查看容器挂载情况

[root@k8s-01 nginx]# kubectl exec -it web-1 bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@web-1:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          50G   20G   31G  40% /
tmpfs            64M     0   64M   0% /dev
tmpfs           1.9G     0  1.9G   0% /sys/fs/cgroup
shm              64M     0   64M   0% /dev/shm
/dev/sda3        50G   20G   31G  40% /etc/hosts
/dev/rbd0       466M  2.3M  460M   1% /usr/share/nginx/html             #默认挂载点
tmpfs           3.7G   12K  3.7G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs           1.9G     0  1.9G   0% /proc/acpi
tmpfs           1.9G     0  1.9G   0% /proc/scsi
tmpfs           1.9G     0  1.9G   0% /sys/firmware

并且我们查看rbd文件,也可以看到对应的镜像

StatefulSet常用于Redis、Mysql、ES做集群的时候,数据相互隔离,互相主备的关系

给TA打赏
共{{data.count}}人
人已打赏
Kubernetes

Kubeadm搭建高可用(k8s)Kubernetes v1.24.0集群

2022-5-19 4:00:15

Kubernetes

Kubeadm搭建高可用(k8s)Kubernetes v1.23.5集群

2022-6-19 18:41:33

5 条回复 A文章作者 M管理员
  1. sunlight

    感谢发布教程, k8s k3s学起来好难。看了您之前traefik v1.0 的文章,没部署成功。
    请问大佬能否出一期 k3s下安装 traefik v2.0 的教程呢?
    1、想要通过 traefik 自动生成并续期泛域名证书
    2、traefik 反向代理 局域网 内(非本服务器)其他服务(比如traefik所在服务器:192.168.1.5,反代局域网内其他服务器服务:192.168.1.6)
    能否出个教程指导下,感谢。

    • 新闻联播老司机

      1.这个组件自签的证书没有ca认证,会提示异常。 生产环境中都是采用购买证书的方式,这个我可以改一版
      2.用了traefik就没要必要在反代的,反向代理相当于把traefik又给改成4层协议了。 traefik可以实现nginx的功能。可以直接用traefik代理后端service,k3s和k8s底层原理一致。所以也可以直接使用,这两天我更新一下traefik 最新的

    • sunlight

      感谢。
      本来docker上已搞定了,但是想做到更稳的 k3s 上,相比之下docker 就显得十分简单。
      1、自签的证书自动免费续期,域名是在 cloudflare 解析的,docker版用了一段时间还行。
      2、主要是把 traefik 作为单独的反代服务器独立了,所以其他服务就都在局域网上,就是如您所说想直接用traefik代理局域网内后端service

  2. 树清仔

    大佬,请问下,我按你的部署,但是测试 pvc 一直是 Pending
    检查 kubectl describe pvc ceph-raw-test

    log如下

    Events:
    Type Reason Age From Message
    —- —— —- —- ——-
    Normal ExternalProvisioning 3s (x13 over 2m57s) persistentvolume-controller waiting for a volume to be created, either by external provisioner “rbd.csi.ceph.com” or manually created by system administrator

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索