튜토리얼

Red Hat OpenShift Service on AWS 4

Red Hat OpenShift Service on AWS 튜토리얼

Red Hat OpenShift Documentation Team

초록

AWS(ROSA) 클러스터에서 첫 번째 Red Hat OpensShift Service를 생성하는 방법에 대한 튜토리얼입니다.

1장. 튜토리얼 개요

관리형 OpenShift 클러스터를 최대한 활용할 수 있도록 Red Hat 전문가의 단계별 튜토리얼.

Cloud Cryostat 튜토리얼 콘텐츠를 빠르게 사용할 수 있도록 하기 위한 노력의 일환으로, 지원되는 모든 구성에서 아직 테스트되지 않을 수 있습니다.

2장. 튜토리얼: HCP 활성화 및 계정 연결을 통한 ROSA

이 튜토리얼에서는 첫 번째 클러스터를 배포하기 전에 호스팅되는 컨트롤 플레인(HCP)을 사용하여 AWS에서 Red Hat OpenShift Service를 활성화하고 AWS 계정에 연결하는 프로세스를 설명합니다.

중요

제품에 대한 비공개 제안을 받은 경우 이 튜토리얼을 따르기 전에 개인 제안과 함께 제공된 지침에 따라 진행하십시오. 개인 오퍼링은 활성 서브스크립션을 대체하는 제품이 이미 활성화된 경우 또는 처음 활성화되는 경우를 위해 설계되었습니다.

2.1. 사전 요구 사항

  • 이전 단계에서 ROSA를 HCP와 활성화한 AWS 계정과 연결하려는 Red Hat 계정에 로그인하십시오.
  • 서비스 청구에 사용할 단일 AWS 계정만 Red Hat 계정과 연결할 수 있습니다. 일반적으로 개발자 계정과 연결된 다른 AWS 계정이 있는 조직의 AWS 계정은 개별 AWS 최종 사용자 계정이 아닌 청구해야 하는 계정입니다.
  • 동일한 Red Hat 조직에 속하는 Red Hat 계정이 동일한 AWS 계정에 연결됩니다. 따라서 Red Hat 조직 계정 수준에서 HCP 클러스터를 사용하여 ROSA를 생성할 수 있는 사용자를 관리할 수 있습니다.

2.2. 서브스크립션 사용 및 AWS 계정 설정

  1. 시작하기 버튼을 클릭하여 AWS 콘솔 페이지에서 HCP 제품으로 ROSA를 활성화합니다.

    Rosa 시작하기

    ROSA를 이전에 활성화했지만 프로세스를 완료하지 않은 경우 버튼을 클릭하고 다음 단계에 설명된 대로 계정 링크를 완료할 수 있습니다.

  2. 연락처 정보를 Red Hat과 공유하도록 확인하고 서비스를 활성화합니다.

    Rosa enable 2
    • 이 단계에서 서비스를 활성화하면 부과되지 않습니다. 첫 번째 클러스터를 배포한 후에만 발생하는 청구 및 미터링에 대한 연결이 수행됩니다. 이 작업은 몇 분 정도 걸릴 수 있습니다.
  3. 프로세스가 완료되면 확인이 표시됩니다.

    Rosa prereq 사용 3
  4. 이 확인 페이지의 다른 섹션에는 추가 사전 요구 사항의 상태가 표시됩니다. 이러한 사전 요구 사항 중 하나라도 충족되지 않으면 각 메시지가 표시됩니다. 다음은 선택한 리전에서 할당량 부족의 예입니다.

    Rosa 서비스 할당량 4
    1. Increase 서비스 할당량 버튼을 클릭하거나 자세히 알아보기 링크를 사용하여 서비스 할당량 관리 방법에 대한 자세한 정보를 가져옵니다. 할당량이 충분하지 않은 경우 할당량은 지역에 따라 다릅니다. 웹 콘솔의 오른쪽 상단에 있는 지역 전환기를 사용하여 관심 있는 모든 지역에 대한 할당량 검사를 다시 실행한 다음 필요에 따라 서비스 할당량 증가 요청을 제출할 수 있습니다.
  5. 사전 요구 사항이 모두 충족되면 페이지가 다음과 같이 표시됩니다.

    Rosa prereq 5

    ELB 서비스 연결 역할이 자동으로 생성됩니다. 작은 Info Blue 링크를 클릭하면 상황에 맞는 도움말과 리소스를 얻을 수 있습니다.

2.3. AWS 및 Red Hat 계정 및 서브스크립션 연결

  1. 주황색 계속 Red Hat 버튼을 클릭하여 계정 연결을 진행합니다.

    Rosa continue rh 6
  2. 현재 브라우저 세션에서 Red Hat 계정에 로그인하지 않은 경우 계정에 로그인하라는 메시지가 표시됩니다.

    Rosa 로그인 rh 계정 7
    • 새 Red Hat 계정에 등록하거나 이 페이지에서 비밀번호를 재설정할 수도 있습니다.
    • 이전 단계에서 ROSA를 HCP와 활성화한 AWS 계정과 연결하려는 Red Hat 계정에 로그인하십시오.
    • 서비스 청구에 사용할 단일 AWS 계정만 Red Hat 계정과 연결할 수 있습니다. 일반적으로 개발자 계정과 연결된 다른 AWS 계정이 있는 조직의 AWS 계정은 개별 AWS 최종 사용자 계정이 아닌 청구해야 하는 계정입니다.
    • 동일한 Red Hat 조직에 속하는 Red Hat 계정이 동일한 AWS 계정에 연결됩니다. 따라서 Red Hat 조직 계정 수준에서 HCP 클러스터를 사용하여 ROSA를 생성할 수 있는 사용자를 관리할 수 있습니다.
  3. 사용 약관을 검토한 후 Red Hat 계정 연결을 완료합니다.

    참고

    이 단계는 로그인한 Red Hat 계정 또는 Red Hat 계정을 관리하는 Red Hat 조직이 이전에 AWS 계정에 연결되지 않은 경우에만 사용할 수 있습니다.

    Rosa rh 계정 연결 8

    이 화면에 Red Hat 및 AWS 계정 번호가 모두 표시됩니다.

  4. 서비스 약관에 동의한 경우 계정 연결 버튼을 클릭합니다.

    Red Hat Hybrid Cloud Console을 처음 사용하는 경우 첫 번째 ROSA 클러스터를 생성하기 전에 일반 관리 서비스 사용 약관에 동의하라는 메시지가 표시됩니다.

    Rosa 약관 9

    약관 보기 버튼을 클릭하면 검토 및 수락이 필요한 추가 조건이 표시됩니다.

    Rosa 약관 9 5

    현재 메시지가 표시되면 추가 약관을 검토한 후 계약을 제출하십시오.

  5. Hybrid Cloud Console은 AWS 사전 요구 사항이 완료되었음을 확인하고 클러스터 배포에 필요한 첫 번째 단계를 나열합니다.

    Rosa 클러스터 생성 10
  6. 다음 단계는 클러스터의 기술 배포에 적용됩니다.

    Rosa deploy 11
    • 이러한 단계는 서비스 사용 및 계정 연결이 완료된 위치와 다른 시스템에서 수행될 수 있습니다.
    • 이전에 언급했듯이 ROSA 서비스를 활성화한 AWS 계정과 연결된 Red Hat 조직에 속하는 모든 Red Hat 계정은 클러스터를 생성할 수 있으며 이전에 이 Red Hat 조직에서 연결된 청구 AWS 계정을 선택할 수 있습니다.

      이 페이지의 마지막 섹션에는 rosa CLI를 사용하거나 웹 콘솔을 통해 클러스터 배포 옵션이 표시됩니다.

      Rosa cli ui 12
    • 다음 단계에서는 rosa CLI를 사용한 클러스터 배포를 설명합니다.
    • 웹 콘솔만 사용하여 배포에 관심이 있는 경우 웹 콘솔 섹션을 사용하여 HCP 클러스터 배포를 통해 ROSA로 건너뛸 수 있습니다. 그러나 계정 역할 생성과 같은 특정 작업에는 rosa CLI가 필요합니다. ROSA를 처음 배포하는 경우 웹 콘솔 배포 단계를 건너뛰기 전에 rosa whoami 명령을 실행할 때까지 CLI 단계를 수행합니다.

2.4. CLI를 사용하여 HCP 클러스터 배포와 ROSA

  1. ROSA CLI 다운로드 버튼을 클릭하여 운영 체제의 ROSA CLI(명령줄 인터페이스)를 다운로드하고 ROSA CLI 설정을 사용하여 도움말 에 설명된 대로 설정합니다.

    중요

    최신 AWS CLI가 설치되어 있는지 확인합니다. 자세한 내용은 AWS CLI를 설치하는 지침을 참조하십시오.

  2. 이전 단계가 완료되면 rosa 버전을 실행하여 두 CLI를 모두 사용할 수 있는지 확인할 수 있습니다. 터미널에서 이전 버전과 aws -version 명령을 사용하는 경우 이 명령은 업데이트 알림을 표시합니다.
  3. HCP 클러스터를 사용하여 ROSA를 생성하는 전제 조건은 2.1 단계에 표시된 고유한 토큰과 함께 개인화된 명령으로 rosa cli를 사용하여 로그인하는 것입니다. 인증하려면 웹 콘솔에서 이 명령 을 실행합니다. 복사 버튼을 사용하여 전체 토큰을 사용하여 명령을 터미널에 쉽게 복사하고 붙여넣을 수 있습니다.

    Rosa 토큰 13

    고유한 토큰을 공유하지 마십시오.

  4. 첫 번째 클러스터 배포 전에 최종 사전 요구 사항으로 필요한 계정 전체 역할 및 정책이 생성되었는지 확인합니다. rosa CLI는 2.2 단계에 표시된 명령을 사용하여 이를 지원할 수 있습니다. 웹 콘솔에서 필요한 계정 전체 역할 및 정책을 빠르게 생성하려면 다음을 수행합니다. 이에 대한 대안은 이러한 역할 및 정책을 수동으로 생성하는 것입니다.
  5. 로그인한 후 계정 역할을 만들고 rosa whoami 명령을 사용하여 ID를 확인하면 터미널이 다음과 유사합니다.

    rosa whoami 14
  6. 제공된 명령을 사용하여 클러스터 배포를 시작합니다. 복사 버튼을 다시 클릭하고 터미널에 명령을 붙여넣을 수 있습니다.

    Rosa cli 15
  7. ~/.aws/credentials 에 지정된 기본이 아닌 프로필 중 하나인 사용자 지정 AWS 프로필을 사용하려면 명령이 rosa create cluster -profile stage 와 같이 표시되도록 -profile <profile_name > 선택기를 rosa create cluster 명령에 추가할 수 있습니다. 이 옵션을 사용하여 AWS CLI 프로필을 지정하지 않으면 기본 AWS CLI 프로파일에서 클러스터가 배포된 AWS 인프라 프로필이 결정됩니다. 다음 단계 중 하나에서 청구 AWS 프로파일이 선택됩니다.
  8. 클러스터 이름을 입력하면 호스팅된 컨트롤 플레인 사용 여부를 묻는 메시지가 표시됩니다. 선택 :

    Rosa create cli 16
  9. HCP 클러스터를 사용하여 ROSA를 배포할 때 청구 AWS 계정을 지정해야 합니다.

    Rosa create cli billing 17
    • 현재 사용되는 Red Hat 조직에 연결된 AWS 계정만 표시됩니다.
    • 인프라 AWS 계정이 동일한 AWS 조직에 연결되어 있는지 여부와 관계없이 지정된 AWS 계정은 ROSA 서비스 사용에 대한 비용이 청구됩니다.
    • ROSA 계약이 지정된 AWS 청구 계정에 대해 활성화되어 있는지 여부에 대한 표시기를 확인할 수 있습니다.
    • 계약이 활성화되어 있지 않은 AWS 계정을 선택하려면 이 튜토리얼의 처음 몇 가지 단계를 참조하여 계약을 활성화하고 성공적으로 클러스터 배포에 필요한 서비스 요금을 허용합니다.
  10. 다음 단계에서는 배포할 클러스터의 기술 세부 정보를 지정합니다.

    Rosa cli 세부 정보 18

2.5. 웹 콘솔을 사용하여 HCP 클러스터 배포와 함께 ROSA

  1. 기본 설정 ROSA 페이지의 하단 섹션에서 두 번째 옵션을 선택하여 웹 콘솔을 사용하여 클러스터를 생성할 수 있습니다.

    Rosa deploy ui 19
  2. 웹 콘솔을 사용하여 ROSA 클러스터를 생성할 때 첫 번째 단계는 컨트롤 플레인 선택입니다. Next 버튼을 클릭하기 전에 Hosted 옵션이 선택되어 있는지 확인합니다.

    Rosa deploy ui hcp 20
  3. 다음 단계 의 계정 및 역할을 사용하면 ROSA 클러스터가 배포될 인프라 AWS 계정과 리소스가 소비 및 관리될 위치를 지정할 수 있습니다.

    Rosa ui 계정 21
    • 연결에 대한 계정 역할을 생성하거나 연결하는 방법에 대한 자세한 내용은 ROSA 클러스터를 배포하려는 계정이 표시되지 않는 경우 새 AWS 계정을 연결하는 방법을 클릭합니다.
    • rosa CLI는 이를 위해 사용됩니다.
    • 여러 AWS 계정을 사용하고 AWS CLI에 대한 해당 프로필이 구성된 경우 --profile 선택기를 사용하여 rosa CLI 명령으로 작업할 때 AWS 프로필을 지정할 수 있습니다.
  4. 다음 섹션에서 청구 AWS 계정이 선택됩니다.

    Rosa ui 청구 22
    • 현재 사용되는 Red Hat 조직에 연결된 AWS 계정만 표시됩니다.
    • 인프라 AWS 계정이 동일한 AWS 조직에 연결되어 있는지 여부와 관계없이 지정된 AWS 계정은 ROSA 서비스 사용에 대한 비용이 청구됩니다.
    • ROSA 계약이 지정된 AWS 청구 계정에 대해 활성화되어 있는지 여부를 나타내는 표시기를 확인할 수 있습니다.
    • 아직 계약이 활성화되어 있지 않은 AWS 계정을 사용하려는 경우, 새 AWS 결제 계정에 연결 ROSA를 사용하여 ROSA AWS 콘솔 페이지에 도달할 수 있습니다. 이 페이지에서 해당 AWS 계정을 사용하여 로그인한 후 해당 AWS 계정을 활성화하거나 AWS 계정 관리자에게 해당 작업을 수행하도록 요청할 수 있습니다.

AWS 계정 선택 이후의 다음 단계는 이 튜토리얼의 범위를 벗어납니다.

추가 리소스

3장. 튜토리얼: ROSA STS 배포에 대한 권한 확인

ROSA 클러스터 배포를 진행하려면 계정이 필요한 역할 및 권한을 지원해야 합니다. AWS 서비스 제어 정책(SCP)은 설치 프로그램 또는 운영자 역할에 의해 수행된 API 호출을 차단할 수 없습니다.

ROSA의 STS를 설치하는 데 필요한 IAM 리소스에 대한 자세한 내용은 여기에서 확인할 수 있습니다. STS를 사용하는 ROSA 클러스터의 IAM 리소스 정보

이 안내서는 ROSA v4.11.X에 대해 검증되었습니다.

3.1. 사전 요구 사항

3.2. ROSA 권한 확인

ROSA에 필요한 권한을 확인하기 위해 AWS 리소스를 생성하지 않고도 다음 섹션에 포함된 스크립트를 실행할 수 있습니다.

이 스크립트는 rosa,awsjq CLI 명령을 사용하여 현재 AWS 구성에 연결된 계정의 권한을 확인하는 데 사용할 작업 디렉터리에 파일을 생성합니다.

AWS 정책 시뮬레이터는 jq 에서 추출한 API 호출에 대해 각 역할 정책의 권한을 확인하는 데 사용됩니다. 결과는 .results 로 추가된 텍스트 파일에 저장됩니다.

이 스크립트는 현재 계정 및 지역에 대한 권한을 확인하도록 설계되었습니다.

3.3. usage instructions

  1. 스크립트를 사용하려면 bash 터미널에서 다음 명령을 실행합니다(-p 옵션은 역할에 대한 접두사를 정의합니다).

    $ mkdir scratch
    $ cd scratch
    $ cat << 'EOF' > verify-permissions.sh
    #!/bin/bash
    while getopts 'p:' OPTION; do
      case "$OPTION" in
        p)
          PREFIX="$OPTARG"
          ;;
        ?)
          echo "script usage: $(basename \$0) [-p PREFIX]" >&2
          exit 1
          ;;
      esac
    done
    shift "$(($OPTIND -1))"
    rosa create account-roles --mode manual --prefix $PREFIX
    INSTALLER_POLICY=$(cat sts_installer_permission_policy.json | jq )
    CONTROL_PLANE_POLICY=$(cat sts_instance_controlplane_permission_policy.json | jq)
    WORKER_POLICY=$(cat sts_instance_worker_permission_policy.json | jq)
    SUPPORT_POLICY=$(cat sts_support_permission_policy.json | jq)
    simulatePolicy () {
        outputFile="${2}.results"
        echo $2
        aws iam simulate-custom-policy --policy-input-list "$1" --action-names $(jq '.Statement | map(select(.Effect == "Allow"))[].Action | if type == "string" then . else .[] end' "$2" -r) --output text > $outputFile
    }
    simulatePolicy "$INSTALLER_POLICY" "sts_installer_permission_policy.json"
    simulatePolicy "$CONTROL_PLANE_POLICY" "sts_instance_controlplane_permission_policy.json"
    simulatePolicy "$WORKER_POLICY" "sts_instance_worker_permission_policy.json"
    simulatePolicy "$SUPPORT_POLICY" "sts_support_permission_policy.json"
    EOF
    $ chmod +x verify-permissions.sh
    $ ./verify-permissions.sh -p SimPolTest
  2. 스크립트가 완료되면 각 결과 파일을 검토하여 필요한 API 호출이 차단되지 않았는지 확인합니다.

    $ for file in $(ls *.results); do echo $file; cat $file; done

    출력은 다음과 유사합니다.

    sts_installer_permission_policy.json.results
    EVALUATIONRESULTS       autoscaling:DescribeAutoScalingGroups   allowed *
    MATCHEDSTATEMENTS       PolicyInputList.1       IAM Policy
    ENDPOSITION     6       195
    STARTPOSITION   17      3
    EVALUATIONRESULTS       ec2:AllocateAddress     allowed *
    MATCHEDSTATEMENTS       PolicyInputList.1       IAM Policy
    ENDPOSITION     6       195
    STARTPOSITION   17      3
    EVALUATIONRESULTS       ec2:AssociateAddress    allowed *
    MATCHEDSTATEMENTS       PolicyInputList.1       IAM Policy
    ...
    참고

    작업이 차단되면 AWS에서 제공한 오류를 검토하고 관리자에게 문의하여 필요한 API 호출을 차단하는지 확인합니다.

4장. CloudMonitor 로그 및 STS에 대한 로그 전달 구성

이 튜토리얼을 사용하여 Red Hat OpenShift Logging Operator를 배포하고 STS(Security Token Services) 인증을 사용하여 CloudMonitor로 로그를 전달하도록 구성합니다.

사전 요구 사항

  • Red Hat OpenShift Service on AWS (ROSA) Classic 클러스터
  • jq 명령줄 인터페이스(CLI)
  • AWS(Amazon Web Services) CLI(aws)

4.1. 환경 설정

  1. 클러스터에 맞게 클러스터 이름을 변경하여 다음 환경 변수를 구성합니다.

    참고

    관리자로 로그인해야 합니다.

    $ export ROSA_CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(rosa describe cluster -c ${ROSA_CLUSTER_NAME} --output json | jq -r .region.id)
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o json | jq -r .spec.serviceAccountIssuer | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
    $ export AWS_PAGER=""
    $ export SCRATCH="/tmp/${ROSA_CLUSTER_NAME}/clf-cloudwatch-sts"
    $ mkdir -p ${SCRATCH}
  2. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "Cluster: ${ROSA_CLUSTER_NAME}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

4.2. AWS 계정 준비

  1. 로깅을 위한 IAM(Identity Access Management) 정책을 생성합니다.

    $ POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='RosaCloudWatch'].{ARN:Arn}" --output text)
    $ if [[ -z "${POLICY_ARN}" ]]; then
    cat << EOF > ${SCRATCH}/policy.json
    {
      "Version": "2012-10-17",
      "Statement": [
         {
               "Effect": "Allow",
               "Action": [
                  "logs:CreateLogGroup",
                  "logs:CreateLogStream",
                  "logs:DescribeLogGroups",
                  "logs:DescribeLogStreams",
                  "logs:PutLogEvents",
                  "logs:PutRetentionPolicy"
               ],
               "Resource": "arn:aws:logs:*:*:*"
         }
    ]
    }
    EOF
    POLICY_ARN=$(aws iam create-policy --policy-name "RosaCloudWatch" \
    --policy-document file:///${SCRATCH}/policy.json --query Policy.Arn --output text)
    fi
    $ echo ${POLICY_ARN}
  2. 클러스터에 대한 IAM 역할 신뢰 정책을 생성합니다.

    $ cat <<EOF > ${SCRATCH}/trust-policy.json
    {
       "Version": "2012-10-17",
       "Statement": [{
         "Effect": "Allow",
         "Principal": {
           "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_ENDPOINT}"
         },
         "Action": "sts:AssumeRoleWithWebIdentity",
         "Condition": {
           "StringEquals": {
             "${OIDC_ENDPOINT}:sub": "system:serviceaccount:openshift-logging:logcollector"
           }
         }
       }]
    }
    EOF
    $ ROLE_ARN=$(aws iam create-role --role-name "${ROSA_CLUSTER_NAME}-RosaCloudWatch" \
          --assume-role-policy-document file://${SCRATCH}/trust-policy.json \
          --query Role.Arn --output text)
    $ echo ${ROLE_ARN}
  3. IAM 정책을 IAM 역할에 연결합니다.

    $ aws iam attach-role-policy --role-name "${ROSA_CLUSTER_NAME}-RosaCloudWatch" \
       --policy-arn ${POLICY_ARN}

4.3. Operator 배포

  1. Red Hat OpenShift Logging Operator를 배포합니다.

    $  cat << EOF | oc apply -f -
       apiVersion: operators.coreos.com/v1alpha1
       kind: Subscription
       metadata:
         labels:
          operators.coreos.com/cluster-logging.openshift-logging: ""
         name: cluster-logging
         namespace: openshift-logging
       spec:
         channel: stable
         installPlanApproval: Automatic
         name: cluster-logging
         source: redhat-operators
         sourceNamespace: openshift-marketplace
    EOF
  2. 보안을 생성합니다.

    $  cat << EOF | oc apply -f -
      apiVersion: v1
      kind: Secret
      metadata:
        name: cloudwatch-credentials
        namespace: openshift-logging
      stringData:
        role_arn: $ROLE_ARN
    EOF

4.4. 클러스터 로깅 구성

  1. ClusterLogForwarder CR(사용자 정의 리소스)을 생성합니다.

    $ cat << EOF | oc apply -f -
      apiVersion: "logging.openshift.io/v1"
      kind: ClusterLogForwarder
      metadata:
        name: instance
        namespace: openshift-logging
      spec:
        outputs:
          - name: cw
            type: cloudwatch
            cloudwatch:
              groupBy: namespaceName
              groupPrefix: rosa-${ROSA_CLUSTER_NAME}
              region: ${REGION}
            secret:
              name: cloudwatch-credentials
        pipelines:
          - name: to-cloudwatch
            inputRefs:
              - infrastructure
              - audit
              - application
            outputRefs:
              - cw
    EOF
  2. ClusterLogging CR을 생성합니다.

    $ cat << EOF | oc apply -f -
      apiVersion: logging.openshift.io/v1
      kind: ClusterLogging
      metadata:
        name: instance
        namespace: openshift-logging
      spec:
        collection:
          logs:
             type: vector
        managementState: Managed
    EOF

4.5. CloudMonitor에서 로그 확인

  • AWS 콘솔 또는 AWS CLI를 사용하여 클러스터의 로그 스트림이 있는지 확인합니다.

    • AWS CLI에서 로그를 검증하려면 다음 명령을 실행합니다.

      $ aws logs describe-log-groups --log-group-name-prefix rosa-${ROSA_CLUSTER_NAME}

      샘플 출력

      {
        "logGroups": [
            {
              "logGroupName": "rosa-xxxx.audit",
              "creationTime": 1661286368369,
              "metricFilterCount": 0,
              "arn": "arn:aws:logs:us-east-2:xxxx:log-group:rosa-xxxx.audit:*",
              "storedBytes": 0
            },
            {
              "logGroupName": "rosa-xxxx.infrastructure",
              "creationTime": 1661286369821,
              "metricFilterCount": 0,
              "arn": "arn:aws:logs:us-east-2:xxxx:log-group:rosa-xxxx.infrastructure:*",
              "storedBytes": 0
            }
        ]
      }

      참고

      새 클러스터인 경우 애플리케이션이 아직 실행되지 않으므로 애플리케이션 로그의 로그 그룹이 표시되지 않을 수 있습니다.

4.6. 리소스 정리

  1. ClusterLogForwarder CR을 삭제합니다.

    $ oc delete -n openshift-logging clusterlogforwarder instance
  2. ClusterLogging CR을 삭제합니다.

    $ oc delete -n openshift-logging clusterlogging instance
  3. IAM 정책을 IAM 역할에 분리합니다.

    $ aws iam detach-role-policy --role-name "${ROSA_CLUSTER_NAME}-RosaCloudWatch" \
       --policy-arn "${POLICY_ARN}"
  4. IAM 역할을 삭제합니다.

    $ aws iam delete-role --role-name "${ROSA_CLUSTER_NAME}-RosaCloudWatch"
  5. IAM 정책을 삭제합니다.

    중요

    정책을 사용하는 다른 리소스가 없는 경우에만 IAM 정책을 삭제합니다.

    $ aws iam delete-policy --policy-arn "${POLICY_ARN}"
  6. CloudMonitor 로그 그룹을 삭제합니다.

    $ aws logs delete-log-group --log-group-name "rosa-${ROSA_CLUSTER_NAME}.audit"
    $ aws logs delete-log-group --log-group-name "rosa-${ROSA_CLUSTER_NAME}.infrastructure"

5장. 튜토리얼: AWS WAF 및 Amazon CloudFront를 사용하여 ROSA 워크로드를 보호

AWS WAF는 보호된 웹 애플리케이션 리소스로 전달되는 HTTP 및 HTTPS 요청을 모니터링할 수 있는 웹 애플리케이션 방화벽입니다.

Amazon CloudFront를 사용하여 AWS(ROSA)의 Red Hat OpenShift Service에WAF(Web Application Firewall)를 추가할 수 있습니다. 외부 솔루션을 사용하면 ROSA 리소스가 WAF 처리로 인해 서비스 거부가 발생하지 않도록 보호합니다.

5.1. 사전 요구 사항

  • ROSA Classic 클러스터.
  • OpenShift CLI(oc)에 액세스할 수 있습니다.
  • AWS CLI(aws)에 액세스할 수 있습니다.

5.1.1. 환경 설정

  • 환경 변수를 준비합니다.

    $ export AWS_PAGER=""
    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${CLUSTER_NAME}/cloudfront-waf"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster: ${CLUSTER_NAME}, Region: ${REGION}, AWS Account ID: ${AWS_ACCOUNT_ID}"

5.2. 사용자 정의 도메인 설정

외부 WAF로 보호된 트래픽을 표준(및 기본) 클러스터 인그레스 컨트롤러에서 분할하도록 보조 수신 컨트롤러를 구성해야 합니다. ROSA에서는 Custom Domain Operator를 사용하여 이 작업을 수행합니다.

사전 요구 사항

  • *.apps.<company_name>.io와 같은 고유한 도메인
  • CN=*.apps.<company_name>.io와 같은 사용자 지정 SAN 또는 와일드카드 인증서

프로세스

  1. 새 프로젝트 생성

    $ oc new-project waf-demo
  2. 개인 키와 공개 인증서에서 새 TLS 시크릿을 만듭니다. 여기서 fullchain.pem 은 전체 와일드카드 인증서 체인(개체 포함)이고 privkey.pem 은 와일드카드 인증서의 개인 키입니다.

    예제

    $ oc -n waf-demo create secret tls waf-tls --cert=fullchain.pem --key=privkey.pem

  3. CustomDomain CR(사용자 정의 리소스)을 생성합니다.

    예: waf-custom-domain.yaml

    apiVersion: managed.openshift.io/v1alpha1
    kind: CustomDomain
    metadata:
      name: cloudfront-waf
    spec:
      domain: apps.<company_name>.io 1
      scope: External
      loadBalancerType: NLB
      certificate:
        name: waf-tls
        namespace: waf-demo
      routeSelector: 2
        matchLabels:
         route: waf

    1
    사용자 정의 도메인입니다.
    2
    CustomDomain 인그레스에서 서비스를 제공하는 경로 집합을 필터링합니다. 이 튜토리얼에서는 waf 경로 선택기를 사용하지만 값이 제공되지 않으면 필터링이 발생하지 않습니다.
  4. CR을 적용합니다.

    예제

    $ oc apply -f waf-custom-domain.yaml

  5. 사용자 정의 도메인 Ingress 컨트롤러가 배포되었으며 Ready 인지 확인합니다.

    $ oc get customdomains

    출력 예

    NAME               ENDPOINT                                                    DOMAIN                       STATUS
    cloudfront-waf     xxrywp.<company_name>.cluster-01.opln.s1.openshiftapps.com  *.apps.<company_name>.io     Ready

5.2.1. AWS WAF 구성

AWS WAF 서비스는 ROSA와 같이 보호된 웹 애플리케이션 리소스로 전달되는 HTTP 및 HTTPS 요청을 모니터링, 보호 및 제어할 수 있는 웹 애플리케이션 방화벽입니다.

  1. 웹 ACL에 적용할 AWS WAF 규칙 파일을 만듭니다.

    $ cat << EOF > ${SCRATCH}/waf-rules.json
    [
        {
          "Name": "AWS-AWSManagedRulesCommonRuleSet",
          "Priority": 0,
          "Statement": {
            "ManagedRuleGroupStatement": {
              "VendorName": "AWS",
              "Name": "AWSManagedRulesCommonRuleSet"
            }
          },
          "OverrideAction": {
            "None": {}
          },
          "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "AWS-AWSManagedRulesCommonRuleSet"
          }
        },
        {
          "Name": "AWS-AWSManagedRulesSQLiRuleSet",
          "Priority": 1,
          "Statement": {
            "ManagedRuleGroupStatement": {
              "VendorName": "AWS",
              "Name": "AWSManagedRulesSQLiRuleSet"
            }
          },
          "OverrideAction": {
            "None": {}
          },
          "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "AWS-AWSManagedRulesSQLiRuleSet"
          }
        }
    ]
    EOF

    그러면 코어(Common) 및 SQL AWS 관리 규칙 세트가 활성화됩니다.

  2. 위에서 지정한 규칙을 사용하여 AWS WAF 웹 ACL을 만듭니다.

    $ WAF_WACL=$(aws wafv2 create-web-acl \
      --name cloudfront-waf \
      --region ${REGION} \
      --default-action Allow={} \
      --scope CLOUDFRONT \
      --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=${CLUSTER_NAME}-waf-metrics \
      --rules file://${SCRATCH}/waf-rules.json \
      --query 'Summary.Name' \
      --output text)

5.3. Amazon CloudFront 구성

  1. 새로 생성된 사용자 정의 도메인 인그레스 컨트롤러의 NLB 호스트 이름을 검색합니다.

    $ NLB=$(oc -n openshift-ingress get service router-cloudfront-waf \
      -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    $ echo "Origin domain: ${NLB}"
  2. 인증서를 Amazon Certificate Manager로 가져옵니다. 여기서 cert.pem 은 와일드카드 인증서인 fullchain.pem 은 와일드카드 인증서의 체인이고 privkey.pem 은 와일드카드 인증서의 개인 키입니다.

    참고

    클러스터가 배포된 리전에 관계없이 Amazon CloudFront가 글로벌 AWS 서비스이므로 이 인증서를 us-east-1 로 가져와야 합니다.

    예제

    $ aws acm import-certificate --certificate file://cert.pem \
      --certificate-chain file://fullchain.pem \
      --private-key file://privkey.pem \
      --region us-east-1

  3. AWS 콘솔에 로그인하여 CloudFront 배포를 생성합니다.
  4. 다음 정보를 사용하여 CloudFront 배포를 구성합니다.

    참고

    아래 표에 옵션을 지정하지 않으면 기본값(빈일 수 있음)을 그대로 둡니다.

    옵션현재의

    원본 도메인

    위 명령의 출력 [1]

    이름

    rosa-waf-ingress [2]

    뷰어 프로토콜 정책

    HTTP를 HTTPS로 리디렉션

    허용되는 HTTP 메서드

    GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE

    캐시 정책

    CachingDisabled

    원본 요청 정책

    AllViewer

    웹 애플리케이션 방화벽(WAF)

    보안 보호 활성화

    기존 WAF 구성 사용

    true

    웹 ACL 선택

    cloudfront-waf

    대체 도메인 이름(CNAME)

    *.apps.<company_name>.io [3]

    사용자 정의 SSL 인증서

    위 단계에서 가져온 인증서를 선택합니다 [4]

    1. echo ${NLB} 를 실행하여 원본 도메인을 가져옵니다.
    2. 클러스터가 여러 개인 경우 원본 이름이 고유해야 합니다.
    3. 사용자 정의 도메인 인그레스 컨트롤러를 생성하는 데 사용한 와일드카드 도메인과 일치해야 합니다.
    4. 이는 위에서 입력한 대체 도메인 이름과 일치해야 합니다.
  5. Amazon CloudFront 배포 끝점을 검색합니다.

    $ aws cloudfront list-distributions --query "DistributionList.Items[?Origins.Items[?DomainName=='${NLB}']].DomainName" --output text
  6. 위의 단계에서 CNAME을 사용하여 사용자 지정 와일드카드 도메인의 DNS를 Amazon CloudFront 배포 엔드포인트로 업데이트합니다.

    예제

    *.apps.<company_name>.io CNAME d1b2c3d4e5f6g7.cloudfront.net

5.4. 샘플 애플리케이션 배포

  1. hello world 애플리케이션을 배포합니다.

    $ oc -n waf-demo new-app --image=docker.io/openshift/hello-openshift
  2. 사용자 정의 도메인 이름을 지정하는 애플리케이션의 경로를 생성합니다.

    예제

    $ oc -n waf-demo create route edge --service=hello-openshift hello-openshift-tls \
    --hostname hello-openshift.apps.<company_name>.io

  3. 이를 사용자 정의 도메인 인그레스 컨트롤러에 승인하도록 경로에 레이블을 지정합니다.

    $ oc -n waf-demo label route.route.openshift.io/hello-openshift-tls route=waf

5.5. WAF 테스트

  1. Amazon CloudFront에서 앱에 액세스할 수 있는지 테스트합니다.

    예제

    $ curl "https://hello-openshift.apps.<company_name>.io"

    출력 예

    Hello OpenShift!

  2. WAF가 잘못된 요청을 거부했는지 테스트합니다.

    예제

    $ curl -X POST "https://hello-openshift.apps.<company_name>.io" \
      -F "user='<script><alert>Hello></alert></script>'"

    출력 예

    <html>
    <head><title>403 Forbidden</title></head>
    <body>
    <center><h1>403 Forbidden</h1></center>
    </body>
    </html

    예상되는 결과는 403 Forbidden 오류이며 이는 AWS WAF가 애플리케이션을 보호하고 있음을 의미합니다.

5.6. 추가 리소스

6장. 튜토리얼: AWS WAF 및 AWS ALB를 사용하여 ROSA 워크로드를 보호

AWS WAF는 보호된 웹 애플리케이션 리소스로 전달되는 HTTP 및 HTTPS 요청을 모니터링할 수 있는 웹 애플리케이션 방화벽입니다.

AWS Application Load Balancer(ALB)를 사용하여 AWS(ROSA) 워크로드의 Red Hat OpenShift Service에WAF(Web Application Firewall)를 추가할 수 있습니다. 외부 솔루션을 사용하면 ROSA 리소스가 WAF 처리로 인해 서비스 거부가 발생하지 않도록 보호합니다.

참고

ALB 기반 솔루션을 사용해야 하는 경우를 제외하고 CloudFront 방법을 사용하는 것이 좋습니다.

6.1. 사전 요구 사항

참고

AWS ALB에는 멀티 AZ 클러스터와 동일한 VPC의 동일한 VPC에서 3개의 퍼블릭 서브넷이 분할되어 있어야 합니다.

6.1.1. 환경 설정

  • 환경 변수를 준비합니다.

    $ export AWS_PAGER=""
    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${CLUSTER_NAME}/alb-waf"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster: ${CLUSTER_NAME}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

6.1.2. AWS VPC 및 서브넷

참고

이 섹션은 기존 VPC에 배포된 클러스터에만 적용됩니다. 클러스터를 기존 VPC에 배포하지 않은 경우 이 섹션을 건너뛰고 아래의 설치 섹션을 진행합니다.

  1. 다음 변수를 ROSA 배포의 적절한 값으로 설정합니다.

    $ export VPC_ID=<vpc-id>
    $ export PUBLIC_SUBNET_IDS=<public-subnets>
    $ export PRIVATE_SUBNET_IDS=<private-subnets>
  2. 클러스터 이름을 사용하여 클러스터의 VPC에 태그를 추가합니다.

    $ aws ec2 create-tags --resources ${VPC_ID} --tags Key=kubernetes.io/cluster/${CLUSTER_NAME},Value=owned --region ${REGION}
  3. 퍼블릭 서브넷에 태그를 추가합니다.

    $ aws ec2 create-tags \
         --resources ${PUBLIC_SUBNET_IDS} \
         --tags Key=kubernetes.io/role/elb,Value='' \
         --region ${REGION}
  4. 프라이빗 서브넷에 태그를 추가합니다.

    $ aws ec2 create-tags \
         --resources "${PRIVATE_SUBNET_IDS}" \
         --tags Key=kubernetes.io/role/internal-elb,Value='' \
         --region ${REGION}

6.2. AWS Load Balancer Operator 배포

AWS Load Balancer Operator 는 ROSA 클러스터에서 aws-load-balancer-controller 인스턴스를 설치, 관리 및 구성하는 데 사용됩니다. ROSA에 ALB를 배포하려면 먼저 AWS Load Balancer Operator를 배포해야 합니다.

  1. AWS Load Balancer Controller에 대한 AWS IAM 정책을 생성합니다.

    참고

    이 정책은 업스트림 AWS Load Balancer 컨트롤러 정책과 서브넷에 태그를 생성할 수 있는 권한을 통해 제공됩니다. 이 작업은 Operator가 작동해야 합니다.

    $ oc new-project aws-load-balancer-operator
    $ POLICY_ARN=$(aws iam list-policies --query \
         "Policies[?PolicyName=='aws-load-balancer-operator-policy'].{ARN:Arn}" \
         --output text)
    $ if [[ -z "${POLICY_ARN}" ]]; then
        wget -O "${SCRATCH}/load-balancer-operator-policy.json" \
           https://raw.githubusercontent.com/rh-mobb/documentation/main/content/rosa/aws-load-balancer-operator/load-balancer-operator-policy.json
         POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn \
         --output text iam create-policy \
         --policy-name aws-load-balancer-operator-policy \
         --policy-document "file://${SCRATCH}/load-balancer-operator-policy.json")
    fi
    $ echo $POLICY_ARN
  2. AWS Load Balancer Operator에 대한 AWS IAM 신뢰 정책을 생성합니다.

    $ cat <<EOF > "${SCRATCH}/trust-policy.json"
    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Condition": {
       "StringEquals" : {
         "${OIDC_ENDPOINT}:sub": ["system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-operator-controller-manager", "system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-controller-cluster"]
       }
     },
     "Principal": {
       "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
     },
     "Action": "sts:AssumeRoleWithWebIdentity"
     }
     ]
    }
    EOF
  3. AWS Load Balancer Operator에 대한 AWS IAM 역할을 생성합니다.

    $ ROLE_ARN=$(aws iam create-role --role-name "${CLUSTER_NAME}-alb-operator" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
    $ echo $ROLE_ARN
    
    $ aws iam attach-role-policy --role-name "${CLUSTER_NAME}-alb-operator" \
         --policy-arn $POLICY_ARN
  4. AWS Load Balancer Operator가 새로 생성된 AWS IAM 역할을 가정할 시크릿을 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    stringData:
      credentials: |
        [default]
        role_arn = $ROLE_ARN
        web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    EOF
  5. Red Hat AWS Load Balancer Operator를 설치합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      upgradeStrategy: Default
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      channel: stable-v1.0
      installPlanApproval: Automatic
      name: aws-load-balancer-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: aws-load-balancer-operator.v1.0.0
    EOF
  6. Operator를 사용하여 AWS Load Balancer 컨트롤러 인스턴스를 배포합니다.

    참고

    여기에서 오류가 발생하면 1분 정도 기다린 후 다시 시도하면 Operator가 아직 설치를 완료하지 않은 것입니다.

    $ cat << EOF | oc apply -f -
    apiVersion: networking.olm.openshift.io/v1
    kind: AWSLoadBalancerController
    metadata:
      name: cluster
    spec:
      credentials:
        name: aws-load-balancer-operator
      enabledAddons:
        - AWSWAFv2
    EOF
  7. Operator 및 컨트롤러 Pod가 둘 다 실행 중인지 확인합니다.

    $ oc -n aws-load-balancer-operator get pods

    잠시 대기하지 않고 다시 시도하면 다음이 표시됩니다.

    NAME                                                             READY   STATUS    RESTARTS   AGE
    aws-load-balancer-controller-cluster-6ddf658785-pdp5d            1/1     Running   0          99s
    aws-load-balancer-operator-controller-manager-577d9ffcb9-w6zqn   2/2     Running   0          2m4s

6.3. 샘플 애플리케이션 배포

  1. 샘플 애플리케이션을 위한 새 프로젝트를 생성합니다.

    $ oc new-project hello-world
  2. hello world 애플리케이션을 배포합니다.

    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  3. 사전 생성된 서비스 리소스를 NodePort 서비스 유형으로 변환합니다.

    $ oc -n hello-world patch service hello-openshift -p '{"spec":{"type":"NodePort"}}'
  4. AWS Load Balancer Operator를 사용하여 AWS ALB를 배포합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: hello-openshift-alb
      namespace: hello-world
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Exact
                backend:
                  service:
                    name: hello-openshift
                    port:
                      number: 8080
    EOF
  5. AWS ALB Ingress 끝점을 curl하여 hello world 애플리케이션에 액세스할 수 있는지 확인합니다.

    참고

    AWS ALB 프로비저닝에는 몇 분이 걸립니다. curl: (6) 호스트를 해결할 수 없는 오류가 발생하면 기다렸다가 다시 시도하십시오.

    $ INGRESS=$(oc -n hello-world get ingress hello-openshift-alb -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    $ curl "http://${INGRESS}"

    출력 예

    Hello OpenShift!

6.3.1. AWS WAF 구성

AWS WAF 서비스는 ROSA와 같이 보호된 웹 애플리케이션 리소스로 전달되는 HTTP 및 HTTPS 요청을 모니터링, 보호 및 제어할 수 있는 웹 애플리케이션 방화벽입니다.

  1. 웹 ACL에 적용할 AWS WAF 규칙 파일을 만듭니다.

    $ cat << EOF > ${SCRATCH}/waf-rules.json
    [
        {
          "Name": "AWS-AWSManagedRulesCommonRuleSet",
          "Priority": 0,
          "Statement": {
            "ManagedRuleGroupStatement": {
              "VendorName": "AWS",
              "Name": "AWSManagedRulesCommonRuleSet"
            }
          },
          "OverrideAction": {
            "None": {}
          },
          "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "AWS-AWSManagedRulesCommonRuleSet"
          }
        },
        {
          "Name": "AWS-AWSManagedRulesSQLiRuleSet",
          "Priority": 1,
          "Statement": {
            "ManagedRuleGroupStatement": {
              "VendorName": "AWS",
              "Name": "AWSManagedRulesSQLiRuleSet"
            }
          },
          "OverrideAction": {
            "None": {}
          },
          "VisibilityConfig": {
            "SampledRequestsEnabled": true,
            "CloudWatchMetricsEnabled": true,
            "MetricName": "AWS-AWSManagedRulesSQLiRuleSet"
          }
        }
    ]
    EOF

    그러면 코어(Common) 및 SQL AWS 관리 규칙 세트가 활성화됩니다.

  2. 위에서 지정한 규칙을 사용하여 AWS WAF 웹 ACL을 만듭니다.

    $ WAF_ARN=$(aws wafv2 create-web-acl \
      --name ${CLUSTER_NAME}-waf \
      --region ${REGION} \
      --default-action Allow={} \
      --scope REGIONAL \
      --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=${CLUSTER_NAME}-waf-metrics \
      --rules file://${SCRATCH}/waf-rules.json \
      --query 'Summary.ARN' \
      --output text)
  3. AWS WAF Web ACL ARN으로 Ingress 리소스에 주석을 답니다.

    $ oc annotate -n hello-world ingress.networking.k8s.io/hello-openshift-alb \
      alb.ingress.kubernetes.io/wafv2-acl-arn=${WAF_ARN}
  4. 규칙이 전파되고 앱이 여전히 작동하는지 테스트할 때까지 10초 동안 기다립니다.

    $ curl "http://${INGRESS}"

    출력 예

    Hello OpenShift!

  5. WAF가 잘못된 요청을 거부했는지 테스트합니다.

    $ curl -X POST "http://${INGRESS}" \
      -F "user='<script><alert>Hello></alert></script>'"

    출력 예

    <html>
    <head><title>403 Forbidden</title></head>
    <body>
    <center><h1>403 Forbidden</h1></center>
    </body>
    </html

    예상되는 결과는 403 Forbidden 오류이며 이는 AWS WAF가 애플리케이션을 보호하고 있음을 의미합니다.

6.4. 추가 리소스

7장. 튜토리얼: ROSA 클러스터에 데이터 보호를 위한 OpenShift API 배포

중요

이 콘텐츠는 Red Hat 전문가가 작성했지만 지원되는 모든 구성에서 테스트되지 않았습니다.

사전 요구 사항

환경

  • 환경 변수를 준비합니다.

    참고

    ROSA 클러스터와 일치하도록 클러스터 이름을 변경하고 관리자로 클러스터에 로그인했는지 확인합니다. 계속 진행하기 전에 모든 필드가 올바르게 출력되었는지 확인합니다.

    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export ROSA_CLUSTER_ID=$(rosa describe cluster -c ${CLUSTER_NAME} --output json | jq -r .id)
    $ export REGION=$(rosa describe cluster -c ${CLUSTER_NAME} --output json | jq -r .region.id)
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
    $ export CLUSTER_VERSION=`rosa describe cluster -c ${CLUSTER_NAME} -o json | jq -r .version.raw_id | cut -f -2 -d '.'`
    $ export ROLE_NAME="${CLUSTER_NAME}-openshift-oadp-aws-cloud-credentials"
    $ export AWS_PAGER=""
    $ export SCRATCH="/tmp/${CLUSTER_NAME}/oadp"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster ID: ${ROSA_CLUSTER_ID}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

7.1. AWS 계정 준비

  1. S3 액세스를 위해 허용할 IAM 정책을 생성합니다.

    $ POLICY_ARN=$(aws iam list-policies --query "Policies[?PolicyName=='RosaOadpVer1'].{ARN:Arn}" --output text)
    if [[ -z "${POLICY_ARN}" ]]; then
    $ cat << EOF > ${SCRATCH}/policy.json
    {
    "Version": "2012-10-17",
    "Statement": [
     {
       "Effect": "Allow",
       "Action": [
         "s3:CreateBucket",
         "s3:DeleteBucket",
         "s3:PutBucketTagging",
         "s3:GetBucketTagging",
         "s3:PutEncryptionConfiguration",
         "s3:GetEncryptionConfiguration",
         "s3:PutLifecycleConfiguration",
         "s3:GetLifecycleConfiguration",
         "s3:GetBucketLocation",
         "s3:ListBucket",
         "s3:GetObject",
         "s3:PutObject",
         "s3:DeleteObject",
         "s3:ListBucketMultipartUploads",
         "s3:AbortMultipartUpload",
         "s3:ListMultipartUploadParts",
         "ec2:DescribeSnapshots",
         "ec2:DescribeVolumes",
         "ec2:DescribeVolumeAttribute",
         "ec2:DescribeVolumesModifications",
         "ec2:DescribeVolumeStatus",
         "ec2:CreateTags",
         "ec2:CreateVolume",
         "ec2:CreateSnapshot",
         "ec2:DeleteSnapshot"
       ],
       "Resource": "*"
     }
    ]}
    EOF
    $ POLICY_ARN=$(aws iam create-policy --policy-name "RosaOadpVer1" \
    --policy-document file:///${SCRATCH}/policy.json --query Policy.Arn \
    --tags Key=rosa_openshift_version,Value=${CLUSTER_VERSION} Key=rosa_role_prefix,Value=ManagedOpenShift Key=operator_namespace,Value=openshift-oadp Key=operator_name,Value=openshift-oadp \
    --output text)
    fi
    $ echo ${POLICY_ARN}
  2. 클러스터에 대한 IAM 역할 신뢰 정책을 생성합니다.

    $ cat <<EOF > ${SCRATCH}/trust-policy.json
    {
      "Version": "2012-10-17",
      "Statement": [{
        "Effect": "Allow",
        "Principal": {
          "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_ENDPOINT}"
        },
        "Action": "sts:AssumeRoleWithWebIdentity",
        "Condition": {
          "StringEquals": {
             "${OIDC_ENDPOINT}:sub": [
               "system:serviceaccount:openshift-adp:openshift-adp-controller-manager",
               "system:serviceaccount:openshift-adp:velero"]
          }
        }
      }]
    }
    EOF
    $ ROLE_ARN=$(aws iam create-role --role-name \
     "${ROLE_NAME}" \
      --assume-role-policy-document file://${SCRATCH}/trust-policy.json \
      --tags Key=rosa_cluster_id,Value=${ROSA_CLUSTER_ID} Key=rosa_openshift_version,Value=${CLUSTER_VERSION} Key=rosa_role_prefix,Value=ManagedOpenShift Key=operator_namespace,Value=openshift-adp Key=operator_name,Value=openshift-oadp \
      --query Role.Arn --output text)
    
    $ echo ${ROLE_ARN}
  3. IAM 역할에 IAM 정책을 연결합니다.

    $ aws iam attach-role-policy --role-name "${ROLE_NAME}" \
     --policy-arn ${POLICY_ARN}

7.2. 클러스터에 OADP 배포

  1. OADP의 네임스페이스를 생성합니다.

    $ oc create namespace openshift-adp
  2. 인증 정보 시크릿을 생성합니다.

    $ cat <<EOF > ${SCRATCH}/credentials
    [default]
    role_arn = ${ROLE_ARN}
    web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    EOF
    $ oc -n openshift-adp create secret generic cloud-credentials \
     --from-file=${SCRATCH}/credentials
  3. OADP Operator를 배포합니다.

    참고

    현재 PartiallyFailed 상태인 백업에 대한 버전 1.1에 문제가 있습니다. 이는 백업 및 복원 프로세스에 영향을 미치지 않지만 문제가 있으므로 주의해야 합니다.

    $ cat << EOF | oc create -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
     generateName: openshift-adp-
     namespace: openshift-adp
     name: oadp
    spec:
     targetNamespaces:
     - openshift-adp
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
     name: redhat-oadp-operator
     namespace: openshift-adp
    spec:
     channel: stable-1.2
     installPlanApproval: Automatic
     name: redhat-oadp-operator
     source: redhat-operators
     sourceNamespace: openshift-marketplace
    EOF
  4. Operator가 준비될 때까지 기다립니다.

    $ watch oc -n openshift-adp get pods

    출력 예

    NAME                                                READY   STATUS    RESTARTS   AGE
    openshift-adp-controller-manager-546684844f-qqjhn   1/1     Running   0          22s

  5. 클라우드 스토리지를 생성합니다.

    $ cat << EOF | oc create -f -
    apiVersion: oadp.openshift.io/v1alpha1
    kind: CloudStorage
    metadata:
     name: ${CLUSTER_NAME}-oadp
     namespace: openshift-adp
    spec:
     creationSecret:
       key: credentials
       name: cloud-credentials
     enableSharedConfig: true
     name: ${CLUSTER_NAME}-oadp
     provider: aws
     region: $REGION
    EOF
  6. 애플리케이션의 스토리지 기본 스토리지 클래스를 확인합니다.

    $ oc get pvc -n <namespace> 1
    1
    애플리케이션 네임스페이스를 입력합니다.

    출력 예

    NAME     STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    applog   Bound    pvc-351791ae-b6ab-4e8b-88a4-30f73caf5ef8   1Gi        RWO            gp3-csi        4d19h
    mysql    Bound    pvc-16b8e009-a20a-4379-accc-bc81fedd0621   1Gi        RWO            gp3-csi        4d19h

    $ oc get storageclass

    출력 예

    NAME                PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    gp2                 kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   true                   4d21h
    gp2-csi             ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h
    gp3                 ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h
    gp3-csi (default)   ebs.csi.aws.com         Delete          WaitForFirstConsumer   true                   4d21h

    gp3-csi, gp2-csi, gp3 또는 gp2 중 하나를 사용합니다. 백업 중인 애플리케이션이 모두 PV의 CSI를 사용하는 경우 OADP DPA 구성에 CSI 플러그인을 포함합니다.

  7. CSI만 해당: 데이터 보호 애플리케이션을 배포합니다.

    $ cat << EOF | oc create -f -
    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
     name: ${CLUSTER_NAME}-dpa
     namespace: openshift-adp
    spec:
     backupImages: true
     features:
       dataMover:
         enable: false
     backupLocations:
     - bucket:
         cloudStorageRef:
           name: ${CLUSTER_NAME}-oadp
         credential:
           key: credentials
           name: cloud-credentials
         prefix: velero
         default: true
         config:
           region: ${REGION}
     configuration:
       velero:
         defaultPlugins:
         - openshift
         - aws
         - csi
       restic:
         enable: false
    EOF
    참고

    CSI 볼륨에 대해 이 명령을 실행하는 경우 다음 단계를 건너뛸 수 있습니다.

  8. CSI가 아닌 볼륨: 데이터 보호 애플리케이션을 배포합니다.

    $ cat << EOF | oc create -f -
    apiVersion: oadp.openshift.io/v1alpha1
    kind: DataProtectionApplication
    metadata:
     name: ${CLUSTER_NAME}-dpa
     namespace: openshift-adp
    spec:
     backupImages: true
     features:
       dataMover:
         enable: false
     backupLocations:
     - bucket:
         cloudStorageRef:
           name: ${CLUSTER_NAME}-oadp
         credential:
           key: credentials
           name: cloud-credentials
         prefix: velero
         default: true
         config:
           region: ${REGION}
     configuration:
       velero:
         defaultPlugins:
         - openshift
         - aws
       restic:
         enable: false
     snapshotLocations:
       - velero:
           config:
             credentialsFile: /tmp/credentials/openshift-adp/cloud-credentials-credentials
             enableSharedConfig: 'true'
             profile: default
             region: ${REGION}
           provider: aws
    EOF
참고
  • OADP 1.1.x ROSA STS 환경에서는 컨테이너 이미지 백업 및 복원(spec.backupImages) 값을 지원되지 않으므로 false 로 설정해야 합니다.
  • Restic 기능(restic.enable=false)은 비활성화되어 ROSA STS 환경에서 지원되지 않습니다.
  • DataMover 기능(dataMover.enable=false)은 비활성화되어 ROSA STS 환경에서 지원되지 않습니다.

7.3. 백업 수행

참고

다음 샘플 hello-world 애플리케이션에는 연결된 영구 볼륨이 없습니다. DPA 구성이 작동합니다.

  1. 백업할 워크로드를 생성합니다.

    $ oc create namespace hello-world
    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  2. 경로를 노출합니다.

    $ oc expose service/hello-openshift -n hello-world
  3. 애플리케이션이 작동하는지 확인합니다.

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`

    출력 예

    Hello OpenShift!

  4. 워크로드를 백업합니다.

    $ cat << EOF | oc create -f -
    apiVersion: velero.io/v1
    kind: Backup
    metadata:
     name: hello-world
     namespace: openshift-adp
    spec:
     includedNamespaces:
     - hello-world
     storageLocation: ${CLUSTER_NAME}-dpa-1
     ttl: 720h0m0s
    EOF
  5. 백업이 완료될 때까지 기다립니다.

    $ watch "oc -n openshift-adp get backup hello-world -o json | jq .status"

    출력 예

    {
     "completionTimestamp": "2022-09-07T22:20:44Z",
     "expiration": "2022-10-07T22:20:22Z",
     "formatVersion": "1.1.0",
     "phase": "Completed",
     "progress": {
       "itemsBackedUp": 58,
       "totalItems": 58
     },
     "startTimestamp": "2022-09-07T22:20:22Z",
     "version": 1
    }

  6. 데모 워크로드를 삭제합니다.

    $ oc delete ns hello-world
  7. 백업에서 복원:

    $ cat << EOF | oc create -f -
    apiVersion: velero.io/v1
    kind: Restore
    metadata:
     name: hello-world
     namespace: openshift-adp
    spec:
     backupName: hello-world
    EOF
  8. 복원이 완료될 때까지 기다립니다.

    $ watch "oc -n openshift-adp get restore hello-world -o json | jq .status"

    출력 예

    {
     "completionTimestamp": "2022-09-07T22:25:47Z",
     "phase": "Completed",
     "progress": {
       "itemsRestored": 38,
       "totalItems": 38
     },
     "startTimestamp": "2022-09-07T22:25:28Z",
     "warnings": 9
    }

  9. 워크로드가 복원되었는지 확인합니다.

    $ oc -n hello-world get pods

    출력 예

    NAME                              READY   STATUS    RESTARTS   AGE
    hello-openshift-9f885f7c6-kdjpj   1/1     Running   0          90s

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`

    출력 예

    Hello OpenShift!

  10. 문제 해결 팁은 OADP 팀의 문제 해결 설명서를 참조하십시오.
  11. 추가 샘플 애플리케이션은 OADP 팀의 샘플 애플리케이션 디렉터리에서확인할 수 있습니다.

7.4. cleanup

  1. 워크로드를 삭제합니다.

    $ oc delete ns hello-world
  2. 더 이상 필요하지 않은 경우 클러스터에서 백업을 제거하고 리소스를 복원합니다.

    $ oc delete backup hello-world
    $ oc delete restore hello-world
  3. s3에서 백업/복원 및 원격 개체를 삭제하려면 다음을 수행합니다.

    $ velero backup delete hello-world
    $ velero restore delete hello-world
  4. 데이터 보호 애플리케이션 삭제:

    $ oc -n openshift-adp delete dpa ${CLUSTER_NAME}-dpa
  5. 클라우드 스토리지를 삭제합니다.

    $ oc -n openshift-adp delete cloudstorage ${CLUSTER_NAME}-oadp
    주의

    이 명령이 중단되면 종료자를 삭제해야 할 수 있습니다.

    $ oc -n openshift-adp patch cloudstorage ${CLUSTER_NAME}-oadp -p '{"metadata":{"finalizers":null}}' --type=merge
  6. 더 이상 필요하지 않은 경우 Operator를 제거합니다.

    $ oc -n openshift-adp delete subscription oadp-operator
  7. Operator의 네임스페이스를 제거합니다.

    $ oc delete ns redhat-openshift-adp
  8. 더 이상 사용하지 않으려면 클러스터에서 사용자 정의 리소스 정의를 제거합니다.

    $ for CRD in `oc get crds | grep velero | awk '{print $1}'`; do oc delete crd $CRD; done
    $ for CRD in `oc get crds | grep -i oadp | awk '{print $1}'`; do oc delete crd $CRD; done
  9. AWS S3 버킷을 삭제합니다.

    $ aws s3 rm s3://${CLUSTER_NAME}-oadp --recursive
    $ aws s3api delete-bucket --bucket ${CLUSTER_NAME}-oadp
  10. 역할에서 정책을 분리합니다.

    $ aws iam detach-role-policy --role-name "${ROLE_NAME}" \
     --policy-arn "${POLICY_ARN}"
  11. 역할을 삭제합니다.

    $ aws iam delete-role --role-name "${ROLE_NAME}"

8장. 튜토리얼: AWS Load Balancer Operator on ROSA

중요

이 콘텐츠는 Red Hat 전문가가 작성했지만 지원되는 모든 구성에서 테스트되지 않았습니다.

작은 정보

AWS Load Balancer Operator에서 생성한 로드 밸런서는 OpenShift 경로에 사용할 수 없으며 OpenShift 경로 의 전체 계층 7 기능이 필요하지 않은 개별 서비스 또는 인그레스 리소스에만 사용해야 합니다.

AWS Load Balancer 컨트롤러는 AWS(ROSA) 클러스터에서 Red Hat OpenShift Service의 AWS Elastic Load Balancer를 관리합니다. 컨트롤러는 LoadBalancer 유형의 Kubernetes 서비스 리소스를 구현할 때 Kubernetes Ingress 리소스 및 AWS NLB(Network Load Balancer)를 생성할 때 AWS Application Load Balancer( ALB )를 프로비저닝합니다.

기본 AWS in-tree 로드 밸런서 공급자와 비교하여 이 컨트롤러는 ALB 및 NLB 모두에 대한 고급 주석으로 개발됩니다. 일부 고급 사용 사례는 다음과 같습니다.

  • ALB에서 네이티브 Kubernetes Ingress 오브젝트 사용
  • ALB를 AWS Web Application Firewall(WAF) 서비스와 통합
  • 사용자 정의 NLB 소스 IP 범위 지정
  • 사용자 정의 NLB 내부 IP 주소 지정

AWS Load Balancer Operator 는 ROSA 클러스터에서 aws-load-balancer-controller 인스턴스를 설치, 관리 및 구성하는 데 사용됩니다.

8.1. 사전 요구 사항

참고

AWS ALB에는 멀티 AZ 클러스터와 동일한 VPC의 동일한 VPC에서 3개의 퍼블릭 서브넷이 분할되어 있어야 합니다. 이로 인해 많은 PrivateLink 클러스터에 ALB가 적합하지 않습니다. AWS NLB에는 이러한 제한이 없습니다.

8.1.1. 환경

  • 환경 변수를 준비합니다.

    $ export AWS_PAGER=""
    $ export ROSA_CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${ROSA_CLUSTER_NAME}/alb-operator"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster: ${ROSA_CLUSTER_NAME}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

8.1.2. AWS VPC 및 서브넷

참고

이 섹션은 기존 VPC에 배포된 클러스터에만 적용됩니다. 클러스터를 기존 VPC에 배포하지 않은 경우 이 섹션을 건너뛰고 아래의 설치 섹션을 진행합니다.

  1. 다음 변수를 ROSA 배포의 적절한 값으로 설정합니다.

    $ export VPC_ID=<vpc-id>
    $ export PUBLIC_SUBNET_IDS=<public-subnets>
    $ export PRIVATE_SUBNET_IDS=<private-subnets>
    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}")
  2. 클러스터 이름을 사용하여 클러스터의 VPC에 태그를 추가합니다.

    $ aws ec2 create-tags --resources ${VPC_ID} --tags Key=kubernetes.io/cluster/${CLUSTER_NAME},Value=owned --region ${REGION}
  3. 퍼블릭 서브넷에 태그를 추가합니다.

    $ aws ec2 create-tags \
         --resources ${PUBLIC_SUBNET_IDS} \
         --tags Key=kubernetes.io/role/elb,Value='' \
         --region ${REGION}
  4. 프라이빗 서브넷에 태그를 추가합니다.

    $ aws ec2 create-tags \
         --resources "${PRIVATE_SUBNET_IDS}" \
         --tags Key=kubernetes.io/role/internal-elb,Value='' \
         --region ${REGION}

8.2. 설치

  1. AWS Load Balancer Controller에 대한 AWS IAM 정책을 생성합니다.

    참고

    이 정책은 업스트림 AWS Load Balancer 컨트롤러 정책과 서브넷에 태그를 생성할 수 있는 권한을 통해 제공됩니다. 이 작업은 Operator가 작동해야 합니다.

    $ oc new-project aws-load-balancer-operator
    $ POLICY_ARN=$(aws iam list-policies --query \
         "Policies[?PolicyName=='aws-load-balancer-operator-policy'].{ARN:Arn}" \
         --output text)
    $ if [[ -z "${POLICY_ARN}" ]]; then
        wget -O "${SCRATCH}/load-balancer-operator-policy.json" \
           https://raw.githubusercontent.com/rh-mobb/documentation/main/content/rosa/aws-load-balancer-operator/load-balancer-operator-policy.json
         POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn \
         --output text iam create-policy \
         --policy-name aws-load-balancer-operator-policy \
         --policy-document "file://${SCRATCH}/load-balancer-operator-policy.json")
    fi
    $ echo $POLICY_ARN
  2. AWS Load Balancer Operator에 대한 AWS IAM 신뢰 정책을 생성합니다.

    $ cat <<EOF > "${SCRATCH}/trust-policy.json"
    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Condition": {
       "StringEquals" : {
         "${OIDC_ENDPOINT}:sub": ["system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-operator-controller-manager", "system:serviceaccount:aws-load-balancer-operator:aws-load-balancer-controller-cluster"]
       }
     },
     "Principal": {
       "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
     },
     "Action": "sts:AssumeRoleWithWebIdentity"
     }
     ]
    }
    EOF
  3. AWS Load Balancer Operator에 대한 AWS IAM 역할을 생성합니다.

    $ ROLE_ARN=$(aws iam create-role --role-name "${ROSA_CLUSTER_NAME}-alb-operator" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
    $ echo $ROLE_ARN
    
    $ aws iam attach-role-policy --role-name "${ROSA_CLUSTER_NAME}-alb-operator" \
         --policy-arn $POLICY_ARN
  4. AWS Load Balancer Operator가 새로 생성된 AWS IAM 역할을 가정할 시크릿을 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Secret
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    stringData:
      credentials: |
        [default]
        role_arn = $ROLE_ARN
        web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    EOF
  5. Red Hat AWS Load Balancer Operator를 설치합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      upgradeStrategy: Default
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: aws-load-balancer-operator
      namespace: aws-load-balancer-operator
    spec:
      channel: stable-v1.0
      installPlanApproval: Automatic
      name: aws-load-balancer-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
      startingCSV: aws-load-balancer-operator.v1.0.0
    EOF
  6. Operator를 사용하여 AWS Load Balancer 컨트롤러 인스턴스를 배포합니다.

    참고

    여기에서 오류가 발생하면 1분 정도 기다린 후 다시 시도하면 Operator가 아직 설치를 완료하지 않은 것입니다.

    $ cat << EOF | oc apply -f -
    apiVersion: networking.olm.openshift.io/v1
    kind: AWSLoadBalancerController
    metadata:
      name: cluster
    spec:
      credentials:
        name: aws-load-balancer-operator
    EOF
  7. Operator 및 컨트롤러 Pod가 둘 다 실행 중인지 확인합니다.

    $ oc -n aws-load-balancer-operator get pods

    잠시 대기하지 않고 다시 시도하면 다음이 표시됩니다.

    NAME                                                             READY   STATUS    RESTARTS   AGE
    aws-load-balancer-controller-cluster-6ddf658785-pdp5d            1/1     Running   0          99s
    aws-load-balancer-operator-controller-manager-577d9ffcb9-w6zqn   2/2     Running   0          2m4s

8.3. 배포 검증

  1. 새 프로젝트를 생성합니다.

    $ oc new-project hello-world
  2. hello world 애플리케이션을 배포합니다.

    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  3. AWS ALB에 연결하도록 NodePort 서비스를 구성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: hello-openshift-nodeport
      namespace: hello-world
    spec:
      ports:
        - port: 80
          targetPort: 8080
          protocol: TCP
      type: NodePort
      selector:
        deployment: hello-openshift
    EOF
  4. AWS Load Balancer Operator를 사용하여 AWS ALB를 배포합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: hello-openshift-alb
      namespace: hello-world
      annotations:
        alb.ingress.kubernetes.io/scheme: internet-facing
    spec:
      ingressClassName: alb
      rules:
        - http:
            paths:
              - path: /
                pathType: Exact
                backend:
                  service:
                    name: hello-openshift-nodeport
                    port:
                      number: 80
    EOF
  5. AWS ALB Ingress 끝점을 curl하여 hello world 애플리케이션에 액세스할 수 있는지 확인합니다.

    참고

    AWS ALB 프로비저닝에는 몇 분이 걸립니다. curl: (6) 호스트를 해결할 수 없는 오류가 발생하면 기다렸다가 다시 시도하십시오.

    $ INGRESS=$(oc -n hello-world get ingress hello-openshift-alb \
        -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    $ curl "http://${INGRESS}"

    출력 예

    Hello OpenShift!

  6. hello world 애플리케이션에 사용할 AWS NLB를 배포합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: hello-openshift-nlb
      namespace: hello-world
      annotations:
        service.beta.kubernetes.io/aws-load-balancer-type: external
        service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: instance
        service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
    spec:
      ports:
        - port: 80
          targetPort: 8080
          protocol: TCP
      type: LoadBalancer
      selector:
        deployment: hello-openshift
    EOF
  7. AWS NLB 끝점을 테스트합니다.

    참고

    NLB 프로비저닝에는 몇 분이 걸립니다. curl: (6) 호스트를 해결할 수 없는 오류가 발생하면 기다렸다가 다시 시도하십시오.

    $ NLB=$(oc -n hello-world get service hello-openshift-nlb \
      -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    $ curl "http://${NLB}"

    출력 예

    Hello OpenShift!

8.4. 정리

  1. hello world 애플리케이션 네임스페이스(및 네임스페이스의 모든 리소스)를 삭제합니다.

    $ oc delete project hello-world
  2. AWS Load Balancer Operator 및 AWS IAM 역할을 삭제합니다.

    $ oc delete subscription aws-load-balancer-operator -n aws-load-balancer-operator
    $ aws iam detach-role-policy \
      --role-name "${ROSA_CLUSTER_NAME}-alb-operator" \
      --policy-arn $POLICY_ARN
    $ aws iam delete-role \
      --role-name "${ROSA_CLUSTER_NAME}-alb-operator"
  3. AWS IAM 정책을 삭제합니다.

    $ aws iam delete-policy --policy-arn $POLICY_ARN

9장. 튜토리얼: Ingress 컨트롤러에서 사용자 정의 TLS 암호를 사용하도록 ROSA/OSD 구성

중요

이 콘텐츠는 Red Hat 전문가가 작성했지만 지원되는 모든 구성에서 테스트되지 않았습니다.

이 가이드에서는 Custom Domain Operator가 생성한 Ingress 컨트롤러와 클러스터 Ingress 컨트롤러를 적절하게 패치하는 방법을 보여줍니다. 이 기능을 통해 고객은 클러스터 Ingress 컨트롤러에서 tlsSecurityProfile 값을 수정할 수 있습니다. 이 가이드에서는 사용자 정의 tlsSecurityProfile, 연결된 역할 및 역할 바인딩이 있는 범위 서비스 계정, Ingress 컨트롤러가 다시 작성되거나 수정되는 경우 60분으로 암호를 다시 적용하는 CronJob을 적용하는 방법을 보여줍니다.

사전 요구 사항

프로세스

  1. 사용할 CronJob의 서비스 계정을 생성합니다.

    서비스 계정을 사용하면 CronJob이 일반 사용자의 인증 정보를 사용하지 않고도 클러스터 API에 직접 액세스할 수 있습니다. 서비스 계정을 생성하려면 다음 명령을 실행합니다.

    $ oc create sa cron-ingress-patch-sa -n openshift-ingress-operator
  2. Ingress 컨트롤러를 패치할 수 있는 제한된 액세스를 허용하는 역할 및 역할 바인딩을 생성합니다.

    RBAC(역할 기반 액세스 제어)는 클러스터 내부의 보안을 보장하는 데 중요합니다. 역할을 생성하면 클러스터 내에서 필요한 API 리소스에만 범위가 지정된 액세스 권한을 제공할 수 있습니다. 역할을 생성하려면 다음 명령을 실행합니다.

    $ oc create role cron-ingress-patch-role --verb=get,patch,update --resource=ingresscontroller.operator.openshift.io -n openshift-ingress-operator

    역할이 생성되면 역할 바인딩을 사용하여 서비스 계정에 역할을 바인딩해야 합니다. 역할 바인딩을 생성하려면 다음 명령을 실행합니다.

    $ oc create rolebinding cron-ingress-patch-rolebinding --role=cron-ingress-patch-role --serviceaccount=openshift-ingress-operator:cron-ingress-patch-sa -n openshift-ingress-operator
  3. Ingress 컨트롤러를 패치합니다.

    중요

    아래 제공된 예제에서는 Windows Server 2008 R2에서 IE 11 액세스를 허용하기 위해 Ingress 컨트롤러의 tlsSecurityProfile 에 암호를 추가합니다. 특정 비즈니스 요구 사항을 충족하도록 이 명령을 수정합니다.

    CronJob을 생성하기 전에 tlsSecurityProfile 구성을 적용하여 변경 사항을 검증합니다. 이 프로세스는 Custom Domain Operator 를 사용하는 경우에 따라 다릅니다.

    1. Custom Domain Operator 를 사용하지 않는 클러스터:

      기본 Ingress 컨트롤러만 사용하고 Custom Domain Operator 를 사용하지 않는 경우 다음 명령을 실행하여 Ingress 컨트롤러를 패치합니다.

      $ oc patch ingresscontroller/default -n openshift-ingress-operator --type=merge -p '{"spec":{"tlsSecurityProfile":{"type":"Custom","custom":{"ciphers":["TLS_AES_128_GCM_SHA256","TLS_AES_256_GCM_SHA384","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256","ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384","ECDHE-ECDSA-CHACHA20-POLY1305","ECDHE-RSA-CHACHA20-POLY1305","DHE-RSA-AES128-GCM-SHA256","DHE-RSA-AES256-GCM-SHA384","TLS_CHACHA20_POLY1305_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"],"minTLSVersion":"VersionTLS12"}}}}'

      이 패치는 RSA 인증서를 사용할 때 Windows Server 2008 R2에서 IE 11에서 액세스할 수 있는 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 암호를 추가합니다.

      명령을 실행하면 다음과 같은 응답이 표시됩니다.

      출력 예

      ingresscontroller.operator.openshift.io/default patched

    2. Custom Domain Operator 를 사용하는 클러스터:

      Custom Domain Operator 를 사용하는 고객은 각 Ingress 컨트롤러를 반복하여 패치해야 합니다. 클러스터의 모든 Ingress 컨트롤러를 패치하려면 다음 명령을 실행합니다.

      $ for ic in $(oc get ingresscontroller -o name -n openshift-ingress-operator); do oc patch ${ic} -n openshift-ingress-operator --type=merge -p '{"spec":{"tlsSecurityProfile":{"type":"Custom","custom":{"ciphers":["TLS_AES_128_GCM_SHA256","TLS_AES_256_GCM_SHA384","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256","ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384","ECDHE-ECDSA-CHACHA20-POLY1305","ECDHE-RSA-CHACHA20-POLY1305","DHE-RSA-AES128-GCM-SHA256","DHE-RSA-AES256-GCM-SHA384","TLS_CHACHA20_POLY1305_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"],"minTLSVersion":"VersionTLS12"}}}}'; done

      명령을 실행하면 다음과 같은 응답이 표시됩니다.

      출력 예

      ingresscontroller.operator.openshift.io/default patched
      ingresscontroller.operator.openshift.io/custom1 patched
      ingresscontroller.operator.openshift.io/custom2 patched

  4. CronJob을 생성하여 TLS 구성을 덮어쓰지 않도록 합니다.

    경우에 따라 클러스터의 Ingress 컨트롤러가 다시 생성될 수 있습니다. 이러한 경우 Ingress 컨트롤러는 적용된 tlsSecurityProfile 변경 사항을 유지하지 않을 수 있습니다. 이러한 문제가 발생하지 않도록 하려면 통과하는 CronJob을 생성하고 클러스터의 Ingress 컨트롤러를 업데이트합니다. 이 프로세스는 Custom Domain Operator 를 사용하는 경우에 따라 다릅니다.

    1. Custom Domain Operator 를 사용하지 않는 클러스터:

      Custom Domain Operator 를 사용하지 않는 경우 다음 명령을 실행하여 CronJob을 생성합니다.

      $ cat << EOF | oc apply -f -
      apiVersion: batch/v1
      kind: CronJob
      metadata:
        name: tls-patch
        namespace: openshift-ingress-operator
      spec:
        schedule: '@hourly'
        jobTemplate:
          spec:
            template:
              spec:
                containers:
                  - name: tls-patch
                    image: registry.redhat.io/openshift4/ose-tools-rhel8:latest
                    args:
                      - /bin/sh
                      - '-c'
                      - oc patch ingresscontroller/default -n openshift-ingress-operator --type=merge -p '{"spec":{"tlsSecurityProfile":{"type":"Custom","custom":{"ciphers":["TLS_AES_128_GCM_SHA256","TLS_AES_256_GCM_SHA384","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256","ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384","ECDHE-ECDSA-CHACHA20-POLY1305","ECDHE-RSA-CHACHA20-POLY1305","DHE-RSA-AES128-GCM-SHA256","DHE-RSA-AES256-GCM-SHA384","TLS_CHACHA20_POLY1305_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"],"minTLSVersion":"VersionTLS12"}}}}'
                restartPolicy: Never
                serviceAccountName: cron-ingress-patch-sa
      EOF
      참고

      이 CronJob은 매시간 실행되며 필요한 경우 Ingress 컨트롤러를 패치합니다. OpenShift Ingress Operator를 오버로드할 수 있는 조정을 트리거할 수 있으므로 이 CronJob이 지속적으로 실행되지 않는 것이 중요합니다. 대부분의 경우 CronJob Pod의 로그는 아무것도 변경하지 않기 때문에 다음 예와 유사합니다.

      출력 예

      ingresscontroller.operator.openshift.io/default patched (no change)

    2. Custom Domain Operator 를 사용하는 클러스터:

      Custom Domain Operator 를 사용하는 경우 CronJob을 반복하고 각 Ingress 컨트롤러를 패치해야 합니다. 이 CronJob을 생성하려면 다음 명령을 실행합니다.

      $ cat << EOF | oc apply -f -
      apiVersion: batch/v1
      kind: CronJob
      metadata:
        name: tls-patch
        namespace: openshift-ingress-operator
      spec:
        schedule: '@hourly'
        jobTemplate:
          spec:
            template:
              spec:
                containers:
                  - name: tls-patch
                    image: registry.redhat.io/openshift4/ose-tools-rhel8:latest
                    args:
                      - /bin/sh
                      - '-c'
                      - for ic in $(oc get ingresscontroller -o name -n openshift-ingress-operator); do oc patch ${ic} -n openshift-ingress-operator --type=merge -p '{"spec":{"tlsSecurityProfile":{"type":"Custom","custom":{"ciphers":["TLS_AES_128_GCM_SHA256","TLS_AES_256_GCM_SHA384","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256","ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384","ECDHE-ECDSA-CHACHA20-POLY1305","ECDHE-RSA-CHACHA20-POLY1305","DHE-RSA-AES128-GCM-SHA256","DHE-RSA-AES256-GCM-SHA384","TLS_CHACHA20_POLY1305_SHA256","TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"],"minTLSVersion":"VersionTLS12"}}}}'; done
                restartPolicy: Never
                serviceAccountName: cron-ingress-patch-sa
      EOF
      참고

      이 CronJob은 매시간 실행되며 필요한 경우 Ingress 컨트롤러를 패치합니다. OpenShift Ingress Operator를 오버로드할 수 있는 조정을 트리거할 수 있으므로 이 CronJob이 지속적으로 실행되지 않는 것이 중요합니다. 대부분의 경우 CronJob Pod의 로그는 다음과 같이 표시됩니다.

      출력 예

      ingresscontroller.operator.openshift.io/default patched (no change)
      ingresscontroller.operator.openshift.io/custom1 patched (no change)
      ingresscontroller.operator.openshift.io/custom2 patched (no change)

10장. 튜토리얼: Microsoft Entra ID (이전 Azure Active Directory)를 ID 공급자로 구성

AWS(ROSA)의 Red Hat OpenShift Service에서 Microsoft Entra ID (이전 Azure Active Directory)를 클러스터 ID 공급자로 구성할 수 있습니다.

이 튜토리얼에서는 다음 작업을 완료하도록 안내합니다.

  1. 인증을 위해 Entra ID에 새 애플리케이션을 등록합니다.
  2. 토큰에 선택적 및 그룹 클레임을 포함하도록 Entra ID에서 애플리케이션 등록을 구성합니다.
  3. ID 공급자로 Entra ID를 사용하도록 AWS 클러스터에서 Red Hat OpenShift Service를 구성합니다.
  4. 개별 그룹에 추가 권한을 부여합니다.

10.1. 사전 요구 사항

10.2. 인증을 위해 Entra ID에 새 애플리케이션 등록

Entra ID에 애플리케이션을 등록하려면 먼저 OAuth 콜백 URL을 생성한 다음 애플리케이션을 등록합니다.

프로세스

  1. 지정된 변수를 변경하고 다음 명령을 실행하여 클러스터의 OAuth 콜백 URL을 생성합니다.

    참고

    이 콜백 URL을 저장해야 합니다. 나중에 프로세스에서 필요합니다.

    $ domain=$(rosa describe cluster -c <cluster_name> | grep "DNS" | grep -oE '\S+.openshiftapps.com')
    $ echo "OAuth callback URL: https://oauth-openshift.apps.$domain/oauth2callback/AAD"

    OAuth 콜백 URL 끝에 있는 "AAD" 디렉터리는 이 프로세스의 뒷부분에서 설정할 OAuth ID 공급자 이름과 일치해야 합니다.

  2. Azure 포털에 로그인하여 Entra ID 애플리케이션을 만들고 앱 등록 블레이드 를 선택합니다. 그런 다음 새 등록을 선택하여 새 애플리케이션을 생성합니다.

    Azure Portal - App registrations blade

  3. 애플리케이션 이름을 openshift-auth 로 지정합니다.
  4. 리디렉션 URI 드롭다운에서 Web 을 선택하고 이전 단계에서 검색한 OAuth 콜백 URL 값을 입력합니다.
  5. 필요한 정보를 제공한 후 등록을 클릭하여 애플리케이션을 생성합니다.

    Azure Portal - Register an application page

  6. 인증서 및 시크릿 하위 블록을 선택하고 새 클라이언트 시크릿을 선택합니다.

    Azure Portal - Certificates and secrets page

  7. 요청된 세부 정보를 작성하고 생성된 클라이언트 시크릿 값을 저장합니다. 이 시크릿은 이 프로세스의 뒷부분에서 필요합니다.

    중요

    초기 설정 후에는 클라이언트 시크릿을 볼 수 없습니다. 클라이언트 시크릿을 기록하지 않은 경우 새 시크릿을 생성해야 합니다.

    Azure Portal - Add a Client Secret page

  8. 개요 하위 블록을 선택하고 애플리케이션(클라이언트) ID 및 디렉터리 (테넌트) ID 를 기록해 둡니다. 향후 단계에서 이러한 값이 필요합니다.

    Azure Portal - Copy Client Secret page

10.3. 선택적 및 그룹 클레임을 포함하도록 Entra ID에서 애플리케이션 등록 구성

AWS의 Red Hat OpenShift Service에는 사용자 계정을 생성할 수 있는 충분한 정보가 있으므로 emailpreferred_username 이라는 두 가지 선택적 클레임을 제공하도록 Entra ID를 구성해야 합니다. Entra ID의 선택적 클레임에 대한 자세한 내용은 Microsoft 설명서를 참조하십시오.

개별 사용자 인증 외에도 AWS의 Red Hat OpenShift Service는 그룹 클레임 기능을 제공합니다. 이 기능을 사용하면 Entra ID와 같은 OpenID Connect(OIDC) ID 공급자를 통해 AWS의 Red Hat OpenShift Service 내에서 사용할 사용자의 그룹 멤버십을 제공할 수 있습니다.

선택적 클레임 구성

Entra ID에서 선택적 클레임을 구성할 수 있습니다.

  1. Token configuration sub-blade를 클릭하고 Add optional claim 버튼을 선택합니다.

    Azure Portal - Add Optional Claims Page

  2. ID 라디오 버튼을 선택합니다.

    Azure Portal - Add Optional Claims - Token Type

  3. 이메일 클레임 확인란을 선택합니다.

    Azure Portal - Add Optional Claims - email

  4. preferred_username 클레임 확인란을 선택합니다. 그런 다음 추가 를 클릭하여 이메일preferred_username 이 Entra ID 애플리케이션을 클레임합니다.

    Azure Portal - Add Optional Claims - preferred_username

  5. 페이지 상단에 대화 상자가 표시됩니다. 프롬프트에 따라 필요한 Microsoft Graph 권한을 활성화합니다.

    Azure Portal - Add Optional Claims - Graph Permissions Prompt

그룹 클레임 구성 (선택 사항)

그룹 클레임을 제공하도록 Entra ID를 구성합니다.

프로세스

  1. 토큰 구성 하위 블록에서 그룹 클레임 추가 를 클릭합니다.

    Azure Portal - Add Groups Claim Page

  2. Entra ID 애플리케이션에 대한 그룹 클레임을 구성하려면 보안 그룹을 선택한 다음 추가 를 클릭합니다.

    참고

    이 예에서 그룹 클레임에는 사용자가 멤버인 모든 보안 그룹이 포함됩니다. 실제 프로덕션 환경에서는 그룹 클레임에 AWS의 Red Hat OpenShift Service에 적용되는 그룹만 포함되어 있는지 확인합니다.

    Azure Portal - Edit Groups Claim Page

10.4. Entra ID를 ID 공급자로 사용하도록 AWS 클러스터에서 Red Hat OpenShift Service 구성

Entra ID를 ID 공급자로 사용하도록 AWS에서 Red Hat OpenShift Service를 구성해야 합니다.

ROSA는 OpenShift Cluster Manager를 사용하여 ID 공급자를 구성하는 기능을 제공하지만 ROSA CLI를 사용하여 Entra ID를 ID 공급자로 사용하도록 클러스터의 OAuth 공급자를 구성합니다. ID 공급자를 구성하기 전에 ID 공급자 구성에 필요한 변수를 설정합니다.

프로세스

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

    $ CLUSTER_NAME=example-cluster 1
    $ IDP_NAME=AAD 2
    $ APP_ID=yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy 3
    $ CLIENT_SECRET=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 4
    $ TENANT_ID=zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz 5
    1
    이를 ROSA 클러스터의 이름으로 바꿉니다.
    2
    이 값을 이 프로세스의 앞부분에서 생성한 OAuth 콜백 URL에서 사용한 이름으로 교체합니다.
    3
    이를 애플리케이션(클라이언트) ID로 바꿉니다.
    4
    이를 클라이언트 시크릿으로 교체합니다.
    5
    이 ID를 디렉터리(테넌트) ID로 바꿉니다.
  2. 다음 명령을 실행하여 클러스터의 OAuth 공급자를 구성합니다. 그룹 클레임을 활성화한 경우 --group-claims groups 인수를 사용해야 합니다.

    • 그룹 클레임을 활성화한 경우 다음 명령을 실행합니다.

      $ rosa create idp \
      --cluster ${CLUSTER_NAME} \
      --type openid \
      --name ${IDP_NAME} \
      --client-id ${APP_ID} \
      --client-secret ${CLIENT_SECRET} \
      --issuer-url https://login.microsoftonline.com/${TENANT_ID}/v2.0 \
      --email-claims email \
      --name-claims name \
      --username-claims preferred_username \
      --extra-scopes email,profile \
      --groups-claims groups
    • 그룹 클레임을 활성화하지 않은 경우 다음 명령을 실행합니다.

      $ rosa create idp \
      --cluster ${CLUSTER_NAME} \
      --type openid \
      --name ${IDP_NAME} \
      --client-id ${APP_ID} \
      --client-secret ${CLIENT_SECRET} \
      --issuer-url https://login.microsoftonline.com/${TENANT_ID}/v2.0 \
      --email-claims email \
      --name-claims name \
      --username-claims preferred_username \
      --extra-scopes email,profile

몇 분 후 클러스터 인증 Operator가 변경 사항을 조정하고 Entra ID를 사용하여 클러스터에 로그인할 수 있습니다.

10.5. 개별 사용자 및 그룹에 추가 권한 부여

처음 로그인하면 매우 제한된 권한이 있음을 알 수 있습니다. 기본적으로 AWS의 Red Hat OpenShift Service는 클러스터에서 새 프로젝트 또는 네임스페이스를 생성할 수 있는 기능만 부여합니다. 다른 프로젝트는 볼 수 없습니다.

이러한 추가 기능을 개별 사용자 및 그룹에 부여해야 합니다.

개별 사용자에게 추가 권한 부여

AWS의 Red Hat OpenShift Service에는 클러스터에 대한 전체 액세스 및 제어 권한을 부여하는 cluster-admin 역할을 포함하여 다양한 사전 구성된 역할이 포함되어 있습니다.

프로세스

  • 다음 명령을 실행하여 cluster-admin 역할에 대한 액세스 권한을 사용자에게 부여합니다.

    $ rosa grant user cluster-admin \
        --user=<USERNAME> 1
        --cluster=${CLUSTER_NAME}
    1
    클러스터 관리자 권한이 필요한 Entra ID 사용자 이름을 제공합니다.

개별 그룹에 추가 권한 부여

그룹 클레임을 활성화하도록 선택한 경우 클러스터 OAuth 공급자는 그룹 ID를 사용하여 사용자의 그룹 멤버십을 자동으로 생성하거나 업데이트합니다. 클러스터 OAuth 공급자는 생성된 그룹에 대해 RoleBindingsClusterRoleBindings 를 자동으로 생성하지 않습니다. 자체 프로세스를 사용하여 해당 바인딩을 생성합니다.

cluster-admin 역할에 자동으로 생성된 그룹 액세스 권한을 부여하려면 그룹 ID에 대한 ClusterRoleBinding 을 생성해야 합니다.

프로세스

  • 다음 명령을 실행하여 ClusterRoleBinding 을 생성합니다.

    $ oc create clusterrolebinding cluster-admin-group \
    --clusterrole=cluster-admin \
    --group=<GROUP_ID> 1
    1
    클러스터 관리자 권한이 필요한 Entra ID 그룹 ID를 제공합니다.

    이제 지정된 그룹의 모든 사용자가 cluster-admin 액세스 권한을 자동으로 수신합니다.

10.6. 추가 리소스

AWS의 Red Hat OpenShift Service에서 RBAC를 사용하여 권한을 정의하고 적용하는 방법에 대한 자세한 내용은 Red Hat OpenShift Service on AWS 설명서를 참조하십시오.

11장. 튜토리얼: STS를 사용하여 ROSA에서 AWS Secrets Manager CSI 사용

AWS Secrets 및 Configuration Provider(ASCP)는 AWS 보안을 Kubernetes 스토리지 볼륨으로 노출하는 방법을 제공합니다. ASCP를 사용하면 시크릿 관리자에 시크릿을 저장하고 관리한 다음 AWS(ROSA)의 Red Hat OpenShift Service에서 실행되는 워크로드를 통해 검색할 수 있습니다.

11.1. 사전 요구 사항

이 프로세스를 시작하기 전에 다음 리소스 및 툴이 있는지 확인합니다.

  • STS를 사용하여 배포된 ROSA 클러스터
  • Helm 3
  • AWS CLI
  • oc CLI
  • jq CLI

추가 환경 요구 사항

  1. 다음 명령을 실행하여 ROSA 클러스터에 로그인합니다.

    $ oc login --token=<your-token> --server=<your-server-url>

    Red Hat OpenShift Cluster Manager에서 풀 시크릿 으로 클러스터에 액세스하여 로그인 토큰을 찾을 수 있습니다.

  2. 다음 명령을 실행하여 클러스터에 STS가 있는지 확인합니다.

    $ oc get authentication.config.openshift.io cluster -o json \
      | jq .spec.serviceAccountIssuer

    출력 예

    "https://xxxxx.cloudfront.net/xxxxx"

    출력이 다르면 계속 진행하지 마십시오. 이 프로세스를 계속하기 전에 STS 클러스터 생성에 대한 Red Hat 설명서 를 참조하십시오.

  3. 다음 명령을 실행하여 CSI 드라이버를 실행할 수 있도록 SecurityContextConstraints 권한을 설정합니다.

    $ oc new-project csi-secrets-store
    $ oc adm policy add-scc-to-user privileged \
        system:serviceaccount:csi-secrets-store:secrets-store-csi-driver
    $ oc adm policy add-scc-to-user privileged \
        system:serviceaccount:csi-secrets-store:csi-secrets-store-provider-aws
  4. 다음 명령을 실행하여 이 프로세스의 뒷부분에 사용할 환경 변수를 생성합니다.

    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster \
       -o jsonpath='{.spec.serviceAccountIssuer}' | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
    $ export AWS_PAGER=""

11.2. AWS 시크릿 및 구성 공급자 배포

  1. 다음 명령을 실행하여 보안 저장소 CSI 드라이버를 등록하려면 Helm을 사용합니다.

    $ helm repo add secrets-store-csi-driver \
        https://kubernetes-sigs.github.io/secrets-store-csi-driver/charts
  2. 다음 명령을 실행하여 Helm 리포지터리를 업데이트합니다.

    $ helm repo update
  3. 다음 명령을 실행하여 보안 저장소 CSI 드라이버를 설치합니다.

    $ helm upgrade --install -n csi-secrets-store \
        csi-secrets-store-driver secrets-store-csi-driver/secrets-store-csi-driver
  4. 다음 명령을 실행하여 AWS 공급자를 배포합니다.

    $ oc -n csi-secrets-store apply -f \
        https://raw.githubusercontent.com/rh-mobb/documentation/main/content/misc/secrets-store-csi/aws-provider-installer.yaml
  5. 다음 명령을 실행하여 두 데몬 세트 모두 실행 중인지 확인합니다.

    $ oc -n csi-secrets-store get ds \
        csi-secrets-store-provider-aws \
        csi-secrets-store-driver-secrets-store-csi-driver
  6. 다음 명령을 실행하여 제한된 Pod 보안 프로필과 함께 사용할 수 있도록 Secrets Store CSI 드라이버에 레이블을 지정합니다.

    $ oc label csidriver.storage.k8s.io/secrets-store.csi.k8s.io security.openshift.io/csi-ephemeral-volume-profile=restricted

11.3. 시크릿 및 IAM 액세스 정책 생성

  1. 다음 명령을 실행하여 Secrets Manager에 보안을 생성합니다.

    $ SECRET_ARN=$(aws --region "$REGION" secretsmanager create-secret \
        --name MySecret --secret-string \
        '{"username":"shadowman", "password":"hunter2"}' \
        --query ARN --output text)
    $ echo $SECRET_ARN
  2. 다음 명령을 실행하여 IAM 액세스 정책 문서를 생성합니다.

    $ cat << EOF > policy.json
    {
       "Version": "2012-10-17",
       "Statement": [{
          "Effect": "Allow",
          "Action": [
            "secretsmanager:GetSecretValue",
            "secretsmanager:DescribeSecret"
          ],
          "Resource": ["$SECRET_ARN"]
          }]
    }
    EOF
  3. 다음 명령을 실행하여 IAM 액세스 정책을 생성합니다.

    $ POLICY_ARN=$(aws --region "$REGION" --query Policy.Arn \
    --output text iam create-policy \
    --policy-name openshift-access-to-mysecret-policy \
    --policy-document file://policy.json)
    $ echo $POLICY_ARN
  4. 다음 명령을 실행하여 IAM 역할 신뢰 정책 문서를 생성합니다.

    참고

    신뢰 정책은 이 프로세스에서 나중에 생성하는 네임스페이스의 기본 서비스 계정에 잠겨 있습니다.

    $ cat <<EOF > trust-policy.json
    {
       "Version": "2012-10-17",
       "Statement": [
       {
       "Effect": "Allow",
       "Condition": {
         "StringEquals" : {
           "${OIDC_ENDPOINT}:sub": ["system:serviceaccount:my-application:default"]
          }
        },
        "Principal": {
           "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
        },
        "Action": "sts:AssumeRoleWithWebIdentity"
        }
        ]
    }
    EOF
  5. 다음 명령을 실행하여 IAM 역할을 생성합니다.

    $ ROLE_ARN=$(aws iam create-role --role-name openshift-access-to-mysecret \
    --assume-role-policy-document file://trust-policy.json \
    --query Role.Arn --output text)
    $ echo $ROLE_ARN
  6. 다음 명령을 실행하여 정책에 역할을 연결합니다.

    $ aws iam attach-role-policy --role-name openshift-access-to-mysecret \
        --policy-arn $POLICY_ARN

11.4. 이 시크릿을 사용할 애플리케이션 생성

  1. 다음 명령을 실행하여 OpenShift 프로젝트를 생성합니다.

    $ oc new-project my-application
  2. 다음 명령을 실행하여 STS 역할을 사용하도록 기본 서비스 계정에 주석을 답니다.

    $ oc annotate -n my-application serviceaccount default \
        eks.amazonaws.com/role-arn=$ROLE_ARN
  3. 다음 명령을 실행하여 시크릿에 액세스할 시크릿 공급자 클래스를 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: my-application-aws-secrets
    spec:
      provider: aws
      parameters:
        objects: |
          - objectName: "MySecret"
            objectType: "secretsmanager"
    EOF
  4. 다음 명령에서 시크릿을 사용하여 배포를 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-application
      labels:
        app: my-application
    spec:
      volumes:
      - name: secrets-store-inline
        csi:
          driver: secrets-store.csi.k8s.io
          readOnly: true
          volumeAttributes:
            secretProviderClass: "my-application-aws-secrets"
      containers:
      - name: my-application-deployment
        image: k8s.gcr.io/e2e-test-images/busybox:1.29
        command:
          - "/bin/sleep"
          - "10000"
        volumeMounts:
        - name: secrets-store-inline
          mountPath: "/mnt/secrets-store"
          readOnly: true
    EOF
  5. 다음 commandv를 실행하여 Pod에 보안이 마운트되었는지 확인합니다.

    $ oc exec -it my-application -- cat /mnt/secrets-store/MySecret

11.5. 정리

  1. 다음 명령을 실행하여 애플리케이션을 삭제합니다.

    $ oc delete project my-application
  2. 다음 명령을 실행하여 보안 저장소 csi 드라이버를 삭제합니다.

    $ helm delete -n csi-secrets-store csi-secrets-store-driver
  3. 다음 명령을 실행하여 보안 컨텍스트 제약 조건을 삭제합니다.

    $ oc adm policy remove-scc-from-user privileged \
        system:serviceaccount:csi-secrets-store:secrets-store-csi-driver
    $ oc adm policy remove-scc-from-user privileged \
        system:serviceaccount:csi-secrets-store:csi-secrets-store-provider-aws
  4. 다음 명령을 실행하여 AWS 공급자를 삭제합니다.

    $ oc -n csi-secrets-store delete -f \
    https://raw.githubusercontent.com/rh-mobb/documentation/main/content/misc/secrets-store-csi/aws-provider-installer.yaml
  5. 다음 명령을 실행하여 AWS 역할 및 정책을 삭제합니다.

    $ aws iam detach-role-policy --role-name openshift-access-to-mysecret \
        --policy-arn $POLICY_ARN
    $ aws iam delete-role --role-name openshift-access-to-mysecret
    $ aws iam delete-policy --policy-arn $POLICY_ARN
  6. 다음 명령을 실행하여 Secrets Manager 시크릿을 삭제합니다.

    $ aws secretsmanager --region $REGION delete-secret --secret-id $SECRET_ARN

12장. 튜토리얼: ROSA에서 AWS Controllers for Kubernetes 사용

AWS Controllers for Kubernetes (ACK)를 사용하면 AWS(ROSA)의 Red Hat OpenShift Service에서 직접 AWS 서비스 리소스를 정의하고 사용할 수 있습니다. ACK을 사용하면 클러스터 외부의 리소스를 정의하거나 클러스터 내에서 데이터베이스 또는 메시지 큐와 같은 지원 기능을 제공하는 서비스를 실행할 필요 없이 애플리케이션에 AWS 관리 서비스를 활용할 수 있습니다.

OperatorHub에서 다양한 ACK Operator를 직접 설치할 수 있습니다. 이렇게 하면 애플리케이션과 함께 Operator를 쉽게 시작하고 사용할 수 있습니다. 이 컨트롤러는 현재 개발자 프리뷰에 있는 Kubernetes 프로젝트용 AWS 컨트롤러의 구성 요소입니다.

이 튜토리얼을 사용하여 ACK S3 Operator를 배포합니다. 클러스터의 OperatorHub에서 다른 ACK Operator에 맞게 조정할 수도 있습니다.

12.1. 사전 요구 사항

  • ROSA 클러스터
  • cluster-admin 권한이 있는 사용자 계정
  • OpenShift CLI(oc)
  • AWS(Amazon Web Services) CLI(aws)

12.2. 환경 설정

  1. 클러스터에 맞게 클러스터 이름을 변경하여 다음 환경 변수를 구성합니다.

    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(rosa describe cluster -c ${ROSA_CLUSTER_NAME} --output json | jq -r .region.id)
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o json | jq -r .spec.serviceAccountIssuer | sed  's|^https://||')
    $ export AWS_ACCOUNT_ID=`aws sts get-caller-identity --query Account --output text`
    $ export ACK_SERVICE=s3
    $ export ACK_SERVICE_ACCOUNT=ack-${ACK_SERVICE}-controller
    $ export POLICY_ARN=arn:aws:iam::aws:policy/AmazonS3FullAccess
    $ export AWS_PAGER=""
    $ export SCRATCH="/tmp/${ROSA_CLUSTER_NAME}/ack"
    $ mkdir -p ${SCRATCH}
  2. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "Cluster: ${ROSA_CLUSTER_NAME}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

12.3. AWS 계정 준비

  1. ACK Operator에 대한 AWS IAM(Identity Access Management) 신뢰 정책을 생성합니다.

    $ cat <<EOF > "${SCRATCH}/trust-policy.json"
    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Condition": {
       "StringEquals" : {
         "${OIDC_ENDPOINT}:sub": "system:serviceaccount:ack-system:${ACK_SERVICE_ACCOUNT}"
       }
     },
     "Principal": {
       "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
     },
     "Action": "sts:AssumeRoleWithWebIdentity"
     }
     ]
    }
    EOF
  2. ACK Operator가 연결된 AmazonS3FullAccess 정책을 사용하여 가정할 AWS IAM 역할을 생성합니다.

    참고

    각 프로젝트의 GitHub 리포지토리에서 권장 정책을 찾을 수 있습니다(예: https://github.com/aws-controllers-k8s/s3-controller/blob/main/config/iam/recommended-policy-arn ).

    $ ROLE_ARN=$(aws iam create-role --role-name "ack-${ACK_SERVICE}-controller" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
    $ echo $ROLE_ARN
    
    $ aws iam attach-role-policy --role-name "ack-${ACK_SERVICE}-controller" \
         --policy-arn ${POLICY_ARN}

12.4. ACK S3 컨트롤러 설치

  1. ACK S3 Operator를 설치할 프로젝트를 생성합니다.

    $ oc new-project ack-system
  2. ACK S3 Operator 구성으로 파일을 생성합니다.

    참고

    컨트롤러에서 클러스터의 모든 네임스페이스를 올바르게 조사할 수 있도록 ACK_WATCH_NAMESPACE 는 의도적으로 비워 둡니다.

    $ cat <<EOF > "${SCRATCH}/config.txt"
    ACK_ENABLE_DEVELOPMENT_LOGGING=true
    ACK_LOG_LEVEL=debug
    ACK_WATCH_NAMESPACE=
    AWS_REGION=${REGION}
    AWS_ENDPOINT_URL=
    ACK_RESOURCE_TAGS=${CLUSTER_NAME}
    ENABLE_LEADER_ELECTION=true
    LEADER_ELECTION_NAMESPACE=
    EOF
  3. 이전 단계의 파일을 사용하여 ConfigMap을 생성합니다.

    $ oc -n ack-system create configmap \
      --from-env-file=${SCRATCH}/config.txt ack-${ACK_SERVICE}-user-config
  4. OperatorHub에서 ACK S3 Operator를 설치합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: ack-${ACK_SERVICE}-controller
      namespace: ack-system
    spec:
      upgradeStrategy: Default
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: ack-${ACK_SERVICE}-controller
      namespace: ack-system
    spec:
      channel: alpha
      installPlanApproval: Automatic
      name: ack-${ACK_SERVICE}-controller
      source: community-operators
      sourceNamespace: openshift-marketplace
    EOF
  5. 배포를 가정하고 다시 시작하려면 AWS IAM 역할로 ACK S3 Operator 서비스 계정에 주석을 답니다.

    $ oc -n ack-system annotate serviceaccount ${ACK_SERVICE_ACCOUNT} \
      eks.amazonaws.com/role-arn=${ROLE_ARN} && \
      oc -n ack-system rollout restart deployment ack-${ACK_SERVICE}-controller
  6. ACK S3 Operator가 실행 중인지 확인합니다.

    $ oc -n ack-system get pods

    출력 예

    NAME                                 READY   STATUS    RESTARTS   AGE
    ack-s3-controller-585f6775db-s4lfz   1/1     Running   0          51s

12.5. 배포 검증

  1. S3 버킷 리소스를 배포합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    metadata:
       name: ${CLUSTER-NAME}-bucket
       namespace: ack-system
    spec:
       name: ${CLUSTER-NAME}-bucket
    EOF
  2. S3 버킷이 AWS에서 생성되었는지 확인합니다.

    $ aws s3 ls | grep ${CLUSTER_NAME}-bucket

    출력 예

    2023-10-04 14:51:45 mrmc-test-maz-bucket

12.6. 정리

  1. S3 버킷 리소스를 삭제합니다.

    $ oc -n ack-system delete bucket.s3.services.k8s.aws/${CLUSTER-NAME}-bucket
  2. ACK S3 Operator 및 AWS IAM 역할을 삭제합니다.

    $ oc -n ack-system delete subscription ack-${ACK_SERVICE}-controller
    $ aws iam detach-role-policy \
      --role-name "ack-${ACK_SERVICE}-controller" \
      --policy-arn ${POLICY_ARN}
    $ aws iam delete-role \
      --role-name "ack-${ACK_SERVICE}-controller"
  3. ack-system 프로젝트를 삭제합니다.

    $ oc delete project ack-system

13장. 튜토리얼: ROSA에 외부 DNS Operator 배포

주의

AWS 4.14에서 Red Hat OpenShift Service부터 Custom Domain Operator는 더 이상 사용되지 않습니다. AWS 4.14의 Red Hat OpenShift Service에서 Ingress를 관리하려면 Ingress Operator를 사용합니다. AWS 4.13 및 이전 버전의 Red Hat OpenShift Service에는 기능이 변경되지 않습니다.

Custom Domain Operator 를 구성하려면 Amazon Route 53 호스팅 영역에 와일드카드 CNAME DNS 레코드가 필요합니다. 와일드카드 레코드를 사용하지 않으려면 외부 DNS Operator를 사용하여 경로에 대한 개별 항목을 생성할 수 있습니다.

이 튜토리얼을 사용하여 AWS(ROSA)의 Red Hat OpenShift Service에서 사용자 정의 도메인을 사용하여 외부 DNS Operator를 배포 및 구성합니다.

중요

외부 DNS Operator는 IRSA(Service Accounts)의 IAM 역할을 사용하는 STS를 지원하지 않으며 대신 장기적인 IAM(Identity Access Management) 인증 정보를 사용합니다. 이 튜토리얼은 Operator가 STS를 지원할 때 업데이트됩니다.

13.1. 사전 요구 사항

  • ROSA 클러스터
  • dedicated-admin 권한이 있는 사용자 계정
  • OpenShift CLI(oc)
  • AWS(Amazon Web Services) CLI(aws)
  • *.apps.<company_name>.io와 같은 고유한 도메인
  • 위의 도메인의 Amazon Route 53 공용 호스팅 영역

13.2. 환경 설정

  1. CLUSTER_NAME 을 클러스터 이름으로 교체하여 다음 환경 변수를 구성합니다.

    $ export DOMAIN=apps.<company_name>.io 1
    $ export AWS_PAGER=""
    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${CLUSTER_NAME}/external-dns"
    $ mkdir -p ${SCRATCH}
    1
    사용자 정의 도메인입니다.
  2. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "Cluster: ${CLUSTER_NAME}, Region: ${REGION}, AWS Account ID: ${AWS_ACCOUNT_ID}"

13.3. 사용자 정의 도메인 설정

ROSA는 Custom Domain Operator를 사용하여 보조 Ingress 컨트롤러를 관리합니다. 사용자 정의 도메인을 사용하여 보조 Ingress 컨트롤러를 배포하려면 다음 절차를 사용하십시오.

사전 요구 사항

  • *.apps.<company_name>.io와 같은 고유한 도메인
  • CN=*.apps.<company_name>.io와 같은 사용자 지정 SAN 또는 와일드카드 인증서

프로세스

  1. 새 프로젝트를 생성합니다.

    $ oc new-project external-dns-operator
  2. 개인 키와 공개 인증서에서 새 TLS 시크릿을 만듭니다. 여기서 fullchain.pem 은 전체 와일드카드 인증서 체인(개체 포함)이고 privkey.pem 은 와일드카드 인증서의 개인 키입니다.

    $ oc -n external-dns-operator create secret tls external-dns-tls --cert=fullchain.pem --key=privkey.pem
  3. CustomDomain CR(사용자 정의 리소스)을 생성합니다.

    예: external-dns-custom-domain.yaml

    apiVersion: managed.openshift.io/v1alpha1
    kind: CustomDomain
    metadata:
      name: external-dns
    spec:
      domain: apps.<company_name>.io 1
      scope: External
      loadBalancerType: NLB
      certificate:
        name: external-dns-tls
        namespace: external-dns-operator

    1
    사용자 정의 도메인입니다.
  4. CR을 적용합니다.

    $ oc apply -f external-dns-custom-domain.yaml
  5. 사용자 정의 도메인 Ingress 컨트롤러가 배포되었으며 Ready 상태가 있는지 확인합니다.

    $ oc get customdomains

    출력 예

    NAME               ENDPOINT                                                    DOMAIN                       STATUS
    external-dns       xxrywp.<company_name>.cluster-01.opln.s1.openshiftapps.com  *.apps.<company_name>.io     Ready

13.4. AWS 계정 준비

  1. Amazon Route 53 공용 호스팅 영역 ID를 검색합니다.

    $ export ZONE_ID=$(aws route53 list-hosted-zones-by-name --output json \
      --dns-name "${DOMAIN}." --query 'HostedZones[0]'.Id --out text | sed 's/\/hostedzone\///')
  2. 외부 DNS Operator가 사용자 정의 도메인 공용 호스팅 영역 업데이트할 수 있는 AWS IAM 정책 문서를 생성합니다.

    $ cat << EOF > "${SCRATCH}/external-dns-policy.json"
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "route53:ChangeResourceRecordSets"
          ],
          "Resource": [
            "arn:aws:route53:::hostedzone/${ZONE_ID}"
          ]
        },
        {
          "Effect": "Allow",
          "Action": [
            "route53:ListHostedZones",
            "route53:ListResourceRecordSets"
          ],
          "Resource": [
            "*"
          ]
        }
      ]
    }
    EOF
  3. AWS IAM 정책을 생성합니다.

    $ export POLICY_ARN=$(aws iam create-policy --policy-name "${CLUSTER_NAME}-AllowExternalDNSUpdates" \
      --policy-document file://${SCRATCH}/external-dns-policy.json \
      --query 'Policy.Arn' --output text)
  4. AWS IAM 사용자를 생성합니다.

    $ aws iam create-user --user-name "${CLUSTER_NAME}-external-dns-operator"
  5. 정책을 연결합니다.

    $ aws iam attach-user-policy --user-name "${CLUSTER_NAME}-external-dns-operator" --policy-arn $POLICY_ARN
    참고

    이는 향후 IRSA를 사용하여 STS로 변경됩니다.

  6. IAM 사용자에 대한 AWS 키를 생성합니다.

    $ SECRET_ACCESS_KEY=$(aws iam create-access-key --user-name "${CLUSTER_NAME}-external-dns-operator")
  7. 정적 인증 정보를 생성합니다.

    $ cat << EOF > "${SCRATCH}/credentials"
    [default]
    aws_access_key_id = $(echo $SECRET_ACCESS_KEY | jq -r '.AccessKey.AccessKeyId')
    aws_secret_access_key = $(echo $SECRET_ACCESS_KEY | jq -r '.AccessKey.SecretAccessKey')
    EOF

13.5. 외부 DNS Operator 설치

  1. OperatorHub에서 외부 DNS Operator를 설치합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: external-dns-group
      namespace: external-dns-operator
    spec:
      targetNamespaces:
      - external-dns-operator
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: external-dns-operator
      namespace: external-dns-operator
    spec:
      channel: stable-v1.1
      installPlanApproval: Automatic
      name: external-dns-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
    EOF
  2. 외부 DNS Operator가 실행될 때까지 기다립니다.

    $ oc rollout status deploy external-dns-operator --timeout=300s
  3. AWS IAM 사용자 인증 정보에서 시크릿을 생성합니다.

    $ oc -n external-dns-operator create secret generic external-dns \
      --from-file "${SCRATCH}/credentials"
  4. ExternalDNS 컨트롤러를 배포합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: externaldns.olm.openshift.io/v1beta1
    kind: ExternalDNS
    metadata:
      name: ${DOMAIN}
    spec:
      domains:
        - filterType: Include
          matchType: Exact
          name: ${DOMAIN}
      provider:
        aws:
          credentials:
            name: external-dns
        type: AWS
      source:
        openshiftRouteOptions:
          routerName: external-dns
        type: OpenShiftRoute
      zones:
        - ${ZONE_ID}
    EOF
  5. 컨트롤러가 실행될 때까지 기다립니다.

    $ oc rollout status deploy external-dns-${DOMAIN} --timeout=300s

13.6. 샘플 애플리케이션 배포

이제 ExternalDNS 컨트롤러가 실행 중이므로 샘플 애플리케이션을 배포하여 새 경로를 노출할 때 사용자 정의 도메인이 구성되고 신뢰할 수 있는지 확인할 수 있습니다.

  1. 샘플 애플리케이션에 대한 새 프로젝트를 생성합니다.

    $ oc new-project hello-world
  2. hello world 애플리케이션을 배포합니다.

    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
  3. 사용자 정의 도메인 이름을 지정하는 애플리케이션의 경로를 생성합니다.

    $ oc -n hello-world create route edge --service=hello-openshift hello-openshift-tls \
    --hostname hello-openshift.${DOMAIN}
  4. ExternalDNS에서 DNS 레코드가 자동으로 생성되었는지 확인합니다.

    참고

    Amazon Route 53에 레코드가 표시되는 데 몇 분이 걸릴 수 있습니다.

    $ aws route53 list-resource-record-sets --hosted-zone-id ${ZONE_ID} \
       --query "ResourceRecordSets[?Type == 'CNAME']" | grep hello-openshift
  5. 선택 사항: ExternalDNS에서 생성되었음을 나타내는 TXT 레코드를 볼 수도 있습니다.

    $ aws route53 list-resource-record-sets --hosted-zone-id ${ZONE_ID} \
       --query "ResourceRecordSets[?Type == 'TXT']" | grep ${DOMAIN}
  6. OpenShift 로그인이 표시되는 브라우저에서 사용자 정의 콘솔 도메인으로 이동합니다.

    $ echo console.${DOMAIN}

14장. 튜토리얼: ROSA에서 cert-manager Operator를 사용하여 동적 인증서 발행

와일드카드 인증서는 지정된 도메인의 모든 최상위 하위 도메인을 단일 인증서로 보호함으로써 단순성을 제공하지만 다른 사용 사례에서는 도메인당 개별 인증서를 사용해야 할 수 있습니다.

cert-manager Operator for Red Hat OpenShiftLet's Encrypt 를 사용하여 사용자 정의 도메인을 사용하여 생성된 경로의 인증서를 동적으로 발급하는 방법을 알아봅니다.

14.1. 사전 요구 사항

  • ROSA 클러스터
  • cluster-admin 권한이 있는 사용자 계정
  • OpenShift CLI(oc)
  • AWS(Amazon Web Services) CLI(aws)
  • *.apps.<company_name>.io와 같은 고유한 도메인
  • 위의 도메인의 Amazon Route 53 공용 호스팅 영역

14.2. 환경 설정

  1. 다음 환경 변수를 구성합니다.

    $ export DOMAIN=apps.<company_name>.io 1
    $ export EMAIL=<youremail@company_name.io> 2
    $ export AWS_PAGER=""
    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    $ export OIDC_ENDPOINT=$(oc get authentication.config.openshift.io cluster -o json | jq -r .spec.serviceAccountIssuer | sed  's|^https://||')
    $ export REGION=$(oc get infrastructure cluster -o=jsonpath="{.status.platformStatus.aws.region}")
    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    $ export SCRATCH="/tmp/${CLUSTER_NAME}/dynamic-certs"
    $ mkdir -p ${SCRATCH}
    1
    사용자 정의 도메인입니다.
    2
    Let's Encrypt는 인증서에 대한 알림을 보내는 데 사용할 이메일입니다.
  2. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "Cluster: ${CLUSTER_NAME}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"

14.3. AWS 계정 준비

cert-manager 가 Let's Encrypt (또는 다른 ACME 인증서 발급자)에서 인증서를 요청하는 경우, Let's Encrypt servers validate that you control the domain name in that certificate using challenges. 이 튜토리얼에서는 해당 도메인 이름에 TXT 레코드에 특정 값을 배치하여 도메인 이름의 DNS를 제어한다는 것을 증명하는 DNS -01 챌린지 를 사용하고 있습니다. 이 모든 작업은 cert-manager에 의해 자동으로 수행됩니다. cert-manager 권한이 도메인의 Amazon Route 53 공용 호스팅 영역을 수정할 수 있도록 하려면 특정 정책 권한 및 pod 액세스를 허용하는 신뢰 관계를 사용하여 IAM(Identity Access Management) 역할을 생성해야 합니다.

이 튜토리얼에서 사용되는 공개 호스팅 영역은 ROSA 클러스터와 동일한 AWS 계정에 있습니다. 공개 호스팅 영역이 다른 계정에 있는 경우 Cross Account Access 에 대한 몇 가지 추가 단계가 필요합니다.

  1. Amazon Route 53 공용 호스팅 영역 ID를 검색합니다.

    참고

    이 명령은 이전에 DOMAIN 환경 변수로 지정한 사용자 정의 도메인과 일치하는 공개 호스팅 영역을 찾습니다. 내보내기 ZONE_ID=<zone_ID>를 실행하여 Amazon Route 53 공개 호스팅 영역을 수동으로 지정하여 < zone_ID >를 특정 Amazon Route 53 공개 호스팅 영역 ID로 교체할 수 있습니다.

    $ export ZONE_ID=$(aws route53 list-hosted-zones-by-name --output json \
      --dns-name "${DOMAIN}." --query 'HostedZones[0]'.Id --out text | sed 's/\/hostedzone\///')
  2. 지정된 공개 호스팅 영역 업데이트하는 기능을 제공하는 cert-manager Operator에 대한 AWS IAM 정책 문서를 생성합니다.

    $ cat <<EOF > "${SCRATCH}/cert-manager-policy.json"
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": "route53:GetChange",
          "Resource": "arn:aws:route53:::change/*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "route53:ChangeResourceRecordSets",
            "route53:ListResourceRecordSets"
          ],
          "Resource": "arn:aws:route53:::hostedzone/${ZONE_ID}"
        },
        {
          "Effect": "Allow",
          "Action": "route53:ListHostedZonesByName",
          "Resource": "*"
        }
      ]
    }
    EOF
  3. 이전 단계에서 생성한 파일을 사용하여 IAM 정책을 생성합니다.

    $ POLICY_ARN=$(aws iam create-policy --policy-name "${CLUSTER_NAME}-cert-manager-policy" \
      --policy-document file://${SCRATCH}/cert-manager-policy.json \
      --query 'Policy.Arn' --output text)
  4. cert-manager Operator에 대한 AWS IAM 신뢰 정책을 생성합니다.

    $ cat <<EOF > "${SCRATCH}/trust-policy.json"
    {
     "Version": "2012-10-17",
     "Statement": [
     {
     "Effect": "Allow",
     "Condition": {
       "StringEquals" : {
         "${OIDC_ENDPOINT}:sub": "system:serviceaccount:cert-manager:cert-manager"
       }
     },
     "Principal": {
       "Federated": "arn:aws:iam::$AWS_ACCOUNT_ID:oidc-provider/${OIDC_ENDPOINT}"
     },
     "Action": "sts:AssumeRoleWithWebIdentity"
     }
     ]
    }
    EOF
  5. 이전 단계에서 생성한 신뢰 정책을 사용하여 cert-manager Operator에 대한 IAM 역할을 생성합니다.

    $ ROLE_ARN=$(aws iam create-role --role-name "${CLUSTER_NAME}-cert-manager-operator" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
  6. 권한 정책을 역할에 연결합니다.

    $ aws iam attach-role-policy --role-name "${CLUSTER_NAME}-cert-manager-operator" \
      --policy-arn ${POLICY_ARN}

14.4. cert-manager Operator 설치

  1. cert-manager Operator를 설치할 프로젝트를 생성합니다.

    $ oc new-project cert-manager-operator
    중요

    클러스터에서 두 개 이상의 cert-manager Operator를 사용하지 마십시오. 커뮤니티 cert-manager Operator가 클러스터에 설치되어 있는 경우 cert-manager Operator for Red Hat OpenShift를 설치하기 전에 이를 제거해야 합니다.

  2. cert-manager Operator for Red Hat OpenShift를 설치합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: openshift-cert-manager-operator-group
      namespace: cert-manager-operator
    spec:
      targetNamespaces:
      - cert-manager-operator
    ---
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: openshift-cert-manager-operator
      namespace: cert-manager-operator
    spec:
      channel: stable-v1
      installPlanApproval: Automatic
      name: openshift-cert-manager-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
    EOF
    참고

    이 Operator를 설치하고 설정을 완료하는 데 몇 분이 걸립니다.

  3. cert-manager Operator가 실행 중인지 확인합니다.

    $ oc -n cert-manager-operator get pods

    출력 예

    NAME                                                        READY   STATUS    RESTARTS   AGE
    cert-manager-operator-controller-manager-84b8799db5-gv8mx   2/2     Running   0          12s

  4. 이전에 생성한 AWS IAM 역할을 사용하여 cert-manager Pod에서 사용하는 서비스 계정에 주석을 답니다.

    $ oc -n cert-manager annotate serviceaccount cert-manager eks.amazonaws.com/role-arn=${ROLE_ARN}
  5. 다음 명령을 실행하여 기존 cert-manager 컨트롤러 Pod를 다시 시작합니다.

    $ oc -n cert-manager delete pods -l app.kubernetes.io/name=cert-manager
  6. Operator의 구성을 패치하여 외부 이름 서버를 사용하여 DNS-01 챌린지 확인 문제를 방지합니다.

    $ oc patch certmanager.operator.openshift.io/cluster --type merge \
      -p '{"spec":{"controllerConfig":{"overrideArgs":["--dns01-recursive-nameservers-only","--dns01-recursive-nameservers=1.1.1.1:53"]}}}'
  7. 다음 명령을 실행하여 Let's Encrypt를 사용하도록 ClusterIssuer 리소스를 만듭니다.

    $ cat << EOF | oc apply -f -
    apiVersion: cert-manager.io/v1
    kind: ClusterIssuer
    metadata:
      name: letsencrypt-production
    spec:
      acme:
        server: https://acme-v02.api.letsencrypt.org/directory
        email: ${EMAIL}
        # This key doesn't exist, cert-manager creates it
        privateKeySecretRef:
          name: prod-letsencrypt-issuer-account-key
        solvers:
        - dns01:
            route53:
             hostedZoneID: ${ZONE_ID}
             region: ${REGION}
             secretAccessKeySecretRef:
               name: ''
    EOF
  8. ClusterIssuer 리소스가 준비되었는지 확인합니다.

    $ oc get clusterissuer.cert-manager.io/letsencrypt-production

    출력 예

    NAME                     READY   AGE
    letsencrypt-production   True    47s

14.5. 사용자 정의 도메인 Ingress 컨트롤러 생성

  1. 새 프로젝트를 생성합니다.

    $ oc new-project custom-domain-ingress
  2. 사용자 정의 도메인 Ingress 컨트롤러의 인증서를 프로비저닝하도록 인증서 리소스를 생성하고 구성합니다.

    참고

    다음 예제에서는 단일 도메인 인증서를 사용합니다. SAN 및 와일드카드 인증서도 지원됩니다.

    $ cat << EOF | oc apply -f -
    apiVersion: cert-manager.io/v1
    kind: Certificate
    metadata:
      name: custom-domain-ingress-cert
      namespace: custom-domain-ingress
    spec:
      secretName: custom-domain-ingress-cert-tls
      issuerRef:
         name: letsencrypt-production
         kind: ClusterIssuer
      commonName: "${DOMAIN}"
      dnsNames:
      - "${DOMAIN}"
    EOF
  3. 인증서가 발행되었는지 확인합니다.

    참고

    Let's Encrypt에서 이 인증서를 발급하는 데 몇 분이 걸립니다. 5분 이상 걸리는 경우 oc -n custom-domain-ingress describe certificate.cert-manager.io/custom-domain-ingress-cert 를 실행하여 cert-manager에서 보고한 문제를 확인합니다.

    $ oc -n custom-domain-ingress get certificate.cert-manager.io/custom-domain-ingress-cert

    출력 예

    NAME                         READY   SECRET                           AGE
    custom-domain-ingress-cert   True    custom-domain-ingress-cert-tls   9m53s

  4. CustomDomain CR(사용자 정의 리소스)을 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: managed.openshift.io/v1alpha1
    kind: CustomDomain
    metadata:
      name: custom-domain-ingress
    spec:
      domain: ${DOMAIN}
      scope: External
      loadBalancerType: NLB
      certificate:
        name: custom-domain-ingress-cert-tls
        namespace: custom-domain-ingress
    EOF
  5. 사용자 정의 도메인 Ingress 컨트롤러가 배포되었으며 Ready 상태가 있는지 확인합니다.

    $ oc get customdomains

    출력 예

    NAME                    ENDPOINT                                                               DOMAIN            STATUS
    custom-domain-ingress   tfoxdx.custom-domain-ingress.cluster.1234.p1.openshiftapps.com         example.com       Ready

  6. 사용자 정의 도메인 Ingress 컨트롤러에 대한 DNS 확인을 활성화하기 위해 필요한 DNS 변경 사항이 포함된 문서를 준비합니다.

    $ INGRESS=$(oc get customdomain.managed.openshift.io/custom-domain-ingress --template={{.status.endpoint}})
    $ cat << EOF > "${SCRATCH}/create-cname.json"
    {
      "Comment":"Add CNAME to custom domain endpoint",
      "Changes":[{
          "Action":"CREATE",
          "ResourceRecordSet":{
            "Name": "*.${DOMAIN}",
          "Type":"CNAME",
          "TTL":30,
          "ResourceRecords":[{
            "Value": "${INGRESS}"
          }]
        }
      }]
    }
    EOF
  7. 승인을 위해 Amazon Route 53에 변경 사항을 제출합니다.

    $ aws route53 change-resource-record-sets \
      --hosted-zone-id ${ZONE_ID} \
      --change-batch file://${SCRATCH}/create-cname.json
    참고

    와일드카드 CNAME 레코드는 사용자 정의 도메인 Ingress 컨트롤러를 사용하여 배포하는 모든 새 애플리케이션에 대해 새 레코드를 생성할 필요가 없지만 이러한 각 애플리케이션에서 사용하는 인증서는 와일드카드 인증서가 아닙니다.

14.6. 사용자 정의 도메인 경로에 대한 동적 인증서 구성

이제 지정된 도메인의 첫 번째 하위 도메인에 클러스터 애플리케이션을 노출할 수 있지만 애플리케이션 도메인과 일치하는 TLS 인증서로 연결은 보호되지 않습니다. 이러한 클러스터 애플리케이션에 각 도메인 이름에 대한 유효한 인증서가 있는지 확인하려면 이 도메인에서 생성된 모든 새 경로에 인증서를 동적으로 발행하도록 cert-manager를 구성합니다.

  1. OpenShift 경로에 대한 인증서를 관리하는 데 필요한 필수 OpenShift 리소스 cert-manager를 생성합니다.

    이 단계에서는 클러스터의 주석이 달린 경로를 구체적으로 모니터링하는 새 배포(및 Pod)를 생성합니다. 새 경로에 issuer-kindissuer-name 주석이 있는 경우 이 경로에 고유한 새 인증서에 대해 Issuer(ClusterIssuer)를 요청하고 경로를 생성하는 동안 지정된 호스트 이름을 준수합니다.

    참고

    클러스터가 GitHub에 액세스할 수 없는 경우 원시 콘텐츠를 로컬로 저장하고 oc apply -f localfilename.yaml -n cert-manager 를 실행할 수 있습니다.

    $ oc -n cert-manager apply -f https://github.com/cert-manager/openshift-routes/releases/latest/download/cert-manager-openshift-routes.yaml

    다음 추가 OpenShift 리소스도 이 단계에서 생성됩니다.

    • ClusterRole - 클러스터 전체에서 경로를 감시하고 업데이트할 수 있는 권한을 부여합니다.
    • ServiceAccount - 새로 생성된 Pod를 실행하는 권한을 사용합니다.
    • ClusterRoleBinding - 이 두 리소스를 바인딩합니다.
  2. cert-manager-openshift-routes Pod가 성공적으로 실행 중인지 확인합니다.

    $ oc -n cert-manager get pods

    결과 예

    NAME                                             READY   STATUS    RESTARTS   AGE
    cert-manager-866d8f788c-9kspc                    1/1     Running   0          4h21m
    cert-manager-cainjector-6885c585bd-znws8         1/1     Running   0          4h41m
    cert-manager-openshift-routes-75b6bb44cd-f8kd5   1/1     Running   0          6s
    cert-manager-webhook-8498785dd9-bvfdf            1/1     Running   0          4h41m

14.7. 샘플 애플리케이션 배포

이제 동적 인증서가 구성되었으므로 샘플 애플리케이션을 배포하여 새 경로를 노출할 때 인증서가 프로비저닝되고 신뢰할 수 있는지 확인할 수 있습니다.

  1. 샘플 애플리케이션에 대한 새 프로젝트를 생성합니다.

    $ oc new-project hello-world
  2. hello world 애플리케이션을 배포합니다.

    $ oc -n hello-world new-app --image=docker.io/openshift/hello-openshift
  3. 클러스터 외부에서 애플리케이션을 노출할 경로를 생성합니다.

    $ oc -n hello-world create route edge --service=hello-openshift hello-openshift-tls --hostname hello.${DOMAIN}
  4. 경로의 인증서를 신뢰할 수 없는지 확인합니다.

    $ curl -I https://hello.${DOMAIN}

    출력 예

    curl: (60) SSL: no alternative certificate subject name matches target host name 'hello.example.com'
    More details here: https://curl.se/docs/sslcerts.html
    
    curl failed to verify the legitimacy of the server and therefore could not
    establish a secure connection to it. To learn more about this situation and
    how to fix it, please visit the web page mentioned above.

  5. cert-manager를 트리거하도록 경로에 주석을 달아 사용자 정의 도메인의 인증서를 프로비저닝합니다.

    $ oc -n hello-world annotate route hello-openshift-tls cert-manager.io/issuer-kind=ClusterIssuer cert-manager.io/issuer-name=letsencrypt-production
    참고

    인증서를 생성하는 데 2~3분 정도 걸립니다. 인증서 갱신은 expiration에 따라 cert-manager Operator에 의해 자동으로 관리됩니다.

  6. 경로의 인증서가 이제 신뢰할 수 있는지 확인합니다.

    $ curl -I https://hello.${DOMAIN}

    출력 예

    HTTP/2 200
    date: Thu, 05 Oct 2023 23:45:33 GMT
    content-length: 17
    content-type: text/plain; charset=utf-8
    set-cookie: 52e4465485b6fb4f8a1b1bed128d0f3b=68676068bb32d24f0f558f094ed8e4d7; path=/; HttpOnly; Secure; SameSite=None
    cache-control: private

14.8. 동적 인증서 프로비저닝 문제 해결

참고

검증 프로세스는 일반적으로 인증서를 생성하는 동안 2~3분 정도 걸립니다.

인증서 생성 단계에서 경로에 주석을 달지 않으면 각 인증서 , certificate request,order, 챌린지 리소스에 대해 oc describe 를 실행하여 이벤트 또는 문제의 원인을 확인하는 데 도움이 될 수 있습니다.

$ oc get certificate,certificaterequest,order,challenge

문제 해결을 위해 인증서 디버깅에서 이 유용한 가이드를 참조하십시오.

인증서 상태 확인 및 갱신 테스트와 같은 다양한 인증서 관리 활동에 cmctl CLI 툴을 사용할 수도 있습니다.

15장. 튜토리얼: 외부 트래픽에 일관된 송신 IP 할당

보안 그룹 또는 IP 기반 구성이 필요한 기타 종류의 보안 제어와 같은 항목을 구성할 때 클러스터를 떠나는 트래픽에 일관된 IP 주소를 할당하는 것이 좋습니다. 기본적으로 Red Hat OpenShift Service on AWS (ROSA)(Open OVN-Kubernetes CNI 사용)는 풀에서 임의의 IP 주소를 할당하므로 보안 잠금을 예측할 수 없거나 불필요하게 오픈할 수 있습니다. 이 가이드에서는 일반적인 보안 표준 및 지침 및 기타 잠재적인 사용 사례를 충족하기 위해 송신 클러스터 트래픽에 대해 예측 가능한 IP 주소 세트를 구성하는 방법을 보여줍니다.

자세한 내용은 이 항목에 대한 OpenShift 설명서 를 참조하십시오.

15.1. 사전 요구 사항

  • OVN-Kubernetes로 배포된 ROSA 클러스터
  • OpenShift CLI(oc)
  • ROSA CLI (rosa)
  • jq

15.1.1. 환경

이렇게 하면 튜토리얼의 환경 변수가 직접 복사/붙일 필요가 없도록 설정됩니다. 다른 머신 풀을 대상으로 지정하려면 ROSA_MACHINE_POOL_NAME 변수를 교체해야 합니다.

$ export ROSA_CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
$ export ROSA_MACHINE_POOL_NAME=Default

15.2. 용량 확인

각 퍼블릭 클라우드 공급자에 대해 노드별로 할당할 수 있는 IP 주소 수에 제한이 있습니다. 이는 송신 IP 주소를 할당하는 기능에 영향을 미칠 수 있습니다. 충분한 용량을 확인하려면 다음 명령을 실행하여 영향을 받을 수 있는 노드를 식별하기 위해 현재 할당된 IP 주소와 총 용량을 출력할 수 있습니다.

$ oc get node -o json | \
    jq '.items[] |
        {
            "name": .metadata.name,
            "ips": (.status.addresses | map(select(.type == "InternalIP") | .address)),
            "capacity": (.metadata.annotations."cloud.network.openshift.io/egress-ipconfig" | fromjson[] | .capacity.ipv4)
        }'

출력 예

---
{
  "name": "ip-10-10-145-88.ec2.internal",
  "ips": [
    "10.10.145.88"
  ],
  "capacity": 14
}
{
  "name": "ip-10-10-154-175.ec2.internal",
  "ips": [
    "10.10.154.175"
  ],
  "capacity": 14
}
---

참고

위 예제에서는 jq 를 친숙한 필터로 사용합니다. jq 가 설치되지 않은 경우 각 노드의 metadata.annotations['cloud.network.openshift.io/egress-ipconfig'] 필드를 수동으로 검토하여 노드 용량을 확인할 수 있습니다.

15.3. 송신 IP 규칙 생성

15.3.1. 송신 IP 확인

규칙을 만들기 전에 사용할 송신 IP를 식별해야 합니다. 선택한 송신 IP는 작업자 노드가 프로비저닝되는 서브넷의 일부로 존재해야 합니다.

15.3.2. 송신 IP 예약

AWS VPC DHCP 서비스와의 충돌을 방지하기 위해 요청한 송신 IP를 예약하는 것이 좋지만 필수는 아닙니다. 이렇게 하려면 CIDR 예약에 대한 AWS 문서에 따라 명시적 IP 예약을 요청할 수 있습니다.

15.4. 네임스페이스에 송신 IP 배포

네임스페이스 선택을 기반으로 송신 IP 주소 할당을 보여주는 프로젝트를 생성합니다.

$ oc create -f demo-egress-pod.yaml

송신 규칙을 생성합니다. 이 규칙은 송신 트래픽이 spec.namespaceSelector 필드를 사용하여 생성한 네임스페이스 내의 모든 Pod에 적용되도록 합니다.

$ cat <<EOF | oc apply -f -
apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: demo-egress-ns
spec:
  # NOTE: these egress IPs are within the subnet range(s) in which my worker nodes
  #       are deployed.
  egressIPs:
    - 10.10.100.253
    - 10.10.150.253
    - 10.10.200.253
  namespaceSelector:
    matchLabels:
      kubernetes.io/metadata.name: demo-egress-ns
EOF

15.4.1. Pod에 송신 IP 할당

Pod 선택을 기반으로 송신 IP 주소 할당을 보여주는 프로젝트를 생성합니다.

$ oc new-project demo-egress-pod

송신 규칙을 생성합니다. 이 규칙은 spec.podSelector 필드를 사용하여 방금 생성한 Pod에 송신 트래픽이 적용되도록 합니다. spec.namespaceSelector 는 필수 필드입니다.

$ cat <<EOF | oc apply -f -
apiVersion: k8s.ovn.org/v1
kind: EgressIP
metadata:
  name: demo-egress-pod
spec:
  # NOTE: these egress IPs are within the subnet range(s) in which my worker nodes
  #       are deployed.
  egressIPs:
    - 10.10.100.254
    - 10.10.150.254
    - 10.10.200.254
  namespaceSelector:
    matchLabels:
      kubernetes.io/metadata.name: demo-egress-pod
  podSelector:
    matchLabels:
      run: demo-egress-pod
EOF

15.4.2. 노드에 레이블을 지정

oc get egressips 를 실행하고 송신 IP 할당이 보류 중임을 확인할 수 있습니다.

출력 예

NAME              EGRESSIPS       ASSIGNED NODE   ASSIGNED EGRESSIPS
demo-egress-ns    10.10.100.253
demo-egress-pod   10.10.100.254

송신 IP 할당을 완료하려면 노드에 특정 레이블을 할당해야 합니다. 이전 단계에서 생성한 송신 IP 규칙은 k8s.ovn.org/egress-assignable 레이블이 있는 노드에만 적용됩니다. 세트 환경 변수 단계의 환경 변수를 사용하여 설정된 대로 특정 머신풀에만 레이블이 있는지 확인하고자 합니다.

다음 명령을 사용하여 시스템 풀에 필요한 레이블을 할당합니다.

주의

machinepool의 노드 레이블에 의존하는 경우 이 명령은 해당 라벨을 대체합니다. 노드 라벨이 유지되도록 --labels 필드에 원하는 레이블을 입력해야 합니다.

$ rosa update machinepool ${ROSA_MACHINE_POOL_NAME} \
  --cluster="${ROSA_CLUSTER_NAME}" \
  --labels "k8s.ovn.org/egress-assignable="

15.4.3. 송신 IP 검토

다음과 같이 출력을 생성할 oc get egressips 를 실행하여 송신 IP 할당을 검토할 수 있습니다.

출력 예

NAME              EGRESSIPS       ASSIGNED NODE                   ASSIGNED EGRESSIPS
demo-egress-ns    10.10.100.253   ip-10-10-156-122.ec2.internal   10.10.150.253
demo-egress-pod   10.10.100.254   ip-10-10-156-122.ec2.internal   10.10.150.254

15.5. 송신 IP 규칙 테스트

15.5.1. 샘플 애플리케이션 배포

규칙을 테스트하기 위해 지정한 송신 IP 주소에만 잠겨 있는 서비스를 생성합니다. 이렇게 하면 IP 주소의 작은 하위 집합이 예상되는 외부 서비스를 시뮬레이션합니다.

몇 가지 유용한 정보를 제공하는 echoserver를 실행하십시오.

$ oc -n default run demo-service --image=gcr.io/google_containers/echoserver:1.4

Pod를 서비스로 노출하여 ( .spec.loadBalancerSourceRanges 필드를 통해) Pod를 사용해야 하는 송신 IP 주소에만 수신을 제한합니다.

$ cat <<EOF | oc apply -f -
apiVersion: v1
kind: Service
metadata:
  name: demo-service
  namespace: default
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-scheme: "internal"
    service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
  selector:
    run: demo-service
  ports:
    - port: 80
      targetPort: 8080
  type: LoadBalancer
  externalTrafficPolicy: Local
  # NOTE: this limits the source IPs that are allowed to connect to our service.  It
  #       is being used as part of this demo, restricting connectivity to our egress
  #       IP addresses only.
  # NOTE: these egress IPs are within the subnet range(s) in which my worker nodes
  #       are deployed.
  loadBalancerSourceRanges:
    - 10.10.100.254/32
    - 10.10.150.254/32
    - 10.10.200.254/32
    - 10.10.100.253/32
    - 10.10.150.253/32
    - 10.10.200.253/32
EOF

다음 단계에 복사하고 사용할 수 있는 LOAD_BALANCER_HOSTNAME 환경 변수로 로드 밸런서 호스트 이름을 검색합니다.

$ export LOAD_BALANCER_HOSTNAME=$(oc get svc -n default demo-service -o json | jq -r '.status.loadBalancer.ingress[].hostname')

15.5.2. 테스트 네임스페이스 송신

이전에 생성된 네임스페이스 송신 규칙을 테스트합니다. 다음은 데모 서비스에 대해 curl을 실행할 수 있는 대화형 쉘을 시작합니다.

$ oc run \
  demo-egress-ns \
  -it \
  --namespace=demo-egress-ns \
  --env=LOAD_BALANCER_HOSTNAME=$LOAD_BALANCER_HOSTNAME \
  --image=registry.access.redhat.com/ubi9/ubi -- \
  bash

Pod 내부에서는 로드 밸런서에 요청을 보내 성공적으로 연결할 수 있습니다.

$ curl -s http://$LOAD_BALANCER_HOSTNAME

성공적인 연결을 나타내는 다음과 유사한 출력이 표시되어야 합니다. 아래 client_address 는 송신 IP가 아닌 로드 밸런서의 내부 IP 주소입니다. 성공적으로 연결( .spec.loadBalancerSourceRanges로 서비스를 제한)은 성공적인 데모를 제공하는 것입니다.

출력 예

CLIENT VALUES:
client_address=10.10.207.247
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=*/*
host=internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com
user-agent=curl/7.76.1
BODY:
-no body in request-

완료되면 Pod를 안전하게 종료할 수 있습니다.

$ exit

15.5.3. Pod 송신 테스트

이전에 생성된 Pod 송신 규칙을 테스트합니다. 다음은 데모 서비스에 대해 curl을 실행할 수 있는 대화형 쉘을 시작합니다.

$ oc run \
  demo-egress-pod \
  -it \
  --namespace=demo-egress-pod \
  --env=LOAD_BALANCER_HOSTNAME=$LOAD_BALANCER_HOSTNAME \
  --image=registry.access.redhat.com/ubi9/ubi -- \
  bash

Pod 내부에서는 로드 밸런서에 요청을 보내 성공적으로 연결할 수 있습니다.

$ curl -s http://$LOAD_BALANCER_HOSTNAME

성공적인 연결을 나타내는 다음과 유사한 출력이 표시되어야 합니다. 아래 client_address 는 송신 IP가 아닌 로드 밸런서의 내부 IP 주소입니다. 성공적으로 연결( .spec.loadBalancerSourceRanges로 서비스를 제한)은 성공적인 데모를 제공하는 것입니다.

출력 예

CLIENT VALUES:
client_address=10.10.207.247
command=GET
real path=/
query=nil
request_version=1.1
request_uri=http://internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com:8080/

SERVER VALUES:
server_version=nginx: 1.10.0 - lua: 10001

HEADERS RECEIVED:
accept=*/*
host=internal-a3e61de18bfca4a53a94a208752b7263-148284314.us-east-1.elb.amazonaws.com
user-agent=curl/7.76.1
BODY:
-no body in request-

완료되면 Pod를 안전하게 종료할 수 있습니다.

$ exit

15.5.4. 차단된 송신 테스트

또는 성공적인 연결로 인해 송신 규칙이 적용되지 않으면 트래픽이 성공적으로 차단되었음을 확인할 수 있습니다. 실패한 연결(서비스를 .spec.loadBalancerSourceRanges로 제한)은 이 시나리오에서 성공적인 데모를 제공하는 것입니다.

$ oc run \
  demo-egress-pod-fail \
  -it \
  --namespace=demo-egress-pod \
  --env=LOAD_BALANCER_HOSTNAME=$LOAD_BALANCER_HOSTNAME \
  --image=registry.access.redhat.com/ubi9/ubi -- \
  bash

Pod 내부에서는 로드 밸런서에 요청을 보낼 수 있습니다.

$ curl -s http://$LOAD_BALANCER_HOSTNAME

위의 명령이 중단되어야 합니다. 완료되면 Pod를 안전하게 종료할 수 있습니다.

$ exit

15.6. 정리

다음 명령을 실행하여 클러스터를 정리할 수 있습니다.

$ oc delete svc demo-service -n default; \
$ oc delete pod demo-service -n default; \
$ oc delete project demo-egress-ns; \
$ oc delete project demo-egress-pod; \
$ oc delete egressip demo-egress-ns; \
$ oc delete egressip demo-egress-pod

다음 명령을 실행하여 할당된 노드 레이블을 정리할 수 있습니다.

주의

machinepool의 노드 레이블에 의존하는 경우 이 명령은 해당 라벨을 대체합니다. 노드 라벨이 유지되도록 --labels 필드에 원하는 레이블을 입력해야 합니다.

$ rosa update machinepool ${ROSA_MACHINE_POOL_NAME} \
  --cluster="${ROSA_CLUSTER_NAME}" \
  --labels ""

16장. ROSA 시작하기

16.1. 튜토리얼: ROSA란 무엇입니까?

ROSA(Red Hat OpenShift Service on AWS)는 애플리케이션을 구축하고 배포하여 가장 중요한 사항에 중점을 두고 고객에게 가치를 제공할 수 있는 완전 관리형 턴키 애플리케이션 플랫폼입니다. Red Hat 및 AWS SRE 전문가가 기본 플랫폼을 관리하므로 인프라 관리에 대해 우려할 필요가 없습니다. ROSA는 다양한 AWS 컴퓨팅, 데이터베이스, 분석, 머신 러닝, 네트워킹, 모바일 및 기타 서비스와 원활한 통합을 제공하여 고객에게 차별화된 경험을 보다 신속하게 구축하고 제공합니다.

ROSA는 AWS STS(Security Token Service)를 사용하여 AWS 계정의 인프라를 관리하기 위한 인증 정보를 얻습니다. AWS STS는 IAM 사용자 또는 페더레이션 사용자를 위한 임시 인증 정보를 생성하는 글로벌 웹 서비스입니다. ROSA는 이를 사용하여 단기적이고 제한된 권한, 보안 인증 정보를 할당합니다. 이러한 인증 정보는 AWS API 호출을 수행하는 각 구성 요소에 특정적인 IAM 역할과 연결됩니다. 이 방법은 클라우드 서비스 리소스 관리에서 최소한의 권한 및 보안 관행의 주체와 일치합니다. ROSA CLI(명령줄 인터페이스) 툴은 고유한 작업에 할당된 STS 자격 증명을 관리하고 OpenShift 기능의 일부로 AWS 리소스에 대한 작업을 수행합니다.

16.1.1. ROSA의 주요 기능

  • 네이티브 AWS 서비스: AWS 관리 콘솔을 통해 셀프 서비스 온보딩 환경을 통해 Red Hat OpenShift 온 디맨드에 액세스하고 사용합니다.
  • 유연한 소비 기반 가격: 유연한 가격 및 연간 청구 모델에 따라 유연한 가격과 필요에 따라 비즈니스 요구 사항에 맞게 비용을 지불합니다.
  • Red Hat OpenShift 및 AWS 사용량에 대한 단일 청구: 고객은 Red Hat OpenShift 및 AWS 사용량 모두에 대해 AWS에서 단일 청구를 받습니다.
  • 완전 통합된 지원 경험: Red Hat 및 Amazon 지원과 함께 Red Hat 사이트 안정성 엔지니어(SRE)와 함께 설치, 관리, 유지 관리 및 업그레이드와 99.95% 서비스 수준 계약(SLA)을 수행합니다.
  • AWS 서비스 통합: AWS에는 컴퓨팅, 스토리지, 네트워킹, 데이터베이스, 분석 및 머신 러닝과 같은 강력한 클라우드 서비스 포트폴리오가 있습니다. 이러한 모든 서비스는 ROSA를 통해 직접 액세스할 수 있습니다. 따라서 친숙한 관리 인터페이스를 통해 전역 및 온디맨드를 보다 쉽게 구축, 운영 및 확장할 수 있습니다.
  • 최대 가용성: 지원되는 리전의 여러 가용성 영역에 클러스터를 배포하여 가장 까다로운 미션 크리티컬 애플리케이션 및 데이터의 가용성을 극대화하고 고가용성을 유지합니다.
  • 클러스터 노드 확장: 리소스 수요에 맞게 컴퓨팅 노드를 추가하거나 제거합니다.
  • 최적화된 클러스터: 요구 사항에 맞게 클러스터 크기가 지정된 메모리 최적화, 컴퓨팅 최적화 또는 일반 용도의 EC2 인스턴스 유형 중에서 선택합니다.
  • 글로벌 가용성: 제품 지역 가용성 페이지를 참조하여 ROSA를 전 세계적으로 사용할 수 있는 위치를 확인하십시오.

16.1.2. ROSA 및 Kubernetes

ROSA에서 컨테이너를 배포하고 관리하는 데 필요한 모든 것이 컨테이너 관리, Operator, 네트워킹, 로드 밸런싱, 서비스 메시, CI/CD, 방화벽, 모니터링, 레지스트리, 인증 및 권한 부여 기능을 포함하여 번들로 제공됩니다. 이러한 구성 요소는 완전한 플랫폼으로 통합 작업을 위해 함께 테스트됩니다. 무선 플랫폼 업그레이드를 포함한 자동화된 클러스터 작업은 Kubernetes 환경을 더욱 향상시킵니다.

16.1.3. 기본 역할

일반적으로 클러스터 배포 및 유지 관리는 Red Hat 또는 AWS의 책임이고 애플리케이션, 사용자 및 데이터는 고객의 책임이 됩니다. 역할 분석에 대한 자세한 내용은 담당 매트릭스 를 참조하십시오.

16.1.4. 로드맵 및 기능 요청

ROSA 로드맵 을 방문하여 현재 개발 중인 기능의 상태를 최신 상태로 유지합니다. 제품 팀에 대한 제안 사항이 있는 경우 새 문제를 엽니다.

16.1.5. AWS 리전 가용성

ROSA를 사용할 수 있는 위치에 대한 최신 보기는 제품 지역 가용성 페이지를 참조하십시오.

16.1.6. 규정 준수 인증

ROSA는 현재 SOC-2 유형 2, SOC 3, ISO-27001, ISO Cryostat17, ISO Cryostat18, HIPAA, GDPR 및 PCI-DSS와 호환됩니다. 또한 현재 FedRAMP High를 위해 노력하고 있습니다.

16.1.7. 노드

16.1.7.1. 여러 AWS 리전의 작업자 노드

ROSA 클러스터의 모든 노드는 동일한 AWS 리전에 있어야 합니다. 여러 가용성 영역에 구성된 클러스터의 경우 컨트롤 플레인 노드 및 작업자 노드는 가용성 영역에 분산됩니다.

16.1.7.2. 최소 작업자 노드 수

ROSA 클러스터의 경우 최소 수는 단일 가용성 영역의 작업자 노드 2개와 여러 가용성 영역의 작업자 노드 3개입니다.

16.1.7.3. 기본 노드 운영 체제

모든 OpenShift v4.x 오퍼링과 마찬가지로 컨트롤 플레인, 인프라 및 작업자 노드는 RHCOS(Red Hat Enterprise Linux CoreOS)를 실행합니다.

16.1.7.4. 노드 중단 또는 종료

현재 ROSA에는 노드에 대한 하이버네이션 또는 종료 기능이 없습니다. shutdown 및 hibernation 기능은 광범위한 클라우드 서비스 사용을 위해 아직 충분히 완성되지 않은 OpenShift 플랫폼 기능입니다.

16.1.7.5. 작업자 노드에 지원되는 인스턴스

작업자 노드에 지원되는 인스턴스 전체 목록은 AWS 인스턴스 유형을 참조하십시오. Spot 인스턴스도 지원됩니다.

16.1.7.6. 노드 자동 스케일링

자동 스케일링을 사용하면 현재 워크로드에 따라 클러스터 크기를 자동으로 조정할 수 있습니다. 자세한 내용은 클러스터에서 자동 스케일링 노드 정보를 참조하십시오.

16.1.7.7. 최대 작업자 노드 수

최대 작업자 노드 수는 각 ROSA 클러스터에 대해 180 작업자 노드입니다. 노드 수에 대한 자세한 내용은 제한 및 확장성 을 참조하십시오.

계정 전체 및 클러스터별 역할 목록은 ROSA 설명서에 제공됩니다.

16.1.8. 관리자

ROSA 고객의 관리자는 사용자가 생성한 모든 프로젝트에 액세스하는 것 외에도 사용자와 할당량을 관리할 수 있습니다.

16.1.9. OpenShift 버전 및 업그레이드

ROSA는 OpenShift Container Platform을 기반으로 하는 관리형 서비스입니다. ROSA 문서에서 현재 버전 및 라이프 사이클 날짜를 볼 수 있습니다.

고객은 최신 OpenShift 버전으로 업그레이드하고 해당 OpenShift 버전의 기능을 사용할 수 있습니다. 자세한 내용은 라이프 사이클 날짜 를 참조하십시오. ROSA에서 일부 OpenShift 기능을 사용할 수 있는 것은 아닙니다. 자세한 내용은 서비스 정의를 검토하십시오.

16.1.10. 지원

OpenShift Cluster Manager 에서 직접 티켓을 열 수 있습니다. 지원 취득에 대한 자세한 내용은 ROSA 지원 설명서 를 참조하십시오.

Red Hat 고객 포털을 방문하여 Red Hat 제품과 관련된 기사 및 솔루션에 대한 Red Hat 지식 베이스를 검색하거나 검색하거나 Red Hat 지원에 지원 케이스를 제출할 수도 있습니다.

16.1.10.1. 제한된 지원

"수명 종료"일 이전에 ROSA 클러스터가 업그레이드되지 않으면 클러스터는 제한된 지원 상태로 계속 작동합니다. 해당 클러스터에 대한 SLA는 더 이상 적용되지 않지만 해당 클러스터에 대한 지원을 받을 수 있습니다. 자세한 내용은 제한된 지원 상태 설명서를 참조하십시오.

추가 지원 리소스

16.1.11. SLA(서비스 수준 계약)

자세한 내용은 ROSA SLA 페이지를 참조하십시오.

16.1.12. 알림 및 통신

Red Hat은 이메일 및 하이브리드 클라우드 콘솔 서비스 로그를 통해 새로운 Red Hat 및 AWS 기능, 업데이트 및 스케줄링된 유지 관리에 대한 알림을 제공합니다.

16.1.13. OBSA(Open Service Broker for AWS)

ROSA와 함께 OSBA를 사용할 수 있습니다. 그러나 권장되는 방법은 Kubernetes 용 최신 AWS 컨트롤러 입니다. OSBA에 대한 자세한 내용은 AWS의 Open Service Broker 를 참조하십시오.

16.1.14. 오프보딩

고객은 언제든지 ROSA 사용을 중지하고 애플리케이션을 온프레미스, 프라이빗 클라우드 또는 기타 클라우드 공급자로 이동할 수 있습니다. 표준 예약 인스턴스(RI) 정책은 사용되지 않는 RI에 적용됩니다.

16.1.15. 인증

ROSA는 OpenID Connect( OAuth2 프로필, Google OAuth, GitHub OAuth, GitLab 및 LDAP)와 같은 인증 메커니즘을 지원합니다.

16.1.16. SRE 클러스터 액세스

모든 SRE 클러스터 액세스는 MFA에 의해 보호됩니다. 자세한 내용은 SRE Access 를 참조하십시오.

16.1.17. Encryption

16.1.17.1. 암호화 키

ROSA는 KMS에 저장된 키를 사용하여 EBS 볼륨을 암호화합니다. 또한 고객은 클러스터 생성 시 자체 KMS 키를 제공할 수 있습니다.

16.1.17.2. KMS 키

KMS 키를 지정하면 컨트롤 플레인, 인프라 및 작업자 노드 루트 볼륨 및 영구 볼륨이 키로 암호화됩니다.

16.1.17.3. 데이터 암호화

기본적으로 미사용 암호화가 있습니다.By default, there is encryption at rest. AWS Storage 플랫폼은 데이터를 저장하기 전에 자동으로 데이터를 암호화하고 검색하기 전에 데이터를 해독합니다. 자세한 내용은 AWS EBS 암호화를 참조하십시오.

클러스터의 etcd를 암호화하여 AWS 스토리지 암호화와 결합할 수도 있습니다. 이로 인해 암호화를 두 배로 늘리면 성능이 20 %까지 증가합니다. 자세한 내용은 etcd 암호화 설명서를 참조하십시오.

16.1.17.4. etcd 암호화

etcd 암호화는 클러스터 생성 시에만 활성화할 수 있습니다.

참고

etcd 암호화에는 잘못된 보안 위험 완화 기능이 포함된 추가 오버헤드가 발생합니다.

16.1.17.5. etcd 암호화 구성

etcd 암호화는 OpenShift Container Platform과 동일하게 구성됩니다. aescbc cypher가 사용되고 클러스터 배포 중에 설정이 패치됩니다. 자세한 내용은 Kubernetes 설명서 를 참조하십시오.

16.1.17.6. EBS 암호화를 위한 다중 리전 KMS 키

현재 ROSA CLI는 EBS 암호화를 위해 다중 리전 KMS 키를 허용하지 않습니다. 이 기능은 제품 업데이트를 위한 백로그에 있습니다. ROSA CLI는 클러스터 생성 시 정의된 경우 EBS 암호화를 위해 단일 리전 KMS 키를 허용합니다.

16.1.18. 인프라

ROSA는 가상 머신, 스토리지 및 로드 밸런서와 같은 다양한 클라우드 서비스를 사용합니다. AWS 사전 요구 사항 에서 정의된 목록을 볼 수 있습니다.

16.1.19. 인증 정보 방법

AWS 계정에서 필요한 작업을 수행하는 데 필요한 권한을 Red Hat에 부여하는 두 가지 인증 정보 방법이 있습니다. 즉 STS가 있는 AWS 또는 관리자 권한이 있는 IAM 사용자입니다. STS를 사용하는 AWS는 기본 방법이며 IAM 사용자 방법은 결국 더 이상 사용되지 않습니다. STS를 사용하는 AWS는 클라우드 서비스 리소스 관리에서 최소한의 권한 및 보안 관행의 원칙에 더 잘 부합합니다.

16.1.20. 사전 요구 사항 권한 또는 실패 오류

ROSA CLI의 최신 버전을 확인합니다. ROSA CLI의 모든 릴리스는 GithubRed Hat 서명된 바이너리 릴리스 의 두 위치에 있습니다.

16.1.21. 스토리지

서비스 정의의 스토리지 섹션을 참조하십시오.

OpenShift에는 AWS EFS용 CSI 드라이버가 포함되어 있습니다. 자세한 내용은 AWS 에서 Red Hat OpenShift Service의 AWS EFS 설정을 참조하십시오.

16.1.22. VPC 사용

설치 시 기존 VPC에 배포하거나 자체 VPC를 가져오도록 선택할 수 있습니다. 그런 다음 필요한 서브넷을 선택하고 해당 서브넷을 사용할 때 설치 프로그램의 서브넷을 포함하는 유효한 CIDR 범위를 제공할 수 있습니다.

ROSA를 사용하면 여러 클러스터가 동일한 VPC를 공유할 수 있습니다. 하나의 VPC의 클러스터 수는 나머지 AWS 리소스 할당량 및 중복될 수 없는 CIDR 범위에 따라 제한됩니다. 자세한 내용은 CIDR 범위 정의를 참조하십시오.

16.1.23. 네트워크 플러그인

ROSA는 OpenShift OVN-Kubernetes 기본 CNI 네트워크 공급자를 사용합니다.

16.1.24. 네임스페이스 간 네트워킹

클러스터 관리자는 NetworkPolicy 오브젝트를 사용하여 프로젝트별로 네임스페이스를 사용자 지정하고 거부할 수 있습니다. 자세한 내용은 네트워크 정책을 사용하여 다중 테넌트 격리 구성 을 참조하십시오.

16.1.25. Prometheus 및 Grafana 사용

Prometheus 및 Grafana를 사용하여 OpenShift 사용자 워크로드 모니터링을 사용하여 컨테이너를 모니터링하고 용량을 관리할 수 있습니다. OpenShift Cluster Manager 의 확인란 옵션입니다.

16.1.26. 클러스터 control-plane의 감사 로그 출력

Cluster Logging Operator 애드온이 클러스터에 추가된 경우 CloudMonitor를 통해 감사 로그를 사용할 수 있습니다. 그렇지 않은 경우 지원 요청을 통해 일부 감사 로그를 요청할 수 있습니다. 소규모 대상 및 시간상 제공되는 로그는 내보내기를 요청하여 고객에게 보낼 수 있습니다. 사용 가능한 감사 로그의 선택은 플랫폼 보안 및 규정 준수 범주에서 SRE의 재량에 따라 제공됩니다. 클러스터 전체 로그 내보내기 요청은 거부됩니다.

16.1.27. AWS 권한 경계

클러스터 정책에 대해 AWS Permissions Boundary를 사용할 수 있습니다.

16.1.28. AMI

ROSA 작업자 노드는 OSD 및 OpenShift Container Platform의 다른 AMI를 사용합니다. 컨트롤 플레인 및 Infra 노드 AMI는 동일한 버전의 제품에서 일반적입니다.

16.1.29. 클러스터 백업

ROSA STS 클러스터에 백업이 없습니다. 사용자는 애플리케이션 및 데이터에 대한 자체 백업 정책이 있어야 합니다. 자세한 내용은 백업 정책을 참조하십시오.

16.1.30. 사용자 정의 도메인

애플리케이션의 사용자 지정 도메인을 정의할 수 있습니다. 자세한 내용은 애플리케이션의 사용자 정의 도메인 구성 을 참조하십시오.

16.1.31. ROSA 도메인 인증서

Red Hat 인프라(Hive)는 기본 애플리케이션 인그레스의 인증서 교체를 관리합니다.

16.1.32. 연결이 끊긴 환경

ROSA는 Air-gapped, disconnected 환경을 지원하지 않습니다. ROSA 클러스터는 레지스트리, S3에 액세스하여 메트릭을 보내려면 인터넷으로 전송해야 합니다. 이 서비스에는 여러 송신 끝점이 필요합니다. Ingress는 Red Hat SRE의 PrivateLink와 고객 액세스를 위한 VPN으로 제한할 수 있습니다.

16.2. 튜토리얼: AWS STS를 사용하는 ROSA에 대해 설명합니다.

이 튜토리얼에서는 ROSA(Red Hat OpenShift Service on AWS)가 사용자의 AWS(Amazon Web Service) 계정의 리소스와 상호 작용할 수 있도록 하는 두 가지 옵션에 대해 간단히 설명합니다. SDS(Security Token Service)가 필요한 인증 정보를 얻기 위해 사용하는 구성 요소 및 프로세스에 대해 자세히 설명합니다. 또한 STS를 사용하는 ROSA가 더 안전하고 선호되는 방법인 이유를 검토합니다.

참고

이 콘텐츠는 현재 AWS STS를 사용하여 ROSA Classic을 지원하며 AWS STS를 사용하여 호스팅되는 컨트롤 플레인(HCP)을 사용하는 ROSA를 아직 고려하지 않습니다.

이 튜토리얼은 다음을 수행합니다.

  • 배포 옵션 중 두 개를 열거합니다.

    • ROSA( IAM 사용자 포함)
    • STS를 사용하는 ROSA
  • 두 옵션의 차이점 설명
  • STS를 사용하는 ROSA가 왜 더 안전하고 선호되는 옵션에 대해 설명합니다.
  • STS를 사용하는 ROSA의 작동 방식 설명

16.2.1. ROSA를 배포하는 다양한 인증 정보 방법

ROSA의 일환으로 Red Hat은 AWS 계정의 인프라 리소스를 관리하고 필요한 권한을 부여해야 합니다. 현재 이러한 권한을 부여하는 방법은 다음 두 가지가 있습니다.

  • AdministratorAccess 정책으로 정적 IAM 사용자 인증 정보 사용

    이 튜토리얼은 "OSA with IAM Users"라고 합니다. 기본 인증 정보 방법이 아닙니다.

  • 수명이 짧은 동적 토큰과 함께 AWS STS 사용

    이 튜토리얼은 이 튜토리얼에서 "ROSA with STS"라고 합니다. 기본 인증 정보 방법입니다.

16.2.1.1. IAM 사용자와 함께 Rosa

ROSA가 처음 릴리스되었을 때 유일한 인증 정보 방법은 IAM 사용자가 ROSA였습니다. 이 방법은 ROSA를 사용하는 AWS 계정에서 필요한 리소스를 생성하기 위해 AdministratorAccess 정책을 통해 IAM 사용자에게 전체 액세스 권한을 부여합니다. 그런 다음 클러스터는 필요에 따라 인증 정보를 생성하고 확장할 수 있습니다.

16.2.1.2. STS를 사용하는 ROSA

STS를 사용하는 ROSA는 사용자에게 AWS 계정의 리소스에 대한 단기 액세스를 제한합니다. STS 메서드는 사전 정의된 역할 및 정책을 사용하여 IAM 사용자 또는 인증된 페더레이션 사용자에게 임시 최소 권한 권한을 부여합니다. 인증 정보는 일반적으로 요청 후 1시간 후에 만료됩니다. 만료되면 AWS에서 더 이상 인식되지 않으며 해당 API 요청에서 더 이상 계정 액세스 권한이 없습니다. 자세한 내용은 AWS 설명서 를 참조하십시오. STS를 사용하는 IAM 사용자 및 ROSA를 사용하는 ROSA가 모두 활성화되어 있지만 STS를 사용하는 ROSA가 선호되고 권장되는 옵션입니다.

16.2.2. STS 보안이 포함된 ROSA

몇 가지 중요한 구성 요소가 STS를 사용하는 ROSA를 IAM 사용자의 ROSA보다 더 안전하게 만듭니다.

  • 사용자가 미리 생성하는 명시적 및 제한된 역할 및 정책 집합입니다. 사용자는 요청된 모든 권한과 사용된 모든 역할을 알고 있습니다.
  • 서비스는 해당 권한 외부에서는 아무 작업도 수행할 수 없습니다.
  • 서비스가 작업을 수행해야 할 때마다 1시간 이내에 만료되는 인증 정보를 가져옵니다. 즉, 인증 정보를 교체하거나 취소할 필요가 없습니다. 또한 인증 정보 만료를 사용하면 인증 정보 누출 및 재사용 위험이 줄어듭니다.

16.2.3. AWS STS 설명

ROSA는 AWS STS를 사용하여 단기 보안 인증 정보가 있는 최소 권한 권한을 특정 및 분리된 IAM 역할에 부여합니다. 인증 정보는 AWS API 호출을 수행하는 각 구성 요소 및 클러스터와 관련된 IAM 역할과 연결됩니다. 이 방법은 클라우드 서비스 리소스 관리에서 최소 권한 및 보안 관행의 원칙에 맞게 조정됩니다. ROSA CLI(명령줄 인터페이스) 툴은 고유한 작업에 할당된 STS 역할 및 정책을 관리하고 OpenShift 기능의 일부로 AWS 리소스에 대해 작업을 수행합니다.

각 ROSA 클러스터에 대해 STS 역할 및 정책을 생성해야 합니다. 이를 더 쉽게하기 위해 설치 툴은 역할을 생성하는 데 필요한 모든 명령과 파일을 정책으로 제공하고 CLI가 역할 및 정책을 자동으로 생성할 수 있도록 하는 옵션을 제공합니다. 다른 --mode 옵션에 대한 자세한 내용은 사용자 지정을 사용하여 STS를 사용하여 ROSA 클러스터 생성 을 참조하십시오.

16.2.4. STS를 사용하여 ROSA와 관련된 구성 요소

  • AWS 인프라 - 클러스터에 필요한 인프라를 제공합니다. 실제 EC2 인스턴스, 스토리지 및 네트워킹 구성 요소를 포함합니다. 컴퓨팅 노드에 대해 지원되는 인스턴스 유형 및 컨트롤 플레인 및 인프라 노드 구성에 대해 프로비저닝된 AWS 인프라 를 보려면 AWS 컴퓨팅 유형을 참조하십시오.
  • AWS STS - 위의 인증 정보 방법 섹션을 참조하십시오.
  • OpenID Connect(OIDC) - 클러스터 Operator가 AWS로 인증하는 메커니즘을 제공하고, 신뢰 정책을 통해 클러스터 역할을 가정하고, STS에서 임시 인증 정보를 가져와 필요한 API 호출을 수행할 수 있도록 합니다.
  • 역할 및 정책 - 역할과 정책은 STS를 사용한 ROSA와 IAM 사용자와 ROSA의 주요 차이점 중 하나입니다. STS를 사용하는 ROSA의 경우 ROSA에서 사용하는 역할과 정책은 계정 전체 역할 및 정책 및 Operator 역할 및 정책으로 나뉩니다.

    정책에 따라 각 역할에 허용되는 작업이 결정됩니다. 개별 역할 및 정책에 대한 자세한 내용은 STS를 사용하는 ROSA 클러스터의 IAM 리소스 정보를 참조하십시오.

    • 계정 전체 역할은 다음과 같습니다.

      • ManagedOpenShift-Installer-Role
      • ManagedOpenShift-ControlPlane-Role
      • ManagedOpenShift-Worker-Role
      • ManagedOpenShift-Support-Role
    • 계정 전체 정책은 다음과 같습니다.

      • ManagedOpenShift-Installer-Role-Policy
      • ManagedOpenShift-ControlPlane-Role-Policy
      • ManagedOpenShift-Worker-Role-Policy
      • ManagedOpenShift-Support-Role-Policy
      • ManagedOpenShift-openshift-ingress-operator-cloud-credentials [1]
      • ManagedOpenShift-openshift-cluster-csi-drivers-ebs-cloud-credent [1]
      • ManagedOpenShift-openshift-cloud-network-config-controller-cloud [1]
      • ManagedOpenShift-openshift-machine-api-aws-cloud-credentials [1]
      • ManagedOpenShift-openshift-cloud-credential-operator-cloud-crede [1]
      • ManagedOpenShift-openshift-image-registry-installer-cloud-creden [1]

        1. 이 정책은 아래에 나열된 클러스터 Operator 역할에서 사용합니다. Operator 역할은 기존 클러스터 이름에 따라 달라지며 계정 전체 역할과 동시에 생성할 수 없기 때문에 두 번째 단계에서 생성됩니다.
    • Operator 역할은 다음과 같습니다.

      • <cluster-name\>-xxxx-openshift-cluster-csi-drivers-ebs-cloud-credent
      • <cluster-name\>-xxxx-openshift-cloud-network-config-controller-cloud
      • <cluster-name\>-xxxx-openshift-machine-api-aws-cloud-credentials
      • <cluster-name\>-xxxx-openshift-cloud-credential-operator-cloud-crede
      • <cluster-name\>-xxxx-openshift-image-registry-installer-cloud-creden
      • <cluster-name\>-xxxx-openshift-ingress-operator-cloud-credentials
    • 계정 전체 및 Operator 역할에 대한 신뢰 정책이 생성됩니다.

16.2.5. ROSA STS 클러스터 배포

아래 단계에 나열된 리소스를 처음부터 생성하지 않아야 합니다. ROSA CLI는 필요한 JSON 파일을 생성하고 필요한 명령을 출력합니다. ROSA CLI는 이 작업을 한 단계 더 진행하여 원하는 경우 명령을 실행할 수도 있습니다.

STS 클러스터를 사용하여 ROSA를 배포하는 단계

  1. 계정 전체 역할 및 정책을 생성합니다.
  2. 해당 계정 전체 역할에 권한 정책을 할당합니다.
  3. 클러스터를 생성합니다.
  4. Operator 역할 및 정책을 생성합니다.
  5. 해당 Operator 역할에 권한 정책을 할당합니다.
  6. OIDC 공급자를 생성합니다.

ROSA CLI에서 역할 및 정책을 자동으로 생성하거나 ROSA CLI에서 --mode 수동 또는 --mode 자동 플래그를 사용하여 수동으로 생성할 수 있습니다. 배포에 대한 자세한 내용은 사용자 지정으로 클러스터 생성 또는 클러스터 배포 튜토리얼을 참조하십시오.

16.2.6. STS 워크플로우를 사용하는 ROSA

사용자는 필요한 계정 전체 역할 및 계정 전체 정책을 생성합니다. 자세한 내용은 이 튜토리얼의 구성 요소 섹션을 참조하십시오. 역할 생성 중에 교차 계정 신뢰 정책이라는 신뢰 정책이 생성되어 Red Hat 소유 역할이 역할을 수행할 수 있습니다. EC2 인스턴스의 워크로드가 역할을 가정하고 인증 정보를 얻을 수 있는 EC2 서비스에 대한 신뢰 정책도 생성됩니다. 그러면 사용자는 각 역할에 해당 권한 정책을 할당할 수 있습니다.

계정 전체 역할 및 정책이 생성되면 사용자가 클러스터를 생성할 수 있습니다. 클러스터 생성이 시작되면 Operator 역할이 생성되어 클러스터 Operator가 AWS API 호출을 수행할 수 있습니다. 그런 다음 이러한 역할은 이전에 생성된 해당 권한 정책과 OIDC 공급자를 사용하는 신뢰 정책에 할당됩니다. Operator 역할은 궁극적으로 AWS 리소스에 액세스해야 하는 Pod를 나타내는 계정 전체 역할과 다릅니다. 사용자는 IAM 역할을 Pod에 연결할 수 없으므로 Operator와 Pod가 필요한 역할에 액세스할 수 있도록 OIDC 공급자를 사용하여 신뢰 정책을 생성해야 합니다.

사용자가 해당 정책 권한에 역할을 할당하면 최종 단계는 OIDC 공급자를 생성합니다.

클라우드 전문가가 생성 흐름에 대해 설명합니다.

새 역할이 필요한 경우 현재 Red Hat 역할을 사용하는 워크로드는 AWS 계정에서 역할을 수행하고, AWS STS에서 임시 인증 정보를 가져오고, 가정된 역할의 권한 정책에서 허용하는 대로 고객의 AWS 계정 내에서 API 호출을 사용하여 작업을 수행하기 시작합니다. 인증 정보는 임시이며 최대 1시간 동안 지속됩니다.

클라우드 전문가가 상위 수준에 대해 설명합니다.

전체 워크플로우는 다음 그래픽에 표시됩니다.

클라우드 전문가가 전체 흐름에 대해 설명합니다.

Operator는 다음 프로세스를 사용하여 작업을 수행하는 데 필요한 자격 증명을 가져옵니다. 각 Operator에는 Operator 역할, 권한 정책 및 OIDC 공급자가 있는 신뢰 정책이 할당됩니다. Operator는 역할이 포함된 JSON 웹 토큰과 토큰 파일(web_identity_token_file)을 OIDC 공급자에 전달하여 역할을 가정하고 공개 키로 서명된 키를 인증합니다. 공개 키는 클러스터 생성 중에 생성되어 S3 버킷에 저장됩니다. 그런 다음 Operator는 서명된 토큰 파일의 주체가 역할 신뢰 정책의 역할과 일치하는지 확인하여 OIDC 공급자가 허용된 역할만 가져올 수 있도록 합니다. 그런 다음 OIDC 공급자는 Operator가 AWS API 호출을 수행할 수 있도록 임시 인증 정보를 Operator에 반환합니다. 시각적 표현의 경우 아래를 참조하십시오.

클라우드 전문가 sts explained oidc op roles

16.2.7. STS 사용 사례가 있는 ROSA

클러스터 설치 시 노드 생성

Red Hat 설치 프로그램은 RH-Managed-OpenShift-Installer 역할 및 신뢰 정책을 사용하여 고객 계정에서 Managed-OpenShift-Installer-Role 역할을 가정합니다. 이 프로세스에서는 AWS STS에서 임시 인증 정보를 반환합니다. 설치 프로그램은 STS에서 방금 수신한 임시 인증 정보를 사용하여 필요한 API 호출을 시작합니다. 설치 프로그램은 AWS에 필요한 인프라를 생성합니다. 인증 정보는 1시간 이내에 만료되며 설치 프로그램은 더 이상 고객 계정에 액세스할 수 없습니다.

동일한 프로세스가 지원 케이스에도 적용됩니다. 지원 사례에서 Red Hat 사이트 안정성 엔지니어(SRE)는 설치 프로그램을 대체합니다.

클러스터 스케일링

machine-api-operatorAssumeRoleWithWebIdentity 를 사용하여 machine-api-aws-cloud-credentials 역할을 가정합니다. 그러면 클러스터 Operator의 순서에 따라 인증 정보가 수신됩니다. machine-api-operator 역할은 관련 API 호출을 통해 클러스터에 EC2 인스턴스를 추가할 수 있습니다.

16.3. 클러스터 배포

16.3.1. 튜토리얼: 배포 방법 선택

이 튜토리얼에서는 클러스터를 배포하는 다양한 방법을 간략하게 설명합니다. 기본 설정 및 요구 사항에 가장 적합한 배포 방법을 선택합니다.

16.3.1.1. 배포 옵션

원하는 경우:

위의 모든 배포 옵션은 이 튜토리얼에서 잘 작동합니다. 이 튜토리얼을 처음 수행하는 경우 Simple CLI 가이드가 가장 간단하고 권장되는 방법입니다.

16.3.2. 튜토리얼: 간단한 CLI 가이드

이 페이지에서는 CLI(명령줄 인터페이스)를 사용하여 AWS(ROSA) 클러스터에 Red Hat OpenShift Service를 배포하는 최소 명령 목록을 간략하게 설명합니다.

참고

이 간단한 배포는 튜토리얼 설정에 적합하지만 프로덕션에 사용되는 클러스터는 보다 자세한 방법으로 배포해야 합니다.

16.3.2.1. 사전 요구 사항

  • 설치 튜토리얼에서 사전 요구 사항을 완료했습니다.

16.3.2.2. 계정 역할 생성

각 AWS 계정 및 Y-stream OpenShift 버전에 대해 다음 명령을 한 번 실행합니다.

rosa create account-roles --mode auto --yes

16.3.2.3. 클러스터 배포

  1. 다음 명령을 실행하여 자체 클러스터 이름을 대체하여 기본 구성으로 클러스터를 생성합니다.

    rosa create cluster --cluster-name <cluster-name> --sts --mode auto --yes
  2. 다음 명령을 실행하여 클러스터 상태를 확인합니다.

    rosa list clusters

16.3.3. 튜토리얼: 자세한 CLI 가이드

이 튜토리얼에서는 ROSA CLI를 사용하여 ROSA 클러스터를 배포하는 자세한 단계를 간략하게 설명합니다.

16.3.3.1. CLI 배포 모드

ROSA 클러스터를 배포하는 방법은 두 가지가 있습니다. 하나는 자동이며 더 빠르고 수동 작업을 수행합니다. 다른 하나는 수동이며 추가 명령을 실행해야 하며 생성되는 역할 및 정책을 검사할 수 있습니다. 이 튜토리얼은 두 가지 옵션을 모두 문서화합니다.

클러스터를 빠르게 생성하려면 자동 옵션을 사용합니다. 생성되는 역할 및 정책을 탐색하는 것을 선호하는 경우 수동 옵션을 사용합니다.

관련 명령에서 --mode 플래그를 사용하여 배포 모드를 선택합니다.

--mode 의 유효한 옵션은 다음과 같습니다.

  • 수동: 역할 및 정책이 생성되어 현재 디렉터리에 저장됩니다. 제공된 명령을 다음 단계로 수동으로 실행해야 합니다. 이 옵션을 사용하면 정책 및 역할을 생성하기 전에 검토할 수 있습니다.
  • Auto: 현재 AWS 계정을 사용하여 역할 및 정책이 자동으로 생성되고 적용됩니다.
작은 정보

이 튜토리얼에 두 가지 배포 방법을 사용할 수 있습니다. 자동 모드가 빨라지고 단계가 줄어듭니다.

16.3.3.2. 배포 워크플로

전체 배포 워크플로는 다음 단계를 따릅니다.

  1. Rosa create account-roles - 이는 각 계정에 대해 한 번만 실행됩니다. 생성된 계정 역할은 동일한 y-stream 버전의 더 많은 클러스터에 대해 다시 생성할 필요가 없습니다.
  2. Rosa create cluster
  3. Rosa create operator-roles - 수동 모드의 경우에만 사용됩니다.
  4. Rosa create oidc-provider - 수동 모드의 경우에만 사용됩니다.

동일한 y-stream 버전의 동일한 계정에 있는 각 추가 클러스터에 대해 자동 모드의 경우 2단계만 필요합니다. 수동 모드에서는 2~4 단계가 필요합니다.

16.3.3.3. 자동 모드

ROSA CLI에서 클러스터를 신속하게 생성하기 위한 역할 및 정책 생성을 자동화하려면 이 방법을 사용합니다.

16.3.3.3.1. 계정 역할 생성

이 계정에 ROSA를 처음 배포하고 계정 역할을 아직 생성하지 않은 경우 Operator 정책을 포함하여 계정 전체 역할 및 정책을 생성합니다.

다음 명령을 실행하여 계정 전체 역할을 생성합니다.

rosa create account-roles --mode auto --yes

출력 예

I: Creating roles using 'arn:aws:iam::000000000000:user/rosa-user'
I: Created role 'ManagedOpenShift-ControlPlane-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role'
I: Created role 'ManagedOpenShift-Worker-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role'
I: Created role 'ManagedOpenShift-Support-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role'
I: Created role 'ManagedOpenShift-Installer-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-machine-api-aws-cloud-credentials'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-cloud-credential-operator-cloud-crede'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-image-registry-installer-cloud-creden'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-ingress-operator-cloud-credentials'
I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-cluster-csi-drivers-ebs-cloud-credent'
I: To create a cluster with these roles, run the following command:
    rosa create cluster --sts

16.3.3.3.2. 클러스터 생성

다음 명령을 실행하여 모든 기본 옵션이 있는 클러스터를 생성합니다.

rosa create cluster --cluster-name <cluster-name> --sts --mode auto --yes
참고

또한 필요한 Operator 역할 및 OIDC 공급자가 생성됩니다. 클러스터에 사용 가능한 모든 옵션을 보려면 대화형 모드에서 --help 플래그 또는 --interactive 를 사용합니다.

입력 예

$ rosa create cluster --cluster-name my-rosa-cluster --sts --mode auto --yes

출력 예

I: Creating cluster 'my-rosa-cluster'
I: To view a list of clusters and their status, run 'rosa list clusters'
I: Cluster 'my-rosa-cluster' has been created.
I: Once the cluster is installed you will need to add an Identity Provider before you can login into the cluster. See 'rosa create idp --help' for more information.
I: To determine when your cluster is Ready, run 'rosa describe cluster -c my-rosa-cluster'.
I: To watch your cluster installation logs, run 'rosa logs install -c my-rosa-cluster --watch'.
Name:                       my-rosa-cluster
ID:                         1mlhulb3bo0l54ojd0ji000000000000
External ID:
OpenShift Version:
Channel Group:              stable
DNS:                        my-rosa-cluster.ibhp.p1.openshiftapps.com
AWS Account:                000000000000
API URL:
Console URL:
Region:                     us-west-2
Multi-AZ:                   false
Nodes:
- Master:                  3
- Infra:                   2
- Compute:                 2
Network:
- Service CIDR:            172.30.0.0/16
- Machine CIDR:            10.0.0.0/16
- Pod CIDR:                10.128.0.0/14
- Host Prefix:             /23
STS Role ARN:               arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role
Support Role ARN:           arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role
Instance IAM Roles:
- Master:                  arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role
- Worker:                  arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role
Operator IAM Roles:
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-image-registry-installer-cloud-credentials
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-ingress-operator-cloud-credentials
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-cluster-csi-drivers-ebs-cloud-credentials
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-machine-api-aws-cloud-credentials
- arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-cloud-credential-operator-cloud-credential-oper
State:                      waiting (Waiting for OIDC configuration)
Private:                    No
Created:                    Oct 28 2021 20:28:09 UTC
Details Page:               https://console.redhat.com/openshift/details/s/1wupmiQy45xr1nN000000000000
OIDC Endpoint URL:          https://rh-oidc.s3.us-east-1.amazonaws.com/1mlhulb3bo0l54ojd0ji000000000000

16.3.3.3.2.1. 기본 구성

기본 설정은 다음과 같습니다.

  • 노드:

    • 컨트롤 플레인 노드 세 개
    • 인프라 노드 2개
    • 작업자 노드 2개
    • 자동 스케일링 없음
    • 자세한 내용은 ec2 인스턴스에 대한 설명서를 참조하십시오.
  • region: aws CLI에 대해 구성된 대로
  • 네트워킹 IP 범위:

    • 머신 CIDR: 10.0.0.0/16
    • 서비스 CIDR: 172.30.0.0/16
    • Pod CIDR: 10.128.0.0/14
  • 새 VPC
  • 암호화를 위한 기본 AWS KMS 키
  • rosa에서 사용할 수 있는 OpenShift의 최신 버전
  • 단일 가용성 영역
  • 퍼블릭 클러스터
16.3.3.3.3. 설치 상태 확인
  1. 다음 명령 중 하나를 실행하여 클러스터 상태를 확인합니다.

    • 상태에 대한 자세한 보기를 보려면 다음을 실행합니다.

      rosa describe cluster --cluster <cluster-name>
    • 상태의 abridged 뷰의 경우 다음을 실행합니다.

      rosa list clusters
  2. 클러스터 상태가 "대기 중"에서 "설치"로 변경됩니다. 이 작업은 약 40분 정도 걸립니다.
  3. 상태가 "준비"로 변경되면 클러스터가 설치됩니다.

16.3.3.4. 수동 모드

클러스터에 적용하기 전에 역할 및 정책을 검토하려면 수동 방법을 사용합니다. 이 방법을 사용하려면 역할 및 정책을 생성하려면 몇 가지 추가 명령을 실행해야 합니다.

이 섹션에서는 --interactive 모드를 사용합니다. 이 섹션의 필드에 대한 설명은 대화형 모드에 대한 설명서를 참조하십시오.

16.3.3.4.1. 계정 역할 생성
  1. 이 계정에 ROSA를 처음 배포하고 계정 역할을 아직 생성하지 않은 경우 Operator 정책을 포함하여 계정 전체 역할 및 정책을 생성합니다. 명령은 현재 디렉터리의 계정에 필요한 역할 및 정책에 필요한 JSON 파일을 생성합니다. 이러한 오브젝트를 생성하기 위해 실행해야 하는 aws CLI 명령도 출력합니다.

    다음 명령을 실행하여 필요한 파일을 생성하고 추가 명령을 출력합니다.

    rosa create account-roles --mode manual

    출력 예

    I: All policy files saved to the current directory
    I: Run the following commands to create the account roles and policies:
    aws iam create-role \
    --role-name ManagedOpenShift-Worker-Role \
    --assume-role-policy-document file://sts_instance_worker_trust_policy.json \
    --tags Key=rosa_openshift_version,Value=4.8 Key=rosa_role_prefix,Value=ManagedOpenShift Key=rosa_role_type,Value=instance_worker
    aws iam put-role-policy \
    --role-name ManagedOpenShift-Worker-Role \
    --policy-name ManagedOpenShift-Worker-Role-Policy \
    --policy-document file://sts_instance_worker_permission_policy.json

  2. 현재 디렉터리의 내용을 확인하여 새 파일을 확인합니다. aws CLI를 사용하여 이러한 각 오브젝트를 생성합니다.

    출력 예

    $ ls
    openshift_cloud_credential_operator_cloud_credential_operator_iam_ro_creds_policy.json
    sts_instance_controlplane_permission_policy.json
    openshift_cluster_csi_drivers_ebs_cloud_credentials_policy.json        sts_instance_controlplane_trust_policy.json
    openshift_image_registry_installer_cloud_credentials_policy.json          sts_instance_worker_permission_policy.json
    openshift_ingress_operator_cloud_credentials_policy.json                 sts_instance_worker_trust_policy.json
    openshift_machine_api_aws_cloud_credentials_policy.json                   sts_support_permission_policy.json
    sts_installer_permission_policy.json                                      sts_support_trust_policy.json
    sts_installer_trust_policy.json

  3. 선택 사항: 파일을 열어 생성할 항목을 검토합니다. 예를 들어 sts_installer_permission_policy.json 을 열면 다음이 표시됩니다.

    출력 예

    $ cat sts_installer_permission_policy.json
            {
            "Version": "2012-10-17",
            "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "autoscaling:DescribeAutoScalingGroups",
                    "ec2:AllocateAddress",
                    "ec2:AssociateAddress",
                    "ec2:AssociateDhcpOptions",
                    "ec2:AssociateRouteTable",
                    "ec2:AttachInternetGateway",
                    "ec2:AttachNetworkInterface",
                    "ec2:AuthorizeSecurityGroupEgress",
                    "ec2:AuthorizeSecurityGroupIngress",
                    [...]

    ROSA 클러스터 설명서의 IAM 정보 리소스 의 내용을 볼 수도 있습니다.

  4. 1 단계에 나열된 aws 명령을 실행합니다. 생성한 JSON 파일과 동일한 디렉터리에 있는 경우 복사하여 붙여넣을 수 있습니다.
16.3.3.4.2. 클러스터 생성
  1. aws 명령이 성공적으로 실행된 후 다음 명령을 실행하여 대화형 모드에서 ROSA 클러스터 생성을 시작합니다.

    rosa create cluster --interactive --sts

    필드에 대한 설명은 ROSA 설명서 를 참조하십시오.

  2. 이 튜토리얼의 목적을 위해 다음 값을 복사한 다음 입력합니다.

    Cluster name: my-rosa-cluster
    OpenShift version: <choose version>
    External ID (optional): <leave blank>
    Operator roles prefix: <accept default>
    Multiple availability zones: No
    AWS region: <choose region>
    PrivateLink cluster: No
    Install into an existing VPC: No
    Enable Customer Managed key: No
    Compute nodes instance type: m5.xlarge
    Enable autoscaling: No
    Compute nodes: 2
    Machine CIDR: <accept default>
    Service CIDR: <accept default>
    Pod CIDR: <accept default>
    Host prefix: <accept default>
    Encrypt etcd data (optional): No
    Disable Workload monitoring: No

    출력 예

    I: Creating cluster 'my-rosa-cluster'
    I: To create this cluster again in the future, you can run:
    rosa create cluster --cluster-name my-rosa-cluster --role-arn arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role --support-role-arn arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role --master-iam-role arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role --worker-iam-role arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role --operator-roles-prefix my-rosa-cluster --region us-west-2 --version 4.8.13 --compute-nodes 2 --machine-cidr 10.0.0.0/16 --service-cidr 172.30.0.0/16 --pod-cidr 10.128.0.0/14 --host-prefix 23
    I: To view a list of clusters and their status, run 'rosa list clusters'
    I: Cluster 'my-rosa-cluster' has been created.
    I: Once the cluster is installed you will need to add an Identity Provider before you can login into the cluster. See 'rosa create idp --help' for more information.
    Name:                       my-rosa-cluster
    ID:                         1t6i760dbum4mqltqh6o000000000000
    External ID:
    OpenShift Version:
    Channel Group:              stable
    DNS:                        my-rosa-cluster.abcd.p1.openshiftapps.com
    AWS Account:                000000000000
    API URL:
    Console URL:
    Region:                     us-west-2
    Multi-AZ:                   false
    Nodes:
    - Control plane:           3
    - Infra:                   2
    - Compute:                 2
    Network:
    - Service CIDR:            172.30.0.0/16
    - Machine CIDR:            10.0.0.0/16
    - Pod CIDR:                10.128.0.0/14
    - Host Prefix:             /23
    STS Role ARN:               arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role
    Support Role ARN:           arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role
    Instance IAM Roles:
    - Control plane:           arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role
    - Worker:                  arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role
    Operator IAM Roles:
    - arn:aws:iam::000000000000:role/my-rosa-cluster-w7i6-openshift-ingress-operator-cloud-credentials
    - arn:aws:iam::000000000000:role/my-rosa-cluster-w7i6-openshift-cluster-csi-drivers-ebs-cloud-credentials
    - arn:aws:iam::000000000000:role/my-rosa-cluster-w7i6-openshift-cloud-network-config-controller-cloud-cre
    - arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-machine-api-aws-cloud-credentials
    - arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-cloud-credential-operator-cloud-credentia
    - arn:aws:iam::000000000000:role/my-rosa-cluster-openshift-image-registry-installer-cloud-credential
    State:                      waiting (Waiting for OIDC configuration)
    Private:                    No
    Created:                    Jul  1 2022 22:13:50 UTC
    Details Page:               https://console.redhat.com/openshift/details/s/2BMQm8xz8Hq5yEN000000000000
    OIDC Endpoint URL:          https://rh-oidc.s3.us-east-1.amazonaws.com/1t6i760dbum4mqltqh6o000000000000
    I: Run the following commands to continue the cluster creation:
    rosa create operator-roles --cluster my-rosa-cluster
    rosa create oidc-provider --cluster my-rosa-cluster
    I: To determine when your cluster is Ready, run 'rosa describe cluster -c my-rosa-cluster'.
    I: To watch your cluster installation logs, run 'rosa logs install -c my-rosa-cluster --watch'.

    참고

    다음 두 단계가 완료될 때까지 클러스터 상태는 "대기 중"으로 유지됩니다.

16.3.3.4.3. Operator 역할 생성
  1. 위 단계에서는 실행할 다음 명령을 출력합니다. 이러한 역할은 클러스터에 대해 한 번 생성해야 합니다. 역할을 생성하려면 다음 명령을 실행합니다.

    rosa create operator-roles --mode manual --cluster <cluster-name>

    출력 예

    I: Run the following commands to create the operator roles:
        aws iam create-role \
            --role-name my-rosa-cluster-openshift-image-registry-installer-cloud-credentials \
            --assume-role-policy-document file://operator_image_registry_installer_cloud_credentials_policy.json \
            --tags Key=rosa_cluster_id,Value=1mkesci269png3tck000000000000000 Key=rosa_openshift_version,Value=4.8 Key=rosa_role_prefix,Value= Key=operator_namespace,Value=openshift-image-registry Key=operator_name,Value=installer-cloud-credentials
    
        aws iam attach-role-policy \
            --role-name my-rosa-cluster-openshift-image-registry-installer-cloud-credentials \
            --policy-arn arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-image-registry-installer-cloud-creden
        [...]

  2. aws 명령을 실행합니다.
16.3.3.4.4. OIDC 공급자 생성
  1. 다음 명령을 실행하여 OIDC 공급자를 생성합니다.

    rosa create oidc-provider --mode manual --cluster <cluster-name>
  2. 그러면 실행해야 하는 aws 명령이 표시됩니다.

    출력 예

    I: Run the following commands to create the OIDC provider:
    $ aws iam create-open-id-connect-provider \
    --url https://rh-oidc.s3.us-east-1.amazonaws.com/1mkesci269png3tckknhh0rfs2da5fj9 \
    --client-id-list openshift sts.amazonaws.com \
    --thumbprint-list a9d53002e97e00e043244f3d170d000000000000
    
    $ aws iam create-open-id-connect-provider \
    --url https://rh-oidc.s3.us-east-1.amazonaws.com/1mkesci269png3tckknhh0rfs2da5fj9 \
    --client-id-list openshift sts.amazonaws.com \
    --thumbprint-list a9d53002e97e00e043244f3d170d000000000000

  3. 이제 클러스터가 설치 프로세스를 계속합니다.
16.3.3.4.5. 설치 상태 확인
  1. 다음 명령 중 하나를 실행하여 클러스터 상태를 확인합니다.

    • 상태에 대한 자세한 보기를 보려면 다음을 실행합니다.

      rosa describe cluster --cluster <cluster-name>
    • 상태의 abridged 뷰의 경우 다음을 실행합니다.

      rosa list clusters
  2. 클러스터 상태가 "대기 중"에서 "설치"로 변경됩니다. 이 작업은 약 40분 정도 걸립니다.
  3. 상태가 "준비"로 변경되면 클러스터가 설치됩니다.

16.3.3.5. Red Hat Hybrid Cloud Console URL 가져오기

  • 하이브리드 클라우드 콘솔 URL을 가져오려면 다음 명령을 실행합니다.

    rosa describe cluster -c <cluster-name> | grep Console

이제 클러스터가 성공적으로 배포되었습니다. 다음 튜토리얼에서는 클러스터를 즉시 사용할 수 있도록 관리자 사용자를 생성하는 방법을 보여줍니다.

16.3.4. 튜토리얼: 호스팅 컨트롤 플레인 가이드

이 튜토리얼에서는 호스팅된 컨트롤 플레인(HCP) 클러스터를 사용하여 AWS(ROSA)에 Red Hat OpenShift Service를 배포하는 방법을 간략하게 설명합니다.

HCP를 사용하는 ROSA를 사용하면 컨트롤 플레인을 데이터 플레인에서 분리할 수 있습니다. 이는 컨트롤 플레인이 Red Hat 소유 AWS 계정에서 호스팅되는 ROSA의 새로운 배포 모델입니다. 컨트롤 플레인은 더 이상 AWS 계정에서 호스팅되지 않으므로 AWS 인프라 비용이 줄어듭니다. 컨트롤 플레인은 단일 클러스터 전용이며 고가용성입니다. 자세한 내용은 HCP 설명서를 사용하는 ROSA를 참조하십시오.

16.3.4.1. 사전 요구 사항

HCP 클러스터를 사용하여 ROSA를 배포하기 전에 다음과 같은 리소스가 있어야 합니다.

  • VPC - 이는 BYO-VPC라고도 하는 Bring-your-own VPC 모델입니다.
  • OIDC - OIDC 구성 및 해당 특정 구성이 있는 OIDC 공급자입니다.
  • ROSA 버전 1.2.31 이상

이 튜토리얼에서는 이러한 리소스를 먼저 생성합니다. 또한 일부 환경 변수를 설정하여 명령을 실행하여 HCP 클러스터로 ROSA를 생성하는 것이 더 쉬워집니다.

16.3.4.1.1. VPC 생성
  1. 먼저 AWS CLI(aws)가 HCP와 함께 ROSA를 사용할 수 있는 리전을 사용하도록 구성되어 있는지 확인합니다. 지원되는 리전을 확인하려면 다음 명령을 실행합니다.

    rosa list regions --hosted-cp
  2. VPC를 생성합니다. 이 튜토리얼에서 다음 스크립트는 VPC 및 필요한 구성 요소를 생성합니다. aws CLI에 구성된 리전을 사용합니다.

    curl https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/rosa/resources/setup-vpc.sh | bash

    VPC 요구 사항에 대한 자세한 내용은 VPC 설명서 를 참조하십시오.

  3. 위의 스크립트는 두 개의 명령을 출력합니다. 명령을 환경 변수로 설정하여 create cluster 명령을 더 쉽게 실행합니다. 다음과 같이 출력에서 복사하여 실행합니다.

    export PUBLIC_SUBNET_ID=<public subnet id here>
    export PRIVATE_SUBNET_ID=<private subnet id here>
  4. 다음 명령을 실행하여 환경 변수가 설정되었는지 확인합니다.

    echo "Public Subnet: $PUBLIC_SUBNET_ID"; echo "Private Subnet: $PRIVATE_SUBNET_ID"

    출력 예

    Public Subnet: subnet-0faeeeb0000000000
    Private Subnet: subnet-011fe340000000000

16.3.4.1.2. OIDC 구성 생성

이 튜토리얼에서는 OIDC 구성을 생성할 때 자동 모드를 사용합니다. 또한 나중에 사용할 수 있도록 OIDC ID를 환경 변수로 저장합니다. 명령은 ROSA CLI를 사용하여 클러스터의 고유한 OIDC 구성을 생성합니다.

  • 이 튜토리얼에 대한 OIDC 구성을 생성하려면 다음 명령을 실행합니다.

    export OIDC_ID=$(rosa create oidc-config --mode auto --managed --yes -o json | jq -r '.id')
16.3.4.1.3. 추가 환경 변수 생성
  • 다음 명령을 실행하여 HCP 클러스터로 ROSA를 생성하는 것이 더 쉬워지도록 일부 환경 변수를 설정합니다.

    export CLUSTER_NAME=<enter cluster name>
    export REGION=<region VPC was created in>
    작은 정보

    rosa whoami 를 실행하여 VPC 리전을 찾습니다.

16.3.4.2. 클러스터 생성

이 계정에 ROSA를 처음 배포하고 계정 역할을 아직 생성하지 않은 경우 Operator 정책을 포함하여 계정 전체 역할 및 정책을 생성합니다. ROSA는 AWS STS(보안 토큰 서비스)를 사용하므로 이 단계는 ROSA가 계정과 상호 작용하는 데 필요한 AWS IAM 역할 및 정책을 생성합니다.

  1. 다음 명령을 실행하여 계정 전체 역할을 생성합니다.

    rosa create account-roles --mode auto --yes
  2. 다음 명령을 실행하여 클러스터를 생성합니다.

    rosa create cluster --cluster-name $CLUSTER_NAME \
        --subnet-ids ${PUBLIC_SUBNET_ID},${PRIVATE_SUBNET_ID} \
        --hosted-cp \
        --region $REGION \
        --oidc-config-id $OIDC_ID \
        --sts --mode auto --yes

클러스터가 준비되고 약 10분 후에 완전히 사용할 수 있습니다. 클러스터에는 선택한 리전에서 세 개의 AWS 가용성 영역에 걸쳐 컨트롤 플레인이 있으며 AWS 계정에 두 개의 작업자 노드를 생성합니다.

16.3.4.3. 설치 상태 확인

  1. 다음 명령 중 하나를 실행하여 클러스터 상태를 확인합니다.

    • 클러스터 상태에 대한 자세한 보기를 보려면 다음을 실행합니다.

      rosa describe cluster --cluster $CLUSTER_NAME
    • 클러스터 상태에 대한 abridged 뷰의 경우 다음을 실행합니다.

      rosa list clusters
    • 로그가 진행 중인 것을 확인하려면 다음을 실행합니다.

      rosa logs install --cluster $CLUSTER_NAME --watch
  2. 상태가 "준비"로 변경되면 클러스터가 설치됩니다. 작업자 노드가 온라인 상태가 되는 데 몇 분이 더 걸릴 수 있습니다.

16.3.5. 튜토리얼: 간단한 UI 가이드

이 페이지에서는 UI(사용자 인터페이스)를 사용하여 ROSA 클러스터를 배포하는 최소 명령 목록을 간략하게 설명합니다.

참고

이 간단한 배포는 튜토리얼 설정에 적합하지만 프로덕션에 사용되는 클러스터는 보다 자세한 방법으로 배포해야 합니다.

16.3.5.1. 사전 요구 사항

  • 설치 튜토리얼에서 사전 요구 사항을 완료했습니다.

16.3.5.2. 계정 역할 생성

각 AWS 계정 및 Y-stream OpenShift 버전에 대해 다음 명령을 한 번 실행합니다.

rosa create account-roles --mode auto --yes

16.3.5.3. Red Hat OpenShift Cluster Manager 역할 생성

  1. 다음 명령을 실행하여 각 AWS 계정에 대해 하나의 OpenShift Cluster Manager 역할을 생성합니다.

    rosa create ocm-role --mode auto --admin --yes
  2. 다음 명령을 실행하여 각 AWS 계정에 대해 하나의 OpenShift Cluster Manager 사용자 역할을 생성합니다.

    rosa create user-role --mode auto --yes
  3. OpenShift Cluster Manager 를 사용하여 AWS 계정, 클러스터 옵션을 선택하고 배포를 시작합니다.
  4. OpenShift Cluster Manager UI는 클러스터 상태를 표시합니다.

    cloud experts getting started deployment ui cluster create

16.3.6. 튜토리얼: 자세한 UI 가이드

이 튜토리얼에서는 Red Hat OpenShift Cluster Manager UI(사용자 인터페이스)를 사용하여 AWS(ROSA) 클러스터에 Red Hat OpenShift Service를 배포하는 자세한 단계를 간략하게 설명합니다.

16.3.6.1. 배포 워크플로

전체 배포 워크플로는 다음 단계를 따릅니다.

  1. 계정 전체 역할 및 정책을 생성합니다.
  2. AWS 계정을 Red Hat 계정과 연결합니다.

    1. Red Hat OpenShift Cluster Manager 역할을 생성하고 연결합니다.
    2. 사용자 역할을 생성하고 연결합니다.
  3. 클러스터를 생성합니다.

1단계는 AWS 계정에 처음 배포하는 경우에만 수행해야 합니다. 2 단계는 UI를 처음 사용하는 경우에만 수행해야 합니다. 동일한 y-stream 버전의 연속 클러스터의 경우 클러스터를 생성하기만 하면 됩니다.

16.3.6.2. 계정 전체 역할 생성

참고

이전 배포의 계정 역할이 이미 있는 경우 이 단계를 건너뜁니다. 연결된 AWS 계정을 선택한 후 UI가 기존 역할을 감지합니다.

이 계정에 ROSA를 처음 배포하고 계정 역할을 아직 생성하지 않은 경우 Operator 정책을 포함하여 계정 전체 역할 및 정책을 생성합니다.

  • 터미널에서 다음 명령을 실행하여 계정 전체 역할을 생성합니다.

    $ rosa create account-roles --mode auto --yes

    출력 예

    I: Creating roles using 'arn:aws:iam::000000000000:user/rosa-user'
    I: Created role 'ManagedOpenShift-ControlPlane-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-ControlPlane-Role'
    I: Created role 'ManagedOpenShift-Worker-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Worker-Role'
    I: Created role 'ManagedOpenShift-Support-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Support-Role'
    I: Created role 'ManagedOpenShift-Installer-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-Installer-Role'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-machine-api-aws-cloud-credentials'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-cloud-credential-operator-cloud-crede'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-image-registry-installer-cloud-creden'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-ingress-operator-cloud-credentials'
    I: Created policy with ARN 'arn:aws:iam::000000000000:policy/ManagedOpenShift-openshift-cluster-csi-drivers-ebs-cloud-credent'
    I: To create a cluster with these roles, run the following command:
    rosa create cluster --sts

16.3.6.3. AWS 계정과 Red Hat 계정 연결

이 단계에서는 ROSA를 배포할 때 사용할 AWS 계정을 OpenShift Cluster Manager에 지시합니다.

참고

이미 AWS 계정을 연결한 경우 이 단계를 건너뜁니다.

  1. OpenShift Cluster Manager 를 방문하여 Red Hat Hybrid Cloud Console을 열고 Red Hat 계정에 로그인합니다.
  2. 클러스터 생성을 클릭합니다.
  3. AWS(ROSA)의 Red Hat OpenShift Service로 아래로 스크롤하고 Create Cluster 를 클릭합니다.

    rosa 배포를 자세히 시작하는 클라우드 전문가
  4. 드롭다운 메뉴가 표시됩니다. 웹 인터페이스 를 클릭합니다.

    rosa 배포 상세 ui 웹 인터페이스 시작하기를 위한 클라우드 전문가
  5. "AWS 컨트롤 플레인 유형 선택"에서 Classic 을 선택합니다. 그런 다음 다음을 클릭합니다.

    클라우드 전문가 rosa 배포 상세 UI 클래식 시작
  6. 연결된 AWS 인프라 계정 에서 드롭 박스를 클릭합니다. AWS 계정을 아직 연결하지 않은 경우 dropbox가 비어 있을 수 있습니다.
  7. 새 AWS 계정을 연결하는 방법을 클릭합니다.

    rosa 배포를 자세히 시작하는 클라우드 전문가
  8. 사이드바는 새 AWS 계정을 연결하는 데 필요한 지침과 함께 표시됩니다.

    rosa 배포를 시작하여 자세한 ui associate2를 시작하는 클라우드 전문가

16.3.6.4. OpenShift Cluster Manager 역할 생성 및 연결

  1. 다음 명령을 실행하여 OpenShift Cluster Manager 역할이 있는지 확인합니다.

    $ rosa list ocm-role
  2. UI에는 두 가지 수준의 권한으로 OpenShift Cluster Manager 역할을 생성하는 명령이 표시됩니다.

    • 기본 OpenShift Cluster Manager 역할: OpenShift Cluster Manager에서 계정에 대한 읽기 전용 액세스 권한을 부여하여 클러스터를 생성하기 전에 ROSA에 필요한 역할과 정책이 있는지 확인할 수 있습니다. CLI를 사용하여 필요한 역할, 정책 및 OIDC 공급자를 수동으로 생성해야 합니다.
    • admin OpenShift Cluster Manager 역할: OpenShift Cluster Manager 추가 권한을 부여하여 ROSA에 필요한 역할, 정책 및 OIDC 공급자를 생성합니다. 이를 사용하면 OpenShift Cluster Manager에서 필요한 리소스를 생성할 수 있으므로 ROSA 클러스터를 더 빠르게 배포할 수 있습니다.

      이러한 역할에 대한 자세한 내용은 문서의 OpenShift Cluster Manager 역할 및 권한 섹션을 참조하십시오.

      이 튜토리얼의 목적을 위해 가장 빠르고 간단한 접근 방식으로 Admin OpenShift Cluster Manager 역할을 사용합니다.

  3. 명령을 복사하여 사이드바에서 Admin OpenShift Cluster Manager 역할을 생성하거나 터미널로 전환하고 다음 명령을 입력합니다.

    $ rosa create ocm-role --mode auto --admin --yes

    이 명령은 OpenShift Cluster Manager 역할을 생성하여 Red Hat 계정과 연결합니다.

    출력 예

    I: Creating ocm role
    I: Creating role using 'arn:aws:iam::000000000000:user/rosa-user'
    I: Created role 'ManagedOpenShift-OCM-Role-12561000' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-OCM-Role-12561000'
    I: Linking OCM role
    I: Successfully linked role-arn 'arn:aws:iam::000000000000:role/ManagedOpenShift-OCM-Role-12561000' with organization account '1MpZfntsZeUdjWHg7XRgP000000'

  4. 2단계: 사용자 역할을 클릭합니다.
16.3.6.4.1. 기타 OpenShift Cluster Manager 역할 생성 옵션
  • 수동 모드: AWS CLI 명령을 직접 실행하려는 경우 auto 대신 모드를 manual 로 정의할 수 있습니다. CLI는 AWS 명령을 출력하고 관련 JSON 파일은 현재 디렉터리에 생성됩니다.

    다음 명령을 사용하여 수동 모드에서 OpenShift Cluster Manager 역할을 생성합니다.

    $ rosa create ocm-role --mode manual --admin --yes
  • 기본 OpenShift Cluster Manager 역할: OpenShift Cluster Manager에서 계정에 대한 읽기 전용 액세스 권한을 부여하려면 기본 OpenShift Cluster Manager 역할을 생성합니다. 그런 다음 CLI를 사용하여 필요한 역할, 정책 및 OIDC 공급자를 수동으로 생성해야 합니다.

    다음 명령을 사용하여 기본 OpenShift Cluster Manager 역할을 생성합니다.

    $ rosa create ocm-role --mode auto --yes

16.3.6.5. OpenShift Cluster Manager 사용자 역할 생성

사용자 역할 문서에 정의된 대로 ROSA가 AWS ID를 확인할 수 있도록 사용자 역할을 생성해야 합니다. 이 역할에는 권한이 없으며 설치 프로그램 계정과 OpenShift Cluster Manager 역할 리소스 간에 신뢰 관계를 생성하는 데만 사용됩니다.

  1. 다음 명령을 실행하여 사용자 역할이 이미 있는지 확인합니다.

    $ rosa list user-role
  2. 다음 명령을 실행하여 사용자 역할을 생성하고 이를 Red Hat 계정에 연결합니다.

    $ rosa create user-role --mode auto --yes

    출력 예

    I: Creating User role
    I: Creating ocm user role using 'arn:aws:iam::000000000000:user/rosa-user'
    I: Created role 'ManagedOpenShift-User-rosa-user-Role' with ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-User-rosa-user-Role'
    I: Linking User role
    I: Successfully linked role ARN 'arn:aws:iam::000000000000:role/ManagedOpenShift-User-rosa-user-Role' with account '1rbOQez0z5j1YolInhcXY000000'

    참고

    이전과 마찬가지로 AWS CLI 명령을 직접 실행하려는 경우 --mode 설명서 를 정의할 수 있습니다. CLI는 AWS 명령을 출력하고 관련 JSON 파일은 현재 디렉터리에 생성됩니다. 역할을 연결해야 합니다.

  3. 3단계: 계정 역할을 클릭합니다.

16.3.6.6. 계정 역할 생성

  1. 다음 명령을 실행하여 계정 역할을 생성합니다.

    $ rosa create account-roles --mode auto
  2. OK 를 클릭하여 사이드바를 닫습니다.

16.3.6.7. 성공적인 계정 연결 확인

  1. 이제 Associated AWS 인프라 계정 드롭다운 메뉴에서 AWS 계정이 표시됩니다. 계정이 표시되면 계정 연결에 성공했습니다.
  2. 계정을 선택합니다.
  3. 아래에 채워진 계정 역할 ARN이 표시됩니다.

    rosa 배포를 시작하는 클라우드 전문가 자세한 ui 계정 역할
  4. 다음을 클릭합니다.

16.3.6.8. 클러스터 생성

  1. 이 튜토리얼의 목적을 위해 다음과 같이 선택합니다.

    클러스터 설정

    • 클러스터 이름: & lt;pick a name\>
    • 버전: & lt;select latest version\>
    • region: & lt;select region\>
    • 가용성: 단일 영역
    • 사용자 워크로드 모니터링 활성화: 체크 아웃
    • 추가 etcd 암호화 활성화: 선택되지 않은 상태로 두십시오.
    • 고객 키를 사용하여 영구 볼륨 암호화: 선택되지 않은 상태로 둡니다.
  2. 다음을 클릭합니다.
  3. 머신 풀의 기본 설정을 그대로 둡니다.

    기본 머신 풀 설정

    • 컴퓨팅 노드 인스턴스 유형: m5.xlarge - 4 vCPU 16GiB RAM
    • 자동 스케일링 활성화: 선택되지 않음
    • 컴퓨팅 노드 수: 2
    • 노드 레이블을 비워 둡니다
  4. 다음을 클릭합니다.
16.3.6.8.1. 네트워킹
  1. 구성의 기본값을 모두 그대로 둡니다.
  2. 다음을 클릭합니다.
  3. CIDR 범위의 기본값을 모두 그대로 둡니다.
  4. 다음을 클릭합니다.
16.3.6.8.2. 클러스터 역할 및 정책

이 튜토리얼의 경우 Auto 를 선택된 상태로 둡니다. 클러스터 배포 프로세스를 더 쉽고 빠르게 수행할 수 있습니다.

참고

이전에 기본 OpenShift Cluster Manager 역할을 선택한 경우 수동 모드만 사용할 수 있습니다. Operator 역할 및 OIDC 공급자를 수동으로 생성해야 합니다. "클러스터 업데이트" 섹션을 완료하고 클러스터 생성을 시작한 후 아래의 "기본 OpenShift Cluster Manager 역할" 섹션을 참조하십시오.

16.3.6.8.3. 클러스터 업데이트
  • 이 섹션의 모든 옵션을 기본값으로 둡니다.
16.3.6.8.4. 클러스터 검토 및 생성
  1. 클러스터 구성의 콘텐츠를 검토합니다.
  2. 클러스터 생성을 클릭합니다.
16.3.6.8.5. 설치 진행 상황 모니터링
  • 현재 페이지를 방문하여 설치 진행 상황을 모니터링합니다. 약 40분 정도 소요됩니다.

    클라우드 전문가 rosa 배포 상세 UI 클러스터 생성 시작

16.3.6.9. 기본 OpenShift Cluster Manager 역할

참고

위에서 설명한 Admin OpenShift Cluster Manager 역할을 생성한 경우 전체 섹션을 무시합니다. OpenShift Cluster Manager가 리소스를 생성합니다.

이전에 기본 OpenShift Cluster Manager 역할을 생성한 경우 클러스터 설치를 계속하기 전에 두 개의 요소를 수동으로 생성해야 합니다.

  • Operator 역할
  • OIDC 공급자
16.3.6.9.1. Operator 역할 생성
  1. 팝업 창에 실행할 명령이 표시됩니다.

    클라우드 전문가 rosa 배포를 자세한 내용은 UI create cmds
  2. 터미널의 창에서 명령을 실행하여 대화형 모드를 시작합니다. 또는 간단히 하려면 다음 명령을 실행하여 Operator 역할을 생성합니다.

    $ rosa create operator-roles --mode auto --cluster <cluster-name> --yes

    출력 예

    I: Creating roles using 'arn:aws:iam::000000000000:user/rosauser'
    I: Created role 'rosacluster-b736-openshift-ingress-operator-cloud-credentials' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-ingress-operator-cloud-credentials'
    I: Created role 'rosacluster-b736-openshift-cluster-csi-drivers-ebs-cloud-credent' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-cluster-csi-drivers-ebs-cloud-credent'
    I: Created role 'rosacluster-b736-openshift-cloud-network-config-controller-cloud' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-cloud-network-config-controller-cloud'
    I: Created role 'rosacluster-b736-openshift-machine-api-aws-cloud-credentials' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-machine-api-aws-cloud-credentials'
    I: Created role 'rosacluster-b736-openshift-cloud-credential-operator-cloud-crede' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-cloud-credential-operator-cloud-crede'
    I: Created role 'rosacluster-b736-openshift-image-registry-installer-cloud-creden' with ARN 'arn:aws:iam::000000000000:role/rosacluster-b736-openshift-image-registry-installer-cloud-creden'

16.3.6.9.2. OIDC 공급자 생성
  • 터미널에서 다음 명령을 실행하여 OIDC 공급자를 생성합니다.

    $ rosa create oidc-provider --mode auto --cluster <cluster-name> --yes

    출력 예

    I: Creating OIDC provider using 'arn:aws:iam::000000000000:user/rosauser'
    I: Created OIDC provider with ARN 'arn:aws:iam::000000000000:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/1tt4kvrr2kha2rgs8gjfvf0000000000'

16.4. 튜토리얼: 관리자 생성

관리(admin) 사용자를 생성하면 클러스터에 빠르게 액세스할 수 있습니다. 다음 단계에 따라 admin 사용자를 생성합니다.

참고

관리자는 이 튜토리얼 설정에서 잘 작동합니다. 실제 배포의 경우 공식 ID 공급자 를 사용하여 클러스터에 액세스하고 사용자에게 관리자 권한을 부여합니다.

  1. 다음 명령을 실행하여 admin 사용자를 생성합니다.

    rosa create admin --cluster=<cluster-name>

    출력 예

    W: It is recommended to add an identity provider to login to this cluster. See 'rosa create idp --help' for more information.
    I: Admin account has been added to cluster 'my-rosa-cluster'. It may take up to a minute for the account to become active.
    I: To login, run the following command:
    oc login https://api.my-rosa-cluster.abcd.p1.openshiftapps.com:6443 \
    --username cluster-admin \
    --password FWGYL-2mkJI-00000-00000

  2. 이전 단계에서 반환된 로그인 명령을 복사하여 터미널에 붙여넣습니다. 그러면 클러스터 사용을 시작할 수 있도록 CLI를 사용하여 클러스터에 로그인합니다.

    $ oc login https://api.my-rosa-cluster.abcd.p1.openshiftapps.com:6443 \
    >    --username cluster-admin \
    >    --password FWGYL-2mkJI-00000-00000

    출력 예

    Login successful.
    
    You have access to 79 projects, the list has been suppressed. You can list all projects with ' projects'
    
    Using project "default".

  3. admin 사용자로 로그인했는지 확인하려면 다음 명령 중 하나를 실행합니다.

    • 옵션 1:

      $ oc whoami

      출력 예

      cluster-admin

    • 옵션 2:

      oc get all -n openshift-apiserver

      관리자만 오류 없이 이 명령을 실행할 수 있습니다.

  4. 이제 이 튜토리얼에 충분한 관리자 사용자로 클러스터를 사용할 수 있습니다. 실제 배포의 경우 다음 튜토리얼에서 설명하는 ID 공급자를 설정하는 것이 좋습니다.

16.5. 튜토리얼: ID 공급자 설정

클러스터에 로그인하려면 IDP(ID 공급자)를 설정합니다. 이 튜토리얼에서는 GitHub를 예제 IDP로 사용합니다. ROSA에서 지원하는 IDP의 전체 목록을 참조하십시오.

  • 모든 IDP 옵션을 보려면 다음 명령을 실행합니다.

    rosa create idp --help

16.5.1. GitHub를 사용하여 IDP 설정

  1. GitHub 계정에 로그인합니다.
  2. 관리자인 새 GitHub 조직을 생성합니다.

    작은 정보

    기존 조직의 관리자이고 해당 조직을 사용하려는 경우 9 단계로 건너뜁니다.

    + 아이콘을 클릭한 다음 새 조직을 클릭합니다.

    클라우드 전문가가 idp 새 조직 시작하기
  3. 상황에 가장 적합한 계획을 선택하거나 무료로 조인을 클릭합니다.
  4. 조직 계정 이름, 이메일, 개인 또는 비즈니스 계정인지를 입력합니다. 그런 다음 다음을 클릭합니다.

    idp 팀 시작 클라우드 전문가
  5. 선택 사항: 다른 사용자의 GitHub ID를 추가하여 ROSA 클러스터에 대한 추가 액세스 권한을 부여합니다. 나중에 추가할 수도 있습니다.
  6. 설정 완료 를 클릭합니다.
  7. 선택 사항: 다음 페이지에서 요청된 정보를 입력합니다.
  8. Submit 을 클릭합니다.
  9. 터미널로 돌아가서 다음 명령을 입력하여 GitHub IDP를 설정합니다.

    rosa create idp --cluster=<cluster name> --interactive
  10. 다음 값을 입력합니다.

    Type of identity provider: github
    Identity Provider Name: <IDP-name>
    Restrict to members of: organizations
    GitHub organizations: <organization-account-name>
  11. CLI에서 링크를 제공합니다. 링크를 복사하여 브라우저에 붙여넣고 Enter 키를 누릅니다. 그러면 OAuth에 이 애플리케이션을 등록하는 데 필요한 정보가 채워집니다. 정보를 수정할 필요가 없습니다.

    idp 링크 시작 클라우드 전문가
  12. Register application을 클릭합니다.

    idp 레지스터 시작하기를 위한 클라우드 전문가
  13. 다음 페이지에는 클라이언트 ID 가 표시됩니다. ID를 복사하여 클라이언트 ID 를 요청하는 터미널에 붙여넣습니다.

    참고

    탭을 닫지 마십시오.

  14. CLI에서 클라이언트 시크릿 을 요청합니다. 브라우저로 돌아가서 새 클라이언트 시크릿 생성 을 클릭합니다.

    idp 시크릿을 시작하는 클라우드 전문가
  15. 사용자를 위해 보안이 생성됩니다. 시크릿은 다시 표시되지 않으므로 복사하십시오.
  16. 시크릿을 터미널에 붙여넣고 Enter 를 누릅니다.
  17. GitHub Enterprise 호스트 이름을 비워 둡니다.
  18. 클레임을 선택합니다.
  19. IDP가 생성되고 구성이 클러스터에 배치될 때까지 약 1분 정도 기다립니다.

    idp 입력을 시작하는 클라우드 전문가
  20. 반환된 링크를 복사하여 브라우저에 붙여넣습니다. 새 IDP는 선택한 이름으로 사용할 수 있어야 합니다. IDP를 클릭하고 GitHub 인증 정보를 사용하여 클러스터에 액세스합니다.

    idp login을 시작하는 클라우드 전문가

16.5.2. 다른 사용자에게 클러스터에 대한 액세스 권한 부여

다른 클러스터 사용자에게 액세스 권한을 부여하려면 이 클러스터에 사용되는 GitHub 조직에 GitHub 사용자 ID를 추가해야 합니다.

  1. GitHub에서 조직 페이지로 이동합니다.
  2. 프로필 아이콘을 클릭한 다음 조직을 클릭합니다. 그런 다음 &lt ;your-organization-name>을 클릭합니다. 이 예에서는 my-rosa-cluster 입니다.

    idp org를 시작하는 클라우드 전문가
  3. 담당자 초대를 클릭합니다.

    클라우드 전문가가 idp invite 시작하기
  4. 새 사용자의 GitHub ID를 입력하고 올바른 사용자를 선택한 다음 Invite 를 클릭합니다.
  5. 새 사용자가 초대를 수락하면 하이브리드 클라우드 콘솔 링크와 GitHub 자격 증명을 사용하여 ROSA 클러스터에 로그인할 수 있습니다.

16.6. 튜토리얼: 관리자 권한 부여

관리(관리자) 권한은 클러스터에 추가한 사용자에게 자동으로 부여되지 않습니다. 특정 사용자에게 관리자 수준 권한을 부여하려면 각 사용자에게 수동으로 권한을 부여해야 합니다. ROSA CLI(명령줄 인터페이스) 또는 Red Hat OpenShift Cluster Manager 웹 UI(사용자 인터페이스)에서 관리자 권한을 부여할 수 있습니다.

Red Hat은 다음 두 가지 유형의 관리자 권한을 제공합니다.

  • cluster-admin:cluster-admin 권한은 admin 사용자에게 클러스터 내에서 전체 권한을 부여합니다.
  • dedicated-admin:dedicated-admin 권한을 사용하면 관리자가 클러스터 손상을 방지하기 위해 특정 제한 사항을 사용하여 대부분의 관리 작업을 완료할 수 있습니다. 승격된 권한이 필요한 경우 dedicated-admin 을 사용하는 것이 좋습니다.

관리자 권한에 대한 자세한 내용은 클러스터 관리 설명서를 참조하십시오.

16.6.1. ROSA CLI 사용

  1. 클러스터를 생성한 사용자라고 가정하면 다음 명령 중 하나를 실행하여 관리자 권한을 부여합니다.

    • cluster-admin 의 경우:

      $ rosa grant user cluster-admin --user <idp_user_name> --cluster=<cluster-name>
    • dedicated-admin 의 경우 :

      $ rosa grant user dedicated-admin --user <idp_user_name> --cluster=<cluster-name>
  2. 다음 명령을 실행하여 관리자 권한이 추가되었는지 확인합니다.

    $ rosa list users --cluster=<cluster-name>

    출력 예

    $ rosa list users --cluster=my-rosa-cluster
    ID                 GROUPS
    <idp_user_name>    cluster-admins

  3. 현재 Red Hat Hybrid Cloud Console에 로그인한 경우 콘솔에서 로그아웃하고 클러스터에 다시 로그인하여 "관리자 패널"에 새로운 관점을 확인합니다. incognito 또는 private 창이 필요할 수 있습니다.

    cloud experts getting started admin rights admin panel

  4. 다음 명령을 실행하여 관리자 권한이 계정에 추가되었는지 테스트할 수도 있습니다. cluster-admin 사용자만 오류 없이 이 명령을 실행할 수 있습니다.

    $ oc get all -n openshift-apiserver

16.6.2. Red Hat OpenShift Cluster Manager UI 사용

  1. OpenShift Cluster Manager 에 로그인합니다.
  2. 클러스터를 선택합니다.
  3. 액세스 제어 탭을 클릭합니다.
  4. 사이드바에서 클러스터 역할 및 액세스 탭을 클릭합니다.
  5. 사용자 추가를 클릭합니다.

    클라우드 전문가로서 관리자 권한 액세스 제어 시작
  6. 팝업 화면에서 사용자 ID를 입력합니다.
  7. cluster-admins 또는 dedicated-admins 권한을 부여할지 여부를 선택합니다.

    클라우드 전문가가 관리자 권한을 시작합니다. user2

16.7. 튜토리얼: 클러스터에 액세스

CLI(명령줄 인터페이스) 또는 Red Hat Hybrid Cloud Console 사용자 인터페이스(UI)를 사용하여 클러스터에 연결할 수 있습니다.

16.7.1. CLI를 사용하여 클러스터에 액세스

CLI를 사용하여 클러스터에 액세스하려면 oc CLI가 설치되어 있어야 합니다. 튜토리얼을 따르는 경우 oc CLI를 이미 설치했습니다.

  1. OpenShift Cluster Manager 에 로그인합니다.
  2. 오른쪽 상단에 있는 사용자 이름을 클릭합니다.
  3. 로그인 명령 복사를 클릭합니다.

    클라우드 전문가가 복사 로그인 액세스를 시작합니다.
  4. 그러면 선택한 IDP(ID 공급자)가 포함된 새 탭이 열립니다. 사용할 IDP를 클릭합니다. 예를 들면 "rosa-github"입니다.

    클라우드 전문가가 복사 토큰 액세스 시작
  5. 새 탭이 열립니다. 토큰 표시를 클릭합니다.
  6. 터미널에서 다음 명령을 실행합니다.

    $ oc login --token=sha256~GBAfS4JQ0t1UTKYHbWAK6OUWGUkdMGz000000000000 --server=https://api.my-rosa-cluster.abcd.p1.openshiftapps.com:6443

    출력 예

    Logged into "https://api.my-rosa-cluster.abcd.p1.openshiftapps.com:6443" as "rosa-user" using the token provided.
    
    You have access to 79 projects, the list has been suppressed. You can list all projects with ' projects'
    
    Using project "default".

  7. 다음 명령을 실행하여 로그인했는지 확인합니다.

    $ oc whoami

    출력 예

    rosa-user

  8. 이제 클러스터에 액세스할 수 있습니다.

16.7.2. 하이브리드 클라우드 콘솔을 통해 클러스터에 액세스

  1. OpenShift Cluster Manager 에 로그인합니다.

    1. 하이브리드 클라우드 콘솔 URL을 검색하려면 다음을 실행합니다.

      rosa describe cluster -c <cluster-name> | grep Console
  2. IDP를 클릭합니다. 예를 들면 "rosa-github"입니다.

    클라우드 전문가가 복사 토큰 액세스 시작
  3. 사용자 자격 증명을 입력합니다.
  4. 로그인해야 합니다. 튜토리얼을 따르는 경우 cluster-admin이 되고 관리자 패널이 표시되는 Hybrid Cloud Console 웹 페이지가 표시되어야 합니다.

    로그인한 액세스 시작 클라우드 전문가

16.8. 튜토리얼: 작업자 노드 관리

ROSA(Red Hat OpenShift Service on AWS)에서는 머신 풀을 사용하여 작업자 노드의 측면을 변경합니다. 시스템 풀을 사용하면 여러 시스템을 단일 엔터티로 관리할 수 있습니다. 모든 ROSA 클러스터에는 클러스터를 생성할 때 생성되는 기본 머신 풀이 있습니다. 자세한 내용은 머신 풀 설명서를 참조하십시오.

16.8.1. 머신 풀 생성

CLI(명령줄 인터페이스) 또는 UI(사용자 인터페이스)를 사용하여 머신 풀을 생성할 수 있습니다.

16.8.1.1. CLI를 사용하여 머신 풀 생성

  1. 다음 명령을 실행합니다.

    rosa create machinepool --cluster=<cluster-name> --name=<machinepool-name> --replicas=<number-nodes>

    입력 예

     $ rosa create machinepool --cluster=my-rosa-cluster --name=new-mp
     --replicas=2

    출력 예

    I: Machine pool 'new-mp' created successfully on cluster 'my-rosa-cluster'
    I: To view all machine pools, run 'rosa list machinepools -c my-rosa-cluster'

  2. 선택 사항: 다음 명령을 실행하여 새 머신 풀의 특정 노드에 노드 레이블 또는 테인트를 추가합니다.

    rosa create machinepool --cluster=<cluster-name> --name=<machinepool-name> --replicas=<number-nodes> --labels=`<key=pair>`

    입력 예

    $ rosa create machinepool --cluster=my-rosa-cluster --name=db-nodes-mp --replicas=2 --labels='app=db','tier=backend'

    출력 예

    I: Machine pool 'db-nodes-mp' created successfully on cluster 'my-rosa-cluster'

    이렇게 하면 하나의 단위로 관리할 수 있는 추가 2개의 노드가 생성되고 표시된 레이블을 할당합니다.

  3. 다음 명령을 실행하여 머신 풀 생성 및 할당된 라벨을 확인합니다.

    rosa list machinepools --cluster=<cluster-name>

    출력 예

    ID          AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS            TAINTS    AVAILABILITY ZONES
    Default     No           2         m5.xlarge                                  us-east-1a

16.8.1.2. UI를 사용하여 머신 풀 생성

  1. OpenShift Cluster Manager 에 로그인하고 클러스터를 클릭합니다.

    ocm 클러스터 관리를 시작하는 클라우드 전문가
  2. 머신 풀을 클릭합니다.

    cloud experts getting started managing mp ocm

  3. 머신 풀 추가를 클릭합니다.
  4. 원하는 구성을 입력합니다.

    작은 정보

    노드 레이블 및 테인트 섹션을 확장하여 머신 풀의 노드에 노드 레이블 및 테인트를 추가할 수도 있습니다.

    클라우드 전문가가 mp nlt 관리를 시작합니다.
  5. 생성한 새 머신 풀이 표시됩니다.

    클라우드 전문가가 UI에서 mp 관리를 시작합니다.

16.8.2. 작업자 노드 스케일링

머신 풀을 편집하여 해당 특정 머신 풀의 작업자 노드 수를 확장합니다. CLI 또는 UI를 사용하여 작업자 노드를 확장할 수 있습니다.

16.8.2.1. CLI를 사용하여 작업자 노드 스케일링

  1. 다음 명령을 실행하여 각 클러스터와 함께 생성된 기본 머신 풀을 확인합니다.

    rosa list machinepools --cluster=<cluster-name>

    출력 예

    ID          AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS            TAINTS    AVAILABILITY ZONES
    Default     No           2         m5.xlarge                                  us-east-1a

  2. 기본 머신 풀을 다른 수의 노드로 확장하려면 다음 명령을 실행합니다.

    rosa edit machinepool --cluster=<cluster-name> --replicas=<number-nodes> <machinepool-name>

    입력 예

    rosa edit machinepool --cluster=my-rosa-cluster --replicas 3 Default

  3. 다음 명령을 실행하여 시스템 풀이 확장되었는지 확인합니다.

    rosa describe cluster --cluster=<cluster-name> | grep Compute

    입력 예

    $ rosa describe cluster --cluster=my-rosa-cluster | grep Compute

    출력 예

    - Compute:                 3 (m5.xlarge)

16.8.2.2. UI를 사용하여 작업자 노드 스케일링

  1. 편집할 머신 풀 오른쪽에 있는 세 개의 점을 클릭합니다.
  2. 편집을 클릭합니다.
  3. 원하는 수의 노드를 입력하고 저장을 클릭합니다.
  4. 클러스터를 선택하고 개요 탭을 클릭하고 Compute 목록으로 스크롤하여 클러스터가 확장되었는지 확인합니다. 컴퓨팅 목록은 확장된 노드와 같아야 합니다. 예: 3/3입니다.

    ocm 노드 관리를 시작하는 클라우드 전문가

16.8.2.3. 노드 라벨 추가

  1. 다음 명령을 사용하여 노드 레이블을 추가합니다.

    rosa edit machinepool --cluster=<cluster-name> --replicas=<number-nodes> --labels='key=value' <machinepool-name>

    입력 예

    rosa edit machinepool --cluster=my-rosa-cluster --replicas=2 --labels 'foo=bar','baz=one' new-mp

    새 머신 풀에 레이블을 2개 추가합니다.

중요

이 명령은 모든 시스템 풀 구성을 새로 정의된 구성으로 교체합니다. 다른 레이블을 추가하고 이전 레이블을 유지하려면 새 레이블과 기존 레이블을 모두 지정해야 합니다. 그렇지 않으면 명령은 기존의 모든 레이블을 추가하려는 레이블로 교체합니다. 마찬가지로 레이블을 삭제하려면 삭제하려는 명령을 제외하고 명령을 실행하고 원하는 상태를 표시합니다.

16.8.3. 노드 유형 혼합

새 머신 풀을 사용하여 동일한 클러스터에서 다른 작업자 노드 머신 유형을 혼합할 수도 있습니다. 생성된 후에는 머신 풀의 노드 유형을 변경할 수 없지만 --instance-type 플래그를 추가하여 다른 노드로 새 머신 풀을 생성할 수 있습니다.

  1. 예를 들어 데이터베이스 노드를 다른 노드 유형으로 변경하려면 다음 명령을 실행합니다.

    rosa create machinepool --cluster=<cluster-name> --name=<mp-name> --replicas=<number-nodes> --labels='<key=pair>' --instance-type=<type>

    입력 예

    rosa create machinepool --cluster=my-rosa-cluster --name=db-nodes-large-mp --replicas=2 --labels='app=db','tier=backend' --instance-type=m5.2xlarge

  2. 사용 가능한 모든 인스턴스 유형을 보려면 다음 명령을 실행합니다.

    rosa list instance-types
  3. 단계별 변경을 수행하려면 --interactive 플래그를 사용합니다.

    rosa create machinepool -c <cluster-name> --interactive
    클라우드 전문가가 MP 대화형 관리를 시작합니다.
  4. 다음 명령을 실행하여 머신 풀을 나열하고 새로운 대규모 인스턴스 유형을 확인합니다.

    rosa list machinepools -c <cluster-name>
    클라우드 전문가가 대규모 mp 관리를 시작합니다.

16.9. 튜토리얼: 자동 확장

클러스터 자동 스케일러 는 Pod 리소스를 기반으로 클러스터에서 작업자 노드를 추가하거나 제거합니다.

클러스터 자동 스케일러는 다음과 같은 경우 클러스터 크기를 늘립니다.

  • 리소스가 부족하여 Pod가 현재 노드에서 예약되지 않습니다.
  • 배포 요구 사항을 충족하기 위해 다른 노드가 필요합니다.

클러스터 자동 스케일러는 사용자가 지정한 제한을 초과하여 클러스터 리소스를 늘리지 않습니다.

클러스터 자동 스케일러는 다음과 같은 경우 클러스터 크기를 줄입니다.

  • 일부 노드는 상당한 기간 동안 지속적으로 필요하지 않습니다. 예를 들어 노드에 리소스 사용량이 부족하고 중요한 모든 Pod가 다른 노드에 적합할 수 있는 경우입니다.

16.9.1. CLI를 사용하여 기존 머신 풀에 대한 자동 스케일링 활성화

참고

클러스터 생성 시 및 --enable-autoscaling 옵션을 사용하여 새 머신 풀을 생성할 때 클러스터 자동 스케일링을 활성화할 수 있습니다.

  1. 자동 스케일링은 머신 풀 가용성에 따라 설정됩니다. 자동 스케일링에 사용할 수 있는 머신 풀을 확인하려면 다음 명령을 실행합니다.

    $ rosa list machinepools -c <cluster-name>

    출력 예

    ID         AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS     TAINTS    AVAILABILITY ZONES
    Default    No           2         m5.xlarge                           us-east-1a

  2. 다음 명령을 실행하여 사용 가능한 머신 풀에 자동 스케일링을 추가합니다.

    $ rosa edit machinepool -c <cluster-name> --enable-autoscaling <machinepool-name> --min-replicas=<num> --max-replicas=<num>

    입력 예

    $ rosa edit machinepool -c my-rosa-cluster --enable-autoscaling Default --min-replicas=2 --max-replicas=4

    위의 명령은 리소스에 따라 2~4개의 노드 사이를 확장하는 작업자 노드에 대한 자동 스케일러를 생성합니다.

16.9.2. UI를 사용하여 기존 머신 풀에 대한 자동 스케일링 활성화

참고

머신 풀을 생성할 때 자동 스케일링 활성화 확인란을 선택하여 클러스터 생성 시 클러스터 자동 스케일링을 활성화할 수 있습니다.

  1. 머신 풀 탭으로 이동하여 오른쪽에 있는 세 개의 점을 클릭합니다.
  2. 스케일링을 클릭한 다음 자동 스케일링을 활성화합니다.
  3. 다음 명령을 실행하여 자동 스케일링이 추가되었는지 확인합니다.

    $ rosa list machinepools -c <cluster-name>

    출력 예

    ID         AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS     TAINTS    AVAILABILITY ZONES
    Default    Yes          2-4       m5.xlarge                           us-east-1a

16.10. 튜토리얼: 클러스터 업그레이드

ROSA(Red Hat OpenShift Service on AWS)는 관리형 서비스의 일부로 모든 클러스터 업그레이드를 실행합니다. 명령을 실행하거나 클러스터를 변경할 필요가 없습니다. 편리한 시간에 업그레이드를 예약할 수 있습니다.

클러스터 업그레이드 예약 방법은 다음과 같습니다.

  • 수동으로 CLI(명령줄 인터페이스) 사용: 즉시 업그레이드하거나 향후 날짜 및 시간에 대해 일회성 업그레이드를 예약합니다.
  • Red Hat OpenShift Cluster Manager 사용자 인터페이스(UI)를 수동으로 사용: 즉시 업그레이드하거나 향후 날짜 및 시간에 대해 일회성 업그레이드를 예약합니다.
  • 자동화된 업그레이드: 수동으로 예약하지 않고도 새 버전을 사용할 수 있을 때마다 반복적인 y-stream 업그레이드에 대한 업그레이드 창을 설정합니다. 마이너 버전은 수동으로 예약해야 합니다.

클러스터 업그레이드에 대한 자세한 내용은 다음 명령을 실행합니다.

$ rosa upgrade cluster --help

16.10.1. CLI를 사용하여 클러스터 수동 업그레이드

  1. 다음 명령을 실행하여 업그레이드할 수 있는 업그레이드가 있는지 확인합니다.

    $ rosa list upgrade -c <cluster-name>

    출력 예

    $ rosa list upgrade -c <cluster-name>
    VERSION  NOTES
    4.14.7   recommended
    4.14.6
    ...

    위의 예에서 4.14.7 및 4.14.6 버전을 모두 사용할 수 있습니다.

  2. 다음 명령을 실행하여 1시간 이내에 업그레이드할 클러스터를 예약합니다.

    $ rosa upgrade cluster -c <cluster-name> --version <desired-version>
  3. 선택 사항: 다음 명령을 실행하여 나중에 업그레이드하도록 클러스터를 예약합니다.

    $ rosa upgrade cluster -c <cluster-name> --version <desired-version> --schedule-date <future-date-for-update> --schedule-time <future-time-for-update>

16.10.2. UI를 사용하여 클러스터 수동 업그레이드

  1. OpenShift Cluster Manager에 로그인하고 업그레이드할 클러스터를 선택합니다.
  2. 설정을 클릭합니다.
  3. 업그레이드할 수 있는 경우 업데이트를 클릭합니다.

    클라우드 전문가가 클러스터 업그레이드 시작
  4. 새 창에서 업그레이드할 버전을 선택합니다.
  5. 업그레이드 시간을 예약하거나 즉시 시작합니다.

16.10.3. 자동 반복 업그레이드 설정

  1. OpenShift Cluster Manager에 로그인하고 업그레이드할 클러스터를 선택합니다.
  2. 설정을 클릭합니다.

    1. 업데이트 전략에서 업데이트 반복 을 클릭합니다.
  3. 업그레이드 날짜 및 시간을 설정합니다.
  4. 노드 드레이닝 에서 유예 기간을 선택하여 Pod를 제거하기 전에 노드를 드레이닝할 수 있습니다.
  5. 저장을 클릭합니다.

16.11. 튜토리얼: 클러스터 삭제

CLI(명령줄 인터페이스) 또는 UI(사용자 인터페이스)를 사용하여 AWS(ROSA)에서 Red Hat OpenShift Service를 삭제할 수 있습니다.

16.11.1. CLI를 사용하여 ROSA 클러스터 삭제

  1. 선택 사항: 다음 명령을 실행하여 올바른 클러스터를 삭제하도록 클러스터를 나열합니다.

    $ rosa list clusters
  2. 다음 명령을 실행하여 클러스터를 삭제합니다.

    $ rosa delete cluster --cluster <cluster-name>
    주의

    이 명령은 복구할 수 없습니다.

  3. CLI에서 클러스터를 삭제할지 묻는 메시지를 표시합니다. y 를 누른 다음 Enter 를 누릅니다. 클러스터 및 관련 인프라가 모두 삭제됩니다.

    참고

    모든 AWS STS 및 IAM 역할 및 정책은 다음 단계에 따라 클러스터 삭제가 완료되면 수동으로 삭제해야 합니다.

  4. CLI는 생성된 OpenID Connect(OIDC) 공급자 및 Operator IAM 역할 리소스를 삭제하는 명령을 출력합니다. 이러한 리소스를 삭제하기 전에 클러스터가 삭제를 완료할 때까지 기다립니다. 다음 명령을 실행하여 빠른 상태 점검을 수행합니다.

    $ rosa list clusters
  5. 클러스터가 삭제되면 다음 명령을 실행하여 OIDC 공급자를 삭제합니다.

    $ rosa delete oidc-provider -c <clusterID> --mode auto --yes
  6. 다음 명령을 실행하여 Operator IAM 역할을 삭제합니다.

    $ rosa delete operator-roles -c <clusterID> --mode auto --yes
    참고

    이 명령에는 클러스터 이름이 아닌 클러스터 ID가 필요합니다.

  7. 동일한 계정의 다른 클러스터에 더 이상 필요하지 않은 경우에만 나머지 계정 역할을 제거합니다. 이 계정에 다른 ROSA 클러스터를 만들려면 이 단계를 수행하지 마십시오.

    계정 역할을 삭제하려면 해당 역할을 생성할 때 사용되는 접두사를 알아야 합니다. 달리 지정하지 않는 한 기본값은 "ManagedOpenShift"입니다.

    다음 명령을 실행하여 계정 역할을 삭제합니다.

    $ rosa delete account-roles --prefix <prefix> --mode auto --yes

16.11.2. UI를 사용하여 ROSA 클러스터 삭제

  1. Red Hat OpenShift Cluster Manager에 로그인하고 삭제할 클러스터를 찾습니다.
  2. 클러스터 오른쪽에 있는 점 세 개를 클릭합니다.

    클라우드 전문가 삭제 시작하기1
  3. 드롭다운 메뉴에서 클러스터 삭제 를 클릭합니다.

    클라우드 전문가 삭제2
  4. 삭제를 확인할 클러스터 이름을 입력하고 삭제를 클릭합니다.

16.12. 튜토리얼: 지원 받기

필요한 경우 올바른 도움말을 찾는 것이 중요합니다. 이는 도움이 필요할 때 필요한 리소스 중 일부입니다.

16.12.1. 지원 연락처 추가

클러스터에 대한 통신을 위해 추가 이메일 주소를 추가할 수 있습니다.

  1. Red Hat OpenShift Cluster Manager UI(사용자 인터페이스)에서 클러스터 선택을 클릭합니다.
  2. 지원 탭을 클릭합니다.
  3. 알림 연락처 추가 를 클릭하고 추가 이메일 주소를 입력합니다.

16.12.2. UI를 사용한 지원을 위해 Red Hat에 문의

  1. OpenShift Cluster Manager UI에서 지원 탭을 클릭합니다.
  2. 지원 케이스 열기를 클릭합니다.

16.12.3. 지원 페이지를 사용하여 Red Hat에 문의하십시오.

  1. Red Hat 지원 페이지로 이동합니다.
  2. 새 케이스 열기를 클릭합니다.

    지원 케이스 받기
  3. Red Hat 계정에 로그인합니다.
  4. 지원에 문의하는 이유를 선택합니다.

    지원 이유 받기
  5. AWS의 Red Hat OpenShift Service를 선택합니다.
지원 선택 Roa
  1. 계속 을 클릭합니다.
  2. 문제에 대한 요약과 요청 세부 정보를 입력합니다. 파일, 로그 및 스크린샷을 업로드합니다. 자세한 내용은 Red Hat 지원이 도움이 될 수 있습니다.

    참고

    문제에 도움이 될 수 있는 관련 제안 사항이 이 페이지 하단에 표시됩니다.

    지원 요약 받기
  3. Continue 를 클릭합니다.
  4. 새 필드의 질문에 대답합니다.
  5. Continue 를 클릭합니다.
  6. 케이스에 대한 다음 정보를 입력합니다.

    1. 지원 수준: 프리미엄
    2. 심각도: Red Hat 지원 심각도 수준 정의를 검토하여 올바른 버전을 선택합니다.
    3. 그룹: 다른 몇 가지 케이스와 관련된 경우 해당 그룹을 선택할 수 있습니다.
    4. 언어
    5. 알림 보내기: 추가 이메일 주소를 추가하여 활동에 대한 알림을 유지합니다.
    6. Red Hat 동료: Red Hat의 모든 사용자와 협력하여 이를 루프에 유지하려면 여기에서 이메일 주소를 입력할 수 있습니다.
    7. 대체 케이스 ID: 고유한 ID를 첨부하려면 여기에서 입력할 수 있습니다.
  7. Continue 를 클릭합니다.
  8. 검토 화면에서 지원에 문의할 올바른 클러스터 ID를 선택해야 합니다.

    지원 클러스터 ID 받기
  9. Submit 을 클릭합니다.
  10. 표시된 심각도 수준에 대해 커밋된 응답 시간을 기반으로 연락을 취할 것입니다.

17장. 애플리케이션 배포

17.1. 튜토리얼: 애플리케이션 배포

17.1.1. 소개

클러스터를 성공적으로 프로비저닝한 후 애플리케이션을 배포할 수 있습니다. 이 애플리케이션을 사용하면 AWS(ROSA) 및 Kubernetes에서 Red Hat OpenShift Service의 일부 기능을 보다 잘 이해할 수 있습니다.

17.1.1.1. 랩 개요

이 실습에서는 컨테이너 기반 애플리케이션 배포 및 운영 개념을 이해하는 데 도움이 되도록 설계된 다음 작업 세트를 완료합니다.

  • S2I 및 Kubernetes Deployment 오브젝트를 사용하여 Node.js 기반 애플리케이션을 배포합니다.
  • 소스 코드 변경 사항을 자동으로 푸시하도록 CD(지속 제공) 파이프라인을 설정합니다.
  • 로깅 살펴보기.
  • 애플리케이션에 대한 자체 복구 경험.
  • 구성 맵, 시크릿 및 환경 변수를 통해 구성 관리를 살펴봅니다.
  • 영구 스토리지를 사용하여 Pod를 다시 시작할 때마다 데이터를 공유합니다.
  • Kubernetes 및 애플리케이션 내에서 네트워킹을 살펴봅니다.
  • ROSA 및 Kubernetes 기능에 대해 숙지합니다.
  • Horizontal Pod Autoscaler에서 부하를 기반으로 Pod를 자동으로 스케일링합니다.
  • S3 버킷을 배포하고 사용하려면 AWS Controllers for Kubernetes(ACK)를 사용합니다.

이 랩에서는 ROSA CLI 또는 ROSA 웹 사용자 인터페이스(UI)를 사용합니다.

17.2. 튜토리얼: 애플리케이션 배포

17.2.1. 사전 요구 사항

  1. 프로비저닝된 ROSA 클러스터

    이 랩은 ROSA 클러스터를 성공적으로 프로비저닝한 것으로 가정합니다. ROSA 클러스터를 아직 생성하지 않은 경우 자세한 내용은 Red Hat OpenShift Service on AWS 빠른 시작 가이드를 참조하십시오.

  2. OpenShift CLI(명령줄 인터페이스)

    자세한 내용은 OpenShift CLI 시작하기를 참조하십시오.

  3. GitHub 계정

    기존 GitHub 계정을 사용하거나 https://github.com/signup 에 등록합니다.

17.3. 튜토리얼: 애플리케이션 배포

17.3.1. 랩 개요

17.3.1.1. 랩 리소스

  • OSToy 애플리케이션의 소스 코드
  • OSToy 프론트 엔드 컨테이너 이미지
  • OSToy 마이크로 서비스 컨테이너 이미지
  • 배포 정의 YAML 파일:

    ostoy-frontend-deployment.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: ostoy-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 1Gi
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ostoy-frontend
      labels:
        app: ostoy
    spec:
      selector:
        matchLabels:
          app: ostoy-frontend
      strategy:
        type: Recreate
      replicas: 1
      template:
        metadata:
          labels:
            app: ostoy-frontend
        spec:
          # Uncomment to use with ACK portion of the workshop
          # If you chose a different service account name please replace it.
          # serviceAccount: ostoy-sa
          containers:
          - name: ostoy-frontend
            securityContext:
              allowPrivilegeEscalation: false
              runAsNonRoot: true
              seccompProfile:
                type: RuntimeDefault
              capabilities:
                drop:
                - ALL
            image: quay.io/ostoylab/ostoy-frontend:1.6.0
            imagePullPolicy: IfNotPresent
            ports:
            - name: ostoy-port
              containerPort: 8080
            resources:
              requests:
                memory: "256Mi"
                cpu: "100m"
              limits:
                memory: "512Mi"
                cpu: "200m"
            volumeMounts:
            - name: configvol
              mountPath: /var/config
            - name: secretvol
              mountPath: /var/secret
            - name: datavol
              mountPath: /var/demo_files
            livenessProbe:
              httpGet:
                path: /health
                port: 8080
              initialDelaySeconds: 10
              periodSeconds: 5
            env:
            - name: ENV_TOY_SECRET
              valueFrom:
                secretKeyRef:
                  name: ostoy-secret-env
                  key: ENV_TOY_SECRET
            - name: MICROSERVICE_NAME
              value: OSTOY_MICROSERVICE_SVC
            - name: NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
          volumes:
            - name: configvol
              configMap:
                name: ostoy-configmap-files
            - name: secretvol
              secret:
                defaultMode: 420
                secretName: ostoy-secret
            - name: datavol
              persistentVolumeClaim:
                claimName: ostoy-pvc
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ostoy-frontend-svc
      labels:
        app: ostoy-frontend
    spec:
      type: ClusterIP
      ports:
        - port: 8080
          targetPort: ostoy-port
          protocol: TCP
          name: ostoy
      selector:
        app: ostoy-frontend
    ---
    apiVersion: route.openshift.io/v1
    kind: Route
    metadata:
      name: ostoy-route
    spec:
      to:
        kind: Service
        name: ostoy-frontend-svc
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: ostoy-secret-env
    type: Opaque
    data:
      ENV_TOY_SECRET: VGhpcyBpcyBhIHRlc3Q=
    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: ostoy-configmap-files
    data:
      config.json:  '{ "default": "123" }'
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: ostoy-secret
    data:
      secret.txt: VVNFUk5BTUU9bXlfdXNlcgpQQVNTV09SRD1AT3RCbCVYQXAhIzYzMlk1RndDQE1UUWsKU01UUD1sb2NhbGhvc3QKU01UUF9QT1JUPTI1
    type: Opaque

    ostoy-microservice-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: ostoy-microservice
      labels:
        app: ostoy
    spec:
      selector:
        matchLabels:
          app: ostoy-microservice
      replicas: 1
      template:
        metadata:
          labels:
            app: ostoy-microservice
        spec:
          containers:
          - name: ostoy-microservice
            securityContext:
              allowPrivilegeEscalation: false
              runAsNonRoot: true
              seccompProfile:
                type: RuntimeDefault
              capabilities:
                drop:
                - ALL
            image: quay.io/ostoylab/ostoy-microservice:1.5.0
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 8080
              protocol: TCP
            resources:
              requests:
                memory: "128Mi"
                cpu: "50m"
              limits:
                memory: "256Mi"
                cpu: "100m"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: ostoy-microservice-svc
      labels:
        app: ostoy-microservice
    spec:
      type: ClusterIP
      ports:
        - port: 8080
          targetPort: 8080
          protocol: TCP
      selector:
        app: ostoy-microservice

  • ACK S3용 S3 버킷 매니페스트

    s3-bucket.yaml

    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    metadata:
      name: ostoy-bucket
      namespace: ostoy
    spec:
      name: ostoy-bucket

참고

OSToy 애플리케이션의 배포를 단순화하기 위해 위의 배포 매니페스트에 필요한 모든 오브젝트가 함께 그룹화됩니다. 일반적인 엔터프라이즈 배포에는 각 Kubernetes 오브젝트에 대한 별도의 매니페스트 파일이 권장됩니다.

17.3.1.2. OSToy 애플리케이션 정보

OSToy는 Kubernetes의 기능을 탐색하는 데 도움이 되도록 ROSA 클러스터에 배포할 간단한 Node.js 애플리케이션입니다. 이 애플리케이션에는 다음을 수행할 수 있는 사용자 인터페이스가 있습니다.

  • 로그에 메시지를 작성합니다(stdout / stderr).
  • 자동 복구 보기를 위해 의도적으로 애플리케이션을 충돌합니다.
  • 활성 상태 프로브를 전환하고 OpenShift 동작을 모니터링합니다.
  • 구성 맵, 시크릿 및 env 변수를 읽습니다.
  • 공유 스토리지에 연결된 경우 파일을 읽고 씁니다.
  • 포함된 마이크로 서비스를 사용하여 네트워크 연결, 클러스터 내 DNS 및 intra-communication을 확인합니다.
  • Horizontal Pod Autoscaler를 사용하여 부하를 처리하도록 Pod의 자동 스케일링을 보려면 부하를 늘립니다.
  • 선택 사항: AWS S3 버킷에 연결하여 오브젝트를 읽고 씁니다.

17.3.1.3. OSToy Application Diagram

OSToy 아키텍처 다이어그램

17.3.1.4. OSToy UI 이해

OSToy 홈페이지의 프리뷰
  1. 브라우저에서 페이지를 제공한 포드 이름을 표시합니다.
  2. 홈: 당사가 탐색할 기능 중 일부를 수행할 수 있는 애플리케이션의 기본 페이지입니다.
  3. 영구 스토리지: 이 애플리케이션에 바인딩된 영구 볼륨에 데이터를 쓸 수 있습니다.
  4. 구성 맵: 애플리케이션에서 사용할 수 있는 configmaps 내용과 key:value 쌍을 표시합니다.
  5. 보안: 애플리케이션에서 사용할 수 있는 보안 내용과 키:값 쌍을 표시합니다.
  6. ENV 변수: 애플리케이션에서 사용할 수 있는 환경 변수를 표시합니다.
  7. 네트워킹: 애플리케이션 내에서 네트워킹을 설명하는 툴입니다.
  8. Pod 자동 확장: Pod의 부하를 늘리고 HPA를 테스트하는 툴입니다.
  9. ACK S3: 선택 사항: AWS S3와 통합하여 오브젝트를 읽고 버킷에 씁니다.

    참고

    OSToy의 "ACK S3" 섹션을 보려면 이 워크샵의 ACK 섹션을 완료해야 합니다. 해당 섹션을 완료하지 않으려면 OSToy 애플리케이션이 계속 작동합니다.

  10. 정보: 애플리케이션에 대한 자세한 정보를 표시합니다.

법적 공지

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.