4.3. 配置持久性存储

重要

Metering 是一个已弃用的功能。弃用的功能仍然包含在 OpenShift Container Platform 中,并将继续被支持。但是,这个功能会在以后的发行版本中被删除,且不建议在新的部署中使用。

有关 OpenShift Container Platform 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Container Platform 发行注记中已弃用和删除的功能部分。

Metering 需要持久性存储来保留 Metering Operator 收集的数据并存储报告结果。它支持多种存储系统和存储格式。选择您的存储系统并修改示例配置文件,以便为您的 metering 安装配置持久性存储。

4.3.1. 将数据存储至 Amazon S3 中

Metering 可以使用现有的 Amazon S3 存储桶,或为存储创建存储桶。

注意

Metering 不会管理或删除任何 S3 存储桶数据。您必须手动清理用于存储 metering 数据的 S3 存储桶。

流程

  1. 编辑 s3-storage.yaml 文件中的 spec.storage 部分:

    s3-storage.yaml 文件示例

    apiVersion: metering.openshift.io/v1
    kind: MeteringConfig
    metadata:
      name: "operator-metering"
    spec:
      storage:
        type: "hive"
        hive:
          type: "s3"
          s3:
            bucket: "bucketname/path/" 1
            region: "us-west-1" 2
            secretName: "my-aws-secret" 3
            # Set to false if you want to provide an existing bucket, instead of
            # having metering create the bucket on your behalf.
            createBucket: true 4

    1
    指定要存储数据的存储桶的名称。可选:指定存储桶中的路径。
    2
    指定存储桶的区域。
    3
    metering 命名空间中的一个 secret 的名称。它包含了 AWS 凭证信息(data.aws-access-key-iddata.aws-secret-access-key)。更多详情请查看以下示例 Secret 对象。
    4
    如果要提供现有 S3 存储桶,或者如果不想提供具有 CreateBucket 权限的 IAM 凭证,则把该字段设置为 false
  2. 使用以下 Secret 对象作为模板:

    AWS Secret 对象示例

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-aws-secret
    data:
      aws-access-key-id: "dGVzdAo="
      aws-secret-access-key: "c2VjcmV0Cg=="

    注意

    Aws-access-key-id 值和 aws-secret-access-key 值必须采用 base64 编码。

  3. 创建 secret:

    $ oc create secret -n openshift-metering generic my-aws-secret \
      --from-literal=aws-access-key-id=my-access-key \
      --from-literal=aws-secret-access-key=my-secret-key
    注意

    该命令会对您的 aws-access-key-id 值和 aws-secret-access-key 值自动进行 base64 编码。

aws-access-key-idaws-secret-access-key 凭证必须具有存储桶的读取和写入权限。以下 aws/read-write.json 文件显示授予所需权限的 IAM 策略:

aws/read-write.json 文件示例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:HeadBucket",
                "s3:ListBucket",
                "s3:ListMultipartUploadParts",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::operator-metering-data/*",
                "arn:aws:s3:::operator-metering-data"
            ]
        }
    ]
}

如果 s3-storage.yaml 文件中的 spec.storage.hive.s3.createBucket 被设置为 true 或取消设置,那么您应该使用包含创建和删除存储桶权限的 aws/read-write-create.json 文件:

aws/read-write-create.json 文件示例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Action": [
                "s3:AbortMultipartUpload",
                "s3:DeleteObject",
                "s3:GetObject",
                "s3:HeadBucket",
                "s3:ListBucket",
                "s3:CreateBucket",
                "s3:DeleteBucket",
                "s3:ListMultipartUploadParts",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::operator-metering-data/*",
                "arn:aws:s3:::operator-metering-data"
            ]
        }
    ]
}

4.3.2. 将数据存储至 S3 兼容存储中

您可以使用 S3 兼容存储,如 Noobaa。

流程

  1. 编辑 s3-compatible-storage.yaml 文件中的 spec.storage 部分:

    s3-compatible-storage.yaml 文件示例

    apiVersion: metering.openshift.io/v1
    kind: MeteringConfig
    metadata:
      name: "operator-metering"
    spec:
      storage:
        type: "hive"
        hive:
          type: "s3Compatible"
          s3Compatible:
            bucket: "bucketname" 1
            endpoint: "http://example:port-number" 2
            secretName: "my-aws-secret" 3

    1
    指定 S3 兼容存储桶的名称。
    2
    指定存储端点。
    3
    metering 命名空间中的一个 secret 的名称。它包含了 AWS 凭证信息(data.aws-access-key-iddata.aws-secret-access-key)。更多详情请查看以下示例 Secret 对象。
  2. 使用以下 Secret 对象作为模板:

    S3 兼容 Secret 对象示例

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-aws-secret
    data:
      aws-access-key-id: "dGVzdAo="
      aws-secret-access-key: "c2VjcmV0Cg=="

4.3.3. 将数据存储至 Microsoft Azure 中

要将数据存储至 Azure blob 存储中,必须使用已有容器。

流程

  1. 编辑 azure-blob-storage.yaml 文件中的 spec.storage 部分:

    azure-blob-storage.yaml 文件示例

    apiVersion: metering.openshift.io/v1
    kind: MeteringConfig
    metadata:
      name: "operator-metering"
    spec:
      storage:
        type: "hive"
        hive:
          type: "azure"
          azure:
            container: "bucket1" 1
            secretName: "my-azure-secret" 2
            rootDirectory: "/testDir" 3

    1
    指定容器名称。
    2
    指定 metering 命名空间中的 secret。更多详情请查看以下示例 Secret 对象。
    3
    可选:指定要存储数据的目录。
  2. 使用以下 Secret 对象作为模板:

    Azure Secret 对象示例

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-azure-secret
    data:
      azure-storage-account-name: "dGVzdAo="
      azure-secret-access-key: "c2VjcmV0Cg=="

  3. 创建 secret:

    $ oc create secret -n openshift-metering generic my-azure-secret \
      --from-literal=azure-storage-account-name=my-storage-account-name \
      --from-literal=azure-secret-access-key=my-secret-key

4.3.4. 将数据存储至 Google Cloud Storage 中

要将数据存储至 Google Cloud Storage 中,您必须使用现有的存储桶。

流程

  1. 编辑 gcs-storage.yaml 文件中的 spec.storage 部分:

    gcs-storage.yaml 文件示例

    apiVersion: metering.openshift.io/v1
    kind: MeteringConfig
    metadata:
      name: "operator-metering"
    spec:
      storage:
        type: "hive"
        hive:
          type: "gcs"
          gcs:
            bucket: "metering-gcs/test1" 1
            secretName: "my-gcs-secret" 2

    1
    指定存储桶的名称。您可选择在存储桶中指定要存储数据的目录。
    2
    指定 metering 命名空间中的 secret。更多详情请查看以下示例 Secret 对象。
  2. 使用以下 Secret 对象作为模板:

    Google Cloud Storage Secret 对象示例

    apiVersion: v1
    kind: Secret
    metadata:
      name: my-gcs-secret
    data:
      gcs-service-account.json: "c2VjcmV0Cg=="

  3. 创建 secret:

    $ oc create secret -n openshift-metering generic my-gcs-secret \
      --from-file gcs-service-account.json=/path/to/my/service-account-key.json

4.3.5. 将数据存储至共享卷中

Metering 默认不配置存储。但是,您可以使用任何 ReadWriteMany 持久性卷(PV)或置备 ReadWriteMany PV 的存储类作为 Metering 存储。

注意

不建议在生产环境中使用 NFS。将 RHEL 上的 NFS 服务器用作存储后端可能无法满足 metering 要求,并可能无法提供 Metering Operator 正常工作所需的性能。

市场中的其他 NFS 实现可能没有这些问题,如 Parallel Network File System(pNFS)。pNFS 是一个带有分布式和并行功能的 NFS 实现。如需了解更多与此问题相关的信息,请联络相关的 NFS 厂商。

流程

  1. 修改 shared-storage.yaml 文件,以使用 ReadWriteMany 持久性卷进行存储:

    apiVersion: metering.openshift.io/v1
    kind: MeteringConfig
    metadata:
      name: "operator-metering"
    spec:
      storage:
        type: "hive"
        hive:
          type: "sharedPVC"
          sharedPVC:
            claimName: "metering-nfs" 1
            # Uncomment the lines below to provision a new PVC using the specified storageClass. 2
            # createPVC: true
            # storageClass: "my-nfs-storage-class"
            # size: 5Gi

    从以下配置选项中任选一个:

    1
    storage.hive.sharedPVC.claimName 设置为一个现存 ReadWriteMany 持久性卷声明(PVC)的名称。如果您没有动态卷置备,或想要对持久性卷的创建方式拥有更多控制权,则需要此配置。
    2
    storage.hive.sharedPVC.createPVC 设置为 true,并将 storage.hive.sharedPVC.storageClass 设置为具有 ReadWriteMany 访问模式的存储类的名称。此配置使用动态卷置备来自动创建卷。
  2. 为 metering 创建部署 NFS 服务器所需的以下资源对象。使用 oc create -f <file-name\".yaml 命令来创建对象 YAML 文件。

    1. 配置 PersistentVolume 资源对象:

      nfs_persistentvolume.yaml 文件示例

      apiVersion: v1
      kind: PersistentVolume
      metadata:
        name: nfs
        labels:
          role: nfs-server
      spec:
        capacity:
          storage: 5Gi
        accessModes:
        - ReadWriteMany
        storageClassName: nfs-server 1
        nfs:
          path: "/"
          server: REPLACEME
        persistentVolumeReclaimPolicy: Delete

      1
      必须与 [kind: StorageClass].metadata.name 字段值完全匹配。
    2. 使用 nfs-server 角色配置 Pod 资源对象:

      nfs_server.yaml 文件示例

      apiVersion: v1
      kind: Pod
      metadata:
        name: nfs-server
        labels:
          role: nfs-server
      spec:
        containers:
          - name: nfs-server
            image: <image_name> 1
            imagePullPolicy: IfNotPresent
            ports:
              - name: nfs
                containerPort: 2049
            securityContext:
              privileged: true
            volumeMounts:
            - mountPath: "/mnt/data"
              name: local
        volumes:
          - name: local
            emptyDir: {}

      1
      安装您的 NFS 服务器镜像。
    3. 使用 nfs-server 角色配置 Service 资源对象:

      nfs_service.yaml 文件示例

      apiVersion: v1
      kind: Service
      metadata:
        name: nfs-service
        labels:
          role: nfs-server
      spec:
        ports:
        - name: 2049-tcp
          port: 2049
          protocol: TCP
          targetPort: 2049
        selector:
          role: nfs-server
        sessionAffinity: None
        type: ClusterIP

    4. 配置 StorageClass 资源对象:

      nfs_storageclass.yaml 文件示例

      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: nfs-server 1
      provisioner: example.com/nfs
      parameters:
        archiveOnDelete: "false"
      reclaimPolicy: Delete
      volumeBindingMode: Immediate

      1
      必须与 [kind: PersistentVolume].spec.storageClassName 字段值完全匹配。
警告

NFS 存储以及所有相关资源对象的具体配置,会取决于您用于 Metering 存储的 NFS 服务器镜像。