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

成功创建和挂载

官方文档

https://docs.ceph.com/en/quincy/rbd/rbd-kubernetes/

posted @ 2022-10-27 17:43  klvchen  阅读(364)  评论(0编辑  收藏  举报