格物、致知、诚意、正心

0%

Kubernetes 使用 Aliyun OSS 作为持久化存储

插件选择

Kubernetes 与外部存储对接时要使用插件,自定义插件有很多协议。阿里云支持的插件为 FlexvolumeCSI,需要选择用哪一个插件搭建系统。由于 CSI 比较新,而且社区推荐使用,我这边就选择了 CSI。

Flexvolume

Flexvolume插件是Kubernetes社区较早实现的存储卷扩展机制。ACK从上线起,即支持Flexvolume类型数据卷服务。Flexvolume插件包括以下三部分。

  • Flexvolume:负责数据卷的挂载、卸载功能。ACK默认提供云盘、NAS、OSS三种存储卷的挂载能力。
  • Disk-Controller:负责云盘卷的自动创建能力。
  • Nas-Controller:负责NAS卷的自动创建能力。

CSI

CSI插件是当前Kubernetes社区推荐的插件实现方案。ACK集群提供的CSI存储插件兼容社区的CSI特性。CSI插件包括以下两部分:

  • CSI-Plugin:实现数据卷的挂载、卸载功能。ACK默认提供云盘、NAS、OSS三种存储卷的挂载能力。
  • CSI-Provisioner:实现数据卷的自动创建能力,目前支持云盘、NAS两种存储卷创建能力。

安装插件

命名空间

1
kubectl create namespace cloud-retirwer-k8s-plugin

RBAC

下载 RBAC 配置

1
wget https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/deploy/rbac.yaml

修改 namespace ,后续的所有配置也都要修改命名空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
# replace with the same namespace name with plugin
namespace: cloud-retirwer-k8s-plugin

---
# 省略权限配置
---

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: alicloud-csi-plugin
subjects:
- kind: ServiceAccount
name: admin
namespace: cloud-retirwer-k8s-plugin
roleRef:
kind: ClusterRole
name: alicloud-csi-plugin
apiGroup: rbac.authorization.k8s.io

加载配置

1
kubectl apply -f rbac.yaml

OSS-Plugin

下载配置

1
wget https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/deploy/oss/oss-plugin.yaml

修改 namespace

1
2
3
4
5
kind: DaemonSet
apiVersion: apps/v1beta2
metadata:
name: csi-ossplugin
namespace: cloud-retirwer-k8s-plugin

加载配置

1
kubectl apply -f oss-plugin.yaml

常见问题如下,k8s 高版本对于 beta 版 API 有所更改。

1
error: unable to recognize "oss-plugin.yaml": no matches for kind "DaemonSet" in version "apps/v1beta2"

如果碰见以上问题 ,则将版本修改为 V1

1
2
kind: DaemonSet
apiVersion: apps/v1

测试

需要提前创建好 OSS Bucket,配置好权限,获得访问密钥。

下载测试配置

1
2
3
wget https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/examples/oss/deploy.yaml
wget https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/examples/oss/pv.yaml
wget https://raw.githubusercontent.com/kubernetes-sigs/alibaba-cloud-csi-driver/master/examples/oss/pvc.yaml

修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apiVersion: v1
kind: PersistentVolume
metadata:
name: oss-csi-pv
labels:
alicloud-pvname: oss-csi-pv
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
csi:
driver: ossplugin.csi.alibabacloud.com
# set volumeHandle same value pv name
volumeHandle: oss-csi-pv
volumeAttributes:
bucket: "<*>"
url: "oss-cn-hangzhou.aliyuncs.com"
otherOpts: "-o max_stat_cache_size=0 -o allow_other"
akId: "<*>"
akSecret: "<*>"
path: "/test"

加载配置

1
2
3
kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml
kubectl apply -f deploy.yaml

检查运行状态,如果三个都正常就没问题了

1
2
3
kubectl get pv | grep oss
kubectl get pvc | grep oss
kubectl get pod | grep oss

使用

PV

使用此 CSI 主要是需要在定义 PV 的配置中做特殊配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-name
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
# 回收模式 一定要选保留
persistentVolumeReclaimPolicy: Retain
csi:
driver: ossplugin.csi.alibabacloud.com
# set volumeHandle same value pv name
volumeHandle: oss-csi-pv
volumeAttributes:
bucket: "<*>"
url: "oss-cn-hangzhou.aliyuncs.com"
otherOpts: "-o max_stat_cache_size=0 -o allow_other"
akId: "<*>"
akSecret: "<*>"
path: "/test"

存储大小

1
2
3
# 定义存储大小,Gi 代表以 1024 的算法进行计算大小
capacity:
storage: 5Gi

访问模式

1
2
3
# 访问模式 OSS 支持 ReadWriteMany
accessModes:
- ReadWriteOnce

回收模式

1
persistentVolumeReclaimPolicy: Retain

回收模式一般要选保留,不排除特殊情况

CSI

1
2
3
4
5
6
7
8
9
10
csi:
driver: ossplugin.csi.alibabacloud.com
volumeHandle: oss-csi-pv
volumeAttributes:
bucket: "<*>"
url: "oss-cn-hangzhou.aliyuncs.com"
otherOpts: "-o max_stat_cache_size=0 -o allow_other"
akId: "<*>"
akSecret: "<*>"
path: "/test"

driver 是所要挂载的驱动,需要和之前安装的相同,如果你用其他厂家或者是不同的产品,根据情况调整。volumeHandle 唯一标识从 CSI 卷插件的 CreateVolume 调用返回的卷名。随后在卷驱动程序的所有后续调用中使用卷句柄来引用该卷,一般和 PV 名称相同。volumeAttributes 则是外部服务提供商自己定义的值,OSS 目前是这些配置,其他厂家有不同的配置。

PVC

不需要做特殊配置。选择器需要匹配自己想要使用的 PV。

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: oss-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
selector:
matchLabels:
alicloud-pvname: oss-csi-pv

参考