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-csi
및gp2-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
)가 설치되어 있습니다.
프로세스
다음 명령을 실행하여 클러스터의 인프라 ID를 나열합니다. 이 값을 유지합니다.
$ oc get -o jsonpath='{.status.infrastructureName}{"\n"}' infrastructures.config.openshift.io cluster
다음 명령을 실행하여 설치 프로그램에서 생성한 컴퓨팅 머신 세트에 대한 세부 정보를 가져옵니다.
클러스터의 컴퓨팅 머신 세트를 나열합니다.
$ 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
나열된 컴퓨팅 머신 세트 중 하나에 대한 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}'
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 계정에 액세스할 수 있습니다.
프로세스
다음 명령을 실행하여 AWS 계정에 연결된 Outpost를 나열합니다.
$ aws outposts list-outposts
aws outposts list-outposts
명령의 출력에서 다음 값을 유지합니다.- Outpost ID입니다.
- Outpost의 Amazon 리소스 이름(ARN)입니다.
Outpost 가용성 영역입니다.
참고aws outposts list-outposts
명령의 출력에는AvailabilityZone
및AvailabilityZoneId
과 관련된 두 개의 값이 포함됩니다.AvailablilityZone
값을 사용하여 Outpost에 컴퓨팅 시스템을 생성하는 컴퓨팅 머신 세트를 구성합니다.
Outpost ID 값을 사용하여 다음 명령을 실행하여 Outpost에서 사용할 수 있는 인스턴스 유형을 표시합니다. 사용 가능한 인스턴스 유형의 값을 유지합니다.
$ aws outposts get-outpost-instance-types \ --outpost-id <outpost_id_value>
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
으로 설정해야 합니다.
프로세스
클러스터 네트워크의 현재 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 ...
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} } } } }'
Machine Config Operator는 각 머신 구성 풀에서 머신을 업데이트하므로 각 노드를 하나씩 재부팅합니다. 모든 노드가 업데이트될 때까지 기다려야 합니다. 다음 명령을 입력하여 머신 구성 풀 상태를 확인합니다.
$ oc get machineconfigpools
업데이트된 노드의 상태가
UPDATED=true
,UPDATING=false
,DEGRADED=false
입니다.참고기본적으로 Machine Config Operator는 풀당 한 번에 하나의 머신을 업데이트하여 클러스터 크기에 따라 마이그레이션에 걸리는 총 시간을 늘립니다.
호스트의 새 머신 구성 상태를 확인합니다.
머신 구성 상태 및 적용된 머신 구성 이름을 나열하려면 다음 명령을 입력합니다.
$ 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
다음 구문이 올바른지 확인합니다.
-
machineconfiguration.openshift.io/state
필드의 값은Done
입니다. -
machineconfiguration.openshift.io/currentConfig
필드의 값은machineconfiguration.openshift.io/desiredConfig
필드의 값과 동일합니다.
-
머신 구성이 올바른지 확인하려면 다음 명령을 입력합니다.
$ oc get machineconfig <config_name> -o yaml | grep ExecStart
여기서
<config_name>
은machineconfiguration.openshift.io/currentConfig
필드에서 머신 구성의 이름입니다.머신 구성은 다음 업데이트를 systemd 구성에 포함해야 합니다.
ExecStart=/usr/local/bin/mtu-migration.sh
MTU 마이그레이션을 완료하려면 OVN-Kubernetes 네트워크 플러그인에 대해 다음 명령을 입력합니다.
$ oc patch Network.operator.openshift.io cluster --type=merge --patch \ '{"spec": { "migration": null, "defaultNetwork":{ "ovnKubernetesConfig": { "mtu": <mtu> }}}}'
다음과 같습니다.
<mtu>
-
<
overlay_to>로 지정한 새 클러스터 네트워크 MTU를 지정합니다
.
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 계정에서 환경에 대한 필수 정보를 가져왔습니다.
프로세스
- "CloudFormation template for the VPC subnet"이라는 문서의 섹션으로 이동하여 템플릿에서 구문을 복사합니다. 복사한 템플릿 구문을 로컬 시스템에 YAML 파일로 저장합니다. 이 템플릿은 클러스터에 필요한 VPC를 설명합니다.
다음 명령을 실행하여 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>
;).- 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>
StackStatus
에CREATE_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]]
3.13.4. Outpost에 엣지 컴퓨팅 머신을 배포하는 컴퓨팅 머신 세트 생성
AWS Outposts에서 엣지 컴퓨팅 머신을 생성하려면 호환되는 구성으로 새 컴퓨팅 머신 세트를 생성해야 합니다.
사전 요구 사항
- AWS Outposts가 있습니다.
- AWS의 사용자 지정 VPC에 OpenShift Container Platform 클러스터를 설치했습니다.
-
cluster-admin
권한이 있는 계정을 사용하여 클러스터에 액세스할 수 있습니다. -
OpenShift CLI(
oc
)가 설치되어 있습니다.
프로세스
다음 명령을 실행하여 클러스터의 컴퓨팅 머신 세트를 나열합니다.
$ 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
- 기존 컴퓨팅 머신 세트의 이름을 기록합니다.
다음 방법 중 하나를 사용하여 새 컴퓨팅 머신 세트 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 # ...
<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에서 사용자 워크로드를 예약하려면 애플리케이션의배포
리소스에 해당 허용 오차를 지정해야 합니다.
- 변경 사항을 저장하십시오.
다음 명령을 실행하여 컴퓨팅 머신 세트 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 환경과 호환되는 엣지 컴퓨팅 머신을 배포하는 컴퓨팅 머신 세트를 생성했습니다.
프로세스
에지 서브넷의 에지 컴퓨팅 노드에 배포하려는 애플리케이션에 대한
배포
리소스 파일을 구성합니다.배포
매니페스트 예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 허용
오차를 설정합니다.
다음 명령을 실행하여
Deployment
리소스를 생성합니다.$ oc create -f <application_deployment>.yaml
대상 엣지 컴퓨팅 노드에서 에지 네트워크 내에서 실행되는 서비스에 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>
다음 명령을 실행하여
Service
CR을 생성합니다.$ oc create -f <application_service>.yaml
3.13.6. 엣지 및 클라우드 기반 AWS 컴퓨팅 리소스에서 워크로드 예약
AWS VPC 클러스터를 Outpost로 확장할 때 Outpost는 엣지 컴퓨팅 노드를 사용하고 VPC는 클라우드 기반 컴퓨팅 노드를 사용합니다. 다음 로드 밸런서 고려 사항은 Outpost로 확장된 AWS VPC 클러스터에 적용됩니다.
- Outposts는 AWS Network Load Balancer 또는 AWS Classic Load Balancer를 실행할 수 없지만, VPC 클러스터의 Classic Load Balancer는 Outpost 엣지 컴퓨팅 노드에 연결할 수 있습니다. 자세한 내용은 AWS VPC 클러스터에서 AWS Classic Load Balancers 사용을 참조하십시오.
- Outpost 인스턴스에서 로드 밸런서를 실행하려면 AWS Application Load Balancer를 사용해야 합니다. AWS Load Balancer Operator를 사용하여 AWS Load Balancer 컨트롤러 인스턴스를 배포할 수 있습니다. 컨트롤러는 Kubernetes Ingress 리소스의 AWS Application Load Balancer를 프로비저닝합니다. 자세한 내용은 AWS VPC 클러스터에서 AWS Load Balancer Operator 사용을 참조하십시오.
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에 사용자 워크로드를 생성했습니다.
프로세스
선택 사항: 다음 명령을 실행하고 출력에 Outpost의 에지 컴퓨팅 노드만 포함되어 있는지 확인하여 에지 컴퓨팅 노드에
location=outposts
레이블이 있는지 확인합니다.$ oc get nodes -l location=outposts
다음 명령을 실행하여 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
선택 사항: 다음 명령을 실행하고 출력에 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
서비스 매니페스트의
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
다음 명령을 실행하여
Service
CR을 생성합니다.$ oc create -f <file_name>.yaml
검증
다음 명령을 실행하여 프로비저닝된 Classic Load Balancer의 호스트를 표시하도록
서비스
리소스의 상태를 확인합니다.$ HOST=$(oc get service <application_name> -n <application_namespace> --template='{{(index .status.loadBalancer.ingress 0).hostname}}')
다음 명령을 실행하여 프로비저닝된 Classic Load Balancer 호스트의 상태를 확인합니다.
$ curl $HOST
- 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를 사용하려면 다른 가용성 영역에 두 개 이상의 서브넷을 지정해야 합니다.
추가 리소스