Kubernetes最新的版本对有状态服务做了较多的增强,包括添加了CSI Plugin、Local Volume、PVC保护、Volume Resize等。本系列文章着重介绍K8S有状态服务的各种应用实践,并结合阿里云存储系列产品底座,为您使用K8S有状态服务拓展业务提供参考。
K8S有状态服务-LocalVolume使用最佳实践
介绍
云盘为阿里云存储团队提供的非共享存储,只能同时被一个 pod 挂载。集群中只有与云盘在同一个可用区(Zone)的节点才可以挂载云盘。
使用场景
某些对磁盘IO要求高的应用,且没有共享数据的需求,如Mysql、Redis等数据存储服务;
高速写日志的场景;
对存储数据需要持久化,不会因pod挂掉而消失;
两种使用云盘方案
静态方式:
手动创建PV、PVC资源对象;
这种方式适合于已经购买了云盘实例的情况下;
动态方式:
手动创建PVC,在PVC中声明StorageClass;
通过storageclass自动创建PV资源对象;
这种方式适合于没有购买云盘,在应用部署时自动购买的情况;
创建云盘PV
创建PV前要确保在ECS控制台创建了待用云盘,并获取云盘ID;
PV名字需要和云盘ID保持一致,如下:
apiVersion: v1
kind: PersistentVolume
metadata:
name: d-bp1j17ifxfasvts3tf40
labels:
alicloud-pvname: d-bp1j17ifxfasvts3tf40
failure-domain.beta.kubernetes.io/zone: cn-hangzhou-b
failure-domain.beta.kubernetes.io/region: cn-hangzhou
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
flexVolume:
driver: "alicloud/disk"
fsType: "ext4"
options:
volumeId: "d-bp1j17ifxfasvts3tf40"
其中,zone、region两个labels在多个zone环境下是必须的,此label会保证pod调度到云盘所在的zone;
failure-domain.beta.kubernetes.io/zone: cn-hangzhou-b
failure-domain.beta.kubernetes.io/region: cn-hangzhou
alicloud-pvname为一个标签,标明唯一pv,可以为pvc筛选pv配置中使用;
alicloud-pvname: d-bp1j17ifxfasvts3tf40
使用云盘卷创建应用
创建云盘存储声明PVC,使用selector进行pv筛选,这样可以精确配置PVC、PV的绑定关系;
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-disk
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
selector:
matchLabels:
alicloud-pvname: d-bp1j17ifxfasvts3tf40
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-static
labels:
app: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
volumeMounts:
- name: disk-pvc
mountPath: "/data"
volumes:
- name: disk-pvc
persistentVolumeClaim:
claimName: pvc-disk
高可用验证
创建应用
# kubectl create -f static.yaml
# kubectl get pod | grep static
nginx-static-85f99b4448-clnb2 1/1 Running 0 1m
# kubectl exec nginx-static-85f99b4448-clnb2 df | grep data
/dev/vdc 20511312 45080 19401272 1% /data
在云盘中创建文件:
# kubectl exec nginx-static-85f99b4448-clnb2 ls /data
lost+found
# kubectl exec nginx-static-85f99b4448-clnb2 touch /data/hello
# kubectl exec nginx-static-85f99b4448-clnb2 ls /data
hello
lost+found
删除Pod,验证文件持久化:
# kubectl delete pod nginx-static-85f99b4448-clnb2
pod "nginx-static-85f99b4448-clnb2" deleted
# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-static-85f99b4448-clnb2 0/1 Terminating 0 4m
nginx-static-85f99b4448-x5b28 0/1 ContainerCreating 0 4s
# kubectl exec nginx-static-85f99b4448-x5b28 ls /data
hello
lost+found