Ceph相关文档
本次环境使用Kubernetes 1.24,相关搭建文档见下方
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 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
就可以看到
生成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
最新版本的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状态
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做集群的时候,数据相互隔离,互相主备的关系
感谢发布教程, 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 最新的
感谢。
本来docker上已搞定了,但是想做到更稳的 k3s 上,相比之下docker 就显得十分简单。
1、自签的证书自动免费续期,域名是在 cloudflare 解析的,docker版用了一段时间还行。
2、主要是把 traefik 作为单独的反代服务器独立了,所以其他服务就都在局域网上,就是如您所说想直接用traefik代理局域网内后端service
大佬,请问下,我按你的部署,但是测试 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
kubectl describe pvc ceph-raw-test