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 仍能達成一致。若是不可能,刪除它以前可能須要先增長一個。