K8S v1.24.1 集成 ceph
环境背景
主机名 | IP | 角色 | 版本 | 容器运行时 |
---|---|---|---|---|
k8s-master-01 | 172.16.16.180 | Master1 | v1.24.1 | containerd 1.6.8 |
k8s-master-02 | 172.16.16.181 | Master2 | v1.24.1 | containerd 1.6.8 |
k8s-node-01 | 172.16.16.182 | node1 | v1.24.1 | containerd 1.6.8 |
主机名 | IP | 版本 |
---|---|---|
ceph1 | 172.16.16.190 | 14.2.22-0 |
ceph2 | 172.16.16.191 | 14.2.22-0 |
ceph3 | 172.16.16.192 | 14.2.22-0 |
获取 ceph 需要用到的信息
在 ceph 管理节点 ceph1 上操作
# 创建 pool 池
ceph osd pool create rbd 64 64
# 初始化这个pool 为 RBD (不加时默认为rbd)
rbd pool init rbd
# 获取 cluster id,每个集群不一样,我的是 eda101d5-385e-4160-bac6-fa3aaffc73d8
ceph -s
# 查看 ceph 的 admin 用户认证信息
ceph auth list|grep -A 4 client.admin
# 我的 key为 key: AQD/9Fljn5t/AhAA/8WoMpdDKoqM1WVbJ3KEXA==
在K8S集群中创建各种依赖
在 k8s-master-01 上操作
mkdir -p /data/yaml/default/ceph-csi
cd /data/yaml/default/ceph-csi
# 生成 ceph-csi ConfigMap
cat <<EOF > csi-config-map.yaml
---
apiVersion: v1
kind: ConfigMap
data:
config.json: |-
[
{
"clusterID": "eda101d5-385e-4160-bac6-fa3aaffc73d8", # ceph 集群的 clusterID
"monitors": [
"172.16.16.190:6789",
"172.16.16.191:6789",
"172.16.16.192:6789"
]
}
]
metadata:
name: ceph-csi-config
EOF
kubectl apply -f csi-config-map.yaml
# 新版本的 ceph-csi 需要 Key Management Service (KMS)
wget https://raw.githubusercontent.com/ceph/ceph-csi/devel/examples/kms/vault/kms-config.yaml
kubectl apply -f kms-config.yaml
# 新版本的 ceph-csi 还需要这个配置
cat <<EOF > 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
kubectl apply -f ceph-config-map.yaml
# 生成 ceph-csi 用来通信 ceph 集群的秘钥
cat << EOF > csi-rbd-secret.yaml
---
apiVersion: v1
kind: Secret
metadata:
name: csi-rbd-secret
namespace: default
stringData:
userID: admin
userKey: AQD/9Fljn5t/AhAA/8WoMpdDKoqM1WVbJ3KEXA== # ceph 集群 admin 的 key
kubectl apply -f csi-rbd-secret.yaml
# 配置 ceph-csi 插件需要的权限
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-provisioner-rbac.yaml
kubectl apply -f csi-provisioner-rbac.yaml
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-nodeplugin-rbac.yaml
kubectl apply -f csi-nodeplugin-rbac.yaml
# 安装 ceph-csi 插件
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin-provisioner.yaml
kubectl apply -f csi-rbdplugin-provisioner.yaml
wget https://raw.githubusercontent.com/ceph/ceph-csi/master/deploy/rbd/kubernetes/csi-rbdplugin.yaml
kubectl apply -f csi-rbdplugin.yaml
# 创建存储类
# Kubernetes存储类定义存储类。可以创建多个 StorageClass 对象以映射到不同的服务
# 确保下面的 clusterID 为 ceph cluster id
cat <<EOF > csi-rbd-sc.yaml
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
clusterID: eda101d5-385e-4160-bac6-fa3aaffc73d8 # ceph 的 clusterID
pool: rbd # 上面创建的 ceph 的 pool
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: default
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: default
imageFormat: "2"
imageFeatures: "layering"
reclaimPolicy: Delete
mountOptions:
- discard
kubectl apply -f csi-rbd-sc.yaml
# 检查 csi-rbdplugin 和 csi-rbdplugin-provisioner 是否创建成功
kubectl get pod
遇到的问题
# 一: K8S 主节点有污点,去除污点
kubectl taint nodes --all node-role.kubernetes.io/master-
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
# 二:发现下面 5 个镜像无法获取
registry.k8s.io/sig-storage/csi-provisioner:v3.3.0
registry.k8s.io/sig-storage/csi-snapshotter:v6.1.0
registry.k8s.io/sig-storage/csi-attacher:v4.0.0
registry.k8s.io/sig-storage/csi-resizer:v1.6.0
registry.k8s.io/sig-storage/csi-node-driver-registrar:v2.5.1
# 解决办法,想办法在外网下载,然后在3个节点手动导入镜像
# 注意,通过 ctr 命令导入镜像,需要指定命名空间 k8s.io
ctr -n=k8s.io image import csi-attacher_v4.0.0
ctr -n=k8s.io image import csi-node-driver-registrar_v2.5.1
ctr -n=k8s.io image import csi-provisioner_v3.3.0
ctr -n=k8s.io image import csi-resizer_v1.6.0
ctr -n=k8s.io image import csi-snapshotter_v6.1.0
# 这里把这5个镜像放到百度云盘,需要的自行下载
# 链接: https://pan.baidu.com/s/1L9ymUU1BxVm2mJCqV3OW5g 提取码: wypq
成功运行
测试
kubectl create ns klvchen
mkdir -p /data/yaml/klvchen/nginx
cd /data/yaml/klvchen/nginx
cat <<EOF > sts.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
namespace: klvchen
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /var/lib/www/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "csi-rbd-sc"
resources:
requests:
storage: 1Gi
EOF
kubectl apply -f sts.yaml
成功创建和挂载