云原生專欄大綱
ceph應(yīng)用場景
官網(wǎng)文檔:Ceph Docs
- 對象存儲(Ceph Object Storage):
對象存儲適用于需要存儲和訪問大量非結(jié)構(gòu)化數(shù)據(jù)的場景,例如圖像、視頻、日志文件等。在 Kubernetes 中,可以使用 Ceph Rados Gateway 提供的對象存儲接口,將應(yīng)用程序的對象數(shù)據(jù)存儲在 Ceph 集群中。對象存儲提供了高可擴展性和高可靠性,并且可以通過 HTTP 或 S3 API 進行訪問。 - 塊存儲(Ceph Block Storage):
塊存儲適用于需要將持久化數(shù)據(jù)作為塊設(shè)備掛載到容器中的場景,例如數(shù)據(jù)庫、文件系統(tǒng)等應(yīng)用。在 Kubernetes 中,可以使用 Ceph RBD(Rados Block Device)提供的塊存儲功能。通過創(chuàng)建和管理 RBD 卷,可以將塊設(shè)備掛載到 Pod 中,以提供高性能和可靠的塊存儲。 - 文件系統(tǒng)(Ceph File System):
文件系統(tǒng)適用于需要共享文件數(shù)據(jù)的場景,例如共享配置文件、共享存儲卷等。在 Kubernetes 中,可以使用 CephFS(Ceph File System)作為持久化存儲卷,將文件系統(tǒng)掛載到多個 Pod 中,實現(xiàn)文件級別的共享和訪問。CephFS 提供了高性能和可擴展的分布式文件系統(tǒng)功能。
總結(jié)來說,Ceph 對象存儲適用于存儲大量非結(jié)構(gòu)化數(shù)據(jù),塊存儲適用于需要掛載塊設(shè)備的應(yīng)用,文件系統(tǒng)適用于需要共享文件數(shù)據(jù)的場景。根據(jù)應(yīng)用的需求和特點,選擇適合的 Ceph 存儲方式可以提供高性能、可靠性和可擴展性的存儲解決方案。
ceph應(yīng)用
在k8s集群外使用塊設(shè)備
ceph客戶端配置
- 通過rook-ceph-tools工具查看配置
sh-4.4$ cat /etc/ceph/ceph.conf
[global]
mon_host = 192.168.31.25:6789,192.168.31.24:6789,192.168.31.20:6789
[client.admin]
keyring = /etc/ceph/keyring
sh-4.4$ cat /etc/ceph/keyring
[client.admin]
key = AQBaFp1lEAyWNRAAmSeFCljy78bBBH3+D0qkmw==
- 將上述配置在其他機器創(chuàng)建,
確保其他機器能訪問上述mon_host配置的ip:port。mon_host配置ip為宿主集群ip,需將cluster.yaml中provider: host配置注釋放開,不然使用的是k8s集群中service的虛擬vip,需修改上述配置
# 宿主機上查看是否暴露端口
[root@ksnode20 ~]# ss -anput | grep ":6789"
tcp LISTEN 0 128 192.168.31.20:6789 *:* users:(("ceph-mon",pid=19223,fd=28))
- 確定centos版本和下載源
# 查看el版本
cat /etc/redhat-release
#CentOS Linux release 7.5.1804 (Core)
# 對應(yīng)el7版本
# rook-ceph-tools中查看
sh-4.4$ cat /etc/redhat-release
CentOS Stream release 8
- 查看版本
# rook-ceph-tools中查看ceph版本
sh-4.4$ ceph -v
ceph version 16.2.10 (45fa1a083152e41a408d15505f594ec5f1b4fe17) pacific (stable)
- 下載ceph客戶端
vi /etc/yum.repos.d/ceph.repo
# 添加如下內(nèi)容,https://mirrors.aliyun.com/ceph找到相應(yīng)版本
[ceph]
name=ceph
baseurl=https://mirrors.aliyun.com/ceph/rpm-16.2.10/el8/x86_64/
enabled=1
gpgcheck=0
####安裝客戶端
yum install ceph-common -y
- 測試
sh-4.4$ ceph -s
cluster:
id: b4e4ce76-8a0c-4171-a5ec-27da6394983e
health: HEALTH_OK
services:
mon: 3 daemons, quorum a,b,c (age 21h)
mgr: b(active, since 21h), standbys: a
osd: 5 osds: 5 up (since 21h), 5 in (since 21h)
data:
pools: 1 pools, 1 pgs
objects: 0 objects, 0 B
usage: 27 MiB used, 2.4 TiB / 2.4 TiB avail
pgs: 1 active+clean
Ceph是一個開源的分布式存儲系統(tǒng),提供了豐富的命令行工具來管理和操作Ceph集群。以下是一些常用的Ceph命令:
1. ceph-deploy: 用于在Ceph集群中部署和管理節(jié)點。
2. ceph: 主要命令行工具,用于執(zhí)行各種Ceph管理操作。
ceph health: 檢查Ceph集群的健康狀態(tài)。
ceph status: 顯示Ceph集群的狀態(tài)信息。
ceph osd status: 顯示Ceph集群中每個OSD(對象存儲設(shè)備)的狀態(tài)信息。
ceph df: 顯示Ceph集群的存儲使用情況。
ceph osd pool ls: 列出Ceph集群中的所有存儲池。
ceph osd pool stats: 顯示Ceph集群中每個存儲池的統(tǒng)計信息。
ceph osd tree: 顯示Ceph集群中的OSD樹結(jié)構(gòu)。
ceph pg stat: 顯示Ceph集群中PG(Placement Group)的狀態(tài)信息。
ceph pg dump: 顯示Ceph集群中PG的詳細(xì)信息。
ceph osd crush tree: 顯示Ceph集群中的CRUSH映射樹結(jié)構(gòu)。
ceph osd lspools: 列出Ceph集群中的所有存儲池。
3. rados: 用于執(zhí)行與RADOS(可靠自動分布式對象存儲)相關(guān)的操作。
rados df: 顯示RADOS集群的存儲使用情況。
rados ls: 列出RADOS集群中的所有對象。
rados rm: 刪除RADOS集群中的對象。
rados put: 將文件上傳為RADOS對象。
rados get: 從RADOS集群中下載對象。
4. rbd: 用于執(zhí)行與RBD(塊設(shè)備)相關(guān)的操作。
rbd create: 創(chuàng)建一個RBD鏡像。
rbd ls: 列出RBD鏡像。
rbd info: 顯示RBD鏡像的詳細(xì)信息。
rbd map: 將RBD鏡像映射為塊設(shè)備。
rbd unmap: 解除RBD鏡像的塊設(shè)備映射。
rbd resize: 調(diào)整RBD鏡像的大小。
rbd snap create: 創(chuàng)建RBD鏡像的快照。
rbd snap ls: 列出RBD鏡像的快照。
rbd snap rm: 刪除RBD鏡像的快照。
創(chuàng)建塊掛載使用
- 創(chuàng)建pool
# 該命令的作用是在 Ceph 存儲集群中創(chuàng)建一個名為 "rook" 的 OSD 池,初始設(shè)置為具有 16 個 PG 和至少 16 個副本
sh-4.4$ ceph osd pool create rook 16 16
pool 'rook' created
# 用于列出 Ceph 存儲集群中存在的所有 OSD 池
sh-4.4$ ceph osd lspools
1 device_health_metrics
2 rook
- ceph osd pool create:這是 Ceph 命令行工具的一部分,用于創(chuàng)建 OSD 池。
- rook:這是要創(chuàng)建的 OSD 池的名稱。您可以根據(jù)自己的需求選擇一個合適的名稱。
- 16:這是指定 OSD 池的初始 PG(Placement Group)數(shù)量。PG 是 Ceph 存儲集群中數(shù)據(jù)分布和負(fù)載均衡的單位。選擇適當(dāng)?shù)?PG 數(shù)量對于性能和數(shù)據(jù)分布非常重要。根據(jù)集群的大小和負(fù)載情況,您可以根據(jù)需要調(diào)整這個數(shù)字。
- 16:這是指定 OSD 池的最小副本數(shù)。Ceph 使用副本(replication)來提供數(shù)據(jù)冗余和高可用性。設(shè)置最小副本數(shù)將確保在發(fā)生故障時仍然有足夠的副本可用。同樣,您可以根據(jù)需求調(diào)整這個數(shù)字。
- 在pool上創(chuàng)建RDB塊
# 在名為 "rook" 的 OSD 池中創(chuàng)建一個名為 "rook-rbd.img" 的 RBD 鏡像,其大小為 1GB
sh-4.4$ rbd create -p rook --image rook-rbd.img --size 1G
# 獲得名為 "rook" 的 OSD 池中所有 RBD 鏡像的列表
sh-4.4$ rbd ls -p rook
rook-rbd.img
- 客戶端掛載塊
# 將指定的 RBD 鏡像映射到本地系統(tǒng)中,使其在本地系統(tǒng)上可用。映射后,該鏡像將作為塊設(shè)備出現(xiàn),并可以像其他塊設(shè)備一樣進行讀取和寫入操作。
rbd map rook/rook-rbd.img
# 在/dev/rbd0設(shè)備上創(chuàng)建一個XFS文件系統(tǒng)。這將格式化該設(shè)備,并將其準(zhǔn)備好以存儲文件和目錄
mkfs.xfs /dev/rbd0
# 掛載
mount /dev/rbd0 /media
刪除pool
要刪除 Ceph 中的池(Pool),可以按照以下步驟進行操作:
- 檢查池狀態(tài):運行以下命令,確保要刪除的池處于健康狀態(tài)(HEALTH_OK):
ceph -s
- 停止池中的操作:在刪除池之前,最好停止對該池的任何操作,以確保數(shù)據(jù)的完整性??梢允褂靡韵旅顣和3刂械?I/O 操作:
#查看pool列表
ceph osd pool ls
ceph osd pool set <pool-name> size 0
- 刪除池:運行以下命令刪除池:
ceph osd pool delete <pool-name> <pool-name> --yes-i-really-really-mean-it
ceph osd pool delete rook rook --yes-i-really-really-mean-it
將 替換為要刪除的池的名稱。請注意,這是一個不可逆的操作,所有池中的數(shù)據(jù)將被永久刪除。因此,請謹(jǐn)慎執(zhí)行此命令,并確保已備份重要數(shù)據(jù)。
- 確認(rèn)刪除:運行以下命令確認(rèn)池已被刪除:
ceph osd lspools
檢查輸出中是否不再包含已刪除的池。
請注意,刪除池是一個潛在的危險操作,需要謹(jǐn)慎處理。在執(zhí)行刪除操作之前,請確保已備份重要數(shù)據(jù),并確保不再需要該池中的任何數(shù)據(jù)。建議在刪除池之前,仔細(xì)評估并確認(rèn)操作的后果,并參考 Ceph 官方文檔獲取更多詳細(xì)的指導(dǎo)和建議。
在k8s集群內(nèi)使用塊設(shè)備
塊存儲允許單個 Pod 掛載存儲。官網(wǎng)參考文檔:https://rook.io/docs/rook/v1.9/ceph-block.html
創(chuàng)建塊池和StorageClass
- 編輯storageclass.yaml
# 指定所使用的API版本,這里使用的是Ceph Rook的API版本
apiVersion: ceph.rook.io/v1
# 指定資源的類型為CephBlockPool,表示創(chuàng)建一個Ceph塊池。
kind: CephBlockPool
# 元數(shù)據(jù)部分,用于定義資源的元數(shù)據(jù)信息。
metadata:
# 指定資源的名稱為"replicapool",這是創(chuàng)建的Ceph塊池的名稱。
name: replicapool
# 指定資源所屬的命名空間為"rook-ceph",命名空間用于對資源進行邏輯隔離和管理。
namespace: rook-ceph
# 規(guī)格部分,用于定義資源的配置規(guī)格
spec:
# 指定故障域為"host",表示塊池的數(shù)據(jù)副本將在不同的主機上進行分布,以提高數(shù)據(jù)的容錯性和可用性。
failureDomain: host
# 指定塊池的復(fù)制方式為"replicated",表示數(shù)據(jù)將以復(fù)制的方式進行存儲。
replicated:
# 指定復(fù)制的副本數(shù)為3,表示每個數(shù)據(jù)塊將被復(fù)制為3個副本。
size: 3
# 設(shè)置為true,表示要求每個副本都處于安全狀態(tài),確保數(shù)據(jù)的完整性和可靠性。
requireSafeReplicaSize: true
---
# 指定所使用的API版本,這里使用的是Kubernetes的存儲API版本。
apiVersion: storage.k8s.io/v1
# 指定資源的類型為StorageClass,表示創(chuàng)建一個存儲類。
kind: StorageClass
# 元數(shù)據(jù)部分,用于定義資源的元數(shù)據(jù)信息。
metadata:
# 指定資源的名稱為"rook-ceph-block",這是創(chuàng)建的存儲類的名稱。
name: rook-ceph-block
# 指定存儲類的提供者為"rook-ceph.rbd.csi.ceph.com",表示使用Rook Ceph提供的CSI插件進行存儲。
provisioner: rook-ceph.rbd.csi.ceph.com
# 參數(shù)部分,用于定義存儲類的配置參數(shù)
parameters:
# 指定集群ID為"rook-ceph",表示使用名為"rook-ceph"的Ceph集群。
clusterID: rook-ceph # namespace:cluster
# 指定使用的Ceph塊池為"replicapool",表示存儲數(shù)據(jù)的塊池名稱。
pool: replicapool
# 指定存儲的鏡像格式為"2",表示使用Ceph的版本2鏡像格式。
imageFormat: "2"
# 指定鏡像特性為"layering",表示啟用鏡像層級特性。
imageFeatures: layering
# 指定CSI插件的提供者密鑰名稱為"rook-csi-rbd-provisioner",用于訪問Rook Ceph提供的存儲。
csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
# 指定CSI插件的提供者密鑰所在的命名空間為"rook-ceph"。
csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
# 指定CSI插件的控制器擴展密鑰名稱為"rook-csi-rbd-provisioner"。
csi.storage.k8s.io/controller-expand-secret-name: rook-csi-rbd-provisioner
# 指定CSI插件的控制器擴展密鑰所在的命名空間為"rook-ceph"。
csi.storage.k8s.io/controller-expand-secret-namespace: rook-ceph
# 指定CSI插件的節(jié)點階段密鑰名稱為"rook-csi-rbd-node"。
csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
# 指定CSI插件的節(jié)點階段密鑰所在的命名空間為"rook-ceph"。
csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph
# 指定文件系統(tǒng)類型為"ext4",表示使用ext4文件系統(tǒng)進行掛載。
csi.storage.k8s.io/fstype: ext4
# 設(shè)置為true,表示允許對該存儲類的卷進行擴展。
allowVolumeExpansion: true
# 指定回收策略為"Delete",表示當(dāng)卷被刪除時,相關(guān)的存儲資源也會被刪除。
reclaimPolicy: Delete
- 創(chuàng)建資源
kubectl create -f deploy/examples/csi/rbd/storageclass.yaml
ALLOWVOLUMEEXPANSION是Kubernetes中存儲類(StorageClass)的一個屬性,用于指示該存儲類是否允許卷的擴展(容量增加)。
當(dāng)存儲類的 ALLOWVOLUMEEXPANSION 屬性設(shè)置為 true 時,表示該存儲類允許動態(tài)卷的擴展。這意味著在使用該存儲類創(chuàng)建的卷上,可以通過修改卷的容量來增加其存儲空間。擴展卷的過程可以是在線的,而不需要中斷應(yīng)用程序的運行。
如果存儲類的 ALLOWVOLUMEEXPANSION 屬性設(shè)置為 false 或未設(shè)置(默認(rèn)值為 false),則不允許對使用該存儲類創(chuàng)建的卷進行擴展。在這種情況下,如果需要增加卷的容量,通常需要創(chuàng)建一個新的卷,并將數(shù)據(jù)從舊卷遷移到新卷。
要注意的是,存儲后端必須支持卷的擴展功能,并且相應(yīng)的存儲插件和驅(qū)動程序也必須進行相應(yīng)的配置和支持。因此,在使用 ALLOWVOLUMEEXPANSION 屬性之前,需要確保存儲后端和相關(guān)組件都支持卷擴展操作。
要查看存儲類是否允許卷擴展,可以使用 kubectl describe storageclass <storageclass_name> 命令,并查找 AllowVolumeExpansion 字段的值。
使用存儲
下述操作可直接在kubesphere中可視化操作
- 創(chuàng)建PVC資源
上述操作生成的資源文件內(nèi)容如下:
# 指定要創(chuàng)建的資源類型為持久卷聲明
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
# 指定持久卷聲明的名稱為 "rook-ceph-block-pvc"
name: rook-ceph-block-pvc
namespace: rook-ceph
annotations:
kubesphere.io/creator: admin
pv.kubernetes.io/bind-completed: 'yes'
pv.kubernetes.io/bound-by-controller: 'yes'
volume.beta.kubernetes.io/storage-provisioner: rook-ceph.rbd.csi.ceph.com
volume.kubernetes.io/storage-provisioner: rook-ceph.rbd.csi.ceph.com
finalizers:
- kubernetes.io/pvc-protection
# 指定持久卷聲明的規(guī)格和配置
spec:
# 指定卷的訪問模式,這里使用了 "ReadWriteOnce",表示該卷可以被單個節(jié)點以讀寫方式掛載。
accessModes:
- ReadWriteOnce
resources:
requests:
# # 指定需要 10GB 的存儲容量
storage: 10Gi
volumeName: pvc-23ae523d-6b0c-423f-b2ed-748a7758d7b9
# # 指定存儲類的名稱為 "rook-ceph-block"。這將告訴 Kubernetes 使用名為 "rook-ceph-block" 的存儲類來提供持久卷。
storageClassName: rook-ceph-block
volumeMode: Filesystem
- pod引用PVC
apiVersion: apps/v1
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
tier: mysql
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
value: changeme
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
塊存儲映射問題處理
問題現(xiàn)象
參考:https://rook.io/docs/rook/v1.9/ceph-block.html
當(dāng)操作執(zhí)行如下命令:
kubectl create -f deploy/examples/csi/rbd/storageclass.yaml
kubectl create -f mysql.yaml
kubectl create -f wordpress.yaml
上述命令執(zhí)行現(xiàn)象如下:
事件分析
MountVolume.MountDevice failed for volume "pvc-541330c2-c399-4d33-a6dc-a2e1146ae87d" : rpc error: code = Internal desc = rbd: map failed with error an error (exit status 95) occurred while running rbd args: [--id csi-rbd-node -m 192.168.31.24:6789,192.168.31.20:6789,192.168.31.25:6789 --keyfile=***stripped*** map replicapool/csi-vol-b6def63c-afa0-11ee-a3c0-923efe8ba7cc --device-type krbd --options noudev], rbd error output: rbd: sysfs write failed rbd: map failed: (95) Operation not supported
具體是由于 rbd(RADOS Block Device)映射失敗而導(dǎo)致的。錯誤消息中提到了 “Operation not supported”,這可能是由于以下原因之一引起的:
-
內(nèi)核模塊未加載:確保在執(zhí)行 rbd 操作之前,已加載了正確的內(nèi)核模塊。在節(jié)點上執(zhí)行以下命令加載內(nèi)核模塊:
modprobe rbd
- 缺少依賴軟件包:確保節(jié)點上安裝了必要的軟件包,包括 Ceph 和 RBD 相關(guān)的軟件包。具體所需的軟件包可能因操作系統(tǒng)和安裝方式而異。請參考 Ceph 和 Rook 的官方文檔,查找正確的軟件包依賴關(guān)系并進行安裝。
- 內(nèi)核版本不兼容:某些內(nèi)核版本可能不完全支持 rbd 映射功能。嘗試升級或更換到支持的內(nèi)核版本。請參考 Ceph 和 Rook 的官方文檔,了解支持的內(nèi)核版本要求。
- 硬件限制:某些硬件環(huán)境可能不支持 rbd 映射操作。確保硬件環(huán)境滿足 rbd 映射的要求。如果使用的是虛擬化環(huán)境,請檢查虛擬化平臺的文檔,確認(rèn)是否支持 rbd 映射。
- SELinux 或安全策略限制:如果啟用了 SELinux 或其他安全策略,可能會限制 rbd 映射操作。請檢查安全策略配置,并相應(yīng)地調(diào)整以允許 rbd 映射。
請根據(jù)你的環(huán)境和具體情況逐一檢查這些可能的原因,并采取適當(dāng)?shù)拇胧﹣斫鉀Q問題。如果問題仍然存在,建議參考 Ceph、Rook 和 Kubernetes 相關(guān)的官方文檔和社區(qū)支持資源,以獲取更深入的故障排除和解決方案。
Unable to attach or mount volumes: unmounted volumes=[wordpress-persistent-storage], unattached volumes=[kube-api-access-54dwt wordpress-persistent-storage]: timed out waiting for the condition
這個錯誤消息表明在附加或掛載卷時遇到了問題。錯誤消息中提到了超時等待條件,可能是由于以下原因之一引起的:
- 存儲類配置錯誤:檢查所使用的存儲類(StorageClass)配置是否正確。確保存儲類指定了正確的卷插件和參數(shù),并與底層存儲系統(tǒng)兼容。可以通過運行 kubectl describe storageclass 命令來查看存儲類的詳細(xì)信息,并確保其配置正確。
- 存儲系統(tǒng)故障:如果底層存儲系統(tǒng)出現(xiàn)故障或不可用,可能導(dǎo)致掛載卷超時。確保存儲系統(tǒng)正常運行,并且與 Kubernetes 集群連接正常。檢查存儲系統(tǒng)的日志和狀態(tài),以確定是否存在任何問題。
- 節(jié)點資源不足:如果節(jié)點上的資源(例如 CPU、內(nèi)存、存儲)不足,可能導(dǎo)致掛載卷超時。檢查節(jié)點的資源使用情況,確保節(jié)點具有足夠的資源來處理卷掛載操作。
- 網(wǎng)絡(luò)問題:網(wǎng)絡(luò)問題可能導(dǎo)致掛載卷超時。確保網(wǎng)絡(luò)連接正常,并且 Kubernetes 集群中的各個組件可以相互通信。檢查網(wǎng)絡(luò)配置和防火墻設(shè)置,確保沒有阻止卷掛載所需的流量。
- 存儲系統(tǒng)性能問題:如果底層存儲系統(tǒng)的性能不足,可能導(dǎo)致掛載卷超時。檢查存儲系統(tǒng)的性能指標(biāo),并確保其能夠處理所需的讀寫操作。
在解決問題之前,建議備份重要數(shù)據(jù),并參考 Kubernetes 和底層存儲系統(tǒng)的官方文檔,以獲取更詳細(xì)的故障排除步驟和支持。此外,查看 Kubernetes 事件日志和存儲系統(tǒng)日志,以獲取更多關(guān)于超時問題的詳細(xì)信息。
0/8 nodes are available: 8 pod has unbound immediate PersistentVolumeClaims.
這個錯誤消息表明在調(diào)度 Pod 時遇到了問題,沒有可用的節(jié)點。錯誤消息中提到有 8 個 Pod 的 PersistentVolumeClaims(PVC)處于未綁定狀態(tài),這可能是由以下原因之一引起的:
- 存儲類配置錯誤:檢查所使用的存儲類(StorageClass)配置是否正確。確保存儲類指定的卷插件和參數(shù)與底層存儲系統(tǒng)兼容,并且有足夠的可用存儲容量。如果存儲類配置錯誤,可能導(dǎo)致 PVC 無法綁定到可用的持久卷(PersistentVolume)。
- 持久卷不足:如果沒有足夠的可用持久卷來滿足 PVC 的需求,可能導(dǎo)致 PVC 無法綁定。檢查持久卷的狀態(tài)和可用性,確保有足夠的持久卷供應(yīng)給 PVC 使用。
- 節(jié)點資源不足:如果節(jié)點上的資源(例如 CPU、內(nèi)存、存儲)不足,可能導(dǎo)致 Pod 無法調(diào)度。檢查節(jié)點的資源使用情況,確保節(jié)點具有足夠的資源來運行 Pod,并滿足 PVC 的需求。
- 節(jié)點標(biāo)簽不匹配:如果節(jié)點的標(biāo)簽與 Pod 的調(diào)度要求不匹配,可能導(dǎo)致 Pod 無法調(diào)度到節(jié)點上。檢查節(jié)點的標(biāo)簽和 Pod 的調(diào)度要求,確保它們匹配。
- 網(wǎng)絡(luò)問題:網(wǎng)絡(luò)問題可能導(dǎo)致節(jié)點無法與存儲系統(tǒng)通信,從而導(dǎo)致 PVC 無法綁定。確保網(wǎng)絡(luò)連接正常,并且節(jié)點可以訪問存儲系統(tǒng)。
- 存儲系統(tǒng)故障:如果底層存儲系統(tǒng)出現(xiàn)故障或不可用,可能導(dǎo)致 PVC 無法綁定。檢查存儲系統(tǒng)的狀態(tài)和日志,以確定是否存在任何問題。
解決此問題的步驟可能包括檢查存儲類配置、持久卷可用性、節(jié)點資源、節(jié)點標(biāo)簽和網(wǎng)絡(luò)連接。此外,查看 Kubernetes 事件日志和存儲系統(tǒng)日志,以獲取更多關(guān)于 PVC 綁定問題的詳細(xì)信息。如果問題仍然存在,建議參考 Kubernetes 和底層存儲系統(tǒng)的官方文檔,以獲取更詳細(xì)的故障排除步驟和支持。
csi-rbdplugin pod日志分析
W0110 10:42:47.457179 30223 rbd_attach.go:226] nbd modprobe failed (an error (exit status 1) occurred while running modprobe args: [nbd]): "modprobe: FATAL: Module nbd not found in directory /lib/modules/3.10.0-862.el7.x86_64\n"
錯誤消息 “modprobe: FATAL: Module nbd not found in directory /lib/modules/3.10.0-862.el7.x86_64” 表明在您的 CentOS 系統(tǒng)中找不到名為 “nbd” 的內(nèi)核模塊。
nbd 是 Network Block Device 的縮寫,它允許通過網(wǎng)絡(luò)連接將遠(yuǎn)程塊設(shè)備映射到本地系統(tǒng)。通常,nbd 模塊應(yīng)該存在于 /lib/modules/<kernel_version> 目錄中,其中 <kernel_version> 是您當(dāng)前使用的內(nèi)核版本。
W0111 01:23:26.200423 43637 util.go:250] kernel 3.10.0-862.el7.x86_64 does not support required features
W0111 01:23:26.814313 43637 rbd_attach.go:469] ID: 3562 Req-ID: 0001-0009-rook-ceph-0000000000000005-b22dcee8-b01d-11ee-879c-dab0780880f4 rbd: map error an error (exit status 95) occurred while running rbd args: [--id csi-rbd-node -m 192.168.31.25:6789,192.168.31.24:6789,192.168.31.20:6789 --keyfile=***stripped*** map replicapool/csi-vol-b22dcee8-b01d-11ee-879c-dab0780880f4 --device-type krbd --options noudev], rbd output: rbd: sysfs write failed
rbd: map failed: (95) Operation not supported
錯誤消息 “rbd: map failed,kernel 3.10.0-862.el7.x86_64 does not support required features” 表明您的 CentOS 操作系統(tǒng)內(nèi)核版本不支持所需的功能。
這個問題通常發(fā)生在使用 RBD (Rados Block Device) 時,該設(shè)備需要在內(nèi)核中啟用一些特定的功能。您的內(nèi)核版本可能過舊,不支持所需的功能。
解決此問題的一種方法是升級您的內(nèi)核版本。
問題小結(jié)
操作系統(tǒng)內(nèi)核版本過低,內(nèi)核中沒有RBD內(nèi)核模塊,兩種解決方案:(推薦安裝rdb內(nèi)核)
- 升級內(nèi)核(影響大)
- 安裝rdb內(nèi)核模塊(影響?。?/strong>
CentOS 上升級內(nèi)核可能對運行在其上的 Kubernetes (K8s) 環(huán)境產(chǎn)生一些影響。以下是一些可能的影響和注意事項:
- 容器運行時兼容性:在升級內(nèi)核之前,您需要確保所選的內(nèi)核版本與您使用的容器運行時兼容。不同的容器運行時可能對內(nèi)核版本有特定的要求。您應(yīng)該查看容器運行時的文檔或支持頁面,以了解其支持的內(nèi)核版本范圍。
- 內(nèi)核模塊和功能:升級內(nèi)核可能會導(dǎo)致某些內(nèi)核模塊或功能的更改或移除。如果您的 Kubernetes 集群依賴于特定的內(nèi)核模塊或功能,您需要確保新的內(nèi)核版本仍然支持這些要求。
- 容器網(wǎng)絡(luò):升級內(nèi)核可能會對容器網(wǎng)絡(luò)產(chǎn)生一些影響。某些網(wǎng)絡(luò)插件或驅(qū)動程序可能需要與特定的內(nèi)核版本配合使用。在升級內(nèi)核之前,您應(yīng)該檢查您使用的容器網(wǎng)絡(luò)插件或驅(qū)動程序的兼容性和支持情況。
- 安全性和性能改進:升級內(nèi)核通常會帶來安全性和性能方面的改進。新的內(nèi)核版本可能修復(fù)了一些已知的漏洞或改進了系統(tǒng)性能。這些改進可能會對您的 Kubernetes 集群產(chǎn)生積極的影響,提供更好的安全性和性能。
- 測試和驗證:在升級內(nèi)核之前,建議您在非生產(chǎn)環(huán)境中進行測試和驗證。您可以創(chuàng)建一個與生產(chǎn)環(huán)境相似的測試環(huán)境,并在該環(huán)境中進行內(nèi)核升級。這樣可以幫助您發(fā)現(xiàn)潛在的問題并解決它們,以確保升級過程順利進行。
在進行任何重要的系統(tǒng)更改之前,包括內(nèi)核升級,都建議您備份重要的數(shù)據(jù)和配置,以便在需要時進行恢復(fù)。此外,您還應(yīng)該參考 CentOS 和 Kubernetes 的官方文檔,以獲取更詳細(xì)的指導(dǎo)和建議,以確保您的升級過程正確無誤。
CentOS 7 編譯安裝 nbd 模塊
CentOS 7 編譯安裝 nbd 模塊-CSDN博客
CentOS 7 安裝 nbd - OrcHome
nbd內(nèi)核模塊介紹
“nbd” 是 Network Block Device(網(wǎng)絡(luò)塊設(shè)備)的縮寫,它是一種允許通過網(wǎng)絡(luò)連接將遠(yuǎn)程塊設(shè)備映射到本地系統(tǒng)的內(nèi)核模塊。它提供了一種將遠(yuǎn)程存儲設(shè)備(如硬盤、分區(qū)或鏡像文件)映射為本地塊設(shè)備的方法。
通過使用 nbd 內(nèi)核模塊,您可以在本地系統(tǒng)上像使用本地塊設(shè)備一樣使用遠(yuǎn)程存儲設(shè)備。這對于需要遠(yuǎn)程訪問和操作存儲設(shè)備的應(yīng)用程序和系統(tǒng)非常有用。
一些常見的用例包括:
- 在分布式存儲系統(tǒng)中使用 nbd 將遠(yuǎn)程存儲設(shè)備映射到本地系統(tǒng),以實現(xiàn)高可用性和容錯性。
- 在虛擬化環(huán)境中,將遠(yuǎn)程存儲設(shè)備映射到虛擬機實例,以實現(xiàn)共享存儲和遷移虛擬機的能力。
- 在云環(huán)境中,將遠(yuǎn)程存儲設(shè)備映射到云實例,以實現(xiàn)持久化存儲和數(shù)據(jù)共享。
要使用 nbd 內(nèi)核模塊,您需要加載該模塊到內(nèi)核中,并使用相應(yīng)的工具配置和管理映射的遠(yuǎn)程塊設(shè)備。具體操作和配置可能因操作系統(tǒng)和使用的工具而有所不同。
請注意,nbd 內(nèi)核模塊的可用性和功能取決于您的操作系統(tǒng)和內(nèi)核版本。某些發(fā)行版可能已經(jīng)將 nbd 內(nèi)核模塊包含在默認(rèn)內(nèi)核中,而其他發(fā)行版可能需要手動安裝和配置。
在 Linux 系統(tǒng)中,nbd 內(nèi)核模塊通常位于 /lib/modules/<kernel_version>/kernel/drivers/block/nbd.ko 路徑下,其中 <kernel_version> 是您當(dāng)前使用的內(nèi)核版本。
如果您需要使用 nbd 內(nèi)核模塊,請確保您的系統(tǒng)具有適當(dāng)?shù)臋?quán)限,并按照操作系統(tǒng)和工具的文檔進行安裝和配置。
安裝 nbd 模塊
- 確認(rèn)nbd內(nèi)核模塊是否安裝
[root@localhost ~]# modprobe nbd
modprobe: FATAL: Module nbd not found.
- 查看 linux 版本
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core) #查看系統(tǒng)版本
[root@localhost ~]# uname -r #查看linux的內(nèi)核信息
3.10.0-957.el7.x86_64
- 安裝相關(guān)包
yum install kernel-devel kernel-headers elfutils-libelf-devel gcc+ gcc-c++ -y
- 下載內(nèi)核包
找對應(yīng)的kernel源碼包,一般yum都是升級到最新的,因此到 http://vault.centos.org/ 的整個7系列的最新版本目錄下去找:
wget https://vault.centos.org/7.9.2009/os/Source/SPackages/kernel-3.10.0-1160.el7.src.rpm
# 根據(jù)自己的系統(tǒng)版本去下載
# 7.9.2009 為 redhat-release 系統(tǒng)版本
# 3.10.0-1160.102.1.el7 為 uname -r 內(nèi)核信息
- 編譯
安裝bzip2
sudo yum install bzip2
開始編譯
rpm -ivh kernel-3.10.0-957.el7.src.rpm
cd ~/rpmbuild/SOURCES/
# 驗證文件,如果顯示的類型不是 "XZ compressed data",則可能是文件本身損壞或者文件類型不正確。
file linux-3.10.0-862.el7.tar.xz
#解壓 -C 指定目錄 /usr/src/kernels
tar Jxvf linux-3.10.0-957.el7.tar.xz -C /usr/src/kernels/
# 注意,這里使用的是大寫的 J 選項,而不是之前的小寫 j 選項。J 選項告訴 tar 命令使用 xz 工具來解壓縮文件。
#解壓后生成兩個文件
ll /usr/src/kernels/
drwxr-xr-x. 22 root root 4096 9月 6 08:07 3.10.0-957.27.2.el7.x86_64
drwxrwxr-x. 24 root root 4096 9月 6 08:17 linux-3.10.0-957.el7
###############################
cd /usr/src/kernels/linux-3.10.0-957.el7
#刪除所有編譯生成文件,內(nèi)核配置文件
make mrproper
cp /usr/src/kernels/3.10.0-957.27.2.el7.x86_64/Module.symvers ./
cp /boot/config-3.10.0-957.el7.x86_64 ./.config
#備份當(dāng)前.config文件為.config.old
make oldconfig
make prepare
make scripts
- 編譯
修改配置
vi drivers/block/nbd.c
#######################
// sreq.cmd_type = REQ_TYPE_SPECIAL;
sreq.cmd_type = 7; #修改為7
編譯
make CONFIG_BLK_DEV_NBD=m M=drivers/block
如果報以下錯誤:
make[1]: *** No rule to make target tools/objtool/objtool', needed bydrivers/block/floppy.o'. Stop.
則執(zhí)行:
make CONFIG_BLK_DEV_NBD=m M=drivers/block CONFIG_STACK_VALIDATION=
- 復(fù)制文件
cp drivers/block/nbd.ko /lib/modules/$(uname -r)/kernel/drivers/block/
depmod -a
- 驗證nbd是否安裝成功
modinfo nbd
輸出
filename: /lib/modules/3.10.0-1160.102.1.el7.x86_64/kernel/drivers/block/nbd.ko
license: GPL
description: Network Block Device
retpoline: Y
rhelversion: 7.9
srcversion: 171F87FBEBE350C33C34226
depends:
vermagic: 3.10.0 SMP mod_unload modversions
parm: nbds_max:number of network block devices to initialize (default: 16) (int)
parm: max_part:number of partitions per device (default: 0) (int)
parm: debugflags:flags for controlling debug output (int)
重新使用塊存儲驗證
- 重建驅(qū)動程序
kubectl delete po -l app=csi-cephfsplugin-provisioner -n rook-ceph
kubectl delete po -l app=csi-rbdplugin-provisioner -n rook-ceph
kubectl delete po -l app=csi-rbdplugin -n rook-ceph
kubectl delete po -l app=csi-cephfsplugin -n rook-ceph
- 查看csi-rbdplugin
W0111 05:13:24.427112 65526 util.go:250] kernel 3.10.0-862.el7.x86_64 does not support required features
W0111 05:13:24.427606 65526 rbd_attach.go:241] kernel version "3.10.0-862.el7.x86_64" doesn't support cookie feature
最終確認(rèn)是centos內(nèi)核不支持,建議使用centos8或者升級centos,建議依據(jù)如下:
升級centos驗證
先升級CentOS 操作系統(tǒng)驗證,你可以按照以下步驟進行操作:
- 備份數(shù)據(jù):在進行任何操作之前,強烈建議你備份重要的數(shù)據(jù)。升級過程可能會對系統(tǒng)進行更改,因此備份可以保護你的數(shù)據(jù)免受意外損失。
- 更新當(dāng)前系統(tǒng):在升級之前,確保你的當(dāng)前系統(tǒng)已經(jīng)是最新的狀態(tài)。運行以下命令來更新已安裝的軟件包:
sudo yum update -y
這將更新系統(tǒng)上的所有已安裝軟件包到最新版本。
- 安裝升級工具:CentOS 提供了一個名為 yum-utils 的軟件包,其中包含了用于升級 CentOS 的工具。如果你的系統(tǒng)上沒有安裝該軟件包,可以通過以下命令進行安裝:
sudo yum install yum-utils
- 運行系統(tǒng)升級:一旦你安裝了 yum-utils 工具,你可以使用 yum 命令來執(zhí)行實際的系統(tǒng)升級。運行以下命令來升級 CentOS:
sudo yum upgrade
這將檢查可用的更新并升級系統(tǒng)上的軟件包。根據(jù)系統(tǒng)的大小和網(wǎng)絡(luò)速度,升級過程可能需要一些時間。
- 重啟系統(tǒng):升級完成后,建議重新啟動系統(tǒng)以應(yīng)用所有更改。使用以下命令重新啟動系統(tǒng):
sudo reboot
# 重啟后內(nèi)核才會重新加載
- 驗證升級:系統(tǒng)重新啟動后,可以通過運行以下命令來驗證 CentOS 的版本:
[root@ksnode25 ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@ksnode25 ~]# uname -r
3.10.0-1160.105.1.el7.x86_64
[root@ksnode25 ~]# modprobe nbd
modprobe: FATAL: Module nbd not found.
升級后nbd需要重新安裝
重新運行發(fā)現(xiàn)運行正常
kubectl create -f mysql.yaml
kubectl create -f wordpress.yaml
查看rdb映射情況,進入mon pod終端執(zhí)行:rbd showmapped
進入升級centos機器查看dev設(shè)備信息如下,說明驗證成功
驗證小結(jié)
升級centos后部署成功,由于centos不在維護,生產(chǎn)環(huán)境建議更換操作系統(tǒng):
- Pacific(16.2.z)支持centos7和8
- ceph客戶端發(fā)現(xiàn)只有el8版本,https://mirrors.aliyun.com/ceph/rpm-16.2.10/el8/x86_64/
- CentOS Linux停止維護,推出了CentOS Stream項目
- 查看rook-ceph-tools系統(tǒng)版本:CentOS Stream release 8
總結(jié):綜合上圖可選擇centos8和Ubuntu20.04替換centos7,但是生產(chǎn)環(huán)境不建議使用CentOS Linux(停止維護),也不建議使用CentOS Stream(無法保證系統(tǒng)的穩(wěn)定性與兼容性),老項目不建議更換操作系統(tǒng)穩(wěn)定運行就行。新項目可以考慮使用其他穩(wěn)定操作系統(tǒng)。
操作系統(tǒng)選擇考慮
CentOS 7 停止維護后如何平替你的生產(chǎn)系統(tǒng)?
從習(xí)慣和兼容性考慮,CentOS Linux 和 Rocky Linux。您可能想知道Rocky Linux是否適合您。如果您依賴CentOS而不想運行CentOS Stream或為RHL付費,那么當(dāng)穩(wěn)定版本可用時,您可以考慮Rocky Linux 。
rockylinux安裝包下載_開源鏡像站-阿里云
重慶大學(xué)開源軟件鏡像站
CentOS Linux 和 Rocky Linux 都是基于 RHEL(Red Hat Enterprise Linux)的操作系統(tǒng),它們有很多相似之處,但也有一些區(qū)別。
- 起源和維護:
- CentOS Linux:CentOS Linux 是一個由社區(qū)維護的開源操作系統(tǒng),它是基于 RHEL 的重構(gòu)版本。在過去,CentOS Linux 通過重新編譯 RHEL 的源代碼來創(chuàng)建一個免費的替代品,并提供長期支持。
- Rocky Linux:Rocky Linux 是由 CentOS 創(chuàng)始人之一創(chuàng)建的一個社區(qū)驅(qū)動的企業(yè)級操作系統(tǒng)。它的目標(biāo)是提供一個免費、開源的替代方案,以填補 CentOS Linux 停止維護的空白。
- 繼承和兼容性:
- CentOS Linux:CentOS Linux 的目標(biāo)是與 RHEL 完全兼容,并提供與 RHEL 相同的功能和特性。它通常會在 RHEL 發(fā)布后的一段時間內(nèi)推出相應(yīng)的更新,以確保與 RHEL 的兼容性。
- Rocky Linux:Rocky Linux 也是基于 RHEL 的代碼構(gòu)建的,旨在提供與 RHEL 完全兼容的功能和特性。它的設(shè)計目標(biāo)是與 CentOS Linux 8 的二進制兼容,以便用戶可以平滑地從 CentOS Linux 遷移到 Rocky Linux。
- 社區(qū)支持:
- CentOS Linux:CentOS Linux 依賴于社區(qū)支持,用戶可以通過郵件列表、論壇和社區(qū)文檔等途徑獲取幫助。在過去,CentOS 社區(qū)一直提供了廣泛的支持和資源。
- Rocky Linux:Rocky Linux 同樣依賴于社區(qū)支持,它的目標(biāo)是建立一個活躍的社區(qū),提供用戶支持和貢獻。
總的來說,CentOS Linux 和 Rocky Linux 在目標(biāo)和理念上非常相似,都致力于提供一個免費、開源的 RHEL 替代方案。主要區(qū)別在于起源和維護方面,以及社區(qū)的背景和發(fā)展。如果你已經(jīng)在使用 CentOS Linux,Rocky Linux 可能是一個平滑的過渡選擇,因為它的設(shè)計目標(biāo)是與 CentOS Linux 8 兼容。無論選擇哪個操作系統(tǒng),都需要評估其社區(qū)支持、更新和兼容性等因素,以選擇適合你需求的操作系統(tǒng)。
文章來源:http://www.zghlxwxcb.cn/news/detail-819091.html
Rocky 8替換k8s節(jié)點驗證
不管是將centos7升級還是替換為Rocky 8,都要考慮對k8s集群的影響,防止操作將k8s搞崩潰,小編這兒推薦一種做法:文章來源地址http://www.zghlxwxcb.cn/news/detail-819091.html
- 驗證可行版本的centos后,將其加入k8s集群
- 保證可行版本的centos集群有,etcd、控制面板、worker節(jié)點
- 下架以前的老節(jié)點
到了這里,關(guān)于9.云原生存儲之ceph在k8s中應(yīng)用及問題處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!