导入现有的 EBS 卷

概览

如果您有一个 AWS Elastic Block Store (EBS) 卷要导入到 GKE on AWS,则可以创建 PersistentVolume (PV) 对象并将其预留给特定 PersistentVolumeClaim (PVC)。

本页面介绍如何使用填充了数据的现有 EBS 卷来创建 PV,以及如何在 pod 中使用 PV。

准备工作

  • anthos-aws 目录中,使用 anthos-gke 将上下文切换到用户集群。
    cd anthos-aws
    env HTTPS_PROXY=http://localhost:8118 \
      anthos-gke aws clusters get-credentials CLUSTER_NAME
    CLUSTER_NAME 替换为用户集群名称。

为预先存在的 EBS 卷创建 PersistentVolume

您可以指定新的 PV 来导入现有的 EBS 卷。

  1. 将以下 YAML 复制到名为 existing-volume.yaml 的文件中,并替换以下值以完成配置:

    • volume-capacity:卷的大小。例如 30Gi。 如需详细了解如何在 Kubernetes 中指定卷容量,请参阅内存含义
    • storage-class-name:预配卷的 StorageClass 的名称。例如,您可以使用默认 standard-rwo

    • ebs-id:EBS 卷 ID。例如 vol-05786ec9ec9526b67

    • fs-type:卷的文件系统。例如 ext4

    • zone:托管 EBS 卷的 AWS 可用性区域。例如 us-east-1c

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: volume-name
      annotations:
        pv.kubernetes.io/provisioned-by: ebs.csi.aws.com
    spec:
      capacity:
        storage: volume-capacity
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      storageClassName: storage-class-name
      claimRef:
        name: my-pvc
        namespace: default
      csi:
        driver: ebs.csi.aws.com
        volumeHandle: ebs-volume-id
        fsType: file-system-type
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: topology.ebs.csi.aws.com/zone
              operator: In
              values:
              - zone
    
  2. 将 YAML 应用到您的集群

    kubectl apply -f existing-volume.yaml
    
  3. 确认已创建 PV

    kubectl describe pv volume-name
    

    此命令的输出内容中包含 PV 的状态。

将卷与 PersistentVolumeClaim 和 pod 一起使用

导入卷后,您可以创建一个 PVC 和一个挂接该 PVC 的 pod。

下面的 YAML 会创建一个 PVC 并将其挂接到运行 Nginx Web 服务器的 pod。将其复制到名为 nginx.yaml 的文件中,并替换以下值以完成配置:

  • storage-class:您之前创建的 PersistentVolume 中的 StorageClass 名称。例如 standard-rwo
  • volume-name:您之前创建的卷名称。
  • volume-capacity:卷的大小。例如 30Gi
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  storageClassName: storage-class-name
  volumeName: volume-name
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: volume-capacity
---

apiVersion: v1
kind: Pod
metadata:
  name: web-server
spec:
  containers:
   - name: web-server
     image: nginx
     volumeMounts:
       - mountPath: /var/lib/www/html
         name: data
  volumes:
   - name: data
     persistentVolumeClaim:
       claimName: my-pvc
  1. 将 YAML 应用到您的集群

    kubectl apply -f nginx.yaml
    
  2. 使用 kubectl describe 检查 Nginx 实例的状态。输出的 STATUS 应为 Running

    kubectl describe pod web-server
    

使用加密的 EBS 卷

如果您的 EBS 卷是使用 AWS Key Management Service (KMS) 加密的,则需要授予 GKE on AWS 控制平面 AWS IAM 角色对 KMS 密钥的访问权限。

如需获取 AWS IAM 角色名称,请执行以下步骤:

  1. 切换到您的 GKE on AWS 配置所在的目录。 您在安装管理服务时创建了此目录。

    cd anthos-aws

  2. 选择您是使用 anthos-gke 工具创建的 GKE on AWS 环境,还是手动创建的 AWS IAM 配置文件。

    anthos-gke 工具

    使用 terraform output 命令并搜索 iamInstanceProfile 的值。

    terraform output | grep iamInstanceProfile
    

    如果您是使用 anthos- gke 工具创建的 GKE on AWS 环境,则输出将如下所示:

      iamInstanceProfile: gke-CLUSTER_ID-controlplane
      iamInstanceProfile: gke-CLUSTER_ID-nodepool
    

    其中,CLUSTER_ID 是您的集群 ID。复制 gke-CLUSTER_ID-controlplane 的值以供以下步骤使用。

    手动创建

    使用以下命令检查 terraform output 的输出:

    terraform output | less
    

    滚动输出,在 AWSCluster 定义后查找 iamInstanceProfile。

    kind: AWSCluster
    metadata:
      name: cluster-0
    spec:
      ...
      controlPlane:
       ...
        iamInstanceProfile: INSTANCE_PROFILE_NAME
    

    复制 INSTANCE_PROFILE_NAME 的值以供以下步骤使用。

  3. 如需授予控制平面访问 EBS 卷的权限,请将 gke-xxxxxx-controlplane AWS IAM 配置文件作为密钥用户添加到用于加密 EBS 卷的 AWS KMS 密钥中。

后续步骤