Ubuntu 22.04 部署 ceph quincy 集群和 K8S 1.24.1对接
环境
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 # 创建出一个默认的sc: csi-rbd-sc
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
成功创建和挂载