前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实验手记:Kubernetes 中进行 PVC 的扩容

实验手记:Kubernetes 中进行 PVC 的扩容

作者头像
崔秀龙
发布2019-07-23 11:27:49
6.9K0
发布2019-07-23 11:27:49
举报
文章被收录于专栏:伪架构师

Kubernetes 1.11 版本中,PVC 的扩容功能进入了 Beta 阶段,一般来说,Kubernetes 功能进入 Beta 阶段就意味着基本可以用于生产了。这里就做几个小测试,看看这一功能的使用方法。

开始之前

首先当然是要有一个 Kubernetes 1.11 版本的集群。并且提供了支持 Auto provision 的存储。下面的实验是基于 Azure 的 ACS-Engine 集群。

创建 StorageClass

接下来准备两个 Storage Class 对象,分别命名为 commonexpend,二者主体基本一致,文件名分别为 sc-common.yaml 以及 sc-exp.yaml

代码语言:javascript
复制
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
 name: exp  # sc-common.yaml 中这里的值为 common
parameters:
 cachingmode: None
 kind: Managed
 storageaccounttype: Standard_LRS
provisioner: kubernetes.io/azure-disk
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true # sc-common.yaml 中删掉这一行
代码语言:javascript
复制
$ kubectl apply -f common.yaml
storageclass.storage.k8s.io/common created
$ kubectl apply -f exp.yaml
storageclass.storage.k8s.io/exp created

创建一个 PVC

我们接下来创建一个 PVC,初始首先测试一下 common 这个 Storageclass,后续的 PVC 操作都从这一个 YAML 中修改而来。

代码语言:javascript
复制
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
 name: myclaim
spec:
 accessModes:
   - ReadWriteOnce
 volumeMode: Filesystem
 resources:
   requests:
     storage: 2Gi
 storageClassName: common

同样使用 kubectl 创建这个 PVC:

代码语言:javascript
复制
$ kubectl apply -f pvc.yaml
persistentvolumeclaim/myclaim created
$ kubectl get pvc -w
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myclaim   Pending                                       common         9s
myclaim   Pending                                 common    10s
myclaim   Pending   pvc-e3f8e886-8776-11e8-b82d-000d3aa2ebc3   0                   common    11s
myclaim   Bound     pvc-e3f8e886-8776-11e8-b82d-000d3aa2ebc3   2Gi       RWO       common    11s

第一次扩容尝试

PVC 进入 Bound 状态之后,我们编辑 pvc.yaml,将容量改成 3Gi,并重新 Apply:

代码语言:javascript
复制
$ cat pvc.yaml | sed  "s/2Gi/3Gi/" | kubectl apply -f -
Error from server (Forbidden): error when applying patch:
...
for: "STDIN": persistentvolumeclaims "myclaim" is forbidden: only dynamically provisioned pvc can be resized and the storageclass that provisions the pvc must support resize

结果表明,这次扩容失败了,失败的原因是 Storageclass 不支持扩容

使用新的 Storageclass 创建 PVC

接下来我们将这个 PVC 删除,使用 exp 这个 Storageclass 重建 PVC:

代码语言:javascript
复制
$ kubectl delete -f pvc.yaml
persistentvolumeclaim "myclaim" deleted
$ sed -i .bak s/common/exp/ pvc.yaml
$ kubectl apply -f pvc.yaml
persistentvolumeclaim/myclaim created
$ kubectl get pvc -w
NAME      STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
myclaim   Bound     pvc-37eb6014-8778-11e8-b82d-000d3aa2ebc3   2Gi        RWO            exp            11s

创建之后,我们可以再次尝试对 PVC 进行扩容:

代码语言:javascript
复制
$ cat pvc.yaml | sed  "s/2Gi/1Gi/" | kubectl apply -f -
The PersistentVolumeClaim "myclaim" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value
$ cat pvc.yaml | sed  "s/2Gi/3Gi/" | kubectl apply -f -
persistentvolumeclaim/myclaim configured

这里两次执行命令:

  • 缩容是不允许的
  • 扩容成功

接下来我们再次获取 PVC 信息:

代码语言:javascript
复制
$ kubectl describe pvc myclaim
Name:          myclaim
Namespace:     default
StorageClass:  exp
Status:        Bound
Volume:        pvc-37eb6014-8778-11e8-b82d-000d3aa2ebc3
...
Capacity:      2Gi
Access Modes:  RWO
Conditions:
...
FileSystemResizePending
...
Waiting for user to (re-)start a pod to finish file system resize of volume on node.

这里会看到,虽然没出错,但是容量还是原有的 2G,他的 Condition 中提示,需要进行一个 Pod 绑定才能真正生效。

绑定 Pod

新建一个 Deployment 来使用前面创建的 PVC:

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: sleep
spec:
 replicas: 1
 template:
   metadata:
     labels:
       app: sleep
       version: v1
   spec:
     containers:
     - name: sleep
       image: dustise/sleep:v0.5
       imagePullPolicy: IfNotPresent
       volumeMounts:
       - name: data
         mountPath: "/data"
     volumes:
     - name: data
       persistentVolumeClaim:
         claimName: myclaim

再次查看 PVC 的情况:

代码语言:javascript
复制
$ kubectl describe pvc myclaim
...
Capacity:      3Gi

容量的修改的确生效了。

绑定之后的 PVC 扩容

再次对这个 PVC 进行扩容,我们这次从 3Gi 扩容到 4Gi:

代码语言:javascript
复制
$ cat pvc.yaml | sed  "s/2Gi/4Gi/" | kubectl apply -f -
persistentvolumeclaim/myclaim configured

然后获取一下 PVC 的情况:

代码语言:javascript
复制
$ kubectl describe pvc myclaim
...
Capacity:      3Gi
...
Events:
 Warning  VolumeResizeFailed     31s (x2 over 56s)  volume_expand
 Original Error: failed request: autorest/azure: Service returned an error. Status=<nil> Code="OperationNotAllowed" Message="Cannot resize disk k8s-5b49c85f-dynamic-pvc-37eb6014-8778-11e8-b82d-000d3aa2ebc3 while it is attached to running VM /subscriptions/6d9be255-d214-4502-a51d-08e1d9c4a7fb/resourceGroups/k8s/providers/Microsoft.Compute/virtualMachines/k8s-agentpool1-17067717-0."

这一情况看来,这次扩容仍然没有生效,错误信息中有提示,无法在已经成功挂载的卷上进行扩容,因此我们清除所有 Pod:

代码语言:javascript
复制
$ kubectl scale deployment sleep --replicas 0
deployment.extensions/sleep scaled

在相关 Pod 消失之后,我们可以再次 describe pvc myclaim,发现这个 PVC 又一次处于等待绑定的状态中。使用 scale 指令恢复 Deployment 运行:

代码语言:javascript
复制
$ kubectl scale deployment sleep --replicas 1
deployment.extensions/sleep scaled
$ kubectl describe pvc myclaim
...
Capacity:      4Gi
...

PVC 的扩容再次成功了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 伪架构师 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开始之前
    • 创建 StorageClass
      • 创建一个 PVC
        • 第一次扩容尝试
          • 使用新的 Storageclass 创建 PVC
            • 绑定 Pod
              • 绑定之后的 PVC 扩容
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档