6.10. AWS Elastic File Service CSI Driver Operator


6.10.1. 개요

OpenShift Container Platform은 AWS EFS(Elastic File Service)용 CSI(Container Storage Interface) 드라이버를 사용하여 PV(영구 볼륨)를 프로비저닝할 수 있습니다.

CSI Operator 및 드라이버를 사용할 때는 영구 스토리지CSI 볼륨 구성에 대해 숙지하는 것이 좋습니다.

AWS EFS CSI Driver Operator를 설치한 후 OpenShift Container Platform은 openshift-cluster-csi-drivers 네임스페이스에 기본적으로 AWS EFS CSI Operator 및 AWS EFS CSI 드라이버를 설치합니다. 이렇게 하면 AWS EFS CSI Driver Operator에서 AWS EFS 자산에 마운트되는 CSI 프로비저닝 PV를 생성할 수 있습니다.

  • AWS EFS CSI Driver Operator 는 설치 후 PVC(영구 볼륨 클레임)를 생성하는 데 사용할 스토리지 클래스를 기본적으로 생성하지 않습니다. 그러나 AWS EFS StorageClass를 수동으로 생성할 수 있습니다. AWS EFS CSI Driver Operator는 필요에 따라 스토리지 볼륨을 생성할 수 있도록 하여 동적 볼륨 프로비저닝을 지원합니다. 이렇게 하면 클러스터 관리자가 스토리지를 사전 프로비저닝할 필요가 없습니다.
  • AWS EFS CSI 드라이버를 사용하면 AWS EFS PV를 생성하고 마운트할 수 있습니다.
참고

AWS EFS는 영역 볼륨이 아닌 지역 볼륨만 지원합니다.

6.10.2. CSI 정보

스토리지 벤더는 일반적으로 Kubernetes의 일부로 스토리지 드라이버를 제공합니다. CSI(Container Storage Interface) 구현을 통해 타사 공급자는 코어 Kubernetes 코드를 변경하지 않고도 표준 인터페이스를 사용하여 스토리지 플러그인을 제공할 수 있습니다.

CSI Operator는 in-tree 볼륨 플러그인에서 사용할 수 없는 볼륨 스냅샷과 같은 OpenShift Container Platform 사용자 스토리지 옵션을 제공합니다.

6.10.3. AWS EFS CSI Driver Operator 설정

  1. AWS STS(Secure Token Service)와 함께 AWS EFS를 사용하는 경우 STS에 대한 역할 ARM(Amazon Resource Name)을 가져옵니다. 이는 AWS EFS CSI Driver Operator를 설치하는 데 필요합니다.
  2. AWS EFS CSI Driver Operator를 설치합니다.
  3. AWS EFS CSI 드라이버를 설치합니다.

6.10.3.1. 보안 토큰 서비스의 Amazon 리소스 이름 가져오기

다음 절차에서는 AWS Security Token Service(STS)에서 OpenShift Container Platform을 사용하여 AWS EFS CSI Driver Operator를 구성하기 위해 역할 ARM(Amazon Resource Name)을 가져오는 방법을 설명합니다.

중요

AWS EFS CSI Driver Operator를 설치하기 전에 다음 절차 를 수행합니다(AWS EFS CSI Driver Operator 설치 참조).

사전 요구 사항

  • cluster-admin 역할을 가진 사용자로 클러스터에 액세스합니다.
  • AWS 계정 인증 정보

프로세스

ARN 역할은 여러 가지 방법으로 얻을 수 있습니다. 다음 절차에서는 클러스터 설치와 동일한 개념 및 CCO 유틸리티(ccoctl) 바이너리 툴을 사용하는 하나의 방법을 보여줍니다.

STS를 사용하여 AWS EFS CSI Driver Operator 구성에 대한 역할 ARN을 가져오려면 다음을 수행합니다.

  1. STS를 사용하여 클러스터를 설치하는 데 사용한 OpenShift Container Platform 릴리스 이미지에서 ccoctl 을 추출합니다. 자세한 내용은 "Cloud Credential Operator 유틸리티 구성"을 참조하십시오.
  2. 다음 예와 같이 EFS CredentialsRequest YAML 파일을 생성하고 저장한 다음 credrequests 디렉터리에 배치합니다.

    예제

    apiVersion: cloudcredential.openshift.io/v1
    kind: CredentialsRequest
    metadata:
      name: openshift-aws-efs-csi-driver
      namespace: openshift-cloud-credential-operator
    spec:
      providerSpec:
        apiVersion: cloudcredential.openshift.io/v1
        kind: AWSProviderSpec
        statementEntries:
        - action:
          - elasticfilesystem:*
          effect: Allow
          resource: '*'
      secretRef:
        name: aws-efs-cloud-credentials
        namespace: openshift-cluster-csi-drivers
      serviceAccountNames:
      - aws-efs-csi-driver-operator
      - aws-efs-csi-driver-controller-sa
    Copy to Clipboard Toggle word wrap

  3. ccoctl 툴을 실행하여 AWS에서 새 IAM 역할을 생성하고 로컬 파일 시스템에서 YAML 파일을 생성합니다( <path_to_ccoctl_output_dir>/manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials.yaml).

    $ ccoctl aws create-iam-roles --name=<name> --region=<aws_region> --credentials-requests-dir=<path_to_directory_with_list_of_credentials_requests>/credrequests --identity-provider-arn=arn:aws:iam::<aws_account_id>:oidc-provider/<name>-oidc.s3.<aws_region>.amazonaws.com
    Copy to Clipboard Toggle word wrap
    • name=<name>은 추적을 위해 생성된 클라우드 리소스에 태그를 지정하는 데 사용되는 이름입니다.
    • region=<aws_region >은 클라우드 리소스가 생성되는 AWS 리전입니다.
    • dir=<path_to_directory_with_list_of_credentials_requests>/credrequests 는 이전 단계에서 EFS CredentialsRequest 파일을 포함하는 디렉터리입니다.
    • <aws_account_id& gt;는 AWS 계정 ID입니다.

      예제

      $ ccoctl aws create-iam-roles --name my-aws-efs --credentials-requests-dir credrequests --identity-provider-arn arn:aws:iam::123456789012:oidc-provider/my-aws-efs-oidc.s3.us-east-2.amazonaws.com
      Copy to Clipboard Toggle word wrap

      출력 예

      2022/03/21 06:24:44 Role arn:aws:iam::123456789012:role/my-aws-efs -openshift-cluster-csi-drivers-aws-efs-cloud- created
      2022/03/21 06:24:44 Saved credentials configuration to: /manifests/openshift-cluster-csi-drivers-aws-efs-cloud-credentials-credentials.yaml
      2022/03/21 06:24:45 Updated Role policy for Role my-aws-efs-openshift-cluster-csi-drivers-aws-efs-cloud-
      Copy to Clipboard Toggle word wrap

  4. 이전 단계에서 예제 출력 의 첫 번째 줄에서 ARN 역할을 복사합니다. 역할 ARN은 "Role"과 "created" 사이의 역할입니다. 이 예에서 ARN 역할은 "arn:aws:iam::123456789012:role/my-aws-efs -openshift-cluster-csi-drivers-aws-efs-cloud"입니다.

    AWS EFS CSI Driver Operator를 설치할 때 ARN 역할이 필요합니다.

6.10.3.2. AWS EFS CSI Driver Operator 설치

AWS EFS CSI Driver Operator (Red Hat Operator)는 기본적으로 OpenShift Container Platform에 설치되지 않습니다. 다음 절차에 따라 클러스터에서 AWS EFS CSI Driver Operator를 설치하고 구성합니다.

사전 요구 사항

  • OpenShift Container Platform 웹 콘솔에 액세스합니다.

프로세스

웹 콘솔에서 AWS EFS CSI Driver Operator를 설치하려면 다음을 수행합니다.

  1. 웹 콘솔에 로그인합니다.
  2. AWS EFS CSI Operator를 설치합니다.

    1. Operators OperatorHub를 클릭합니다.
    2. 필터 상자에 AWS EFS CSI를 입력하여 AWS EFS CSI Operator를 찾습니다.
    3. AWS EFS CSI Driver Operator 버튼을 클릭합니다.

      중요

      AWS EFS Operator가 아닌 AWS EFS CSI Driver Operator를 선택해야 합니다. AWS EFS Operator는 커뮤니티 Operator이며 Red Hat에서 지원하지 않습니다.

    4. AWS EFS CSI Driver Operator 페이지에서 설치를 클릭합니다.
    5. Operator 설치 페이지에서 다음을 확인합니다.

      • 역할 ARN 필드에 AWS EFS(Secure Token Service)를 사용하는 경우 보안 토큰 서비스 프로세스의 Amazon Resource Name(보안 토큰 서비스) 절차의 마지막 단계에서 복사한 ARN 역할을 입력합니다.
      • 클러스터의 모든 네임스페이스(기본값)가 선택됩니다.
      • 설치된 네임스페이스openshift-cluster-csi-drivers로 설정됩니다.
    6. 설치를 클릭합니다.

      설치가 완료되면 AWS EFS CSI Operator가 웹 콘솔의 설치된 Operators 섹션에 나열됩니다.

6.10.3.3. AWS EFS CSI 드라이버 설치

사전 요구 사항

  • OpenShift Container Platform 웹 콘솔에 액세스합니다.

프로세스

  1. Administration CustomResourceDefinitions ClusterCSIDriver 를 클릭합니다.
  2. Instances 탭에서 Create ClusterCSIDriver를 클릭합니다.
  3. 다음 YAML 파일을 사용합니다.

    apiVersion: operator.openshift.io/v1
    kind: ClusterCSIDriver
    metadata:
        name: efs.csi.aws.com
    spec:
      managementState: Managed
    Copy to Clipboard Toggle word wrap
  4. 생성을 클릭합니다.
  5. 다음 조건이 "True" 상태로 변경될 때까지 기다립니다.

    • AWSEFSDriverNodeServiceControllerAvailable
    • AWSEFSDriverControllerServiceControllerAvailable

6.10.4. AWS EFS 스토리지 클래스 생성

스토리지 클래스는 스토리지 수준 및 사용량을 구분하고 조정하는 데 사용됩니다. 스토리지 클래스를 정의하면 사용자는 동적으로 프로비저닝된 영구 볼륨을 얻을 수 있습니다.

AWS EFS CSI Driver Operator (Red Hat Operator) 는 설치 후 기본적으로 스토리지 클래스를 생성하지 않습니다. 그러나 AWS EFS 스토리지 클래스를 수동으로 생성할 수 있습니다.

6.10.4.1. 콘솔을 사용하여 AWS EFS 스토리지 클래스 생성

프로세스

  1. OpenShift Container Platform 콘솔에서 스토리지 StorageClasses 를 클릭합니다.
  2. StorageClasses 페이지에서 StorageClass 만들기 를 클릭합니다.
  3. StorageClass 페이지에서 다음 단계를 수행합니다.

    1. 스토리지 클래스를 참조할 이름을 입력합니다.
    2. 선택 사항: 설명을 입력합니다.
    3. 회수 정책을 선택합니다.
    4. Provisioner 드롭다운 목록에서 efs.csi.aws.com을 선택합니다.
    5. 선택 사항: 선택한 프로비저너의 구성 매개변수를 설정합니다.
  4. 생성을 클릭합니다.

6.10.4.2. CLI를 사용하여 AWS EFS 스토리지 클래스 생성

프로세스

  • StorageClass 오브젝트를 생성합니다.

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: efs-sc
    provisioner: efs.csi.aws.com
    parameters:
      provisioningMode: efs-ap 
    1
    
      fileSystemId: fs-a5324911 
    2
    
      directoryPerms: "700" 
    3
    
      gidRangeStart: "1000" 
    4
    
      gidRangeEnd: "2000" 
    5
    
      basePath: "/dynamic_provisioning" 
    6
    Copy to Clipboard Toggle word wrap
    1
    동적 프로비저닝을 사용하려면 provisioningModeefs-ap 이어야 합니다.
    2
    fileSystemId 는 수동으로 생성된 EFS 볼륨의 ID여야 합니다.
    3
    directoryPerms는 볼륨의 루트 디렉터리에 대한 기본 권한입니다. 이 예에서는 소유자만 볼륨에 액세스할 수 있습니다.
    4 5
    gidRangeStartgidRangeEnd는 AWS 액세스 지점의 GID를 설정하는 데 사용되는 POSIX 그룹 ID(GID) 범위를 설정합니다. 지정하지 않으면 기본 범위는 50000-7000000입니다. 각 프로비저닝 볼륨이므로 AWS 액세스 지점에는 이 범위의 고유한 GID가 할당됩니다.
    6
    basePath는 동적으로 프로비저닝된 볼륨을 생성하는 데 사용되는 EFS 볼륨의 디렉터리입니다. 이 경우 PV는 EFS 볼륨에서 "/dynamic_provisioning/<random uuid>"로 프로비저닝됩니다. 하위 디렉터리만 PV를 사용하는 pod에 마운트됩니다.
    참고

    클러스터 관리자는 각각 다른 EFS 볼륨을 사용하여 여러 StorageClass 오브젝트를 생성할 수 있습니다.

6.10.5. AWS EFS CSI 간 계정 지원

계정 간 지원을 통해 하나의 AWS 계정에 OpenShift Container Platform 클러스터를 보유하고 AWS EFS(Elastic File System) CSI(Container Storage Interface) 드라이버를 사용하여 다른 AWS 계정에 파일 시스템을 마운트할 수 있습니다.

사전 요구 사항

  • 관리자 권한을 사용하여 OpenShift Container Platform 클러스터에 액세스
  • 두 개의 유효한 AWS 계정
  • EFS CSI Operator가 설치되었습니다. EFS CSI Operator 설치에 대한 자세한 내용은 AWS EFS CSI Driver Operator 설치 섹션을 참조하십시오.
  • OpenShift Container Platform 클러스터 및 EFS 파일 시스템은 모두 동일한 AWS 리전에 있어야 합니다.
  • 다음 절차에서 사용되는 두 개의 가상 프라이빗 클라우드(VPC)가 다른 네트워크 CIDR(Classless Inter-Domain Routing) 범위를 사용하는지 확인합니다.
  • OpenShift Container Platform CLI(oc)에 액세스합니다.
  • AWS CLI에 액세스합니다.
  • jq 명령줄 JSON 프로세서에 액세스합니다.

프로세스

다음 절차에서는 설정 방법을 설명합니다.

  • OpenShift Container Platform AWS 계정 A: VPC 내에 배포된 Red Hat OpenShift Container Platform 클러스터 v4.16 이상을 포함합니다.
  • AWS 계정 B: VPC(네트워크, 라우팅 테이블, 네트워크 연결 포함)를 포함합니다. EFS 파일 시스템은 이 VPC에서 생성됩니다.

계정에서 AWS EFS를 사용하려면 다음을 수행합니다.

  1. 환경을 설정합니다.

    1. 다음 명령을 실행하여 환경 변수를 구성합니다.

      export CLUSTER_NAME="<CLUSTER_NAME>" 
      1
      
      export AWS_REGION="<AWS_REGION>" 
      2
      
      export AWS_ACCOUNT_A_ID="<ACCOUNT_A_ID>" 
      3
      
      export AWS_ACCOUNT_B_ID="<ACCOUNT_B_ID>" 
      4
      
      export AWS_ACCOUNT_A_VPC_CIDR="<VPC_A_CIDR>" 
      5
      
      export AWS_ACCOUNT_B_VPC_CIDR="<VPC_B_CIDR>" 
      6
      
      export AWS_ACCOUNT_A_VPC_ID="<VPC_A_ID>" 
      7
      
      export AWS_ACCOUNT_B_VPC_ID="<VPC_B_ID>" 
      8
      
      export SCRATCH_DIR="<WORKING_DIRECTORY>" 
      9
      
      export CSI_DRIVER_NAMESPACE="openshift-cluster-csi-drivers" 
      10
      
      export AWS_PAGER="" 
      11
      Copy to Clipboard Toggle word wrap
      1
      선택한 클러스터 이름입니다.
      2
      AWS 리전을 선택합니다.
      3
      AWS 계정 A ID.
      4
      AWS 계정 B ID.
      5
      계정 A의 VPC의 CIDR 범위.
      6
      계정 B의 VPC의 CIDR 범위.
      7
      계정 A(클러스터)의 VPC ID
      8
      계정 B의 VPC ID (EFS 크로스 계정)
      9
      임시 파일을 저장하는 데 사용할 쓰기 가능한 쓰기 가능한 디렉터리입니다.
      10
      드라이버가 기본이 아닌 네임스페이스에 설치된 경우 이 값을 변경합니다.
      11
      AWS CLI를 사용하면 모든 것이 stdout에 직접 출력됩니다.
    2. 다음 명령을 실행하여 작업 디렉터리를 생성합니다.

      mkdir -p $SCRATCH_DIR
      Copy to Clipboard Toggle word wrap
    3. OpenShift Container Platform CLI에서 다음 명령을 실행하여 클러스터 연결을 확인합니다.

      $ oc whoami
      Copy to Clipboard Toggle word wrap
    4. OpenShift Container Platform 클러스터 유형을 확인하고 노드 선택기를 설정합니다.

      EFS 교차 계정 기능을 사용하려면 EFS CSI 컨트롤러 Pod를 실행하는 노드에 AWS IAM 정책을 할당해야 합니다. 그러나 모든 OpenShift Container Platform 유형에서 이 문제가 일치하지는 않습니다.

      • 클러스터가 HyperShift(Hosted Control Plane)로 배포된 경우 다음 명령을 실행하여 NODE_SELECTOR 환경 변수를 설정하여 작업자 노드 레이블을 유지합니다.

        export NODE_SELECTOR=node-role.kubernetes.io/worker
        Copy to Clipboard Toggle word wrap
      • 다른 모든 OpenShift Container Platform 유형의 경우 다음 명령을 실행하여 마스터 노드 레이블을 유지하도록 NODE_SELECTOR 환경 변수를 설정합니다.

        export NODE_SELECTOR=node-role.kubernetes.io/master
        Copy to Clipboard Toggle word wrap
    5. 다음 명령을 실행하여 AWS CLI 프로필을 계정 전환의 환경 변수로 구성합니다.

      export AWS_ACCOUNT_A="<ACCOUNT_A_NAME>"
      export AWS_ACCOUNT_B="<ACCOUNT_B_NAME>"
      Copy to Clipboard Toggle word wrap
    6. 다음 명령을 실행하여 AWS CLI가 두 계정의 기본값으로 JSON 출력 형식으로 구성되어 있는지 확인합니다.

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_A}
      aws configure get output
      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      aws configure get output
      Copy to Clipboard Toggle word wrap

      이전 명령이 반환되는 경우:

      • no value: 기본 출력 형식은 이미 JSON으로 설정되어 있으며 변경 사항이 필요하지 않습니다.
      • 모든 값: JSON 형식을 사용하도록 AWS CLI를 재구성하십시오. 출력 형식 변경에 대한 자세한 내용은 AWS 문서 의 AWS CLI의 출력 형식 설정을 참조하십시오.
    7. 다음 명령을 실행하여 AWS_DEFAULT_PROFILE 과의 충돌을 방지하기 위해 쉘에서 AWS_PROFILE 을 설정 해제합니다.

      unset AWS_PROFILE
      Copy to Clipboard Toggle word wrap
  2. AWS 계정 B IAM 역할 및 정책을 구성합니다.

    1. 다음 명령을 실행하여 계정 B 프로필로 전환합니다.

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 EFS CSI Driver Operator의 IAM 역할 이름을 정의합니다.

      export ACCOUNT_B_ROLE_NAME=${CLUSTER_NAME}-cross-account-aws-efs-csi-operator
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 IAM 신뢰 정책 파일을 생성합니다.

      cat <<EOF > $SCRATCH_DIR/AssumeRolePolicyInAccountB.json
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::${AWS_ACCOUNT_A_ID}:root"
                  },
                  "Action": "sts:AssumeRole",
                  "Condition": {}
              }
          ]
      }
      EOF
      Copy to Clipboard Toggle word wrap
    4. 다음 명령을 실행하여 EFS CSI Driver Operator에 대한 IAM 역할을 생성합니다.

      ACCOUNT_B_ROLE_ARN=$(aws iam create-role \
        --role-name "${ACCOUNT_B_ROLE_NAME}" \
        --assume-role-policy-document file://$SCRATCH_DIR/AssumeRolePolicyInAccountB.json \
        --query "Role.Arn" --output text) \
      && echo $ACCOUNT_B_ROLE_ARN
      Copy to Clipboard Toggle word wrap
    5. 다음 명령을 실행하여 IAM 정책 파일을 생성합니다.

      cat << EOF > $SCRATCH_DIR/EfsPolicyInAccountB.json
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "VisualEditor0",
                  "Effect": "Allow",
                  "Action": [
                      "ec2:DescribeNetworkInterfaces",
                      "ec2:DescribeSubnets"
                  ],
                  "Resource": "*"
              },
              {
                  "Sid": "VisualEditor1",
                  "Effect": "Allow",
                  "Action": [
                      "elasticfilesystem:DescribeMountTargets",
                      "elasticfilesystem:DeleteAccessPoint",
                      "elasticfilesystem:ClientMount",
                      "elasticfilesystem:DescribeAccessPoints",
                      "elasticfilesystem:ClientWrite",
                      "elasticfilesystem:ClientRootAccess",
                      "elasticfilesystem:DescribeFileSystems",
                      "elasticfilesystem:CreateAccessPoint",
                      "elasticfilesystem:TagResource"
                  ],
                  "Resource": "*"
              }
          ]
      }
      EOF
      Copy to Clipboard Toggle word wrap
    6. 다음 명령을 실행하여 IAM 정책을 생성합니다.

      ACCOUNT_B_POLICY_ARN=$(aws iam create-policy --policy-name "${CLUSTER_NAME}-efs-csi-policy" \
         --policy-document file://$SCRATCH_DIR/EfsPolicyInAccountB.json \
         --query 'Policy.Arn' --output text) \
      && echo ${ACCOUNT_B_POLICY_ARN}
      Copy to Clipboard Toggle word wrap
    7. 다음 명령을 실행하여 역할에 정책을 연결합니다.

      aws iam attach-role-policy \
         --role-name "${ACCOUNT_B_ROLE_NAME}" \
         --policy-arn "${ACCOUNT_B_POLICY_ARN}"
      Copy to Clipboard Toggle word wrap
  3. AWS 계정 A IAM 역할 및 정책을 구성합니다.

    1. 다음 명령을 실행하여 계정 A 프로필로 전환합니다.

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_A}
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 IAM 정책 문서를 생성합니다.

      cat << EOF > $SCRATCH_DIR/AssumeRoleInlinePolicyPolicyInAccountA.json
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "${ACCOUNT_B_ROLE_ARN}"
          }
        ]
      }
      EOF
      Copy to Clipboard Toggle word wrap
    3. AWS 계정 A에서 다음 명령을 실행하여 AWS 관리 정책 "AmazonElasticFileSystemSystemClientFullAccess"를 OpenShift Container Platform 클러스터 마스터 역할에 연결합니다.

      EFS_CLIENT_FULL_ACCESS_BUILTIN_POLICY_ARN=arn:aws:iam::aws:policy/AmazonElasticFileSystemClientFullAccess
      declare -A ROLE_SEEN
      for NODE in $(oc get nodes --selector="${NODE_SELECTOR}" -o jsonpath='{.items[*].metadata.name}'); do
          INSTANCE_PROFILE=$(aws ec2 describe-instances \
              --filters "Name=private-dns-name,Values=${NODE}" \
              --query 'Reservations[].Instances[].IamInstanceProfile.Arn' \
              --output text | awk -F'/' '{print $NF}' | xargs)
          MASTER_ROLE_ARN=$(aws iam get-instance-profile \
              --instance-profile-name "${INSTANCE_PROFILE}" \
              --query 'InstanceProfile.Roles[0].Arn' \
              --output text | xargs)
          MASTER_ROLE_NAME=$(echo "${MASTER_ROLE_ARN}" | awk -F'/' '{print $NF}' | xargs)
          echo "Checking role: '${MASTER_ROLE_NAME}'"
          if [[ -n "${ROLE_SEEN[$MASTER_ROLE_NAME]:-}" ]]; then
              echo "Already processed role: '${MASTER_ROLE_NAME}', skipping."
              continue
          fi
          ROLE_SEEN["$MASTER_ROLE_NAME"]=1
          echo "Assigning policy ${EFS_CLIENT_FULL_ACCESS_BUILTIN_POLICY_ARN} to role ${MASTER_ROLE_NAME}"
          aws iam attach-role-policy --role-name "${MASTER_ROLE_NAME}" --policy-arn "${EEFS_CLIENT_FULL_ACCESS_BUILTIN_POLICY_ARN}"
      done
      Copy to Clipboard Toggle word wrap
  4. 역할을 가정할 수 있도록 IAM 엔터티에 정책을 연결합니다.

    이 단계는 클러스터 구성에 따라 다릅니다. 다음 두 시나리오 모두에서 EFS CSI Driver Operator는 엔터티를 사용하여 AWS에 인증하며 이 엔티티에는 계정 B에서 역할을 가정할 수 있는 권한이 부여되어야 합니다.

    클러스터가 있는 경우:

    • STS가 활성화되지 않음: EFS CSI Driver Operator는 AWS 인증을 위해 IAM 사용자 엔터티를 사용합니다. 역할 가정을 허용하기 위해 IAM 사용자에게 정책 연결을 진행합니다.
    • STS가 활성화되어 있습니다. EFS CSI Driver Operator는 AWS 인증을 위해 IAM 역할 엔터티를 사용합니다. 역할 가정을 허용하려면 " IAM 역할에 연결 정책 적용" 단계를 진행합니다.
  5. 역할 가정 허용을 위해 IAM 사용자에게 정책 연결

    1. 다음 명령을 실행하여 EFS CSI Driver Operator에서 사용하는 IAM 사용자를 식별합니다.

      EFS_CSI_DRIVER_OPERATOR_USER=$(oc -n openshift-cloud-credential-operator get credentialsrequest/openshift-aws-efs-csi-driver -o json | jq -r '.status.providerStatus.user')
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 IAM 사용자에게 정책을 연결합니다.

      aws iam put-user-policy \
          --user-name "${EFS_CSI_DRIVER_OPERATOR_USER}"  \
          --policy-name efs-cross-account-inline-policy \
          --policy-document file://$SCRATCH_DIR/AssumeRoleInlinePolicyPolicyInAccountA.json
      Copy to Clipboard Toggle word wrap
  6. 역할을 가정할 수 있도록 IAM 역할에 정책을 연결합니다.

    1. 다음 명령을 실행하여 현재 EFS CSI Driver Operator에서 사용하는 IAM 역할 이름을 식별합니다.

      EFS_CSI_DRIVER_OPERATOR_ROLE=$(oc -n ${CSI_DRIVER_NAMESPACE} get secret/aws-efs-cloud-credentials -o jsonpath='{.data.credentials}' | base64 -d | grep role_arn | cut -d'/' -f2) && echo ${EFS_CSI_DRIVER_OPERATOR_ROLE}
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 EFS CSI Driver Operator에서 사용하는 IAM 역할에 정책을 연결합니다.

       aws iam put-role-policy \
          --role-name "${EFS_CSI_DRIVER_OPERATOR_ROLE}"  \
          --policy-name efs-cross-account-inline-policy \
          --policy-document file://$SCRATCH_DIR/AssumeRoleInlinePolicyPolicyInAccountA.json
      Copy to Clipboard Toggle word wrap
  7. VPC 피어링을 구성합니다.

    1. 다음 명령을 실행하여 계정 A에서 계정 B로의 피어링 요청을 시작합니다.

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_A}
      PEER_REQUEST_ID=$(aws ec2 create-vpc-peering-connection --vpc-id "${AWS_ACCOUNT_A_VPC_ID}" --peer-vpc-id "${AWS_ACCOUNT_B_VPC_ID}" --peer-owner-id "${AWS_ACCOUNT_B_ID}" --query VpcPeeringConnection.VpcPeeringConnectionId --output text)
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 계정 B에서 피어링 요청을 수락합니다.

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      aws ec2 accept-vpc-peering-connection --vpc-peering-connection-id "${PEER_REQUEST_ID}"
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 계정 A의 경로 테이블 ID를 검색하고 계정 B VPC에 경로를 추가합니다.

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_A}
      for NODE in $(oc get nodes --selector=node-role.kubernetes.io/worker | tail -n +2 | awk '{print $1}')
      do
          SUBNET=$(aws ec2 describe-instances --filters "Name=private-dns-name,Values=$NODE" --query 'Reservations[*].Instances[*].NetworkInterfaces[*].SubnetId' | jq -r '.[0][0][0]')
          echo SUBNET is ${SUBNET}
          ROUTE_TABLE_ID=$(aws ec2 describe-route-tables --filters "Name=association.subnet-id,Values=${SUBNET}" --query 'RouteTables[*].RouteTableId' | jq -r '.[0]')
          echo Route table ID is $ROUTE_TABLE_ID
          aws ec2 create-route --route-table-id ${ROUTE_TABLE_ID} --destination-cidr-block ${AWS_ACCOUNT_B_VPC_CIDR} --vpc-peering-connection-id ${PEER_REQUEST_ID}
      done
      Copy to Clipboard Toggle word wrap
    4. 계정 B의 경로 테이블 ID를 검색하고 다음 명령을 실행하여 계정 A VPC에 경로를 추가합니다.

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      for ROUTE_TABLE_ID in $(aws ec2 describe-route-tables   --filters "Name=vpc-id,Values=${AWS_ACCOUNT_B_VPC_ID}"   --query "RouteTables[].RouteTableId" | jq -r '.[]')
      do
          echo Route table ID is $ROUTE_TABLE_ID
          aws ec2 create-route --route-table-id ${ROUTE_TABLE_ID} --destination-cidr-block ${AWS_ACCOUNT_A_VPC_CIDR} --vpc-peering-connection-id ${PEER_REQUEST_ID}
      done
      Copy to Clipboard Toggle word wrap
  8. 계정 A에서 EFS로 NFS 트래픽을 허용하도록 계정 B에서 보안 그룹을 구성합니다.

    1. 다음 명령을 실행하여 계정 B 프로필로 전환합니다.

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 EFS 액세스를 위해 VPC 보안 그룹을 구성합니다.

      SECURITY_GROUP_ID=$(aws ec2 describe-security-groups --filters Name=vpc-id,Values="${AWS_ACCOUNT_B_VPC_ID}" | jq -r '.SecurityGroups[].GroupId')
      aws ec2 authorize-security-group-ingress \
       --group-id "${SECURITY_GROUP_ID}" \
       --protocol tcp \
       --port 2049 \
       --cidr "${AWS_ACCOUNT_A_VPC_CIDR}" | jq .
      Copy to Clipboard Toggle word wrap
  9. 계정 B에서 지역 전체 EFS 파일 시스템을 생성합니다.

    1. 다음 명령을 실행하여 계정 B 프로필로 전환합니다.

      export AWS_DEFAULT_PROFILE=${AWS_ACCOUNT_B}
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 지역 전체 EFS 파일 시스템을 생성합니다.

      CROSS_ACCOUNT_FS_ID=$(aws efs create-file-system --creation-token efs-token-1 \
      --region ${AWS_REGION} \
      --encrypted | jq -r '.FileSystemId') \
      && echo $CROSS_ACCOUNT_FS_ID
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 EFS의 지역 전체 마운트 대상을 구성합니다.

      for SUBNET in $(aws ec2 describe-subnets \
        --filters "Name=vpc-id,Values=${AWS_ACCOUNT_B_VPC_ID}" \
        --region ${AWS_REGION} \
        | jq -r '.Subnets.[].SubnetId'); do \
          MOUNT_TARGET=$(aws efs create-mount-target --file-system-id ${CROSS_ACCOUNT_FS_ID} \
          --subnet-id ${SUBNET} \
          --region ${AWS_REGION} \
          | jq -r '.MountTargetId'); \
          echo ${MOUNT_TARGET}; \
      done
      Copy to Clipboard Toggle word wrap

      그러면 VPC의 각 서브넷에 마운트 지점이 생성됩니다.

  10. 계정 간 액세스를 위해 EFS Operator를 구성합니다.

    1. 다음 명령을 실행하여 후속 단계에서 생성할 시크릿 및 스토리지 클래스에 대한 사용자 정의 이름을 정의합니다.

      export SECRET_NAME=my-efs-cross-account
      export STORAGE_CLASS_NAME=efs-sc-cross
      Copy to Clipboard Toggle word wrap
    2. OpenShift Container Platform CLI에서 다음 명령을 실행하여 계정 B에서 ARN 역할을 참조하는 시크릿을 생성합니다.

      oc create secret generic ${SECRET_NAME} -n ${CSI_DRIVER_NAMESPACE} --from-literal=awsRoleArn="${ACCOUNT_B_ROLE_ARN}"
      Copy to Clipboard Toggle word wrap
    3. OpenShift Container Platform CLI에서 다음 명령을 실행하여 새로 생성된 보안에 대한 CSI 드라이버 컨트롤러 액세스 권한을 부여합니다.

      oc -n ${CSI_DRIVER_NAMESPACE} create role access-secrets --verb=get,list,watch --resource=secrets
      oc -n ${CSI_DRIVER_NAMESPACE} create rolebinding --role=access-secrets default-to-secrets --serviceaccount=${CSI_DRIVER_NAMESPACE}:aws-efs-csi-driver-controller-sa
      Copy to Clipboard Toggle word wrap
    4. OpenShift Container Platform CLI에서 다음 명령을 실행하여 계정 B의 EFS ID와 이전에 생성된 시크릿을 참조하는 새 스토리지 클래스를 생성합니다.

      cat << EOF | oc apply -f -
      kind: StorageClass
      apiVersion: storage.k8s.io/v1
      metadata:
        name: ${STORAGE_CLASS_NAME}
      provisioner: efs.csi.aws.com
      parameters:
        provisioningMode: efs-ap
        fileSystemId: ${CROSS_ACCOUNT_FS_ID}
        directoryPerms: "700"
        gidRangeStart: "1000"
        gidRangeEnd: "2000"
        basePath: "/dynamic_provisioning"
        csi.storage.k8s.io/provisioner-secret-name: ${SECRET_NAME}
        csi.storage.k8s.io/provisioner-secret-namespace: ${CSI_DRIVER_NAMESPACE}
      EOF
      Copy to Clipboard Toggle word wrap

6.10.6. Amazon Elastic File Storage에 대한 동적 프로비저닝

AWS EFS CSI 드라이버는 다른 CSI 드라이버와 다른 형태의 동적 프로비저닝을 지원합니다. 새 PV를 기존 EFS 볼륨의 하위 디렉터리로 프로비저닝합니다. PV는 서로 독립적입니다. 그러나 모두 동일한 EFS 볼륨을 공유합니다. 볼륨이 삭제되면 프로비저닝된 모든 PV도 삭제됩니다. EFS CSI 드라이버는 이러한 각 하위 디렉터리에 대한 AWS 액세스 지점을 생성합니다. AWS AccessPoint 제한으로 인해 단일 StorageClass/EFS 볼륨에서 1000 PV만 동적으로 프로비저닝할 수 있습니다.

중요

PVC.spec.resources는 EFS에 의해 적용되지 않습니다.

아래 예제에서는 5GiB의 공간을 요청합니다. 그러나 생성된 PV는 제한적이며 페타바이트와 같이 원하는 양의 데이터를 저장할 수 있습니다. 손상된 애플리케이션이나 불량 애플리케이션도 볼륨에 너무 많은 데이터를 저장할 경우 상당한 비용이 발생할 수 있습니다.

AWS에서 EFS 볼륨 크기를 모니터링하는 것이 좋습니다.

사전 요구 사항

  • Amazon EFS(Elastic File Storage) 볼륨을 생성했습니다.
  • AWS EFS 스토리지 클래스를 생성했습니다.

프로세스

동적 프로비저닝을 활성화하려면 다음을 수행합니다.

  • 이전에 만든 StorageClass 를 참조하여 PVC(또는 StatefulSet 또는 Template)를 만듭니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test
    spec:
      storageClassName: efs-sc
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
    Copy to Clipboard Toggle word wrap

동적 프로비저닝을 설정하는 데 문제가 있는 경우 AWS EFS 문제 해결을 참조하십시오.

6.10.7. Amazon Elastic File Storage를 사용하여 정적 PV 생성

동적 프로비저닝 없이 Amazon EFS(Elastic File Storage) 볼륨을 단일 PV로 사용할 수 있습니다. 전체 볼륨이 pod에 마운트됩니다.

사전 요구 사항

  • Amazon EFS 볼륨을 생성했습니다.

프로세스

  • 다음 YAML 파일을 사용하여 PV를 생성합니다.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: efs-pv
    spec:
      capacity: 
    1
    
        storage: 5Gi
      volumeMode: Filesystem
      accessModes:
        - ReadWriteMany
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      csi:
        driver: efs.csi.aws.com
        volumeHandle: fs-ae66151a 
    2
    
        volumeAttributes:
          encryptInTransit: "false" 
    3
    Copy to Clipboard Toggle word wrap
    1
    spec.capacity에는 의미가 없으며 CSI 드라이버에서 무시합니다. PVC에 바인딩할 때만 사용됩니다. 애플리케이션은 볼륨에 원하는 양의 데이터를 저장할 수 있습니다.
    2
    volumeHandle은 AWS에서 생성한 EFS 볼륨과 동일해야 합니다. 자체 액세스 지점을 제공하는 경우 volumeHandle<EFS volume ID>::<access point ID> 여야 합니다. 예: fs-6e633ada::fsap-081a1d293f0004630.
    3
    필요한 경우 전송 시 암호화를 비활성화할 수 있습니다. 암호화는 기본적으로 활성화되어 있습니다.

정적 PV를 설정하는 데 문제가 있는 경우 AWS EFS 문제 해결을 참조하십시오.

6.10.8. Amazon Elastic File Storage 보안

다음 정보는 Amazon Elastic File Storage(Amazon EFS) 보안에 중요합니다.

예를 들어 앞에서 설명한 대로 동적 프로비저닝을 사용하여 액세스 지점을 사용하는 경우 Amazon은 파일의 GID를 액세스 지점의 GID로 자동으로 대체합니다. 또한 EFS는 파일 시스템 권한을 평가할 때 액세스 지점의 사용자 ID, 그룹 ID 및 보조 그룹 ID를 고려합니다. EFS는 NFS 클라이언트의 ID를 무시합니다. 액세스 지점에 대한 자세한 내용은 https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html 을 참조하십시오.

결과적으로 EFS 볼륨은 FSGroup을 자동으로 무시합니다. OpenShift Container Platform은 볼륨의 파일 GID를 FSGroup으로 대체할 수 없습니다. 마운트된 EFS 액세스 지점에 액세스할 수 있는 모든 Pod는 해당 노드의 모든 파일에 액세스할 수 있습니다.

이와 무관하게 전송 중 암호화는 기본적으로 활성화되어 있습니다. 자세한 내용은 https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html을 참조하십시오.

6.10.9. Amazon Elastic File Storage 문제 해결

다음 정보는 Amazon EFS(Elastic File Storage) 문제 해결 방법에 대한 지침을 제공합니다.

  • AWS EFS Operator 및 CSI 드라이버는 openshift-cluster-csi-drivers에서 실행됩니다.
  • AWS EFS Operator 및 CSI 드라이버의 로그 수집을 시작하려면 다음 명령을 실행합니다.

    $ oc adm must-gather
    [must-gather      ] OUT Using must-gather plugin-in image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:125f183d13601537ff15b3239df95d47f0a604da2847b561151fedd699f5e3a5
    [must-gather      ] OUT namespace/openshift-must-gather-xm4wq created
    [must-gather      ] OUT clusterrolebinding.rbac.authorization.k8s.io/must-gather-2bd8x created
    [must-gather      ] OUT pod for plug-in image quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:125f183d13601537ff15b3239df95d47f0a604da2847b561151fedd699f5e3a5 created
    Copy to Clipboard Toggle word wrap
  • AWS EFS Operator 오류를 표시하려면 ClusterCSIDriver 상태를 확인합니다.

    $ oc get clustercsidriver efs.csi.aws.com -o yaml
    Copy to Clipboard Toggle word wrap
  • 볼륨을 Pod에 마운트할 수 없는 경우(다음 명령의 출력에 표시된 대로):

    $ oc describe pod
    ...
      Type     Reason       Age    From               Message
      ----     ------       ----   ----               -------
      Normal   Scheduled    2m13s  default-scheduler  Successfully assigned default/efs-app to ip-10-0-135-94.ec2.internal
      Warning  FailedMount  13s    kubelet            MountVolume.SetUp failed for volume "pvc-d7c097e6-67ec-4fae-b968-7e7056796449" : rpc error: code = DeadlineExceeded desc = context deadline exceeded 
    1
    
      Warning  FailedMount  10s    kubelet            Unable to attach or mount volumes: unmounted volumes=[persistent-storage], unattached volumes=[persistent-storage kube-api-access-9j477]: timed out waiting for the condition
    Copy to Clipboard Toggle word wrap
    1
    볼륨이 마운트되지 않았음을 나타내는 경고 메시지입니다.

    이 오류는 AWS가 OpenShift Container Platform 노드와 Amazon EFS 간에 패킷을 삭제하기 때문에 발생하는 경우가 많습니다.

    다음 사항이 올바른지 확인합니다.

    • AWS 방화벽 및 보안 그룹
    • 네트워킹: 포트 번호 및 IP 주소

6.10.10. AWS EFS CSI Driver Operator 설치 제거

모든 EFS PV는 AWS EFS CSI Driver Operator (Red Hat Operator)를 설치 제거한 후 액세스할 수 없습니다.

사전 요구 사항

  • OpenShift Container Platform 웹 콘솔에 액세스합니다.

프로세스

웹 콘솔에서 AWS EFS CSI Driver Operator를 설치 제거하려면 다음을 수행합니다.

  1. 웹 콘솔에 로그인합니다.
  2. AWS EFS PV를 사용하는 모든 애플리케이션을 중지합니다.
  3. 모든 AWS EFS PV를 삭제합니다.

    1. 스토리지 영구 볼륨 클레임을 클릭합니다.
    2. AWS EFS CSI Driver Operator에서 사용 중인 각 PVC를 선택하고 PVC 오른쪽에 있는 드롭다운 메뉴를 클릭한 다음 영구 볼륨 클레임 삭제를 클릭합니다.
  4. AWS EFS CSI 드라이버를 설치 제거합니다.

    참고

    Operator를 설치 제거하려면 CSI 드라이버를 먼저 제거해야 합니다.

    1. Administration CustomResourceDefinitions ClusterCSIDriver 를 클릭합니다.
    2. 인스턴스 탭에서 efs.csi.aws.com의 맨 왼쪽에 있는 드롭다운 메뉴를 클릭한 다음 ClusterCSIDriver 삭제를 클릭합니다.
    3. 메시지가 표시되면 삭제를 클릭합니다.
  5. AWS EFS CSI Operator를 설치 제거합니다.

    1. Operators 설치된 Operators를 클릭합니다.
    2. 설치된 Operators 페이지에서 스크롤하거나 AWS EFS CSI를 이름으로 검색 상자에 입력하여 Operator를 찾은 다음 클릭합니다.
    3. 설치된 Operator > Operator 세부 정보 페이지 오른쪽 상단에서 작업 Operator 설치 제거를 클릭합니다.
    4. Operator 설치 제거 창이 표시되면 제거 버튼을 클릭하여 네임스페이스에서 Operator를 제거합니다. 클러스터에 Operator가 배포한 애플리케이션을 수동으로 정리해야 합니다.

      설치 제거 후 AWS EFS CSI Driver Operator는 더 이상 웹 콘솔의 설치된 Operator 섹션에 나열되지 않습니다.

참고

클러스터(openshift-install destroy cluster)를 제거하려면 먼저 AWS에서 EFS 볼륨을 삭제해야 합니다. 클러스터의 VPC를 사용하는 EFS 볼륨이 있는 경우 OpenShift Container Platform 클러스터를 삭제할 수 없습니다. Amazon에서는 이러한 VPC를 삭제할 수 없습니다.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat