在OCI上使用Kubernetes进行存储动态配置
这是什么?
在Oracle的IaaS平台上,我们将介绍如何使用Kubernetes进行使用StorageClass实现动态存储规划。
我们将利用OCI的存储服务作为存储选项。
前提条件 (Paraphrased in Chinese) – 前提条件
假设使用OCI的Terraform基于Kubernetes的安装程序来构建Kubernetes集群。
有关该Kubernetes集群的构建步骤,请参阅此条目。
整体的趋势
要使用StorageClass进行动态存储的供应(可能不仅限于OCI,通常适用),需要进行以下准备工作。
-
- 准备工作
1-1. 部署Volume Provisioner
1-2. 创建调用1-1的Storage Class
1-3. 进行与执行Volume Provisioner所需权限相关的设置
在Deployment或StatefulSet的清单中,使用StorageClass进行描述。
在符合该条目的前提条件的环境下,1-2和1-3已经完成了,所以只需完成1-1的准备工作即可。
如果您选择不使用Terraform基础的安装程序并自行构建,那么将需要完成所有的准备工作。在这种情况下,请参考OCI Volume Provisioner的MREADME以了解具体步骤。
步骤
那么我来试试看。
准备工作
将Volume Provisioner部署到集群中。
由于OCI Volume Provisioner的存储库已发布所需的清单,因此可以使用它来进行部署。
此时,最新版本为0.4.1,因此在这里使用它。
> kubectl apply -f https://github.com/oracle/oci-volume-provisioner/releases/download/0.4.1/oci-volume-provisioner.yaml
如果想更改版本,请根据需要替换0.4.1这部分。
使用StorageClass创建manifest。
由于已经在名为”oci”的名称下创建了Volume Provisioner所调用的StorageClass,因此我们将使用此manifest。
> kubectl get storageclass
NAME PROVISIONER AGE
oci (default) oracle.com/oci 4h
oci-ext3 oracle.com/oci 4h
如果使用PersistentVolumeClaim
在中文中,将以下内容进行释义为:使用 PersistentVolumeClaim 指定 StorageClass,并描述 Deployment 以使用该 PersistentVolumeClaim。
使用 StorageClass 来指定 PersistentVolumeClaim,并编写 Deployment 来使用它。
以下是Terraform Kubernetes Installer中的示例描述。
首先,持久化卷要求(PersistentVolumeClaim)。
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nginx-volume
spec:
storageClassName: "oci"
selector:
matchLabels:
oci-availability-domain: "US-ASHBURN-AD-1"
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
存储类名称指定为”oci”。由于OCI的存储容量下限为50G,因此需要将值设置为更大。
在选择器下面,指定了用于配置存储的可用域(类似于AWS的可用区)。
接下来是部署的主要内容。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 2
template:
metadata:
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
volumeMounts:
- name: nginx-storage
mountPath: "/usr/share/nginx/html"
volumes:
- name: nginx-storage
persistentVolumeClaim:
claimName: nginx-volume
在volume部分,指定上述的persistentVolumeClaim。
如果使用VolumeClaimTemplates
在StatefulSet的清单中,可以在VolumeClaimTemplates下面写入Volume的信息。在这种情况下,可以使用annotation来指定StorageClass。
这个annotation是可省略的,如果没有其他方式来分配Volume,将使用oci的Provisioner。关于多种方式的优先级是如何确定的,我们将逐步进行调查。
以下是一个部署Zookeeper的StatefulSet的示例。
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
name: pzoo
namespace: kafka
spec:
serviceName: "pzoo"
replicas: 3
template:
metadata:
labels:
app: zookeeper
storage: persistent
spec:
containers:
- name: zookeeper
--- 中略 ---
volumeMounts:
- name: config
mountPath: /etc/kafka
- name: data
mountPath: /var/lib/zookeeper/data
volumes:
- name: config
configMap:
name: zookeeper-config
volumeClaimTemplates:
- metadata:
name: data
annotations:
volume.beta.kubernetes.io/storage-class: "oci"
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 50Gi
在这种情况下,存储将为部署Pod的可用域进行配置。
以上是在OCI上使用Kubernetes进行存储动态配置的方法。