Ubuntu 22.04 部署 ceph quincy 集群和 K8S 1.24.1对接

发布时间 2024-01-04 14:40:22作者: klvchen

环境

IP 主机名
172.16.16.77 test1
172.16.16.78 test2
172.16.16.79 test3

ceph版本:quincy
主机系统:ubuntu 22.04

安装集成软件

3台机器上都要执行

vi /etc/hosts
# 最后添加
172.16.16.77 test1
172.16.16.78 test2
172.16.16.79 test3

apt-get update
apt install docker.io lvm2 -y

# ceph 对3台机器的时间有要求
apt -y install ntp

# 清空配置文件
echo '' > /etc/ntp.conf

vi /etc/ntp.conf 
# 文件中写入以下信息,同步阿里云时间服务器的时间。
server ntp.aliyun.com

# 重启NTP服务
systemctl restart ntp
systemctl enable ntp

# 设置时区
timedatectl set-timezone Asia/Shanghai

使用 cephadm 部署 ceph

mkdir -p /data/software

cd /data/software/

curl --silent --remote-name --location https://download.ceph.com/rpm-17.2.7/el9/noarch/cephadm

chmod +x cephadm
mv cephadm /usr/local/sbin/

# 创建新集群
cephadm bootstrap --mon-ip 172.16.16.77 --cluster-network 172.16.16.0/24 --allow-fqdn-hostname

# 记录 dashboard 账号信息
Ceph Dashboard is now available at:

             URL: https://test1:8443/
            User: admin
        Password: tujvkqgsb2
		
# 获取 Dashboard 密码 放在test.txt文件中
ceph dashboard set-login-credentials admin -i ./test.txt

# 查看配置
ls -al /etc/ceph/

# 配置服务器可以使用 root 登录,参考:https://www.cnblogs.com/klvchen/p/17482486.html
# 把秘钥放到其他服务器上
ssh-copy-id -f -i /etc/ceph/ceph.pub test2
ssh-copy-id -f -i /etc/ceph/ceph.pub test3

# 安装ceph工具包,包括ceph、rbd、mount
apt install ceph-common
ceph orch host add test2 172.16.16.78
ceph orch host add test3 172.16.16.79

# 检查 
ceph orch ls

# 添加osd,这里添加的节点的硬盘不能做过分区和文件系统。 容量要大于5GB。
# 根据自己实际情况操作,我这里的的盘符为 /dev/sdb
ceph orch daemon add osd test1:/dev/sdb
ceph orch daemon add osd test2:/dev/sdb
ceph orch daemon add osd test3:/dev/sdb
ceph orch device ls

# 查看健康状态
ceph -s

## 各组件介绍
ceph-mgr,ceph管理器
ceph-monitor,ceph监视器
ceph-crash,ceph崩溃数据收集模块
prometheus,prometheus监控组件
grafana,监控数据展示dashboard
alertmanager,prometheus监控告警组件
node_exporter,prometheus节点数据收集组件

ceph 为 K8S 提供存储

# 创建 pool 池
ceph osd pool create rbd 64 64

# 初始化这个pool 为 RBD (不加时默认为rbd)
rbd pool init rbd

# 获取 cluster id,每个集群不一样,我环境是 c4e7cec6-a61d-11ee-b4a0-739e81bf836a
ceph -s

# 查看 ceph 的 admin 用户认证信息
ceph auth list|grep -A 4 client.admin

# 我的 key为 key: AQCSeI5l80ObARAAxS3Pel9ysjwedPEy/4zSYQ==

K8S 安装 ceph-csi

# 注意,这里需要使用到5个国外的镜像,国内可能无法直接拉取,需要自己替换
# 我这里是拉取到自建的 harbor(devharbor.klvchen.com)上
registry.k8s.io/sig-storage/csi-node-driver-registra:v2.6.2
gcr.io/k8s-staging-sig-storage/csi-provisioner:v3.3.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-snapshotter:v6.1.0

# 添加 helm 源
helm repo add ceph-csi https://ceph.github.io/csi-charts

mkdir -p /data/yaml/ceph-csi-rbd/ceph-csi-rbd
cd /data/yaml/ceph-csi-rbd/ceph-csi-rbd

# 因为 K8S 版本是 v1.24.1,所以对应的 ceph-csi 版本为 3.8.0 
helm pull ceph-csi/ceph-csi-rbd --version 3.8.0
tar zxvf ceph-csi-rbd-3.8.0.tgz

kubectl create namespace "ceph-csi-rbd"

# 编辑配置
vi my-values.yaml 
csiConfig:
  - clusterID: "c4e7cec6-a61d-11ee-b4a0-739e81bf836a"
    monitors:
      - "172.16.16.77:6789"      # 这里是3台ceph集群的地址
      - "172.16.16.78:6789"
      - "172.16.16.79:6789"

nodeplugin:
  registrar:
    image:
      repository: devharbor.klvchen.com/oversea/csi-node-driver-registrar
      tag: v2.6.2

provisioner:
  provisioner:
    image:
      repository: devharbor.klvchen.com/oversea/csi-provisioner
      tag: v3.3.0

  attacher:
    name: attacher
    enabled: true
    image:
      repository: devharbor.klvchen.com/oversea/csi-attacher
      tag: v4.0.0

  resizer:
    name: resizer
    enabled: true
    image:
      repository: devharbor.klvchen.com/oversea/csi-resizer
      tag: v1.6.0

  snapshotter:
    image:
      repository: devharbor.klvchen.com/oversea/csi-snapshotter
      tag: v6.1.0

storageClass:
  create: true
  clusterID: c4e7cec6-a61d-11ee-b4a0-739e81bf836a         # ceph 集群 clusterID
  pool: rbd


secret:
  create: true
  userID: admin
  userKey: AQCSeI5l80ObARAAxS3Pel9ysjwedPEy/4zSYQ==      # ceph admin 的 key

# 部署
helm install -n ceph-csi-rbd  ceph-csi-rbd -f my-values.yaml ./ceph-csi-rbd

# 检查
kubectl -n ceph-csi-rbd   get pod

测试

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

成功创建和挂载