3.13. AWS VPC 클러스터를 AWS Outpost로 확장


OpenShift Container Platform 버전 4.14에서는 AWS Outposts에서 기술 프리뷰로 실행되는 컴퓨팅 노드가 있는 AWS(Amazon Web Services)에 클러스터를 설치할 수 있었습니다. OpenShift Container Platform 버전 4.15부터 이 설치 방법은 더 이상 지원되지 않습니다. 대신 AWS의 클러스터를 기존 VPC에 설치하고 설치 후 구성 작업으로 AWS Outpost에서 컴퓨팅 노드를 프로비저닝할 수 있습니다.

AWS(Amazon Web Services)의 클러스터를 기존 Amazon VPC(Virtual Private Cloud)에 설치한 후 AWS Outposts에 컴퓨팅 머신을 배포하는 컴퓨팅 머신 세트를 생성할 수 있습니다. AWS Outposts는 온프레미스 환경의 대기 시간을 단축하여 클라우드 기반 AWS 배포의 많은 기능을 사용할 수 있는 AWS 엣지 컴퓨팅 서비스입니다. 자세한 내용은 AWS Outposts 설명서 를 참조하십시오.

3.13.1. OpenShift Container Platform 요구 사항 및 제한 사항에 대한 AWS Outposts

다음 요구 사항 및 제한 사항을 수용하도록 OpenShift Container Platform 클러스터를 구성하는 경우 클라우드 기반 AWS 클러스터와 유사하게 AWS Outpost에서 리소스를 관리할 수 있습니다.

  • AWS의 OpenShift Container Platform 클러스터를 Outpost로 확장하려면 클러스터를 기존 Amazon VPC(Virtual Private Cloud)에 설치해야 합니다.
  • Outpost의 인프라는 AWS 리전의 가용성 영역에 연결되어 있으며 전용 서브넷을 사용합니다. Outpost에 배포된 에지 컴퓨팅 시스템은 Outpost 서브넷과 Outpost가 연결된 가용성 영역을 사용해야 합니다.
  • AWS Kubernetes 클라우드 컨트롤러 관리자가 Outpost 서브넷을 검색하면 Outpost 서브넷에서 서비스 로드 밸런서를 생성하려고 합니다. AWS Outposts는 서비스 로드 밸런서 실행을 지원하지 않습니다. 클라우드 컨트롤러 관리자가 Outpost 서브넷에서 지원되지 않는 서비스를 생성하지 못하도록 하려면 Outpost 서브넷 구성에 kubernetes.io/cluster/unmanaged 태그를 포함해야 합니다. 이 요구 사항은 OpenShift Container Platform 버전 4.17의 해결 방법입니다. 자세한 내용은 OCPBUGS-30041 에서 참조하십시오.
  • AWS의 OpenShift Container Platform 클러스터에는 gp3-csigp2-csi 스토리지 클래스가 포함됩니다. 이러한 클래스는 Amazon EBS(Elastic Block Store) gp3 및 gp2 볼륨에 해당합니다. OpenShift Container Platform 클러스터는 기본적으로 gp3-csi 스토리지 클래스를 사용하지만 AWS Outposts는 EBS gp3 볼륨을 지원하지 않습니다.
  • 이 구현에서는 node-role.kubernetes.io/outposts 테인트를 사용하여 일반 클러스터 워크로드를 Outpost 노드에 분배하지 않습니다. Outpost에서 사용자 워크로드를 예약하려면 애플리케이션의 배포 리소스에 해당 허용 오차를 지정해야 합니다. 사용자 워크로드에 대해 AWS Outpost 인프라를 예약하면 기본 CSI를 gp2-csi 로 업데이트하여 호환되는 등 추가 구성 요구 사항이 발생하지 않습니다.
  • Outpost에서 볼륨을 생성하려면 CSI 드라이버에 Outpost Amazon Resource Name (ARN)이 필요합니다. 드라이버는 CSINode 오브젝트에 저장된 토폴로지 키를 사용하여 Outpost ARN을 확인합니다. 드라이버가 올바른 토폴로지 값을 사용하는지 확인하려면 볼륨 바인딩 모드를 WaitForConsumer 로 설정하고 생성한 새 스토리지 클래스에서 허용된 토폴로지를 설정하지 않아야 합니다.
  • AWS VPC 클러스터를 Outpost로 확장할 때 컴퓨팅 리소스의 두 가지 유형이 있습니다. VPC에는 클라우드 기반 컴퓨팅 노드가 있는 반면 Outpost에는 엣지 컴퓨팅 노드가 있습니다. 클라우드 기반 AWS Elastic Block 볼륨은 Outpost 엣지 컴퓨팅 노드에 연결할 수 없으며 외부 볼륨은 클라우드 기반 컴퓨팅 노드에 연결할 수 없습니다.

    결과적으로 CSI 스냅샷을 사용하여 클라우드 기반 컴퓨팅 노드에서 엣지 컴퓨팅 노드로 영구 스토리지를 사용하는 애플리케이션을 마이그레이션하거나 원래 영구 볼륨을 직접 사용할 수 없습니다. 애플리케이션의 영구 스토리지 데이터를 마이그레이션하려면 수동 백업 및 복원 작업을 수행해야 합니다.

  • AWS Outposts는 AWS Network Load Balancer 또는 AWS Classic Load Balancer를 지원하지 않습니다. AWS Application Load Balancers를 사용하여 AWS Outposts 환경에서 엣지 컴퓨팅 리소스의 로드 밸런싱을 활성화해야 합니다.

    Application Load Balancer를 프로비저닝하려면 Ingress 리소스를 사용하고 AWS Load Balancer Operator를 설치해야 합니다. 클러스터에 워크로드를 공유하는 엣지 및 클라우드 기반 컴퓨팅 인스턴스가 모두 포함된 경우 추가 구성이 필요합니다.

    자세한 내용은 "AWS VPC 클러스터에서 AWS Load Balancer Operator 사용"을 참조하십시오.

3.13.2. 환경에 대한 정보 얻기

AWS VPC 클러스터를 Outpost로 확장하려면 OpenShift Container Platform 클러스터 및 Outpost 환경에 대한 정보를 제공해야 합니다. 이 정보를 사용하여 네트워크 구성 작업을 완료하고 Outpost에 컴퓨팅 시스템을 생성하는 컴퓨팅 머신 세트를 구성합니다. 명령줄 툴을 사용하여 필요한 세부 정보를 수집할 수 있습니다.

3.13.2.1. OpenShift Container Platform 클러스터에서 정보 가져오기

OpenShift CLI(oc)를 사용하여 OpenShift Container Platform 클러스터에서 정보를 가져올 수 있습니다.

작은 정보

export 명령을 사용하여 이러한 값의 일부 또는 모든 값을 환경 변수로 저장할 수 있습니다.

사전 요구 사항

  • AWS의 사용자 지정 VPC에 OpenShift Container Platform 클러스터를 설치했습니다.
  • cluster-admin 권한이 있는 계정을 사용하여 클러스터에 액세스할 수 있습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  1. 다음 명령을 실행하여 클러스터의 인프라 ID를 나열합니다. 이 값을 유지합니다.

    $ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructures.config.openshift.io cluster
  2. 다음 명령을 실행하여 설치 프로그램에서 생성한 컴퓨팅 머신 세트에 대한 세부 정보를 가져옵니다.

    1. 클러스터의 컴퓨팅 머신 세트를 나열합니다.

      $ oc get machinesets.machine.openshift.io -n openshift-machine-api

      출력 예

      NAME                           DESIRED   CURRENT   READY   AVAILABLE   AGE
      <compute_machine_set_name_1>   1         1         1       1           55m
      <compute_machine_set_name_2>   1         1         1       1           55m

    2. 나열된 컴퓨팅 머신 세트 중 하나에 대한 AMI(Amazon Machine Image) ID를 표시합니다. 이 값을 유지합니다.

      $ oc get machinesets.machine.openshift.io <compute_machine_set_name_1> \
        -n openshift-machine-api \
        -o jsonpath='{.spec.template.spec.providerSpec.value.ami.id}'
    3. AWS VPC 클러스터의 서브넷 ID를 표시합니다. 이 값을 유지합니다.

      $ oc get machinesets.machine.openshift.io <compute_machine_set_name_1> \
        -n openshift-machine-api \
        -o jsonpath='{.spec.template.spec.providerSpec.value.subnet.id}'

3.13.2.2. AWS 계정에서 정보 가져오기

AWS CLI(aws)를 사용하여 AWS 계정에서 정보를 가져올 수 있습니다.

작은 정보

export 명령을 사용하여 이러한 값의 일부 또는 모든 값을 환경 변수로 저장할 수 있습니다.

사전 요구 사항

  • 필요한 하드웨어 설정이 완료된 AWS Outposts 사이트가 있습니다.
  • Outpost는 AWS 계정과 연결되어 있습니다.
  • 필요한 작업을 수행할 수 있는 권한이 있는 사용자로 AWS CLI(aws)를 사용하여 AWS 계정에 액세스할 수 있습니다.

프로세스

  1. 다음 명령을 실행하여 AWS 계정에 연결된 Outpost를 나열합니다.

    $ aws outposts list-outposts
  2. aws outposts list-outposts 명령의 출력에서 다음 값을 유지합니다.

    • Outpost ID입니다.
    • Outpost의 Amazon 리소스 이름(ARN)입니다.
    • Outpost 가용성 영역입니다.

      참고

      aws outposts list-outposts 명령의 출력에는 AvailabilityZoneAvailabilityZoneId과 관련된 두 개의 값이 포함됩니다. AvailablilityZone 값을 사용하여 Outpost에 컴퓨팅 시스템을 생성하는 컴퓨팅 머신 세트를 구성합니다.

  3. Outpost ID 값을 사용하여 다음 명령을 실행하여 Outpost에서 사용할 수 있는 인스턴스 유형을 표시합니다. 사용 가능한 인스턴스 유형의 값을 유지합니다.

    $ aws outposts get-outpost-instance-types \
      --outpost-id <outpost_id_value>
  4. Outpost ARN 값을 사용하여 다음 명령을 실행하여 Outpost의 서브넷 ID를 표시합니다. 이 값을 유지합니다.

    $ aws ec2 describe-subnets \
      --filters Name=outpost-arn,Values=<outpost_arn_value>

3.13.3. Outpost에 대한 네트워크 구성

VPC 클러스터를 Outpost로 확장하려면 다음 네트워크 구성 작업을 완료해야 합니다.

  • Cluster Network MTU를 변경합니다.
  • Outpost에 서브넷을 만듭니다.

3.13.3.1. AWS Outposts를 지원하도록 클러스터 네트워크 MTU 변경

설치하는 동안 클러스터 네트워크의 최대 전송 단위(MTU)는 클러스터에 있는 노드의 기본 네트워크 인터페이스의 MTU를 기반으로 자동으로 감지됩니다. AWS Outposts 서브넷을 지원하려면 클러스터 네트워크의 MTU 값을 줄여야 할 수 있습니다.

중요

MTU 업데이트가 적용되므로 마이그레이션이 중단되고 클러스터의 노드를 일시적으로 사용할 수 없게 될 수 있습니다.

중요한 서비스 중단 고려 사항을 포함하여 마이그레이션 프로세스에 대한 자세한 내용은 이 절차를 위한 추가 리소스의 "클러스터 네트워크의 MTU 변경"을 참조하십시오.

사전 요구 사항

  • OpenShift CLI(oc)가 설치되어 있습니다.
  • cluster-admin 권한이 있는 계정을 사용하여 클러스터에 액세스할 수 있습니다.
  • 클러스터의 대상 MTU를 식별했습니다. OVN-Kubernetes 네트워크 플러그인의 MTU는 클러스터에서 가장 낮은 하드웨어 MTU 값보다 100 으로 설정해야 합니다.

프로세스

  1. 클러스터 네트워크의 현재 MTU를 가져오려면 다음 명령을 입력합니다.

    $ oc describe network.config cluster

    출력 예

    ...
    Status:
      Cluster Network:
        Cidr:               10.217.0.0/22
        Host Prefix:        23
      Cluster Network MTU:  1400
      Network Type:         OVNKubernetes
      Service Network:
        10.217.4.0/23
    ...

  2. MTU 마이그레이션을 시작하려면 다음 명령을 입력하여 마이그레이션 구성을 지정합니다. Machine Config Operator는 MTU 변경을 준비하기 위해 클러스터에서 노드를 롤링 재부팅합니다.

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": <overlay_from>, "to": <overlay_to> } , "machine": { "to" : <machine_to> } } } } }'

    다음과 같습니다.

    <overlay_from>
    현재 클러스터 네트워크 MTU 값을 지정합니다.
    <overlay_to>
    클러스터 네트워크의 대상 MTU를 지정합니다. 이 값은 <machine_to> 값을 기준으로 설정됩니다. OVN-Kubernetes의 경우 이 값은 <machine_to> 값보다 100 미만이어야 합니다.
    <machine_to>
    기본 호스트 네트워크의 기본 네트워크 인터페이스에 대한 MTU를 지정합니다.

    클러스터 MTU를 줄이는 예

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": { "mtu": { "network": { "from": 1400, "to": 1000 } , "machine": { "to" : 1100} } } } }'

  3. Machine Config Operator는 각 머신 구성 풀에서 머신을 업데이트하므로 각 노드를 하나씩 재부팅합니다. 모든 노드가 업데이트될 때까지 기다려야 합니다. 다음 명령을 입력하여 머신 구성 풀 상태를 확인합니다.

    $ oc get machineconfigpools

    업데이트된 노드의 상태가 UPDATED=true, UPDATING=false,DEGRADED=false입니다.

    참고

    기본적으로 Machine Config Operator는 풀당 한 번에 하나의 머신을 업데이트하여 클러스터 크기에 따라 마이그레이션에 걸리는 총 시간을 늘립니다.

  4. 호스트의 새 머신 구성 상태를 확인합니다.

    1. 머신 구성 상태 및 적용된 머신 구성 이름을 나열하려면 다음 명령을 입력합니다.

      $ oc describe node | egrep "hostname|machineconfig"

      출력 예

      kubernetes.io/hostname=master-0
      machineconfiguration.openshift.io/currentConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/desiredConfig: rendered-master-c53e221d9d24e1c8bb6ee89dd3d8ad7b
      machineconfiguration.openshift.io/reason:
      machineconfiguration.openshift.io/state: Done

    2. 다음 구문이 올바른지 확인합니다.

      • machineconfiguration.openshift.io/state 필드의 값은 Done입니다.
      • machineconfiguration.openshift.io/currentConfig 필드의 값은 machineconfiguration.openshift.io/desiredConfig 필드의 값과 동일합니다.
    3. 머신 구성이 올바른지 확인하려면 다음 명령을 입력합니다.

      $ oc get machineconfig <config_name> -o yaml | grep ExecStart

      여기서 <config_name>machineconfiguration.openshift.io/currentConfig 필드에서 머신 구성의 이름입니다.

      머신 구성은 다음 업데이트를 systemd 구성에 포함해야 합니다.

      ExecStart=/usr/local/bin/mtu-migration.sh
  5. MTU 마이그레이션을 완료하려면 OVN-Kubernetes 네트워크 플러그인에 대해 다음 명령을 입력합니다.

    $ oc patch Network.operator.openshift.io cluster --type=merge --patch \
      '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'

    다음과 같습니다.

    <mtu>
    < overlay_to>로 지정한 새 클러스터 네트워크 MTU를 지정합니다.
  6. MTU 마이그레이션을 완료한 후 각 머신 구성 풀 노드는 하나씩 재부팅됩니다. 모든 노드가 업데이트될 때까지 기다려야 합니다. 다음 명령을 입력하여 머신 구성 풀 상태를 확인합니다.

    $ oc get machineconfigpools

    업데이트된 노드의 상태가 UPDATED=true, UPDATING=false,DEGRADED=false입니다.

검증

  • 다음 명령을 입력하여 클러스터의 노드에서 지정한 MTU를 사용하는지 확인합니다.

    $ oc describe network.config cluster

3.13.3.2. AWS 엣지 컴퓨팅 서비스의 서브넷 생성

OpenShift Container Platform 클러스터에서 에지 컴퓨팅 노드에 대한 머신 세트를 구성하기 전에 AWS Outposts에 서브넷을 생성해야 합니다.

제공된 CloudFormation 템플릿을 사용하고 CloudFormation 스택을 생성할 수 있습니다. 그런 다음 이 스택을 사용하여 서브넷을 사용자 지정 프로비저닝할 수 있습니다.

참고

AWS 인프라를 생성하는 데 제공된 CloudFormation 템플릿을 사용하지 않는 경우, 제공된 정보를 검토하고 수동으로 인프라를 생성해야 합니다. 클러스터가 올바르게 초기화되지 않은 경우, Red Hat 지원팀에 설치 로그를 제시하여 문의해야 할 수도 있습니다.

사전 요구 사항

  • AWS 계정을 구성했습니다.
  • aws 구성을 실행하여 AWS 키와 리전을 로컬 AWS 프로필에 추가하셨습니다.
  • OpenShift Container Platform 클러스터, Outpost 및 AWS 계정에서 환경에 대한 필수 정보를 가져왔습니다.

프로세스

  1. "CloudFormation template for the VPC subnet"이라는 문서의 섹션으로 이동하여 템플릿에서 구문을 복사합니다. 복사한 템플릿 구문을 로컬 시스템에 YAML 파일로 저장합니다. 이 템플릿은 클러스터에 필요한 VPC를 설명합니다.
  2. 다음 명령을 실행하여 VPC를 나타내는 AWS 리소스 스택을 생성하는 CloudFormation 템플릿을 배포합니다.

    $ aws cloudformation create-stack --stack-name <stack_name> \1
      --region ${CLUSTER_REGION} \
      --template-body file://<template>.yaml \2
      --parameters \
        ParameterKey=VpcId,ParameterValue="${VPC_ID}" \3
        ParameterKey=ClusterName,ParameterValue="${CLUSTER_NAME}" \4
        ParameterKey=ZoneName,ParameterValue="${ZONE_NAME}" \5
        ParameterKey=PublicRouteTableId,ParameterValue="${ROUTE_TABLE_PUB}" \6
        ParameterKey=PublicSubnetCidr,ParameterValue="${SUBNET_CIDR_PUB}" \7
        ParameterKey=PrivateRouteTableId,ParameterValue="${ROUTE_TABLE_PVT}" \8
        ParameterKey=PrivateSubnetCidr,ParameterValue="${SUBNET_CIDR_PVT}" \9
        ParameterKey=PrivateSubnetLabel,ParameterValue="private-outpost" \
        ParameterKey=PublicSubnetLabel,ParameterValue="public-outpost" \
        ParameterKey=OutpostArn,ParameterValue="${OUTPOST_ARN}" 10
    1
    <stack_name >은 CloudFormation 스택의 이름입니다(예: cluster-<outpost_name&gt;).
    2
    <template >은 상대 경로이며 저장한 CloudFormation 템플릿 YAML 파일의 이름입니다.
    3
    ${VPC_ID} 는 VPC의 CloudFormation 템플릿 출력에 있는 VpcID 값인 VPC ID입니다.
    4
    ${CLUSTER_NAME} 은 새 AWS 리소스 이름의 접두사로 사용할 ClusterName 의 값입니다.
    5
    ${ZONE_NAME} 은 서브넷을 생성할 AWS Outposts 이름의 값입니다.
    6
    ${ROUTE_ Cryostat_PUB} 은 Outpost의 공용 서브넷을 연결하는 데 사용되는 ${VPC_ID} 에서 생성된 공개 경로 테이블 ID입니다. 이 스택에서 생성한 Outpost 서브넷을 연결할 공용 경로 테이블을 지정합니다.
    7
    ${SUBNET_CIDR_PUB} 는 공용 서브넷을 생성하는 데 사용되는 유효한 CIDR 블록입니다. 이 블록은 VPC CIDR 블록 VpcCidr 의 일부여야 합니다.
    8
    ${ROUTE_ Cryostat_PVT} 는 Outpost의 프라이빗 서브넷을 연결하는 데 사용되는 ${VPC_ID} 에서 생성된 프라이빗 경로 테이블 ID입니다. 이 스택에서 생성한 Outpost 서브넷을 연결할 프라이빗 경로 테이블을 지정합니다.
    9
    ${SUBNET_CIDR_PVT} 는 개인 서브넷을 만드는 데 사용되는 유효한 CIDR 블록입니다. 이 블록은 VPC CIDR 블록 VpcCidr 의 일부여야 합니다.
    10
    ${OUTPOST_ARN} 은 Outpost의 Amazon Resource Name(ARN)입니다.

    출력 예

    arn:aws:cloudformation:us-east-1:123456789012:stack/<stack_name>/dbedae40-820e-11eb-2fd3-12a48460849f

검증

  • 다음 명령을 실행하여 템플릿 구성 요소가 있는지 확인합니다.

    $ aws cloudformation describe-stacks --stack-name <stack_name>

    StackStatusCREATE_COMPLETE 가 표시되면 출력에 다음 매개변수의 값이 표시됩니다.

    PublicSubnetId

    CloudFormation 스택에서 생성한 공용 서브넷의 ID입니다.

    PrivateSubnetId

    CloudFormation 스택에서 생성한 프라이빗 서브넷의 ID입니다.

    이러한 매개변수 값을 클러스터에 생성하기 위해 실행하는 다른 CloudFormation 템플릿에 제공해야 합니다.

3.13.3.3. VPC 서브넷용 CloudFormation 템플릿

다음 CloudFormation 템플릿을 사용하여 Outpost 서브넷을 배포할 수 있습니다.

예 3.38. VPC 서브넷용 CloudFormation 템플릿

AWSTemplateFormatVersion: 2010-09-09
Description: Template for Best Practice Subnets (Public and Private)

Parameters:
  VpcId:
    Description: VPC ID that comprises all the target subnets.
    Type: String
    AllowedPattern: ^(?:(?:vpc)(?:-[a-zA-Z0-9]+)?\b|(?:[0-9]{1,3}\.){3}[0-9]{1,3})$
    ConstraintDescription: VPC ID must be with valid name, starting with vpc-.*.
  ClusterName:
    Description: Cluster name or prefix name to prepend the Name tag for each subnet.
    Type: String
    AllowedPattern: ".+"
    ConstraintDescription: ClusterName parameter must be specified.
  ZoneName:
    Description: Zone Name to create the subnets, such as us-west-2-lax-1a.
    Type: String
    AllowedPattern: ".+"
    ConstraintDescription: ZoneName parameter must be specified.
  PublicRouteTableId:
    Description: Public Route Table ID to associate the public subnet.
    Type: String
    AllowedPattern: ".+"
    ConstraintDescription: PublicRouteTableId parameter must be specified.
  PublicSubnetCidr:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-4]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-24.
    Default: 10.0.128.0/20
    Description: CIDR block for public subnet.
    Type: String
  PrivateRouteTableId:
    Description: Private Route Table ID to associate the private subnet.
    Type: String
    AllowedPattern: ".+"
    ConstraintDescription: PrivateRouteTableId parameter must be specified.
  PrivateSubnetCidr:
    AllowedPattern: ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(\/(1[6-9]|2[0-4]))$
    ConstraintDescription: CIDR block parameter must be in the form x.x.x.x/16-24.
    Default: 10.0.128.0/20
    Description: CIDR block for private subnet.
    Type: String
  PrivateSubnetLabel:
    Default: "private"
    Description: Subnet label to be added when building the subnet name.
    Type: String
  PublicSubnetLabel:
    Default: "public"
    Description: Subnet label to be added when building the subnet name.
    Type: String
  OutpostArn:
    Default: ""
    Description: OutpostArn when creating subnets on AWS Outpost.
    Type: String

Conditions:
  OutpostEnabled: !Not [!Equals [!Ref "OutpostArn", ""]]

Resources:
  PublicSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref VpcId
      CidrBlock: !Ref PublicSubnetCidr
      AvailabilityZone: !Ref ZoneName
      OutpostArn: !If [ OutpostEnabled, !Ref OutpostArn, !Ref "AWS::NoValue"]
      Tags:
      - Key: Name
        Value: !Join ['-', [ !Ref ClusterName, !Ref PublicSubnetLabel, !Ref ZoneName]]
      - Key: kubernetes.io/cluster/unmanaged 1
        Value: true

  PublicSubnetRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTableId

  PrivateSubnet:
    Type: "AWS::EC2::Subnet"
    Properties:
      VpcId: !Ref VpcId
      CidrBlock: !Ref PrivateSubnetCidr
      AvailabilityZone: !Ref ZoneName
      OutpostArn: !If [ OutpostEnabled, !Ref OutpostArn, !Ref "AWS::NoValue"]
      Tags:
      - Key: Name
        Value: !Join ['-', [!Ref ClusterName, !Ref PrivateSubnetLabel, !Ref ZoneName]]
      - Key: kubernetes.io/cluster/unmanaged 2
        Value: true

  PrivateSubnetRouteTableAssociation:
    Type: "AWS::EC2::SubnetRouteTableAssociation"
    Properties:
      SubnetId: !Ref PrivateSubnet
      RouteTableId: !Ref PrivateRouteTableId

Outputs:
  PublicSubnetId:
    Description: Subnet ID of the public subnets.
    Value:
      !Join ["", [!Ref PublicSubnet]]

  PrivateSubnetId:
    Description: Subnet ID of the private subnets.
    Value:
      !Join ["", [!Ref PrivateSubnet]]
1
AWS Outposts의 공용 서브넷 구성에 kubernetes.io/cluster/unmanaged 태그를 포함해야 합니다.
2
AWS Outposts의 프라이빗 서브넷 구성에 kubernetes.io/cluster/unmanaged 태그를 포함해야 합니다.

3.13.4. Outpost에 엣지 컴퓨팅 머신을 배포하는 컴퓨팅 머신 세트 생성

AWS Outposts에서 엣지 컴퓨팅 머신을 생성하려면 호환되는 구성으로 새 컴퓨팅 머신 세트를 생성해야 합니다.

사전 요구 사항

  • AWS Outposts가 있습니다.
  • AWS의 사용자 지정 VPC에 OpenShift Container Platform 클러스터를 설치했습니다.
  • cluster-admin 권한이 있는 계정을 사용하여 클러스터에 액세스할 수 있습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  1. 다음 명령을 실행하여 클러스터의 컴퓨팅 머신 세트를 나열합니다.

    $ oc get machinesets.machine.openshift.io -n openshift-machine-api

    출력 예

    NAME                            DESIRED   CURRENT   READY   AVAILABLE   AGE
    <original_machine_set_name_1>   1         1         1       1           55m
    <original_machine_set_name_2>   1         1         1       1           55m

  2. 기존 컴퓨팅 머신 세트의 이름을 기록합니다.
  3. 다음 방법 중 하나를 사용하여 새 컴퓨팅 머신 세트 CR(사용자 정의 리소스)의 값이 포함된 YAML 파일을 생성합니다.

    • 다음 명령을 실행하여 기존 컴퓨팅 머신 세트 구성을 새 파일에 복사합니다.

      $ oc get machinesets.machine.openshift.io <original_machine_set_name_1> \
        -n openshift-machine-api -o yaml > <new_machine_set_name_1>.yaml

      기본 텍스트 편집기를 사용하여 이 YAML 파일을 편집할 수 있습니다.

    • 원하는 텍스트 편집기를 사용하여 < new_machine_set_name_1>.yaml 이라는 빈 YAML 파일을 생성하고 새 컴퓨팅 머신 세트에 필요한 값을 포함합니다.

      특정 필드에 설정할 값이 확실하지 않은 경우 다음 명령을 실행하여 기존 컴퓨팅 머신 세트 CR의 값을 볼 수 있습니다.

      $ oc get machinesets.machine.openshift.io <original_machine_set_name_1> \
        -n openshift-machine-api -o yaml

      출력 예

      apiVersion: machine.openshift.io/v1beta1
      kind: MachineSet
      metadata:
        labels:
          machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1
        name: <infrastructure_id>-<role>-<availability_zone> 2
        namespace: openshift-machine-api
      spec:
        replicas: 1
        selector:
          matchLabels:
            machine.openshift.io/cluster-api-cluster: <infrastructure_id>
            machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>-<availability_zone>
        template:
          metadata:
            labels:
              machine.openshift.io/cluster-api-cluster: <infrastructure_id>
              machine.openshift.io/cluster-api-machine-role: <role>
              machine.openshift.io/cluster-api-machine-type: <role>
              machine.openshift.io/cluster-api-machineset: <infrastructure_id>-<role>-<availability_zone>
          spec:
            providerSpec: 3
      # ...

      1
      클러스터 인프라 ID입니다.
      2
      기본 노드 레이블입니다. AWS Outposts의 경우 outposts 역할을 사용합니다.
      3
      생략된 providerSpec 섹션에는 Outpost에 대해 구성해야 하는 값이 포함되어 있습니다.
  4. <new_machine_set _name_1>.yaml 파일을 편집하여 Outpost에서 에지 컴퓨팅 머신을 생성하도록 새 컴퓨팅 머신 세트를 구성합니다.

    AWS Outposts의 컴퓨팅 머신 세트의 예

    apiVersion: machine.openshift.io/v1beta1
    kind: MachineSet
    metadata:
      labels:
        machine.openshift.io/cluster-api-cluster: <infrastructure_id> 1
      name: <infrastructure_id>-outposts-<availability_zone> 2
      namespace: openshift-machine-api
    spec:
      replicas: 1
      selector:
        matchLabels:
          machine.openshift.io/cluster-api-cluster: <infrastructure_id>
          machine.openshift.io/cluster-api-machineset: <infrastructure_id>-outposts-<availability_zone>
      template:
        metadata:
          labels:
            machine.openshift.io/cluster-api-cluster: <infrastructure_id>
            machine.openshift.io/cluster-api-machine-role: outposts
            machine.openshift.io/cluster-api-machine-type: outposts
            machine.openshift.io/cluster-api-machineset: <infrastructure_id>-outposts-<availability_zone>
        spec:
          metadata:
            labels:
              node-role.kubernetes.io/outposts: ""
              location: outposts
          providerSpec:
            value:
              ami:
                id: <ami_id> 3
              apiVersion: machine.openshift.io/v1beta1
              blockDevices:
                - ebs:
                    volumeSize: 120
                    volumeType: gp2 4
              credentialsSecret:
                name: aws-cloud-credentials
              deviceIndex: 0
              iamInstanceProfile:
                id: <infrastructure_id>-worker-profile
              instanceType: m5.xlarge 5
              kind: AWSMachineProviderConfig
              placement:
                availabilityZone: <availability_zone>
                region: <region> 6
              securityGroups:
                - filters:
                  - name: tag:Name
                    values:
                      - <infrastructure_id>-worker-sg
              subnet:
                id: <subnet_id> 7
              tags:
                - name: kubernetes.io/cluster/<infrastructure_id>
                  value: owned
              userDataSecret:
                name: worker-user-data
          taints: 8
            - key: node-role.kubernetes.io/outposts
              effect: NoSchedule

    1
    클러스터 인프라 ID를 지정합니다.
    2
    컴퓨팅 머신 세트의 이름을 지정합니다. 이름은 클러스터 인프라 ID, outpost s 역할 이름 및 Outpost 가용성 영역으로 구성됩니다.
    3
    AMI(Amazon Machine Image) ID를 지정합니다.
    4
    EBS 볼륨 유형을 지정합니다. AWS Outposts에는 gp2 볼륨이 필요합니다.
    5
    AWS 인스턴스 유형을 지정합니다. Outpost에 구성된 인스턴스 유형을 사용해야 합니다.
    6
    Outpost 가용성 영역이 존재하는 AWS 리전을 지정합니다.
    7
    Outpost의 전용 서브넷을 지정합니다.
    8
    node-role.kubernetes.io/outposts 라벨이 있는 노드에서 워크로드가 예약되지 않도록 테인트를 지정합니다. Outpost에서 사용자 워크로드를 예약하려면 애플리케이션의 배포 리소스에 해당 허용 오차를 지정해야 합니다.
  5. 변경 사항을 저장하십시오.
  6. 다음 명령을 실행하여 컴퓨팅 머신 세트 CR을 생성합니다.

    $ oc create -f <new_machine_set_name_1>.yaml

검증

  • 컴퓨팅 머신 세트가 생성되었는지 확인하려면 다음 명령을 실행하여 클러스터의 컴퓨팅 머신 세트를 나열합니다.

    $ oc get machinesets.machine.openshift.io -n openshift-machine-api

    출력 예

    NAME                            DESIRED   CURRENT   READY   AVAILABLE   AGE
    <new_machine_set_name_1>        1         1         1       1           4m12s
    <original_machine_set_name_1>   1         1         1       1           55m
    <original_machine_set_name_2>   1         1         1       1           55m

  • 새 컴퓨팅 머신 세트에서 관리하는 머신을 나열하려면 다음 명령을 실행합니다.

    $ oc get -n openshift-machine-api machines.machine.openshift.io \
      -l machine.openshift.io/cluster-api-machineset=<new_machine_set_name_1>

    출력 예

    NAME                             PHASE          TYPE        REGION      ZONE         AGE
    <machine_from_new_1>             Provisioned    m5.xlarge   us-east-1   us-east-1a   25s
    <machine_from_new_2>             Provisioning   m5.xlarge   us-east-1   us-east-1a   25s

  • 새 컴퓨팅 머신 세트로 생성한 머신에 올바른 구성이 있는지 확인하려면 다음 명령을 실행하여 새 머신 중 하나에 대해 CR의 관련 필드를 검사합니다.

    $ oc describe machine <machine_from_new_1> -n openshift-machine-api

3.13.5. Outpost에서 사용자 워크로드 생성

AWS VPC 클러스터의 OpenShift Container Platform을 Outpost로 확장한 후 node-role.kubernetes.io/outposts 레이블이 있는 에지 컴퓨팅 노드를 사용하여 Outpost에서 사용자 워크로드를 생성할 수 있습니다.

사전 요구 사항

  • AWS VPC 클러스터를 Outpost로 확장했습니다.
  • cluster-admin 권한이 있는 계정을 사용하여 클러스터에 액세스할 수 있습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.
  • Outpost 환경과 호환되는 엣지 컴퓨팅 머신을 배포하는 컴퓨팅 머신 세트를 생성했습니다.

프로세스

  1. 에지 서브넷의 에지 컴퓨팅 노드에 배포하려는 애플리케이션에 대한 배포 리소스 파일을 구성합니다.

    배포 매니페스트 예

    kind: Namespace
    apiVersion: v1
    metadata:
      name: <application_name> 1
    ---
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: <application_name>
      namespace: <application_namespace> 2
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: gp2-csi 3
      volumeMode: Filesystem
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: <application_name>
      namespace: <application_namespace>
    spec:
      selector:
        matchLabels:
          app: <application_name>
      replicas: 1
      template:
        metadata:
          labels:
            app: <application_name>
            location: outposts 4
        spec:
          securityContext:
            seccompProfile:
              type: RuntimeDefault
          nodeSelector: 5
            node-role.kubernetes.io/outpost: ''
          tolerations: 6
          - key: "node-role.kubernetes.io/outposts"
            operator: "Equal"
            value: ""
            effect: "NoSchedule"
          containers:
            - image: openshift/origin-node
              command:
               - "/bin/socat"
              args:
                - TCP4-LISTEN:8080,reuseaddr,fork
                - EXEC:'/bin/bash -c \"printf \\\"HTTP/1.0 200 OK\r\n\r\n\\\"; sed -e \\\"/^\r/q\\\"\"'
              imagePullPolicy: Always
              name: <application_name>
              ports:
                - containerPort: 8080
              volumeMounts:
                - mountPath: "/mnt/storage"
                  name: data
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: <application_name>

    1
    애플리케이션 이름을 지정합니다.
    2
    애플리케이션의 네임스페이스를 지정합니다. 애플리케이션 네임스페이스는 애플리케이션 이름과 같을 수 있습니다.
    3
    스토리지 클래스 이름을 지정합니다. 엣지 컴퓨팅 구성의 경우 gp2-csi 스토리지 클래스를 사용해야 합니다.
    4
    Outpost에 배포된 워크로드를 식별할 레이블을 지정합니다.
    5
    엣지 컴퓨팅 노드를 대상으로 하는 노드 선택기 레이블을 지정합니다.
    6
    엣지 컴퓨팅 머신 세트의 컴퓨팅 머신 세트의 효과 테인트와 일치하는 허용 오차를 지정합니다. 다음과 같이 Operator 허용 오차를 설정합니다.
  2. 다음 명령을 실행하여 Deployment 리소스를 생성합니다.

    $ oc create -f <application_deployment>.yaml
  3. 대상 엣지 컴퓨팅 노드에서 에지 네트워크 내에서 실행되는 서비스에 Pod를 노출하는 Service 오브젝트를 구성합니다.

    서비스 매니페스트 예

    apiVersion: v1
    kind: Service 1
    metadata:
      name:  <application_name>
      namespace: <application_namespace>
    spec:
      ports:
        - port: 80
          targetPort: 8080
          protocol: TCP
      type: NodePort
      selector: 2
        app: <application_name>

    1
    서비스 리소스를 정의합니다.
    2
    관리 Pod에 적용할 라벨 유형을 지정합니다.
  4. 다음 명령을 실행하여 Service CR을 생성합니다.

    $ oc create -f <application_service>.yaml

3.13.6. 엣지 및 클라우드 기반 AWS 컴퓨팅 리소스에서 워크로드 예약

AWS VPC 클러스터를 Outpost로 확장할 때 Outpost는 엣지 컴퓨팅 노드를 사용하고 VPC는 클라우드 기반 컴퓨팅 노드를 사용합니다. 다음 로드 밸런서 고려 사항은 Outpost로 확장된 AWS VPC 클러스터에 적용됩니다.

3.13.6.1. AWS VPC 클러스터에서 AWS Classic Load Balancer 사용으로 확장됨

AWS Outposts 인프라는 AWS Classic Load Balancer를 실행할 수 없지만 Edge 및 클라우드 기반 서브넷이 동일한 가용성 영역에 있는 경우 AWS VPC 클러스터의 Classic Load Balancer는 Outpost의 에지 컴퓨팅 노드를 대상으로 지정할 수 있습니다. 결과적으로 VPC 클러스터의 Classic Load Balancer가 이러한 노드 유형 중 하나에서 Pod를 예약할 수 있습니다.

엣지 컴퓨팅 노드에서 워크로드를 예약하고 클라우드 기반 컴퓨팅 노드에서 워크로드를 예약하면 대기 시간이 발생할 수 있습니다. VPC 클러스터의 Classic Load Balancer가 Outpost 엣지 컴퓨팅 노드를 대상으로 하는 것을 방지하려면 클라우드 기반 컴퓨팅 노드에 라벨을 적용하고 적용된 라벨이 있는 노드에서만 예약하도록 Classic Load Balancer를 구성할 수 있습니다.

참고

VPC 클러스터의 Classic Load Balancer가 Outpost 엣지 컴퓨팅 노드를 대상으로 하지 않도록 할 필요가 없는 경우 이러한 단계를 완료할 필요가 없습니다.

사전 요구 사항

  • AWS VPC 클러스터를 Outpost로 확장했습니다.
  • cluster-admin 권한이 있는 계정을 사용하여 클러스터에 액세스할 수 있습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.
  • 에지 컴퓨팅 머신의 테인트와 일치하는 허용 오차를 사용하여 Outpost에 사용자 워크로드를 생성했습니다.

프로세스

  1. 선택 사항: 다음 명령을 실행하고 출력에 Outpost의 에지 컴퓨팅 노드만 포함되어 있는지 확인하여 에지 컴퓨팅 노드에 location=outposts 레이블이 있는지 확인합니다.

    $ oc get nodes -l location=outposts
  2. 다음 명령을 실행하여 VPC 클러스터의 클라우드 기반 컴퓨팅 노드에 키-값 쌍으로 레이블을 지정합니다.

    $ for NODE in $(oc get node -l node-role.kubernetes.io/worker --no-headers | grep -v outposts | awk '{print$1}'); do oc label node $NODE <key_name>=<value>; done

    여기서 <key_name>=<value >는 클라우드 기반 컴퓨팅 노드를 구분하는 데 사용할 레이블입니다.

    출력 예

    node1.example.com labeled
    node2.example.com labeled
    node3.example.com labeled

  3. 선택 사항: 다음 명령을 실행하고 출력에 VPC 클러스터의 모든 클라우드 기반 컴퓨팅 노드가 포함되어 있는지 확인하여 클라우드 기반 컴퓨팅 노드에 지정된 레이블이 있는지 확인합니다.

    $ oc get nodes -l <key_name>=<value>

    출력 예

    NAME                   STATUS    ROLES     AGE       VERSION
    node1.example.com      Ready     worker    7h        v1.30.3
    node2.example.com      Ready     worker    7h        v1.30.3
    node3.example.com      Ready     worker    7h        v1.30.3

  4. 서비스 매니페스트의 annotations 필드에 클라우드 기반 서브넷 정보를 추가하여 Classic Load Balancer 서비스를 구성합니다.

    서비스 구성 예

    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: <application_name>
      name: <application_name>
      namespace: <application_namespace>
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-subnets: <aws_subnet> 1
        service.beta.kubernetes.io/aws-load-balancer-target-node-labels: <key_name>=<value> 2
    spec:
      ports:
      - name: http
        port: 80
        protocol: TCP
        targetPort: 8080
      selector:
        app: <application_name>
      type: LoadBalancer

    1
    AWS VPC 클러스터의 서브넷 ID를 지정합니다.
    2
    노드 레이블의 쌍과 일치하는 키-값 쌍을 지정합니다.
  5. 다음 명령을 실행하여 Service CR을 생성합니다.

    $ oc create -f <file_name>.yaml

검증

  1. 다음 명령을 실행하여 프로비저닝된 Classic Load Balancer의 호스트를 표시하도록 서비스 리소스의 상태를 확인합니다.

    $ HOST=$(oc get service <application_name> -n <application_namespace> --template='{{(index .status.loadBalancer.ingress 0).hostname}}')
  2. 다음 명령을 실행하여 프로비저닝된 Classic Load Balancer 호스트의 상태를 확인합니다.

    $ curl $HOST
  3. AWS 콘솔에서 레이블이 지정된 인스턴스만 로드 밸런서의 대상 인스턴스로 표시되는지 확인합니다.

3.13.6.2. AWS VPC 클러스터에서 AWS Load Balancer Operator 사용으로 확장됨

AWS VPC 클러스터에서 AWS Application Load Balancer를 프로비저닝하도록 AWS Load Balancer Operator를 구성할 수 있습니다. AWS Outposts는 AWS Network Load Balancer를 지원하지 않습니다. 결과적으로 AWS Load Balancer Operator는 Outpost에서 네트워크 로드 밸런서를 프로비저닝할 수 없습니다.

클라우드 서브넷 또는 Outpost 서브넷에서 AWS Application Load Balancer를 생성할 수 있습니다. 클라우드의 애플리케이션 로드 밸런서는 클라우드 기반 컴퓨팅 노드에 연결할 수 있으며, Outpost의 Application Load Balancer는 엣지 컴퓨팅 노드에 연결할 수 있습니다. 외부 서브넷 또는 VPC 서브넷으로 Ingress 리소스에 주석을 달어야 하지만 둘 다 해당되지는 않습니다.

사전 요구 사항

  • AWS VPC 클러스터를 Outpost로 확장했습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.
  • AWS Load Balancer Operator를 설치하고 AWS Load Balancer 컨트롤러를 생성했습니다.

프로세스

  • 지정된 서브넷을 사용하도록 Ingress 리소스를 구성합니다.

    Ingress 리소스 구성의 예

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: <application_name>
      annotations:
        alb.ingress.kubernetes.io/subnets: <subnet_id> 1
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Exact
                backend:
                  service:
                    name: <application_name>
                    port:
                      number: 80

    1
    사용할 서브넷을 지정합니다.
    • Outpost에서 Application Load Balancer를 사용하려면 Outpost 서브넷 ID를 지정합니다.
    • 클라우드에서 Application Load Balancer를 사용하려면 다른 가용성 영역에 두 개 이상의 서브넷을 지정해야 합니다.

3.13.7. 추가 리소스

Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

© 2024 Red Hat, Inc.