PV、PVC概述
Pod动态供给
Pod使用CephFS做为持久化数据卷
Ceph端建立CephFS pool
部署Cephfs-provisioner
配置storageclass
测试使用
Ceph集群维护命令html
管理存储是管理计算的一个明显问题。PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息。因而引入了两个新的API资源:PersistentVolume和PersistentVolumeClaim
PersistentVolume(PV)是集群中已由管理员配置的一段网络存储。 集群中的资源就像一个节点是一个集群资源。 PV是诸如卷之类的卷插件,可是具备独立于使用PV的任何单个pod的生命周期。 该API对象包含存储的实现细节,即NFS,iSCSI或云提供商特定的存储系统。
PersistentVolumeClaim(PVC)是用户存储的请求。 它相似于pod。Pod消耗节点资源,PVC消耗存储资源。 pod能够请求特定级别的资源(CPU和内存)。 权限要求能够请求特定的大小和访问模式。
虽然PersistentVolumeClaims容许用户使用抽象存储资源,可是常见的是,用户须要具备不一样属性(如性能)的PersistentVolumes,用于不一样的问题。 管理员须要可以提供多种不一样于PersistentVolumes,而不只仅是大小和访问模式,而不会使用户了解这些卷的实现细节。 对于这些需求,存在StorageClass资源。
StorageClass为集群提供了一种描述他们提供的存储的“类”的方法。 不一样的类可能映射到服务质量级别,或备份策略,或者由群集管理员肯定的任意策略。 Kubernetes自己对于什么类别表明是不言而喻的。 这个概念有时在其余存储系统中称为“配置文件”node
动态供给主要是可以自动帮你建立pv,须要多大的空间就建立多大的pv。k8s帮助建立pv,建立pvc就直接api调用存储类来寻找pv。
若是是存储静态供给的话,会须要咱们手动去建立pv,若是没有足够的资源,找不到合适的pv,那么pod就会处于pending等待的状态。而动态供给主要的一个实现就是StorageClass存储对象,其实它就是声明你使用哪一个存储,而后帮你去链接,再帮你去自动建立pv。nginx
Pod使用CephFS作为持久数据卷
CephFS方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ,ReadWriteMany
Ceph端建立CephFS pool
一、以下操做在ceph的mon或者admin节点
CephFS须要使用两个Pool来分别存储数据和元数据git
ceph osd pool create fs_data 16 ceph osd pool create fs_metadata 16
[root@k8s-master ceph-storage]# ceph osd lspools 1 .rgw.root 2 default.rgw.control 3 default.rgw.meta 4 default.rgw.log 5 kube 6 fs_data 7 fs_metadata
二、建立一个CephFSweb
ceph fs new cephfs fs_metadata fs_data new fs with metadata pool 7 and data pool 6
三、查看算法
ceph fs ls name: cephfs, metadata pool: fs_metadata, data pools: [fs_data ]
部署 cephfs-provisioner
一、使用社区提供的cephfs-provisionerapi
yaml文件地址:git@gitee.com:zhaocheng172/cephfs-storage.git
拉取须要将公钥给我,否则拉不下来bash
[root@k8s-master cephfs-storage]# ls cephfs-pvc-test.yaml external-storage-cephfs-provisioner.yaml nginx-pod.yaml storageclass-cephfs.yaml kubectl apply -f external-storage-cephfs-provisioner.yaml
二、查看状态 等待running以后 再进行后续的操做网络
[root@k8s-master cephfs-storage]# kubectl get pod -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system cephfs-provisioner-5d47d684f4-rff7r 1/1 Running 0 7s kube-system coredns-9d85f5447-mhp9m 1/1 Running 0 7h3m kube-system coredns-9d85f5447-x6rxv 1/1 Running 0 7h9m kube-system etcd-k8s-master 1/1 Running 2 7h9m
配置 storageclass
一、查看key 在ceph的mon或者admin节点ceph auth get-key client.admin
app
二、建立 admin secret
kubectl create secret generic ceph-secret --type="kubernetes.io/rbd" \ --from-literal=key=AQCHHGte882jHxAA3xokdiyBYj9+UhhflszkPw==== \ --namespace=kube-system
三、查看 secret
kubectl get secret ceph-secret -n kube-system -o yaml apiVersion: v1 data: key: QVFDSEhHdGU4ODJqSHhBQTN4b2tkaXlCWWo5K1VoaGZsc3prUHc9PT09 kind: Secret metadata: creationTimestamp: "2020-03-13T12:25:28Z" name: ceph-secret namespace: kube-system resourceVersion: "69255" selfLink: /api/v1/namespaces/kube-system/secrets/ceph-secret uid: 104a8a6d-92f8-4e54-b548-e82e43aa2d0f type: kubernetes.io/rbd
四、配置 StorageClass
cat >storageclass-cephfs.yaml<<EOF kind: StorageClass apiVersion: storage.k8s.io/v1 metadata: name: dynamic-cephfs provisioner: ceph.com/cephfs parameters: monitors: 10.151.30.125:6789,10.151.30.126:6789,10.151.30.127:6789 adminId: admin adminSecretName: ceph-secret adminSecretNamespace: "kube-system" claimRoot: /volumes/kubernetes EOF
五、建立kubectl apply -f storageclass-cephfs.yaml
六、查看
kubectl get sc dynamic-cephfs ceph.com/cephfs Delete Immediate false 5s
测试使用
一、建立pvc测试
cat >cephfs-pvc-test.yaml<<EOF kind: PersistentVolumeClaim apiVersion: v1 metadata: name: cephfs-claim spec: accessModes: - ReadWriteMany storageClassName: dynamic-cephfs resources: requests: storage: 2Gi EOF kubectl apply -f cephfs-pvc-test.yaml
二、查看
kubectl get pvc [root@k8s-master cephfs-storage]# kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE cephfs-claim Bound pvc-544b5db3-e034-4bc7-b601-815030c8bdd4 2Gi RWX dynamic-cephfs 4m53s kubectl get pv pvc-544b5db3-e034-4bc7-b601-815030c8bdd4 2Gi RWX Delete Bound default/cephfs-claim dynamic-cephfs 5m8s
三、建立 nginx pod 挂载测试
cat >nginx-pod.yaml<<EOF apiVersion: v1 kind: Pod metadata: name: nginx-pod2 labels: name: nginx-pod2 spec: containers: - name: nginx-pod2 image: nginx ports: - name: web containerPort: 80 volumeMounts: - name: cephfs mountPath: /usr/share/nginx/html volumes: - name: cephfs persistentVolumeClaim: claimName: cephfs-claim EOF kubectl apply -f nginx-pod.yaml
四、查看
kubectl get pods -o wide [root@k8s-master cephfs-storage]# kubectl exec -it nginx-pod2 /bin/bash root@nginx-pod2:/# df -h Filesystem Size Used Avail Use% Mounted on overlay 8.7G 5.3G 3.5G 61% / tmpfs 64M 0 64M 0% /dev tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup /dev/sda3 8.7G 5.3G 3.5G 61% /etc/hosts shm 64M 0 64M 0% /dev/shm 192.168.30.21:6789,192.168.30.22:6789,192.168.30.23:6789:/volumes/kubernetes/kubernetes/kubernetes-dynamic-pvc-b0ac12c9-6526-11ea-918a-bef58f12dbe9 2.8G 0 2.8G 0% /usr/share/nginx/html
五、修改文件内容kubectl exec -ti nginx-pod2 -- /bin/sh -c 'echo This is from CephFS!!! > /usr/share/nginx/html/index.html'
六、访问pod测试curl http://$podip
七、清理
kubectl delete -f nginx-pod.yaml kubectl delete -f cephfs-pvc-test.yaml
集群总体运行状态
[root@cephnode01 ~]# ceph -s cluster: id: 8230a918-a0de-4784-9ab8-cd2a2b8671d0 health: HEALTH_WARN application not enabled on 1 pool(s) services: mon: 3 daemons, quorum cephnode01,cephnode02,cephnode03 (age 27h) mgr: cephnode01(active, since 53m), standbys: cephnode03, cephnode02 osd: 4 osds: 4 up (since 27h), 4 in (since 19h) rgw: 1 daemon active (cephnode01) data: pools: 6 pools, 96 pgs objects: 235 objects, 3.6 KiB usage: 4.0 GiB used, 56 GiB / 60 GiB avail pgs: 96 active+clean
id:集群ID
health:集群运行状态,这里有一个警告,说明是有问题,意思是pg数大于pgp数,一般此数值相等。
mon:Monitors运行状态。 osd:OSDs运行状态。 mgr:Managers运行状态。 mds:Metadatas运行状态。 pools:存储池与PGs的数量。 objects:存储对象的数量。 usage:存储的理论用量。 pgs:PGs的运行状态 ~]$ ceph -w ~]$ ceph health detail
PG状态
查看pg状态查看一般使用下面两个命令便可,dump能够查看更详细信息,如。
~]$ ceph pg dump ~]$ ceph pg stat
Pool状态
~]$ ceph osd pool stats ~]$ ceph osd pool stats
OSD状态
~]$ ceph osd stat ~]$ ceph osd dump ~]$ ceph osd tree ~]$ ceph osd df
Monitor状态和查看仲裁状态
~]$ ceph mon stat ~]$ ceph mon dump ~]$ ceph quorum_status
集群空间用量
~]$ ceph df ~]$ ceph df detail
2、集群配置管理(临时和全局,服务平滑重启)
有时候须要更改服务的配置,但不想重启服务,或者是临时修改。这时候就可使用tell和daemon子命令来完成此需求。
一、查看运行配置
命令格式:#ceph daemon {daemon-type}.{id} config show
命令举例
#ceph daemon osd.0 config show
二、tell子命令格式
使用 tell 的方式适合对整个集群进行设置,使用 * 号进行匹配,就能够对整个集群的角色进行设置。而出现节点异常没法设置时候,只会在命令行当中进行报错,不太便于查找。
命令格式:
#ceph tell {daemon-type}.{daemon id or *} injectargs --{name}={value} [--{name}={value}] 命令举例: #ceph tell osd.0 injectargs --debug-osd 20 --debug-ms 1
daemon-type:为要操做的对象类型如osd、mon、mds等。
daemon id:该对象的名称,osd一般为0、1等,mon为ceph -s显示的名称,这里能够输入*表示所有。
injectargs:表示参数注入,后面必须跟一个参数,也能够跟多个
三、daemon子命令
使用 daemon 进行设置的方式就是一个个的去设置,这样能够比较好的反馈,此方法是须要在设置的角色所在的主机上进行设置。
命令格式:#ceph daemon {daemon-type}.{id} config set {name}={value}
命令举例:#ceph daemon mon.ceph-monitor-1 config set mon_allow_pool_delete false
3、集群操做
命令包含start、restart、status
一、启动全部守护进程#systemctl start ceph.target
二、按类型启动守护进程
#systemctl start ceph-mgr.target #systemctl start ceph-osd@id #systemctl start ceph-mon.target #systemctl start ceph-mds.target #systemctl start ceph-radosgw.target
4、添加和删除OSD
一、添加OSD
一、格式化磁盘ceph-volume lvm zap /dev/sd<id>
二、进入到ceph-deploy执行目录/my-cluster,添加OSD#ceph-deploy osd create --data /dev/sd<id> $hostname
二、删除OSD
一、调整osd的crush weight为 0ceph osd crush reweight osd.<ID> 0.0
二、将osd进程stopsystemctl stop ceph-osd@<ID>
三、将osd设置outceph osd out <ID>
四、当即执行删除OSD中数据ceph osd purge osd.<ID> --yes-i-really-mean-it
五、卸载磁盘umount /var/lib/ceph/osd/ceph-?
5、扩容PG
ceph osd pool set {pool-name} pg_num 128 ceph osd pool set {pool-name} pgp_num 128
注:
一、扩容大小取跟它接近的2的N次方
二、在更改pool的PG数量时,需同时更改PGP的数量。PGP是为了管理placement而存在的专门的PG,它和PG的数量应该保持一致。若是你增长pool的pg_num,就须要同时增长pgp_num,保持它们大小一致,这样集群才能正常rebalancing。
6、Pool操做
列出存储池ceph osd lspools
建立存储池
命令格式: #ceph osd pool create {pool-name} {pg-num} [{pgp-num}] 命令举例: #ceph osd pool create rbd 32 32
设置存储池配额
命令格式: #ceph osd pool set-quota {pool-name} [max_objects {obj-count}] [max_bytes {bytes}] 命令举例: #ceph osd pool set-quota rbd max_objects 10000
删除存储池ceph osd pool delete {pool-name} [{pool-name} --yes-i-really-really-mean-it]
重命名存储池
ceph osd pool rename {current-pool-name} {new-pool-name}
查看存储池统计信息rados df
给存储池作快照ceph osd pool mksnap {pool-name} {snap-name}
删除存储池的快照ceph osd pool rmsnap {pool-name} {snap-name}
获取存储池选项值ceph osd pool get {pool-name} {key}
调整存储池选项值
ceph osd pool set {pool-name} {key} {value} size:设置存储池中的对象副本数,详情参见设置对象副本数。仅适用于副本存储池。 min_size:设置 I/O 须要的最小副本数,详情参见设置对象副本数。仅适用于副本存储池。 pg_num:计算数据分布时的有效 PG 数。只能大于当前 PG 数。 pgp_num:计算数据分布时使用的有效 PGP 数量。小于等于存储池的 PG 数。 hashpspool:给指定存储池设置/取消 HASHPSPOOL 标志。 target_max_bytes:达到 max_bytes 阀值时会触发 Ceph 冲洗或驱逐对象。 target_max_objects:达到 max_objects 阀值时会触发 Ceph 冲洗或驱逐对象。 scrub_min_interval:在负载低时,洗刷存储池的最小间隔秒数。若是是 0 ,就按照配置文件里的 osd_scrub_min_interval 。 scrub_max_interval:无论集群负载如何,都要洗刷存储池的最大间隔秒数。若是是 0 ,就按照配置文件里的 osd_scrub_max_interval 。 deep_scrub_interval:“深度”洗刷存储池的间隔秒数。若是是 0 ,就按照配置文件里的 osd_deep_scrub_interval 。 获取对象副本数 ceph osd dump | grep 'replicated size'
7、用户管理
Ceph 把数据以对象的形式存于各存储池中。Ceph 用户必须具备访问存储池的权限才可以读写数据。另外,Ceph 用户必须具备执行权限才可以使用 Ceph 的管理命令。
一、查看用户信息
查看全部用户信息#ceph auth list
获取全部用户的key与权限相关信息#ceph auth get client.admin
若是只须要某个用户的key信息,可使用pring-key子命令#ceph auth print-key client.admin
二、添加用户
#ceph auth add client.john mon 'allow r' osd 'allow rw pool=liverpool' #ceph auth get-or-create client.paul mon 'allow r' osd 'allow rw pool=liverpool' #ceph auth get-or-create client.george mon 'allow r' osd 'allow rw pool=liverpool' -o george.keyring #ceph auth get-or-create-key client.ringo mon 'allow r' osd 'allow rw pool=liverpool' -o ringo.key
三、修改用户权限
#ceph auth caps client.john mon 'allow r' osd 'allow rw pool=liverpool' #ceph auth caps client.paul mon 'allow rw' osd 'allow rwx pool=liverpool' #ceph auth caps client.brian-manager mon 'allow *' osd 'allow *' #ceph auth caps client.ringo mon ' ' osd ' '
四、删除用户#ceph auth del {TYPE}.{ID}
其中, {TYPE} 是 client,osd,mon 或 mds 的其中一种。{ID} 是用户的名字或守护进程的 ID 。
8、增长和删除Monitor
一个集群能够只有一个 monitor,推荐生产环境至少部署 3 个。 Ceph 使用 Paxos 算法的一个变种对各类 map 、以及其它对集群来讲相当重要的信息达成共识。建议(但不是强制)部署奇数个 monitor 。Ceph 须要 mon 中的大多数在运行并可以互相通讯,好比单个 mon,或 2 个中的 2 个,3 个中的 2 个,4 个中的 3 个等。初始部署时,建议部署 3 个 monitor。后续若是要增长,请一次增长 2 个。
一、新增一个monitor#ceph-deploy mon create $hostname
注意:执行ceph-deploy以前要进入以前安装时候配置的目录。/my-cluster
二、删除Monitor#ceph-deploy mon destroy $hostname
注意: 确保你删除某个 Mon 后,其他 Mon 仍能达成一致。若是不可能,删除它以前可能须要先增长一个。