关闭selinux每台执行

setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

关闭防火墙每台执行

systemctl stop firewalld && systemctl disable firewalld

修改主机名每台执行

hostnamectl set-hostname ceph01
hostnamectl set-hostname ceph02
hostnamectl set-hostname ceph02

cat >>/etc/hosts <<EOF
192.168.2.230 ceph01
192.168.2.231 ceph02
192.168.2.232 ceph03
EOF

配置时间同步每台执行

yum install ntpdate -y
ntpdate ntp.aliyun.com
echo '*/3 * * * * /usr/bin/ntpdate ntp.aliyun.com' >> /var/spool/cron/root

添加ceph yum源,每台执行

cat >/etc/yum.repos.d/ceph.repo <<EOF
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64
enable=1
gpgcheck=0
priority=1

[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
enable=1
gpgcheck=0
priority=1

[ceph-source]
name=ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enable=1
gpgcheck=0
priority=1
EOF

yum install epel-release -y
yum clean all
yum makecache fast

设置ssh免密登陆,一台上执行,这里ceph01

ssh-keygen
for i in 192.168.2.{230..232};do echo ">>> $i";ssh-copy-id $i;done
for i in ceph{01..03};do echo ">>> $i";ssh-copy-id $i;done

安装ceph-deploy python-setuptools 一台上执行,这里ceph01

yum install ceph-deploy python-setuptools -y

查看ceph-deploy版本 一台上执行,这里ceph01

ceph-deploy --version

生成ceph配置文件 一台上执行,这里ceph01

mkdir /etc/ceph && cd /etc/ceph
ceph-deploy new ceph01

安装ceph ceph-radosgw 每台执行

yum install -y ceph ceph-radosgw 或者使用 ceph-deploy install ceph01 ceph02 ceph03

查看ceph版本

ceph -v

写入网段到ceph配置文件 一台上执行,这里ceph01

echo public network = 192.168.2.0/24 >> /etc/ceph/ceph.conf

创建监控节点,并将配置文件同步到所有节点 一台上执行,这里ceph01

cd /etc/ceph
ceph-deploy mon create-initial
ps -ef |grep ceph-mon
ceph health
ceph-deploy admin ceph01 ceph02 ceph03
ceph -s

禁用不安全模式:mon is allowing insecure global_id reclaim 一台上执行,这里ceph01

ceph config set mon auth_allow_insecure_global_id_reclaim false
ceph health
ceph -s

为了防止mon单节点故障,添加多个mon节点(奇数个) 一台上执行,这里ceph01

ceph-deploy mon add ceph02
ceph-deploy mon add ceph03
ceph -s

查看mon各种状态,一台上执行,这里ceph01

查看mon状态信息
ceph mon stat
查看mon的选举状态
ceph quorum_status
查看mon映射信息
ceph mon dump
查看mon详细状态
ceph daemon mon.ceph01 mon_status

创建mgr管理节点,一台上执行,这里ceph01

ceph-deploy mgr create ceph01
ceph -s

添加多个mgr实现HA,一台上执行,这里ceph01

ceph-deploy mgr create ceph02
ceph-deploy mgr create ceph03
ceph -s

创建osd存储盘,一台上执行,这里ceph01

ceph-deploy disk list ceph01
ceph-deploy disk list ceph02
ceph-deploy disk list ceph03

ceph-deploy disk zap ceph01 /dev/sdb
ceph-deploy disk zap ceph02 /dev/sdb
ceph-deploy disk zap ceph03 /dev/sdb

ceph-deploy osd create --data /dev/sdb ceph01
ceph-deploy osd create --data /dev/sdb ceph02
ceph-deploy osd create --data /dev/sdb ceph03

ceph -s

查看ceph osd 各种状态,一台上执行,这里ceph01

查看osd运行状态
ceph osd stat
查看osd映射信息
ceph osd dump
查看数据延迟
ceph osd perf
详细列出集群每块盘的使用情况
ceph osd df
查看osd目录树
ceph osd tree
查看最大osd的个数
ceph osd  getmaxosd

调整时间偏差阈值(可选),一台上执行,这里ceph01

cat >> /etc/ceph/ceph.conf <<EOF
mon clock drift allowed = 2
mon clock drift warn backoff = 30
EOF
再把修改的配置同步到所有节点(前面通过配置,这个命令不同,同步覆盖过去)
ceph-deploy --overwrite-conf admin ceph01 ceph02 ceph03
重启ceph-mon.target服务 每台执行
systemctl restart ceph-mon.target

在ceph.conf上添加删除pool的配置参数,一台上执行,这里ceph01

echo mon_allow_pool_delete = true >> /etc/ceph/ceph.conf
echo mon_max_pg_per_osd = 2000 >> /etc/ceph/ceph.conf
同步ceph.conf到所有mon节点
ceph-deploy --overwrite-conf admin ceph01 ceph02 ceph03
重启所有的mon服务,每台执行
systemctl restart ceph-mon.target
检查mon状态,每台执行
systemctl status ceph-mon.target

安装ceph dashboard

在每个mgr节点安装
yum install ceph-mgr-dashboard -y
ceph mgr versions
ps -ef |grep ceph-mgr
ceph -s 
开启mgr功能、开启dashboard模块,一台上执行,这里ceph01
ceph mgr module enable dashboard
创建自签名证书,一台上执行,这里ceph01
ceph dashboard create-self-signed-cert
创建新的访问控制角色,创建具有管理员角色的用户
设置用户跟密码,一台上执行,这里ceph01
echo admin123 >/root/ceph-password.txt
创建用户admin,密码指定ceph-password.txt文件,用administrator角色
ceph dashboard ac-user-create admin -i /root/ceph-password.txt administrator
显示用户信息
ceph dashboard ac-user-show
显示角色信息
ceph dashboard ac-role-show
删除用户
ceph dashboard ac-user-delete admin
查看默认的ceph-mgr服务
ceph mgr services
用户:admin  密码:admin123

与k8s进行对接

使用ceph官方的ceph-csi来做持久化,ceph-csi包含RBD和cephfs两种方式

cephfs方式

在ceph01部署节点上同步配置文件,并创建至少一个mds服务,使用cephfs必须保证至少有一个节点提供mds服务
1、同步配置文件
ceph-deploy --overwrite-conf admin  ceph01 ceph02 ceph03
2、这里做三个mds
ceph-deploy mds create ceph01 ceph02 ceph03
3、查看mds
ceph -s
4、创建存储池、文件系统
1)创建cephfs存储池:fs_metadata、fs_data
2)创建cephfs文件系统:命名为cephfs
一个ceph文件系统需要至少两个RADOS存储池,一个用于数据,一个用于元数据
ceph osd pool create fs_data 128 128
ceph osd pool create fs_metadata 128 128
ceph fs new cephfs fs_metadata fs_data
3)查看
ceph fs ls
5、获取集群信息和查看admin用户key(秘钥)
ceph mon dump
ceph auth get client.admin
注意这里不需要加密
6、所有k8s集群节点配置ceph源
cat >/etc/yum.repos.d/ceph.repo <<EOF
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64
enable=1
gpgcheck=0
priority=1

[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
enable=1
gpgcheck=0
priority=1

[ceph-source]
name=ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enable=1
gpgcheck=0
priority=1
EOF

yum clean all
yum makecache fast
7、所有k8s节点安装ceph-common
yum install ceph-common -y
8、同步配置文件,这里k8s只有一个master节点,如果有node几点也需要操作,在ceph01上操作
ssh-copy-id k8smaster1
ceph-deploy --overwrite-conf admin ceph01 ceph02 ceph03 k8smaster1
9、部署cephfs csi,k8smaster上执行
https://github.com/ceph/ceph-csi.git
拉取代码,阿里云中已存在3.6.2,直接下载即可
git clone https://github.com/ceph/ceph-csi.git
cd ceph-csi/deploy/cephfs/kubernetes
创建文件夹
mkdir -p /root/my-ceph-csi/deploy/{cephfs,rbd}
mkdir -p /root/my-ceph-csi/examples/{cephfs,rbd}
cd /opt/kubernetes/ceph-csi-3.6.2/deploy/cephfs/kubernetes
cp ./* /root/my-ceph-csi/deploy/cephfs
10、修改csi-config-map.yaml文件,一下是实例,部署时需要删除注释,k8smaster上执行
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: "ceph-csi-config"
data:
  config.json: |-
    [
      {
      "clusterID": "96f54e84-dbfc-4650-8896-8f3b5f524bbf",#ceph集群的id,此内容可以使用ceph mon dump来查看,clusterID对应fsid
      "monitors": ["192.168.2.230:6789,192.168.2.231:6789,192.168.2.232:6789"]
      }
    ]

11、导入镜像,所有k8s集群node节点,镜像放到阿里云盘,node上执行
docker load <ceph_image.tar.gz
12、安装cephfs
kubectl create -f /root/ceph-csi-3.6.2/examples/ceph-conf.yaml
kubectl create -f /root/ceph-csi-3.6.2/examples/kms/vault/kms-config.yaml
kubectl create -f csidriver.yaml
kubectl create -f csi-provisioner-rbac.yaml
kubectl create -f csi-nodeplugin-rbac.yaml
kubectl create -f csi-config-map.yaml
kubectl create -f csi-cephfsplugin-provisioner.yaml
kubectl create -f csi-cephfsplugin.yaml
13、k8s上创建连接ceph集群的秘钥(创建secret.yaml),k8smaster上执行
cd /opt/kubernetes/ceph-csi-3.8.1/examples/cephfs(官方secret.yaml文件模板位置)
cat >/root/my-ceph-csi/examples/cephfs/secret.yaml <<EOF
---
apiVersion: v1
kind: Secret
metadata:
  name: csi-cephfs-secret
  namespace: default
stringData:
  #通过ceph auth get client.admin 查看,这里不需要base64加密
  # Required for statically provisioned volumes
  userID: admin
  userKey: AQAetX9l2EioDBAAv6HoUlAAZabv9KP1i25CLA==

  # Required for dynamically provisioned volumes
  adminID: admin
  adminKey: AQAetX9l2EioDBAAv6HoUlAAZabv9KP1i25CLA==

  # Encryption passphrase
  encryptionPassphrase: my_passphrase
EOF

kubectl create -f /root/my-ceph-csi/examples/cephfs/secret.yaml
kubectl get secret csi-cephfs-secret -n default
14、创建存储类,k8smaster上执行
cd /opt/kubernetes/ceph-csi-3.8.1/examples/cephfs(官方storageclass.yaml文件模板位置)
cat >/root/my-ceph-csi/examples/cephfs/storageclass.yaml <<EOF
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: csi-cephfs-sc
provisioner: cephfs.csi.ceph.com
parameters:
  clusterID: <cluster-id> 此处需要修改 使用ceph mon dump 查看
  fsName: <cephfs-name> 此处需要修改 使用ceph fs ls 查看
  pool: fs_data  此处需要修改数据的pool 使用ceph osd pool ls 查看
  csi.storage.k8s.io/provisioner-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/provisioner-secret-namespace: default
  csi.storage.k8s.io/controller-expand-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/controller-expand-secret-namespace: default
  csi.storage.k8s.io/node-stage-secret-name: csi-cephfs-secret
  csi.storage.k8s.io/node-stage-secret-namespace: default
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
  - debug
EOF

kubectl create -f /root/my-ceph-csi/examples/cephfs/storageclass.yaml
kubectl get sc csi-cephfs-secret -n default

问题:MountVolume.MountDevice failed for volume "pvc-a7dfc3f5-e719-442d-82cd-68da52c568b2" : driver name rook-ceph.cephfs.csi.ceph.com not found in the list of registered CSI drivers
最终定位到问题原因是kubelet的root-dir设置为 /data/kubelet,而xxx-reg.sock文件却是在 /var/lib/kubelet/plugins_registry/ 目录下,从而导致 kubelet 无法找到 /data/var/lib/kubelet/plugins_registry/xxxx-reg.sock 文件
sed -i 's#/var/lib/kubelet#/data/kubelet#g' /root/my-ceph-csi/deploy/cephfs/csi-cephfsplugin.yaml

rbd方式

1、所有k8s集群node节点配置ceph源(如果master作为node使用也要执行)
cat >/etc/yum.repos.d/ceph.repo <<EOF
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/x86_64
enable=1
gpgcheck=0
priority=1

[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/noarch
enable=1
gpgcheck=0
priority=1

[ceph-source]
name=ceph source packages
baseurl=http://mirrors.aliyun.com/ceph/rpm-nautilus/el7/SRPMS
enable=1
gpgcheck=0
priority=1
EOF

yum clean all
yum makecache fast
2、所有k8s集群node节点安装ceph-common(如果master作为node使用也要执行)
yum install ceph-common -y
3、同步配置文件,这里k8s只有一个master节点,如果有node几点也需要操作,在ceph01上操作
ssh-copy-id k8smaster1
ceph-deploy --overwrite-conf admin ceph01 ceph02 ceph03 k8smaster1
4、部署cephfs csi,k8smaster上执行
https://github.com/ceph/ceph-csi.git
拉取代码
git clone https://github.com/ceph/ceph-csi.git
cd ceph-csi/deploy/cephfs/kubernetes
创建文件夹
mkdir -p /root/my-ceph-csi/deploy/{cephfs,rbd}
mkdir -p /root/my-ceph-csi/examples/{cephfs,rbd}
cd /opt/kubernetes/ceph-csi-3.6.2/deploy/rbd/kubernetes
cp ./* /root/my-ceph-csi/deploy/rbd
5、修改csi-config-map.yaml文件,一下是实例,部署时需要删除注释,k8smaster上执行
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: "ceph-csi-config"
data:
  config.json: |-
    [
      {
      "clusterID": "96f54e84-dbfc-4650-8896-8f3b5f524bbf",#ceph集群的id,此内容可以使用ceph mon dump来查看,clusterID对应fsid
      "monitors": ["192.168.2.230:6789,192.168.2.231:6789,192.168.2.232:6789"]
      }
    ]

6、导入镜像,所有k8s节点,镜像放到阿里云盘
docker load <ceph_image.tar.gz
7、安装cephfs
sed -i 's#/var/lib/kubelet#/data/kubelet#g' csi-nodeplugin-psp.yaml
kubectl create -f /root/ceph-csi-3.6.2/examples/ceph-conf.yaml
kubectl create -f /root/ceph-csi-3.6.2/examples/kms/vault/kms-config.yaml
kubectl create -f csidriver.yaml
kubectl create -f csi-provisioner-rbac.yaml
kubectl create -f csi-nodeplugin-rbac.yaml
kubectl create -f csi-config-map.yaml
kubectl create -f csi-rbdplugin-provisioner.yaml
kubectl create -f csi-rbdplugin.yaml
8、k8s上创建连接ceph集群的秘钥(创建secret.yaml)
cd /opt/kubernetes/ceph-csi-3.8.1/examples/rbd(官方secret.yaml文件模板位置)
cat >/root/my-ceph-csi/examples/rbd/secret.yaml <<EOF
---
apiVersion: v1
kind: Secret
metadata:
  name: csi-rbd-secret
  namespace: default
stringData:
#通过ceph auth get client.admin 查看,这里不需要base64加密
  userID: admin
  userKey: AQBB35Nl+oqgLRAAOZYWjueAwsFE2Y0NpDxMIg==
  adminID: admin
  adminKey: AQBB35Nl+oqgLRAAOZYWjueAwsFE2Y0NpDxMIg==
  encryptionPassphrase: test_passphrase
EOF  

kubectl create -f /root/my-ceph-csi/examples/rbd/secret.yaml
kubectl get secret csi-rbd-secret -n default
9、创建存储类
cd /opt/kubernetes/ceph-csi-3.6.2/examples/rbd(官方storageclass.yaml文件模板位置)
cat >/root/my-ceph-csi/examples/rbd/storageclass.yaml <<EOF
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: csi-rbd-sc
provisioner: rbd.csi.ceph.com
parameters:
   clusterID: <cluster-id> 此处需要修改 使用ceph mon dump 查看
   pool: <rbd-pool-name> 此处需要修改数据的pool 使用ceph osd pool ls 查看
   imageFeatures: "layering"
   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
   csi.storage.k8s.io/fstype: ext4
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
   - discard
EOF

kubectl create -f /root/my-ceph-csi/examples/rbd/storageclass.yaml
kubectl get sc csi-cephfs-secret -n default