k8s挂载云硬盘CBS及重启pod遇到ContainerCreating
1. 背景
云上应用需要挂载云硬盘,操作步骤记录
2. 实践
# (1)获取ceph秘钥信息
# (2)根据秘钥生成secret.yml, 并通过kubectl create -f secret.yml启动
# (3)创建pv.yaml,并通过kubectl create -f pv.yaml启动
apiVersion: v1
kind: PersistentVolume
metadata:
name: demo-pv ##pv名称
spec:
capacity:
storage: 1024Mi ## pv大小,与云硬盘大小一致即可
accessModes:
- ReadWriteOnce ## pv读写类型,目前支持ReadWriteOnce和ReadOnlyMany
mountOptions:
- rw ##挂载类型有只读(ro),读写{rw},挂载类型和accessModes要对应起来
- discard ## discard 参数会自动回收磁盘释放的容量,如果没有该参数,会造成实际使用率与界面显示不一致
persistentVolumeReclaimPolicy: Retain ##目前只支持Retain模式
csi:
driver: ckecsi ##固定不变
volumeHandle: welkinhigh.cke-637860030208 ##与cbs实例列表接口instanceId字段对应
##实例列表接口:/cbs/regions/{regionId}/cbsInstances
fsType: xfs ##挂载文件系统类型xfs,ext4等
volumeAttributes:
monitors: XX1:6789,XX2:6789,XX3:6789
##cephmonitor信息,从/cbs/regions/{regionId}/secrets获取
pool: welkinhigh ##存储池信息,从cbs实例列表接口获取 poolName字段
##实例列表接口:/cbs/regions/{regionId}/cbsInstances
imageFormat: "2" ##固定不变
imageFeatures: "layering" ##固定不变
adminId: admin ##固定不变
userId: '63786111108' ##账户ID
volName: cke-637860030208 ##云硬盘实例列表接口imageName字段
mounter: rbd ##
637860030208: AYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
##密钥信息从接口/cbs/regions/{regionId}/secrets获取,此处无需base64转码
admin: XXXXXXXXXXX
##密钥信息从接口/cbs/regions/{regionId}/secrets获取,此处无需base64转码
controllerPublishSecretRef:
name: cke-secret ##秘钥名称
namespace: default
nodeStageSecretRef:
name: cke-secret
namespace: default
nodePublishSecretRef:
name: cke-secret
namespace: default
# (4) 创建pvc.yaml,并通过kubectl create -f pvc.yaml创建
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc ##pvc名称
namespace: default
spec: ##pv的筛选条件
accessModes:
- ReadWriteOnce ## pv读写模式
volumeName: test ##指定pv名称,此为可选字段,当指定特定的pv名称时,只有对应的名称的pv能被bound
resources:
requests:
storage: 30Gi ##pv大小
# (5) 修改pod的yaml文件,重启
apiVersion: apps/v1
kind: Deployment
metadata:
name: test
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: test
template:
metadata:
labels:
app: test
spec:
hostAliases:
- ip: "0.0.0.0"
hostnames:
- "china.local"
containers:
- name: test
image: /path/to/image:latest
ports:
- name: test-port
containerPort: 8090
protocol: TCP
volumeMounts:
- name: cbs1
mountPath: /data/test
volumes:
- name: cbs1
persistentVolumeClaim:
claimName: demo-pvc
3. 问题
3.1 # pod重启后一直ContainerCreating
# 查看pod容器详情
kubectl describe pod pod-7558b66fdb-6sxxx
Events:
Type Reason Age From Message
Normal Scheduled
default-scheduler Successfully assigned default/smart-hr-7558b66fdb-6sxxx to 192.168.0.1
Warning FailedAttachVolume 58s (x10 over 5m8s) attachdetach-controller AttachVolume.Attach failed for volume "test" : failed to load secret "default/test": secrets "test" not found
Warning FailedMount 52s (x2 over 3m5s) kubelet, 192.168.0.1 Unable to attach or mount volumes: unmounted volumes=[cbs1], unattached volumes=[cbs1 default-token-8m2vk]: timed out waiting for the condition
# 缺失secret服务,启动
kubectl create -f secret.yml
# 再次启动应用
kubectl create -f test.yaml
# 获取pod列表
kubectl get pods
# 进入pod查看挂载情况
kubectl exec -ti test-7558b66fdb-htzx8 -n default -- /bin/sh
df -h
3.2 pod启动后查看应用的日志
kubectl logs -f smart-hr-7558b66fdb-xnrft
# 日志全部重定向到文件
kubectl logs smart-hr-7558b66fdb-xnrft > t.log
4. 引用
k8s学习之 k8s中pod的容器日志查看命令(转载)
k8s出现ContainerCreating,问题解决
5. 拓展
测试生成文件
# python2.7
>>> t = open("test.txt", "w")
>>> t.write('a'*30000000000)
>>> t.close()
还存在两个问题,1.监控页面无法实时看到存储使用情况;2.需要测试pod重启后,CBS中的数据文件不会被清空。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App