在OCI上使用Kubernetes进行存储动态配置

这是什么?

在Oracle的IaaS平台上,我们将介绍如何使用Kubernetes进行使用StorageClass实现动态存储规划。
我们将利用OCI的存储服务作为存储选项。

前提条件 (Paraphrased in Chinese) – 前提条件

假设使用OCI的Terraform基于Kubernetes的安装程序来构建Kubernetes集群。
有关该Kubernetes集群的构建步骤,请参阅此条目。

整体的趋势

要使用StorageClass进行动态存储的供应(可能不仅限于OCI,通常适用),需要进行以下准备工作。

    1. 准备工作

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进行存储动态配置的方法。

广告
将在 10 秒后关闭
bannerAds