使用云盘cds -奇异果体育app竞彩官网下载
当前cds磁盘支持以形式(要求集群k8s版本≥1.11)和(deprecated)在集群中挂载。csi形式挂载需要创建pv和pvc存储资源后,再将pvc挂载到pod中;flexvolume(deprecated)形式支持直接在pod中以volume方式挂载。两种挂载方案都可以满足容器内特定数据持久化的需求,两者详细的区别请参考kubernetes官方文档:
准备工作
用户做好以下准备,才能在容器中挂载 cds 实例:
- 注册百度账号,并完成实名认证;
- 创建一个 cce k8s 集群。
注意:
- 当前裸金属服务器(bbc)节点不支持挂载cds磁盘,若集群中包含bbc节点,挂载cds的pod只能在云服务器(bcc)节点启动。
创建容器集群
- 创建一个容器集群,操作步骤参考创建集群。
- 下载命令行客户端 kubectl,并连接集群,操作步骤参考。
操作指南
通过 pv/pvc 方式挂载
1. 安装 csi cds 插件
- 依次选择:容器引擎 cce -> helm 模版 -> 百度云模版
- 通过模版名称
cce-csi-cds-plugin
搜索模版
- 点击安装并填写相应的参数
参数说明
- 实例名称:插件实例名称,例:cds;
- 部署集群:选择需要部署 cds csi 插件的集群;
- 命名空间:管理实例的 helm 元数据的命名空间,例:kube-system;
- kubernetets 版本:填写实际部署集群的版本,目前支持:1.20、1.18、1.16、1.13;
- nodes:如果部署集群的节点的时候,指定了 kubelet 的数据目录,需要填写具体使用的数据目录到该列表,否则保持默认即可;
- region: 填写部署的集群所在的region,包括:bj(北京), su(苏州), gz(广州), bd(保定), hkg(香港), fwh(武汉);
- maxvolumespernode: 集群中每个节点最多可挂载的cds pv数量。该值不可大于,默认为5(与bcc该配额项默认值一致)。
2. 将 cds 挂载到 pod 中
通过pv/pvc方式使用cds,具体分为两种方式:
- 静态挂载:需要用户提前在百度智能云中创建好cds(),然后通过cds的volume id在集群中创建pv和pvc资源。
- 动态挂载:用户在集群中声明pvc时,自动创建出cds磁盘并且动态关联至pv。
静态挂载的方式需要用户提供的cds磁盘处于未挂载状态,并且确保填入正确的volume id。动态挂载在部分场景下可能会更加方便,但是需要注意动态挂载时将会自动创建cds磁盘并且计费,动态创建的cds将会随着用户删除pvc时被联动删除(需要将对应storageclass的reclaimpolicy参数设置为delete),但是如果用户在没有删除pvc的情况下直接删除了cce集群,则需要手动对这些cds进行处理。
静态挂载
创建pv/pvc
使用kubectl,执行 kubectl create -f pv-cds.yaml
完成pv的创建
对应的pv-cds.yaml文件如下所示:
apiversion: v1
kind: persistentvolume
metadata:
name: pv-cds
namespace: "default"
spec:
accessmodes:
- readwriteonce
capacity:
storage: 5gi
csi:
driver: "csi-cdsplugin"
volumehandle: "v-xxxx"
fstype: "ext4"
nodeaffinity:
required:
nodeselectorterms:
- matchexpressions:
- key: failure-domain.beta.kubernetes.io/zone
operator: in
values:
- zonea
persistentvolumereclaimpolicy: retain
注意:
- yaml中volumehandle字段对应的是cds volume id(短 id)。
- yaml中fstype字段不填写时默认值为ext4。filesystem模式下,若fstype与cds中实际文件系统类型不匹配,将导致挂载失败;若cds中尚无文件系统,则挂载时自动格式化cds为fstype指定的文件系统。
- yaml中nodeaffinity中需要指定cds所在可用区,保证挂载该cds的pod只会被调度到与cds磁盘同可用区的node上。
创建pv后,输入kubectl get pv可以看见一个available状态的pv,如下所示:
$ kubectl get pv
name capacity access modes reclaim policy status claim storageclass reason age
pv-cds 5gi rwo retain available 22s
建立一个能够与该pv绑定的pvc
使用kubectl,执行 kubectl create -f pvc-cds.yaml
完成pvc的创建
对应的pvc-cds.yaml文件如下所示:
apiversion: v1
kind: persistentvolumeclaim
metadata:
name: csi-cds-pvc
spec:
accessmodes:
- readwriteonce
resources:
requests:
storage: 5gi
绑定前,pvc为pending状态
$ kubectl get pvc
name status volume capacity access modes storageclass age
cds-pvc pending 2s
绑定后,pv和pvc状态变为bound
$ kubectl get pv
name capacity access modes reclaim policy status claim storageclass reason age
pv-cds 5gi rwo retain bound default/csi-cds-pvc 4s
$ kubectl get pvc
name status volume capacity access modes storageclass age
csi-cds-pvc bound pv-cds 5gi rwo 36s
有关pv和pvc的更多设置和字段说明,见
创建pod
在pod spec内指定相应的pvc名称即可,使用kubectl,执行 kubectl create -f demo-cds-rc.yaml
完成rc的创建
对应的demo-cds-rc.yaml文件如下所示:
apiversion: apps/v1
kind: deployment
metadata:
name: web-server-deployment
labels:
test: ws
spec:
replicas: 1
selector:
matchlabels:
se: ws
template:
metadata:
labels:
se: ws
name: web-server
spec:
containers:
- name: web-server
image: nginx
volumemounts:
- mountpath: /var/lib/www/html
name: csi-cds-pvc
volumes:
- name: csi-cds-pvc
persistentvolumeclaim:
claimname: csi-cds-pvc
pod创建后,可以读写容器内的/var/lib/www/html路径来访问相应的cds存储上的内容。
由于创建pv和pvc时只支持accessmodes为readwriteonce,该pvc可以被一节点上的pod挂载读写。
释放pv/pvc
完成存储资源的使用后,可以释放pvc和pv资源,使用以下命令可以释放pvc
$ kubectl delete -f pvc-cds.yaml
释放pvc后,原来与之绑定的pv状态会变为release,如下所示:
name capacity access modes reclaim policy status claim storageclass reason age
pv-cds 5gi rwo retain released default/csi-cds-pvc 4m
输入以下指令释放pv资源
$ kubectl delete -f pv-cds.yaml
动态挂载
创建 storageclass
apiversion: storage.k8s.io/v1
kind: storageclass
metadata:
name: hp1 #名字可以自定义
provisioner: csi-cdsplugin
allowvolumeexpansion: true
volumebindingmode: waitforfirstconsumer
parameters:
paymenttiming: "postpaid" #prepaid or postpaid
storagetype: "hp1" #支持cloud_hp1, hp1, hdd
reservationlength: "3" #prepaid 模式下需要填写
reclaimpolicy: delete #支持 delete、retain 默认值为 delete
storageclass 参数说明:
storagetype
用于设置动态创建的 cds 盘的类型,支持:cloud_hp1 (通用型ssd),hp1 (高性能云磁盘),hdd (通用型hdd),具体可参考 bcc openapi 创建 cds 盘接口中的 storagetype 参数的说明:
paymenttiming
用于设置付费方式是:预付费 or 后付费
reservationlength
磁盘的保留时间,预付费模式下需要填写,单位为月
创建 pvc
在 pvc spec 中指定上面创建的 storageclass 名称,则在创建pvc时,会自动生成相应的pv进行绑定。
使用kubectl,执行 kubectl create -f csi-pvc-cds.yaml
完成pvc的创建。
假设创建的storageclass名称为hp1,对应的 csi-pvc-cds.yaml 文件如下所示:
kind: persistentvolumeclaim
apiversion: v1
metadata:
name: csi-pvc-cds
spec:
accessmodes:
- readwriteonce
storageclassname: hp1
resources:
requests:
storage: 5gi
pvc参数说明: pvc 中 resource request的 storge,对于不同storageclass中不同storagetype有相关限制。 hp1: 5~32765gb cloud_hp1: 50~32765gb hdd:5~32765gb
创建pvc后,可以看见相应的pv自动创建,pvc状态变为bound,即pvc已经与新创建的pv绑定。
$ kubectl create -f csi-pvc-cds.yaml
persistentvolumeclaim "csi-pvc-cds" created
$ kubectl get pvc
name status volume capacity access modes storageclass age
csi-pvc-cds bound pvc-1ab36e4d1d2711e9 5gi rwx hp1 4s
$ kubectl get pv
name capacity access modes reclaim policy status claim storageclass reason age
pvc-1ab36e4d1d2711e9 5gi rwx delete bound default/csi-pvc-cds hp1 7s
在pod内挂载pvc
在pod spec内指定相应的pvc名称即可,使用kubectl,执行 kubectl create -f dynamic-cds-pod.yaml
完成资源的创建。对应的dynamic-cds-pod.yaml文件如下所示:
apiversion: v1
kind: pod
metadata:
name: test-pvc-pod
labels:
app: test-pvc-pod
spec:
containers:
- name: test-pvc-pod
image: nginx
volumemounts:
- name: cds-pvc
mountpath: "/cds-volume"
volumes:
- name: cds-pvc
persistentvolumeclaim:
claimname: csi-pvc-cds
pod创建后,可以读写容器内的/cds-volume路径来访问相应的cds存储上的内容。
释放pvc时动态销毁绑定pv
删除pvc时,与之绑定的动态pv是否会被自动删除由自定义的 storageclass 中 reclaimpolicy 决定;reclaimpolicy 支持 delete、retain 默认值为 delete。
- delete:删除 pvc 会自动删除 pv,并且动态申请的 cds 会被自动释放
- retain:删除 pvc 时 pv 状态会变成 released,不会自动删除 pv,对应自动创建的 cds 需要到 cds console上手动释放
$ kubectl delete pvc csi-pvc-cds
persistentvolumeclaim "csi-pvc-cds" deleted
$ kubectl get pv
name capacity access modes reclaim policy status claim
pvc-1ab36e4d1d2711e9 40gi rwo retain released default/csi-pvc-cds hp1 3m
注意:
- 如果集群中存在使用动态方式挂载cds的pod,且对应storageclass中
reclaimpolicy
设置为delete
,这部分cds在集群删除集群时默认会保留,如果需要一同删除请在删除集群前手动停止相关pod并删除对应pvc。
在 statefuleset 里通过 claimtemple 批量使用 pvc 的场景,需要前置步骤为创建 storageclass
以 sts-claim.yaml为例
apiversion: apps/v1
kind: statefulset
metadata:
name: web
spec:
servicename: "nginx"
replicas: 2
selector:
matchlabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerport: 80
name: web
volumemounts:
- name: www
mountpath: /usr/share/nginx/html
volumeclaimtemplates:
- metadata:
name: www
spec:
accessmodes: [ "readwriteonce" ]
resources:
requests:
storage: 5gi
storageclassname: hp1
创建 sts-claim.yaml,同时会自动创建 pvc:
$ kubectl apply -f sts-claim.yaml
$ kubectl get pod
name ready status restarts age
web-0 1/1 running 0 3m
web-1 1/1 running 0 2m
$ kubectl get pvc
name status volume capacity access modes storageclass age
www-web-0 bound pvc-a1e885701d2f11e9 5gi rwo hp1 6m
www-web-1 bound pvc-c91edb891d2f11e9 5gi rwo hp1 5m
多可用区集群使用cds
目前cds不支持跨可用区,如果cce集群中有多个可用区的机器,动态挂载的方式可以通过设置storageclass的volume binding mode为waitforfirstconsumer
来自动根据pod被调度节点所处的可用区创建cds磁盘,或者通过设置storageclass中allowedtopologies
字段或pod的节点亲和属性来指定可用区;使用已有cds时,须指定pv的nodeaffinity参数实现可用区亲和性。
cce集群默认会为集群节点打上可用区标签:
$ kubectl get nodes --show-labels
name status roles age version labels
192.168.80.15 ready 13d v1.8.12 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/instance-type=bcc,beta.kubernetes.io/os=linux,failure-domain.beta.kubernetes.io/region=bj,failure-domain.beta.kubernetes.io/zone=zonec,kubernetes.io/hostname=192.168.80.15
其中 failure-domain.beta.kubernetes.io/zone=zonec 标签说明该集群节点处于c可用区。
1)设置storageclass的volume binding mode
通过指定volumebindingmode
为waitforfirstconsumer
来解决此问题。指定绑定模式为waitforfirstconsumer时,先进行pod的调度,随后根据调度结果对应的可用区创建cds。
使用示例
storageclass-waitforfirstconsumer-example.yaml
apiversion: storage.k8s.io/v1
kind: storageclass
metadata:
name: csi-cds
provisioner: csi-cdsplugin
allowvolumeexpansion: true
volumebindingmode: waitforfirstconsumer
parameters:
dynamicvolume: "true"
cdssizeingb: "40"
paymenttiming: "postpaid"
storagetype: "hp1"
reclaimpolicy: delete
sts-waitforfirstconsumer-example.yaml
apiversion: apps/v1
kind: statefulset
metadata:
name: web
spec:
servicename: "nginx"
replicas: 1
selector:
matchlabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerport: 80
name: web
volumemounts:
- name: www
mountpath: /usr/share/nginx/html
volumeclaimtemplates:
- metadata:
name: www
spec:
accessmodes: [ "readwriteonce" ]
resources:
requests:
storage: 5gi
storageclassname: csi-cds
具体详情请看相关文档:
2)通过storageclass的allowedtopologies字段强制指定zone方式
storageclass-multi-zone-temple.yaml
apiversion: storage.k8s.io/v1
kind: storageclass
metadata:
name: hp1-zonec
provisioner: csi-cdsplugin
parameters:
paymenttiming: "postpaid"
storagetype: "hp1"
reservationlength: "3"
reclaimpolicy: delete
volumebindingmode: waitforfirstconsumer
allowedtopologies:
- matchlabelexpressions:
- key: failure-domain.beta.kubernetes.io/zone
values:
- zonec
sts-multi-zone-temple.yaml
apiversion: apps/v1
kind: statefulset
metadata:
name: sts-multi-zone
spec:
servicename: "nginx"
replicas: 1
selector:
matchlabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerport: 80
name: web
volumemounts:
- name: www
mountpath: /usr/share/nginx/html
volumeclaimtemplates:
- metadata:
name: www
spec:
accessmodes: [ "readwriteonce" ]
resources:
requests:
storage: 40gi
storageclassname: hp1-zonec
在单个pod中挂载多块cds
注意:
- 在pod spec的volumes字段中,每块cds只能被声明一次。
- 在pod spec的volumemounts字段中,每块cds对应的volume可以被引用多次。
- 对于deployment/replicaset等资源,replicas域只能设置为1。
下面的示例 cds-multi-mount-example.yaml
将文件中声明的四块cds磁盘分别挂载到pod mysql-nginx内的my-nginx和my-mysql两个容器的相应路径下,其中test-data和test-data-2两个volume对应的cds为两个容器共享,而nginx-data和db-data两个volume对应的cds分别只挂载在各自容器中。
apiversion: apps/v1
kind: deployment
metadata:
name: mysql-nginx
spec:
replicas: 1
selector:
matchlabels:
app: mysql-nginx
template:
metadata:
name: mysql-nginx
labels:
app: mysql-nginx
spec:
containers:
- name: my-nginx
image: nginx
volumemounts:
- name: nginx-data
mountpath: /nginx-data
- name: test-data
mountpath: /test-data
- name: test-data-2
mountpath: /test-data-2
ports:
- containerport: 80
- name: my-mysql
image: mysql:5.7
volumemounts:
- name: db-data
mountpath: /db-data
- name: test-data
mountpath: /test-data
- name: test-data-2
mountpath: /test-data-2
ports:
- containerport: 3306
env:
- name: mysql_root_password
value: m6jshva8htxagnin
volumes:
- name: db-data
flexvolume:
driver: "baidubce/cds"
fstype: "ext4"
options:
volumeid: "v-hd8muxa7"
- name: nginx-data
flexvolume:
driver: "baidubce/cds"
fstype: "ext4"
options:
volumeid: "v-owehtlsi"
- name: test-data
flexvolume:
driver: "baidubce/cds"
fstype: "ext4"
options:
volumeid: "v-9phgvomu"
- name: test-data-2
flexvolume:
driver: "baidubce/cds"
fstype: "ext4"
options:
volumeid: "v-sxjd482v"
flexvolume字段说明:
- fstype:cds磁盘的文件系统,如果是新建的cds磁盘,将会自动格式化该cds磁盘为该文件系统
- volumeid:cds磁盘id,您可以从百度智能云控制台的页面获取
使用 kubectl create -f cds-multi-mount-example.yaml
创建相应的资源,相应的cds磁盘将会被挂载到文件中声明的各个目录下。pod在集群内发生漂移时,这些cds磁盘将会跟随pod一同迁移。
扩容 cds pv
扩容cds pv功能要求集群 kubernetes版本 ≥ 1.16,同时只针对动态创建的cds pv生效。
扩容cds pv的操作步骤如下:
- 确认对应的storageclass中已经添加
allowvolumeexpansion: true
配置。
apiversion: storage.k8s.io/v1
kind: storageclass
metadata:
name: hp1
allowvolumeexpansion: true #允许磁盘扩容
...
- 修改与pv绑定的pvc中
spec.resources.requests
中的磁盘容量为目标容量,触发扩容。
kind: persistentvolumeclaim
apiversion: v1
metadata:
name: csi-pvc-cds
spec:
accessmodes:
- readwriteonce
storageclassname: hp1
resources:
requests:
storage: 8gi #修改为目标磁盘大小
- 默认情况下cds csi插件仅支持离线扩容,即需要在pvc未被pod挂载时才会执行实际扩容动作。完成pvc容量request修改后,如果此时该pvc未被任何pod挂载,则会触发cds磁盘扩容操作,否则会等待挂载该pvc的pod停止后才开始扩容。具体扩容进度可以通过
kubectl describe pvc
查看对应的events了解。
如果需要在pvc被pod挂载状态下进行在线扩容,可以通过kubectl -n kube-system edit deployment csi-cdsplugin-controller-server
,给csi-cdsplugin
容器的添加启动参数--enable-online-expansion
,来启用在线扩容功能。但需要特别注意的是,同时进行磁盘读写和磁盘扩容可能导致*数据损坏*,非必要场景不建议开启在线扩容功能。
通过flexvolume方式挂载(deprecated)
注意:
- 须提前创建与集群节点所处地域和可用区相同的cds磁盘,cds磁盘状态为未挂载。
- cds同一时间只能挂载在一台bcc实例上。
- cds同一时间只能被一个pod声明使用。
- 对于deployment/replicaset等资源,replicas域只能设置为1。
1. 安装 cds flexvolume 插件
将如下内容保存为 cds-flexvolume.yaml ,执行 kubectl create -f cds-flexvolume.yaml
安装 cds flexvolume 插件。
apiversion: apps/v1
kind: daemonset
metadata:
name: cds-flex-volume-ds
namespace: kube-system
spec:
selector:
matchlabels:
app: cds-flex-volume-ds
template:
metadata:
name: cds-flex-volume-ds
labels:
app: cds-flex-volume-ds
spec:
hostnetwork: true
priorityclassname: system-node-critical
nodeselector:
beta.kubernetes.io/os: linux
containers:
- image: hub.baidubce.com/jpaas-public/cds-flex-volume:latest
imagepullpolicy: always
name: cds-flex-volume-ds
resources:
requests:
cpu: 20m
memory: 20mi
limits:
cpu: 200m
memory: 200mi
securitycontext:
privileged: true
volumemounts:
- name: flexvolume-mount
mountpath: /flexmnt
- name: log-volume
mountpath: /log-volume
volumes:
- name: flexvolume-mount
hostpath:
path: /usr/libexec/kubernetes/kubelet-plugins/volume/exec
- name: log-volume
hostpath:
path: /var/log
等待对应的 pod 处于 running 状态后,插件安装完成。
2. 将 cds 磁盘挂载到 pod 中
安装 cds flexvolume 插件后,下面的示例 cds-example.yaml 将文件中声明的 cds 磁盘挂载到 pod 内 my-nginx 容器的 /data 路径下。
apiversion: apps/v1
kind: deployment
metadata:
name: my-nginx
spec:
replicas: 1
selector:
matchlabels:
app: my-nginx
template:
metadata:
name: my-nginx
labels:
app: my-nginx
spec:
containers:
- name: my-nginx
image: nginx
volumemounts:
- name: cds-data
mountpath: /data
ports:
- containerport: 80
volumes:
- name: cds-data
flexvolume:
driver: "baidubce/cds"
fstype: "ext4"
options:
volumeid: "v-htxagtin"
flexvolume字段说明:
- fstype:cds磁盘的文件系统,如果是新建的cds磁盘,将会自动格式化该cds磁盘为该文件系统
- volumeid:cds磁盘id,您可以从百度智能云控制台的页面获取
使用 kubectl create -f cds-example.yaml
创建相应的资源,相应的cds磁盘将会被挂载到my-nginx容器内的/data目录下。pod在集群内发生漂移时,该cds磁盘将会跟随pod一同迁移。