튜토리얼


Red Hat OpenShift Service on AWS 4

Red Hat OpenShift Service on AWS 튜토리얼

Red Hat OpenShift Documentation Team

초록

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

1장. 튜토리얼 개요

Red Hat 전문가의 단계별 튜토리얼을 사용하여 관리형 OpenShift 클러스터를 최대한 활용할 수 있습니다.

중요

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

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

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

중요

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

2.1. 사전 요구 사항

  • ROSA 제품 서브스크립션을 활성화할 AWS 계정과 연결할 Red Hat 계정에 로그인합니다.
  • 서비스 청구에 사용되는 AWS 계정은 단일 Red Hat 계정에만 연결할 수 있습니다. 일반적으로 AWS 유료 계정은 ROSA에 가입하고 계정 연결 및 청구에 사용되는 계정입니다.
  • 동일한 Red Hat 조직에 속한 모든 팀 구성원은 HCP 클러스터와 ROSA를 생성하는 동안 연결된 AWS 계정을 서비스 청구에 사용할 수 있습니다.

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

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

    그림 2.1. 시작하기

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

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

    그림 2.2. ROSA 활성화

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

    그림 2.3. ROSA 활성화 확인

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

    그림 2.4. 서비스 할당량

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

    그림 2.5. ROSA 사전 요구 사항 확인

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

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

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

    그림 2.6. 계속 Red Hat으로

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

    참고

    AWS 계정이 단일 Red Hat 조직에 연결되어 있어야 합니다.

    그림 2.7. Red Hat 계정에 로그인

    • 새 Red Hat 계정에 등록하거나 이 페이지에서 비밀번호를 재설정할 수도 있습니다.
    • ROSA를 HCP 제품 서브스크립션을 활성화한 AWS 계정과 연결하려는 Red Hat 계정에 로그인합니다.
    • 서비스 청구에 사용되는 AWS 계정은 단일 Red Hat 계정에만 연결할 수 있습니다. 일반적으로 AWS 유료 계정은 ROSA에 가입하고 계정 연결 및 청구에 사용되는 계정입니다.
    • 동일한 Red Hat 조직에 속한 모든 팀 구성원은 HCP 클러스터와 ROSA를 생성하는 동안 연결된 AWS 계정을 서비스 청구에 사용할 수 있습니다.
  3. 사용 약관을 검토한 후 Red Hat 계정 연결을 완료합니다.

    참고

    이 단계는 AWS 계정이 이전에 Red Hat 계정에 연결되지 않은 경우에만 사용할 수 있습니다.

    AWS 계정이 이미 사용자의 로그인된 Red Hat 계정에 연결되어 있는 경우 이 단계를 건너뜁니다.

    AWS 계정이 다른 Red Hat 계정에 연결되어 있으면 오류가 표시됩니다. 문제 해결을 위해 HCP 클러스터의 고객 계정 수정 정보를 참조하십시오.

    그림 2.8. 계정 연결 완료

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

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

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

    그림 2.9. 이용 약관

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

    그림 2.10. Red Hat 이용 약관

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

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

    그림 2.11. ROSA 사전 요구 사항 완료

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

    그림 2.12. 클러스터 배포 및 액세스 설정

중요

최신 ROSA CLI(명령줄 인터페이스) 및 AWS CLI가 설치되어 있고 이전 섹션에서 다루는 ROSA 사전 요구 사항을 완료했는지 확인합니다. 자세한 내용은 ROSA CLI 설정 및 지침의 도움말 을 참조하십시오.

  1. rosa create cluster 명령을 사용하여 클러스터 배포를 시작합니다. AWS (ROSA) 콘솔 페이지에서 Red Hat OpenShift Service 설정 버튼을 클릭하고 터미널에 명령을 붙여넣을 수 있습니다. 그러면 대화형 모드에서 클러스터 생성 프로세스가 시작됩니다.

    그림 2.13. 클러스터 배포 및 액세스 설정

  2. ~/.aws/credentials 에 지정된 기본이 아닌 프로필 중 하나인 사용자 지정 AWS 프로필을 사용하려면 명령이 rosa create cluster -profile stage 와 같이 표시되도록 -profile <profile_name > 선택기를 rosa create cluster 명령에 추가할 수 있습니다. 이 옵션을 사용하여 AWS CLI 프로필을 지정하지 않으면 기본 AWS CLI 프로파일에서 클러스터가 배포된 AWS 인프라 프로필이 결정됩니다. 다음 단계 중 하나에서 청구 AWS 프로파일이 선택됩니다.
  3. HCP 클러스터를 사용하여 ROSA를 배포할 때 청구 AWS 계정을 지정해야 합니다.

    그림 2.14. billing 계정을 지정합니다.

    • Red Hat 계정에 로그인한 사용자 계정에 연결된 AWS 계정만 표시됩니다.
    • 지정된 AWS 계정은 ROSA 서비스 사용에 대해 부과됩니다.
    • 표시는 ROSA 계약이 지정된 AWS 청구 계정에 대해 활성화되었는지 여부를 나타냅니다.

      • Contract가 활성화된 레이블을 표시하는 AWS 청구 계정을 선택하는 경우 사전 결제 계약 용량을 사용한 후에만 온디맨드 사용 요금이 부과됩니다.
      • 계약 활성화 라벨이 없는 AWS 계정에는 해당 온디맨드 사용 요금이 부과됩니다.

추가 리소스

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

    그림 2.15. 웹 인터페이스로 배포

    참고

    웹 콘솔 배포 프로세스를 시작하기 전에 사전 요구 사항을 완료합니다.

    계정 역할 생성과 같은 특정 작업에는 rosa CLI가 필요합니다. ROSA를 처음 배포하는 경우 웹 콘솔 배포 단계를 시작하기 전에 rosa whoami 명령을 실행할 때까지 CLI 단계를 수행합니다.

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

    그림 2.16. 호스팅 옵션 선택

  3. 다음 단계 계정 및 역할을 사용하면 ROSA 클러스터가 배포되고 리소스가 소비 및 관리되는 인프라 AWS 계정을 지정할 수 있습니다.

    그림 2.17. AWS 인프라 계정

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

    그림 2.18. AWS 청구 계정

    • Red Hat 계정에 로그인한 사용자 계정에 연결된 AWS 계정만 표시됩니다.
    • 지정된 AWS 계정은 ROSA 서비스 사용에 대해 부과됩니다.
    • 표시는 ROSA 계약이 지정된 AWS 청구 계정에 대해 활성화되었는지 여부를 나타냅니다.

      • Contract가 활성화된 레이블을 표시하는 AWS 청구 계정을 선택하는 경우 사전 결제 계약 용량을 사용한 후에만 온디맨드 사용 요금이 부과됩니다.
      • 계약 활성화 라벨이 없는 AWS 계정에는 해당 온디맨드 사용 요금이 부과됩니다.

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

추가 리소스

이 가이드에서는 호스팅된 컨트롤 플레인(HCP)을 사용하여 AWS(ROSA)의 Red Hat OpenShift Service에 대한 비공개 제안을 수락하는 방법과 모든 팀 멤버가 프로비저닝하는 클러스터에 대해 비공개 제안을 사용할 수 있도록 하는 방법을 설명합니다.

HCP 비용을 사용하는 ROSA는 AWS 인프라 비용과 HCP 서비스 비용이 포함된 ROSA로 구성됩니다. 필요한 워크로드를 실행하는 EC2 인스턴스와 같은 AWS 인프라 비용은 인프라가 배포된 AWS 계정으로 청구됩니다. ROSA 서비스 비용은 클러스터를 배포할 때 "AWS 청구 계정"으로 지정된 AWS 계정에 부과됩니다.

비용 구성 요소는 다른 AWS 계정으로 청구할 수 있습니다. ROSA 서비스 비용 및 AWS 인프라 비용 계산 방법에 대한 자세한 설명은 AWS 가격 책정 페이지의 Red Hat OpenShift Service에서 확인할 수 있습니다.

3.1. 비공개 제안 수락

  1. HCP를 사용하는 ROSA에 대한 비공개 제안을 받으면 판매자가 지정한 특정 AWS 계정 ID로만 액세스할 수 있는 고유한 URL이 제공됩니다.

    참고

    구매자로 지정된 AWS 계정을 사용하여 로그인했는지 확인합니다. 다른 AWS 계정을 사용하여 제안에 액세스하려고 하면 아래의 문제 해결 섹션에서 "페이지를 찾을 수 없음" 오류 메시지가 표시됩니다.

    1. 그림 1에서 미리 선택된 일반 개인 오퍼링을 사용하여 제안 선택 드롭다운 메뉴를 볼 수 있습니다. 이러한 유형의 제안은 HCP와 함께 ROSA가 공개 제안이나 다른 사적인 제안을 사용하기 전에 활성화되지 않은 경우에만 허용될 수 있습니다.

      그림 3.1. 정기적인 개인 제공

    2. 공개 제안을 사용하여 HCP로 이전에 활성화된 ROSA를 사용하여 이전에 활성화된 AWS 계정에 대해 생성된 비공개 제안을 볼 수 있으며, 그림 2의 현재 ROSA에 대한 현재 실행 중인 계약을 대체하는 제품 이름 및 선택된 개인 제안을 "업그레이드"로 표시합니다.

      그림 3.2. 개인 제안 선택 화면

    3. 드롭다운 메뉴에서는 사용 가능한 경우 여러 제안 중에서 선택할 수 있습니다. 이전에 활성화된 공개 제안은 그림 3에서 "업그레이드"로 표시된 새로 제공된 계약 기반 제안과 함께 표시됩니다.

      그림 3.3. 개인 제안 선택 드롭다운

  2. 제안 구성이 선택되었는지 확인합니다. 그림 4는 제안 페이지의 하단과 함께 제안 세부 정보를 보여줍니다.

    참고

    계약 종료일, 제안에 포함된 단위 수 및 결제 일정입니다. 이 예에서는 4개의 vCPU를 사용하는 클러스터 1개와 최대 3개의 노드가 포함됩니다.

    그림 3.4. 개인 제공 세부 정보

  3. 선택 사항: 구매 중인 서브스크립션에 자체 구매 주문(PO) 번호를 추가할 수 있으므로 후속 AWS 송장에 포함됩니다. 또한 "New offer configuration details"의 범위 위에 있는 모든 사용에 대해 부과되는 "추가 사용 요금"을 확인하십시오.

    참고

    개인 제공에는 몇 가지 사용 가능한 구성이 있습니다.

    • 귀하가 수락하고 있는 개인 오퍼링은 고정된 향후 시작 날짜로 설정될 수 있습니다.
    • 개인 제안을 수락할 때 HCP 서브스크립션이 있는 다른 활성 ROSA가 없는 경우, 공개 제안 또는 이전 개인 제안 인타이틀먼트를 수락하고, 비공개 제안을 수락하고, 지정된 서비스 시작일 이후에 계정 연결 및 클러스터 배포 단계를 계속합니다.

    이러한 단계를 완료하려면 HCP 인타이틀먼트가 있는 활성 ROSA가 있어야 합니다. 서비스 시작 날짜는 항상 UTC 시간대에 보고됩니다.

  4. 계약을 생성하거나 업그레이드합니다.

    1. HCP가 아직 활성화되어 있지 않고 이 서비스에 대한 첫 번째 계약을 생성하는 AWS 계정에서 수락한 개인 제공 사항의 경우 계약 생성 버튼을 클릭합니다.

      그림 3.5. 계약 버튼 생성

    2. 계약 기반 제공의 경우 그림 4 및 6에 표시된 현재 계약 업그레이드 버튼을 클릭합니다.

      그림 3.6. 업그레이드 계약 버튼

  5. 확인을 클릭합니다.

    그림 3.7. 개인 제안 승인 확인 창

  6. 승인된 비공개 서비스 시작 날짜가 제안 수락 직후로 설정된 경우 확인 모달 창에서 계정 설정 버튼을 클릭합니다.

    그림 3.8. 서브스크립션 확인

  7. 승인된 개인 제안에 향후 시작 날짜가 지정된 경우 서비스 시작일 이후 비공개 제안 페이지로 돌아가 계정 설정 버튼을 클릭하여 Red Hat 및 AWS 계정 연결을 진행합니다.

    참고

    유효한 계약이 없으면 아래에 설명된 계정 링크가 트리거되지 않으며 "계정 설정" 프로세스는 "서비스 시작 날짜" 이후에만 수행할 수 있습니다.

    항상 UTC 시간대입니다.

3.2. 개인 제안 공유

  1. 이전 단계에서 계정 설정 버튼을 클릭하면 AWS 및 Red Hat 계정 연결 단계로 이동합니다. 현재 해당 제안을 수락한 AWS 계정으로 이미 로그인되어 있습니다. Red Hat 계정으로 로그인하지 않은 경우 그렇게하라는 메시지가 표시됩니다.

    ROSA with HCP 인타이틀먼트는 Red Hat 조직 계정을 통해 다른 팀 멤버와 공유됩니다. 동일한 Red Hat 조직의 기존 사용자는 위에 설명된 단계에 따라 개인 제안을 수락한 청구 AWS 계정을 선택할 수 있습니다. Red Hat 조직의 사용자를 관리하고 Red Hat 조직 관리자로 로그인하면 새 사용자를 초대하거나 생성할 수 있습니다.

    참고

    HCP 개인 오퍼링을 사용하는 ROSA는 AWS License Manager를 통해 AWS 연결 계정과 공유할 수 없습니다.

  2. ROSA 클러스터를 배포하려는 사용자를 추가합니다. Red Hat 계정 사용자 관리 작업에 대한 자세한 내용은 이 사용자 관리 FAQ 를 확인하십시오.
  3. 이미 로그인한 Red Hat 계정에는 승인된 개인 제안의 혜택을 받는 ROSA 클러스터 배포자가 될 수 있는 모든 사용자가 포함되어 있는지 확인합니다.
  4. Red Hat 계정 번호와 AWS 계정 ID가 연결되어야 하는 계정인지 확인합니다. 이 연결은 고유하며 Red Hat 계정은 단일 AWS(복제) 계정에만 연결할 수 있습니다.

    그림 3.9. AWS 및 Red Hat 계정 연결

  5. 그림 9의 이 페이지에 표시된 것보다 다른 Red Hat 계정과 AWS 계정을 연결하려면 계정을 연결하기 전에 Red Hat Hybrid Cloud Console에서 로그아웃하고 이미 수락한 개인 제공 URL로 돌아가 계정을 설정하는 단계를 반복합니다.

    AWS 계정은 단일 Red Hat 계정으로만 연결할 수 있습니다. Red Hat 및 AWS 계정이 연결되면 사용자가 변경할 수 없습니다. 변경이 필요한 경우 사용자가 지원 티켓을 생성해야 합니다.

  6. 이용 약관에 동의하고 계정 연결을 클릭합니다.

3.3. AWS 청구 계정 선택

  • HCP 클러스터를 사용하여 ROSA를 배포할 때 최종 사용자가 비공개 제안을 수락한 AWS 청구 계정을 선택했는지 확인합니다.
  • HCP와 함께 ROSA를 배포하기 위해 웹 인터페이스를 사용하는 경우, Associated AWS 인프라 계정"은 일반적으로 생성 중인 클러스터 관리자가 사용하는 AWS 계정 ID로 설정됩니다.

    • 이는 AWS 청구 계정과 동일한 AWS 계정일 수 있습니다.
    • AWS 리소스는 이 계정에 배포되며 해당 리소스와 연결된 모든 청구는 적절하게 처리됩니다.

      그림 3.10. HCP 클러스터 배포를 통한 ROSA 중 AWS 계정 선택 인프라 및 청구

    • 위의 스크린샷의 AWS 청구 계정의 드롭다운은 개인 제안을 수락한 AWS 계정으로 설정되어야 하며, 구매한 할당량을 생성하는 클러스터에서 사용할 수 있도록 제공됩니다. 인프라 및 청구 "roles"에서 다른 AWS 계정을 선택하면 그림 10에 표시되는 파란색 정보 노트가 표시됩니다.

3.4. 문제 해결

비공개와 관련된 가장 빈번한 문제는 수락 및 Red Hat 계정 연결을 제공합니다.

3.4.1. 다른 AWS 계정을 사용하여 개인 제안에 액세스

  • 해당 제안에 정의되지 않은 AWS 계정 ID에 로그인할 때 비공개 제안에 액세스하려고 하면 그림 11에 표시된 메시지를 확인한 다음 원하는 AWS 청구 계정으로 로그인했는지 확인합니다.

    그림 3.11. 개인 제공 URL을 사용할 때 HTTP 404 오류

    • 개인 제안을 다른 AWS 계정으로 확장해야 하는 경우 판매자에게 문의하십시오.
  • HCP 활성화와 함께 ROSA가 처음으로 작성된 비공개 제안에 액세스하려고 하면, 이미 다른 공개 또는 사적인 제안을 사용하여 ROSA를 활성화한 상태에서 ROSA가 있는 경우 다음 공지를 참조하시기 바랍니다.

    판매자는 이전 서브스크립션을 취소하지 않고도 현재 계약을 원활하게 대체할 새로운 제안을 제공할 수 있습니다.

    그림 3.12. 개인 제안을 수락하지 않는 기존 서브스크립션

3.4.3. AWS 계정이 이미 다른 Red Hat 계정에 연결되어 있습니다.

  • 현재 로그인된 Red Hat 사용자와 개인 제안을 수락한 AWS 계정을 연결하려고 할 때 "AWS 계정이 이미 다른 Red Hat 계정에 연결되어 있습니다."라는 오류 메시지가 표시되면 AWS 계정이 이미 다른 Red Hat 사용자에게 연결되어 있습니다.

    그림 3.13. AWS 계정이 이미 다른 Red Hat 계정에 연결되어 있습니다.

  • 다른 Red Hat 계정 또는 다른 AWS 계정을 사용하여 로그인할 수 있습니다.

    • 그러나 이 안내서는 비공개 제안과 관련이 있으므로, 이는 귀하가 구매자로 지정된 AWS 계정으로 로그인하여 이미 비공개 제안을 수락했기 때문에 청구 계정으로 사용하도록 의도되었다는 가정입니다. 개인 제안을 수락한 후에는 다른 AWS 계정으로 로그인할 수 없습니다.
  • 개인 제안을 수락한 AWS 계정에 이미 연결된 다른 Red Hat 사용자로 로그인할 수 있습니다. 그림 10과 같이 동일한 Red Hat 조직에 속한 다른 Red Hat 사용자는 클러스터를 생성할 때 ROSA와 HCP AWS 청구 계정으로 연결된 AWS 계정을 사용할 수 있습니다.
  • 기존 계정 링크가 올바르지 않을 수 있다고 생각되면 아래의 "내 팀 멤버가 다른 Red Hat 조직에 속함" 질문을 참조하십시오.

3.4.4. 내 팀 구성원은 다른 Red Hat 조직에 속해 있습니다.

  • AWS 계정은 단일 Red Hat 계정에만 연결할 수 있습니다. 클러스터를 생성하고 이 AWS 계정에 부여된 개인 제공의 혜택을 받으려면 모두 동일한 Red Hat 계정에 있어야 합니다. 이를 위해 사용자를 동일한 Red Hat 계정에 초대하고 새 Red Hat 사용자를 생성할 수 있습니다.

3.4.5. 클러스터를 생성할 때 잘못된 AWS 청구 계정이 선택됨

  • 사용자가 잘못된 AWS 청구 계정을 선택한 경우 이를 해결하는 가장 빠른 방법은 클러스터를 삭제하고 올바른 AWS 청구 계정을 선택하는 동안 새 클러스터를 생성하는 것입니다.
  • 쉽게 삭제할 수 없는 프로덕션 클러스터인 경우 Red Hat 지원팀에 문의하여 기존 클러스터의 청구 계정을 변경하십시오. 이 문제를 해결하기 위해 약간의 시간이 걸릴 것으로 예상됩니다.

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

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

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

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

4.1. 사전 요구 사항

4.2. ROSA 권한 확인

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

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

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

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

4.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
    Copy to Clipboard Toggle word wrap
  2. 스크립트가 완료되면 각 결과 파일을 검토하여 필요한 API 호출이 차단되지 않았는지 확인합니다.

    $ for file in $(ls *.results); do echo $file; cat $file; done
    Copy to Clipboard Toggle word wrap

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

    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
    ...
    Copy to Clipboard Toggle word wrap
    참고

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

5장. 튜토리얼: 사용자 정의 DNS 해결기를 사용하여 ROSA 배포

사용자 지정 DHCP 옵션 세트를 사용하면 자체 DNS 서버, 도메인 이름 등을 사용하여 VPC를 사용자 지정할 수 있습니다. ROSA(Red Hat OpenShift Service on AWS) 클러스터는 사용자 지정 DHCP 옵션 세트를 사용하여 지원합니다. 기본적으로 ROSA 클러스터에서는 클러스터 생성 및 작동을 위해 "도메인 이름 서버" 옵션을 AmazonProvidedDNS 로 설정해야 합니다. DNS 확인을 위해 사용자 지정 DNS 서버를 사용하려는 고객은 ROSA 클러스터 생성 및 작업을 성공적으로 수행하기 위해 추가 구성을 수행해야 합니다.

이 튜토리얼에서는 특정 DNS 영역에 대한 DNS 조회를 Amazon Route 53 인바운드 Resolver 에 전달하도록 DNS 서버를 구성합니다.

참고

이 튜토리얼에서는 오픈 소스 BIND DNS 서버(named)를 사용하여 ROSA 클러스터를 배포하려는 VPC에 있는 Amazon Route 53 Inbound Resolver에 DNS 조회를 전달하는 데 필요한 구성을 보여줍니다. 영역 전달을 구성하는 방법은 기본 DNS 서버에 대한 설명서를 참조하십시오.

5.1. 사전 요구 사항

  • ROSA CLI (rosa)
  • AWS CLI (aws)
  • 수동으로 생성된 AWS VPC
  • 사용자 지정 DNS 서버를 가리키도록 구성하고 VPC의 기본값으로 설정하도록 구성된 DHCP 옵션

5.2. 환경 설정

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

    $ export VPC_ID=<vpc_ID> 
    1
    
    $ export REGION=<region> 
    2
    
    $ export VPC_CIDR=<vpc_CIDR> 
    3
    Copy to Clipboard Toggle word wrap
    1
    & lt;vpc_ID >를 클러스터를 설치하려는 VPC의 ID로 바꿉니다.
    2
    & lt;region >을 클러스터를 설치할 AWS 리전으로 바꿉니다.
    3
    & lt;vpc_CIDR& gt;를 VPC의 CIDR 범위로 바꿉니다.
  2. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "VPC ID: ${VPC_ID}, VPC CIDR Range: ${VPC_CIDR}, Region: ${REGION}"
    Copy to Clipboard Toggle word wrap

5.3. Amazon Route 53 인바운드 Resolver 생성

다음 절차에 따라 클러스터를 배포할 VPC에 Amazon Route 53 인바운드 Resolver 를 배포합니다.

주의

이 예제에서는 클러스터가 사용할 동일한 VPC에 Amazon Route 53 Inbound Resolver를 배포합니다. 별도의 VPC에 배포하려면 클러스터 생성이 시작된 후 아래 설명된 프라이빗 호스팅 영역을 수동으로 연결해야 합니다. 클러스터 생성 프로세스가 시작되기 전에 영역을 연결할 수 없습니다. 클러스터 생성 프로세스 중에 프라이빗 호스팅 영역을 연결하지 않으면 클러스터 생성에 실패합니다.

  1. 보안 그룹을 생성하고 VPC에서 포트 53/tcp53/udp 에 대한 액세스를 허용합니다.

    $ SG_ID=$(aws ec2 create-security-group --group-name rosa-inbound-resolver --description "Security group for ROSA inbound resolver" --vpc-id ${VPC_ID} --region ${REGION} --output text)
    $ aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol tcp --port 53 --cidr ${VPC_CIDR} --region ${REGION}
    $ aws ec2 authorize-security-group-ingress --group-id ${SG_ID} --protocol udp --port 53 --cidr ${VPC_CIDR} --region ${REGION}
    Copy to Clipboard Toggle word wrap
  2. VPC에 Amazon Route 53 인바운드 Resolver를 생성합니다.

    $ RESOLVER_ID=$(aws route53resolver create-resolver-endpoint \
      --name rosa-inbound-resolver \
      --creator-request-id rosa-$(date '+%Y-%m-%d') \
      --security-group-ids ${SG_ID} \
      --direction INBOUND \
      --ip-addresses $(aws ec2 describe-subnets --filter Name=vpc-id,Values=${VPC_ID} --region ${REGION} | jq -jr '.Subnets | map("SubnetId=\(.SubnetId) ") | .[]') \
      --region ${REGION} \
      --output text \
      --query 'ResolverEndpoint.Id')
    Copy to Clipboard Toggle word wrap
    참고

    위의 명령은 동적으로 할당된 IP 주소를 사용하여 제공된 VPC의 모든 서브넷에 Amazon Route 53 Inbound Resolver 끝점을 연결합니다. 서브넷 및/또는 IP 주소를 수동으로 지정하려면 대신 다음 명령을 실행합니다.

    $ RESOLVER_ID=$(aws route53resolver create-resolver-endpoint \
      --name rosa-inbound-resolver \
      --creator-request-id rosa-$(date '+%Y-%m-%d') \
      --security-group-ids ${SG_ID} \
      --direction INBOUND \
      --ip-addresses SubnetId=<subnet_ID>,Ip=<endpoint_IP> SubnetId=<subnet_ID>,Ip=<endpoint_IP> \
    1
    
      --region ${REGION} \
      --output text \
      --query 'ResolverEndpoint.Id')
    Copy to Clipboard Toggle word wrap
    1
    < subnet_ID >를 서브넷 ID로 바꾸고 < endpoint_IP >를 인바운드 확인자 끝점에 추가하려는 고정 IP 주소로 바꿉니다.
  3. DNS 서버 구성에서 구성할 인바운드 확인자 끝점의 IP 주소를 가져옵니다.

    $ aws route53resolver list-resolver-endpoint-ip-addresses \
      --resolver-endpoint-id ${RESOLVER_ID} \
      --region=${REGION} \
      --query 'IpAddresses[*].Ip'
    Copy to Clipboard Toggle word wrap

    출력 예

    [
        "10.0.45.253",
        "10.0.23.131",
        "10.0.148.159"
    ]
    Copy to Clipboard Toggle word wrap

5.4. DNS 서버 구성

다음 절차에 따라 필요한 프라이빗 호스팅 영역을 Amazon Route 53 Inbound Resolver로 전달하도록 DNS 서버를 구성합니다.

5.4.1. HCP를 사용하는 ROSA

HCP 클러스터를 사용하려면 두 개의 프라이빗 호스팅 영역에 대해 DNS 전달을 구성해야 합니다.

  • <cluster-name>.hypershift.local
  • rosa.<domain-prefix>.<unique-ID>.p3.openshiftapps.com

이러한 Amazon Route 53 개인 호스팅 영역은 클러스터 생성 중에 생성됩니다. cluster-namedomain-prefix 는 customer-specified 값이지만, unique-ID 는 클러스터 생성 중에 임의로 생성되며 사전 선택할 수 없습니다. 따라서 p3.openshiftapps.com 개인 호스팅 영역에 대한 전달을 구성하기 전에 클러스터 생성 프로세스가 시작될 때까지 기다려야 합니다.

  1. 클러스터가 생성되기 전에 < cluster-name>.hypershift.local 에 대한 모든 DNS 요청을 Amazon Route 53 인바운드 Resolver 엔드포인트로 전달하도록 DNS 서버를 구성합니다. BIND DNS 서버의 경우 즐겨 찾는 텍스트 편집기에서 /etc/named.conf 파일을 편집하고 다음 예제를 사용하여 새 영역을 추가합니다.

    예제

    zone "<cluster-name>.hypershift.local" { 
    1
    
      type forward;
      forward only;
      forwarders { 
    2
    
        10.0.45.253;
        10.0.23.131;
        10.0.148.159;
      };
    };
    Copy to Clipboard Toggle word wrap

    1
    &lt ;cluster-name&gt;을 ROSA HCP 클러스터 이름으로 교체합니다.
    2
    위에서 수집한 인바운드 확인자 끝점의 IP 주소로 교체하여 각 IP 주소를 팔로우합니다. ;
  2. 클러스터를 생성합니다.
  3. 클러스터가 생성 프로세스를 시작한 후 새로 생성된 개인 호스팅 영역을 찾습니다.

    $ aws route53 list-hosted-zones-by-vpc \
      --vpc-id ${VPC_ID} \
      --vpc-region ${REGION} \
      --query 'HostedZoneSummaries[*].Name' \
      --output table
    Copy to Clipboard Toggle word wrap

    출력 예

    --------------------------------------------------
    |             ListHostedZonesByVPC               |
    +------------------------------------------------+
    |  rosa.domain-prefix.lkmb.p3.openshiftapps.com. |
    |  cluster-name.hypershift.local.                |
    +------------------------------------------------+
    Copy to Clipboard Toggle word wrap

    참고

    클러스터 생성 프로세스가 Route 53에서 개인 호스팅 영역을 생성하는 데 몇 분이 걸릴 수 있습니다. p3.openshiftapps.com 도메인이 표시되지 않으면 몇 분 기다렸다가 명령을 다시 실행합니다.

  4. 클러스터 도메인의 고유 ID를 알고 나면 rosa.<domain-prefix>.<unique-ID>.p3.openshiftapps.com 에 대한 모든 DNS 요청을 Amazon Route 53 인바운드 Resolver 엔드포인트로 전달하도록 DNS 서버를 구성합니다. BIND DNS 서버의 경우 즐겨 찾는 텍스트 편집기에서 /etc/named.conf 파일을 편집하고 다음 예제를 사용하여 새 영역을 추가합니다.

    예제

    zone "rosa.<domain-prefix>.<unique-ID>.p3.openshiftapps.com" { 
    1
    
      type forward;
      forward only;
      forwarders { 
    2
    
        10.0.45.253;
        10.0.23.131;
        10.0.148.159;
      };
    };
    Copy to Clipboard Toggle word wrap

    1
    < domain-prefix >를 클러스터 도메인 접두사로 바꾸고 < unique-ID >를 위에서 수집한 고유한 ID로 바꿉니다.
    2
    위에서 수집한 인바운드 확인자 끝점의 IP 주소로 교체하여 각 IP 주소를 팔로우합니다. ;

5.4.2. ROSA Classic

ROSA Classic 클러스터에서는 하나의 프라이빗 호스팅 영역에 대해 DNS 전달을 구성해야 합니다.

  • <domain-prefix>.<unique-ID>.p1.openshiftapps.com

이 Amazon Route 53 개인 호스팅 영역은 클러스터 생성 중에 생성됩니다. domain-prefix 는 customer-specified 값이지만, unique-ID 는 클러스터 생성 중에 임의로 생성되며 사전 선택할 수 없습니다. 따라서 p1.openshiftapps.com 개인 호스팅 영역에 대한 전달을 구성하기 전에 클러스터 생성 프로세스가 시작될 때까지 기다려야 합니다.

  1. 클러스터를 생성합니다.
  2. 클러스터가 생성 프로세스를 시작한 후 새로 생성된 개인 호스팅 영역을 찾습니다.

    $ aws route53 list-hosted-zones-by-vpc \
      --vpc-id ${VPC_ID} \
      --vpc-region ${REGION} \
      --query 'HostedZoneSummaries[*].Name' \
      --output table
    Copy to Clipboard Toggle word wrap

    출력 예

    ----------------------------------------------
    |           ListHostedZonesByVPC             |
    +--------------------------------------------+
    |  domain-prefix.agls.p3.openshiftapps.com.  |
    +--------------------------------------------+
    Copy to Clipboard Toggle word wrap

    참고

    클러스터 생성 프로세스가 Route 53에서 개인 호스팅 영역을 생성하는 데 몇 분이 걸릴 수 있습니다. p1.openshiftapps.com 도메인이 표시되지 않으면 몇 분 정도 기다린 후 명령을 다시 실행합니다.

  3. 클러스터 도메인의 고유 ID를 알고 나면 < domain-prefix>.<unique-ID>.p1.openshiftapps.com 에 대한 모든 DNS 요청을 Amazon Route 53 인바운드 Resolver 엔드포인트로 전달하도록 DNS 서버를 구성합니다. BIND DNS 서버의 경우 즐겨 찾는 텍스트 편집기에서 /etc/named.conf 파일을 편집하고 다음 예제를 사용하여 새 영역을 추가합니다.

    예제

    zone "<domain-prefix>.<unique-ID>.p1.openshiftapps.com" { 
    1
    
      type forward;
      forward only;
      forwarders { 
    2
    
        10.0.45.253;
        10.0.23.131;
        10.0.148.159;
      };
    };
    Copy to Clipboard Toggle word wrap

    1
    < domain-prefix >를 클러스터 도메인 접두사로 바꾸고 < unique-ID >를 위에서 수집한 고유한 ID로 바꿉니다.
    2
    위에서 수집한 인바운드 확인자 끝점의 IP 주소로 교체하여 각 IP 주소를 팔로우합니다. ;

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

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

6.1. 사전 요구 사항

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

6.1.1. 환경 설정

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

    $ export DOMAIN=apps.example.com 
    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}/cloudfront-waf"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster: ${CLUSTER}, Region: ${REGION}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    Copy to Clipboard Toggle word wrap
    1
    IngressController 에 사용할 사용자 정의 도메인으로 바꿉니다.
    참고

    이전 명령의 "클러스터" 출력은 클러스터의 이름, 클러스터의 내부 ID 또는 클러스터의 도메인 접두사가 될 수 있습니다. 다른 식별자를 사용하려는 경우 다음 명령을 실행하여 이 값을 수동으로 설정할 수 있습니다.

    $ export CLUSTER=my-custom-value
    Copy to Clipboard Toggle word wrap

6.2. 보조 수신 컨트롤러 설정

외부 WAF로 보호된 트래픽을 표준(및 기본) 클러스터 인그레스 컨트롤러에서 분할하도록 보조 수신 컨트롤러를 구성해야 합니다.

사전 요구 사항

  • CN=*.apps.example.com과 같이 사용자 지정 도메인에 대해 공개적으로 신뢰할 수 있는 SAN 또는 와일드카드 인증서

    중요

    Amazon CloudFront는 HTTPS를 사용하여 클러스터의 보조 수신 컨트롤러와 통신합니다. Amazon CloudFront 설명서에서 설명한 대로 CloudFront 와 클러스터 간의 HTTPS 통신에 자체 서명된 인증서를 사용할 수 없습니다. Amazon CloudFront는 인증서가 신뢰할 수 있는 인증 기관에서 발행했는지 확인합니다.

프로세스

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

    예제

    $ oc -n openshift-ingress create secret tls waf-tls --cert=fullchain.pem --key=privkey.pem
    Copy to Clipboard Toggle word wrap

  2. IngressController 리소스를 생성합니다.

    예: waf-ingress-controller.yaml

    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: cloudfront-waf
      namespace: openshift-ingress-operator
    spec:
      domain: apps.example.com 
    1
    
      defaultCertificate:
        name: waf-tls
      endpointPublishingStrategy:
        loadBalancer:
          dnsManagementPolicy: Unmanaged
          providerParameters:
            aws:
              type: NLB
            type: AWS
          scope: External
        type: LoadBalancerService
      routeSelector: 
    2
    
        matchLabels:
         route: waf
    Copy to Clipboard Toggle word wrap

    1
    IngressController 에 사용할 사용자 정의 도메인으로 바꿉니다.
    2
    Ingress 컨트롤러에서 서비스를 제공하는 경로 세트를 필터링합니다. 이 튜토리얼에서는 waf 경로 선택기를 사용하지만 값이 제공되지 않으면 필터링이 발생하지 않습니다.
  3. IngressController 를 적용합니다.

    예제

    $ oc apply -f waf-ingress-controller.yaml
    Copy to Clipboard Toggle word wrap

  4. IngressController가 외부 로드 밸런서를 성공적으로 생성했는지 확인합니다.

    $ oc -n openshift-ingress get service/router-cloudfront-waf
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP                                                                     PORT(S)                      AGE
    router-cloudfront-waf   LoadBalancer   172.30.16.141   a68a838a7f26440bf8647809b61c4bc8-4225395f488830bd.elb.us-east-1.amazonaws.com   80:30606/TCP,443:31065/TCP   2m19s
    Copy to Clipboard Toggle word wrap

6.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
    Copy to Clipboard Toggle word wrap

    그러면 코어(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}-waf-metrics \
      --rules file://${SCRATCH}/waf-rules.json \
      --query 'Summary.Name' \
      --output text)
    Copy to Clipboard Toggle word wrap

6.3. Amazon CloudFront 구성

  1. 새로 생성된 사용자 정의 수신 컨트롤러의 NLB 호스트 이름을 검색합니다.

    $ NLB=$(oc -n openshift-ingress get service router-cloudfront-waf \
      -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

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

    참고

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

    Expand
    옵션현재의

    원본 도메인

    이전 명령의 출력 [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.example.com [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
    Copy to Clipboard Toggle word wrap
  6. 위의 단계에서 CNAME을 사용하여 사용자 지정 와일드카드 도메인의 DNS를 Amazon CloudFront 배포 엔드포인트로 업데이트합니다.

    예제

    *.apps.example.com CNAME d1b2c3d4e5f6g7.cloudfront.net
    Copy to Clipboard Toggle word wrap

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

  1. 다음 명령을 실행하여 샘플 애플리케이션에 대한 새 프로젝트를 생성합니다.

    $ oc new-project hello-world
    Copy to Clipboard Toggle word wrap
  2. hello world 애플리케이션을 배포합니다.

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

    예제

    $ oc -n hello-world create route edge --service=hello-openshift hello-openshift-tls \
    --hostname hello-openshift.${DOMAIN}
    Copy to Clipboard Toggle word wrap

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

    $ oc -n hello-world label route.route.openshift.io/hello-openshift-tls route=waf
    Copy to Clipboard Toggle word wrap

6.5. WAF 테스트

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

    예제

    $ curl "https://hello-openshift.${DOMAIN}"
    Copy to Clipboard Toggle word wrap

    출력 예

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

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

    예제

    $ curl -X POST "https://hello-openshift.${DOMAIN}" \
      -F "user='<script><alert>Hello></alert></script>'"
    Copy to Clipboard Toggle word wrap

    출력 예

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
    <TITLE>ERROR: The request could not be satisfied</TITLE>
    </HEAD><BODY>
    <H1>403 ERROR</H1>
    <H2>The request could not be satisfied.</H2>
    <HR noshade size="1px">
    Request blocked.
    We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
    <BR clear="all">
    If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.
    <BR clear="all">
    <HR noshade size="1px">
    <PRE>
    Generated by cloudfront (CloudFront)
    Request ID: nFk9q2yB8jddI6FZOTjdliexzx-FwZtr8xUQUNT75HThPlrALDxbag==
    </PRE>
    <ADDRESS>
    </ADDRESS>
    </BODY></HTML>
    Copy to Clipboard Toggle word wrap

    결과적으로 403 ERROR 가 됩니다. 즉, AWS WAF가 애플리케이션을 보호하고 있습니다.

7장. 튜토리얼: 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 방법을 사용하는 것이 좋습니다.

7.1. 사전 요구 사항

  • AZ(여러 가용성 영역) ROSA(HCP 또는 Classic) 클러스터.

    참고

    AWS ALB에는 AWS 문서에 따라 AZ에 두 개 이상의 퍼블릭 서브넷이 필요합니다. 이러한 이유로 ALB와 함께 여러 AZ ROSA 클러스터만 사용할 수 있습니다.

  • OpenShift CLI(oc)에 액세스할 수 있습니다.
  • AWS CLI(aws)에 액세스할 수 있습니다.

7.1.1. 환경 설정

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

    $ export AWS_PAGER=""
    $ export CLUSTER=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}")
    $ 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}/alb-waf"
    $ mkdir -p ${SCRATCH}
    $ echo "Cluster: $(echo ${CLUSTER} | sed 's/-[a-z0-9]\{5\}$//'), Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    Copy to Clipboard Toggle word wrap

7.1.2. AWS VPC 및 서브넷

참고

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

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

    $ export VPC_ID=<vpc-id> 
    1
    
    $ export PUBLIC_SUBNET_IDS=(<space-separated-list-of-ids>) 
    2
    
    $ export PRIVATE_SUBNET_IDS=(<space-separated-list-of-ids>) 
    3
    Copy to Clipboard Toggle word wrap
    1
    클러스터의 VPC ID로 바꿉니다(예: export VPC_ID=vpc-04c429b7dbc4680ba ).
    2
    을 클러스터의 프라이빗 서브넷 ID로 공백으로 구분된 목록으로 교체하여 () 를 유지해야 합니다. 예: PUBLIC_SUBNET_IDS=(subnet-056fd6861ad332ba2 subnet-08ce3b4ec753fe74c subnet-071a28228664972f).
    3
    을 클러스터의 프라이빗 서브넷 ID로 공백으로 구분된 목록으로 교체하여 () 를 유지해야 합니다. 예: PRIVATE_SUBNET_IDS=(subnet-0b933d72a8d72c36a subnet-0817eb72070f1d3c2 subnet-0806e64159b66665a).
  2. 클러스터 ID가 있는 클러스터의 VPC에 태그를 추가합니다.

    $ aws ec2 create-tags --resources ${VPC_ID} \
      --tags Key=kubernetes.io/cluster/${CLUSTER},Value=shared --region ${REGION}
    Copy to Clipboard Toggle word wrap
  3. 퍼블릭 서브넷에 태그를 추가합니다.

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

    $ aws ec2 create-tags \
      --resources ${PRIVATE_SUBNET_IDS} \
      --tags Key=kubernetes.io/role/internal-elb,Value='1' \
            Key=kubernetes.io/cluster/${CLUSTER},Value=shared \
      --region ${REGION}
    Copy to Clipboard Toggle word wrap

7.2. AWS Load Balancer Operator 배포

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

  1. 다음 명령을 실행하여 AWS Load Balancer Operator를 배포할 새 프로젝트를 생성합니다.

    $ oc new-project aws-load-balancer-operator
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 AWS Load Balancer Controller에 대한 AWS IAM 정책을 생성합니다.

    참고

    정책은 업스트림 AWS Load Balancer 컨트롤러 정책에서 가져옵니다. 이 작업은 Operator가 작동해야 합니다.

    $ POLICY_ARN=$(aws iam list-policies --query \
         "Policies[?PolicyName=='aws-load-balancer-operator-policy'].{ARN:Arn}" \
         --output text)
    Copy to Clipboard Toggle word wrap
    $ if [[ -z "${POLICY_ARN}" ]]; then
        wget -O "${SCRATCH}/load-balancer-operator-policy.json" \
           https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/main/docs/install/iam_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
    Copy to Clipboard Toggle word wrap
  3. 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
    Copy to Clipboard Toggle word wrap
  4. AWS Load Balancer Operator에 대한 AWS IAM 역할을 생성합니다.

    $ ROLE_ARN=$(aws iam create-role --role-name "${CLUSTER}-alb-operator" \
       --assume-role-policy-document "file://${SCRATCH}/trust-policy.json" \
       --query Role.Arn --output text)
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 실행하여 AWS Load Balancer Operator 정책을 이전에 생성한 IAM 역할에 연결합니다.

    $ aws iam attach-role-policy --role-name "${CLUSTER}-alb-operator" \
         --policy-arn ${POLICY_ARN}
    Copy to Clipboard Toggle word wrap
  6. 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
    Copy to Clipboard Toggle word wrap
  7. 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
    Copy to Clipboard Toggle word wrap
  8. 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
    Copy to Clipboard Toggle word wrap
  9. Operator 및 컨트롤러 Pod가 둘 다 실행 중인지 확인합니다.

    $ oc -n aws-load-balancer-operator get pods
    Copy to Clipboard Toggle word wrap

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

    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
    Copy to Clipboard Toggle word wrap

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

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

    $ oc new-project hello-world
    Copy to Clipboard Toggle word wrap
  2. hello world 애플리케이션을 배포합니다.

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

    $ oc -n hello-world patch service hello-openshift -p '{"spec":{"type":"NodePort"}}'
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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}"
    Copy to Clipboard Toggle word wrap

    출력 예

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

7.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
    Copy to Clipboard Toggle word wrap

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

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

    $ WAF_ARN=$(aws wafv2 create-web-acl \
      --name ${CLUSTER}-waf \
      --region ${REGION} \
      --default-action Allow={} \
      --scope REGIONAL \
      --visibility-config SampledRequestsEnabled=true,CloudWatchMetricsEnabled=true,MetricName=${CLUSTER}-waf-metrics \
      --rules file://${SCRATCH}/waf-rules.json \
      --query 'Summary.ARN' \
      --output text)
    Copy to Clipboard Toggle word wrap
  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}
    Copy to Clipboard Toggle word wrap
  4. 규칙이 전파되고 앱이 여전히 작동하는지 테스트할 때까지 10초 동안 기다립니다.

    $ curl "http://${INGRESS}"
    Copy to Clipboard Toggle word wrap

    출력 예

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

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

    $ curl -X POST "http://${INGRESS}" \
      -F "user='<script><alert>Hello></alert></script>'"
    Copy to Clipboard Toggle word wrap

    출력 예

    <html>
    <head><title>403 Forbidden</title></head>
    <body>
    <center><h1>403 Forbidden</h1></center>
    </body>
    </html
    Copy to Clipboard Toggle word wrap

    참고

    AWS WAF 통합 활성화에는 몇 분이 걸릴 수 있습니다. 403 Forbidden 오류가 표시되지 않으면 몇 초 기다렸다가 다시 시도하십시오.

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

8장. 튜토리얼: 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}"
    Copy to Clipboard Toggle word wrap

8.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}
    Copy to Clipboard Toggle word wrap
  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}
    Copy to Clipboard Toggle word wrap
  3. IAM 역할에 IAM 정책을 연결합니다.

    $ aws iam attach-role-policy --role-name "${ROLE_NAME}" \
     --policy-arn ${POLICY_ARN}
    Copy to Clipboard Toggle word wrap

8.2. 클러스터에 OADP 배포

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

    $ oc create namespace openshift-adp
    Copy to Clipboard Toggle word wrap
  2. 인증 정보 시크릿을 생성합니다.

    $ cat <<EOF > ${SCRATCH}/credentials
    [default]
    role_arn = ${ROLE_ARN}
    web_identity_token_file = /var/run/secrets/openshift/serviceaccount/token
    region=<aws_region> 
    1
    
    EOF
    $ oc -n openshift-adp create secret generic cloud-credentials \
     --from-file=${SCRATCH}/credentials
    Copy to Clipboard Toggle word wrap
    1
    & lt;aws_region >을 STS(Security Token Service) 끝점에 사용할 AWS 리전으로 바꿉니다.
  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
    Copy to Clipboard Toggle word wrap
  4. Operator가 준비될 때까지 기다립니다.

    $ watch oc -n openshift-adp get pods
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                                                READY   STATUS    RESTARTS   AGE
    openshift-adp-controller-manager-546684844f-qqjhn   1/1     Running   0          22s
    Copy to Clipboard Toggle word wrap

  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
    Copy to Clipboard Toggle word wrap
  6. 애플리케이션의 스토리지 기본 스토리지 클래스를 확인합니다.

    $ oc get pvc -n <namespace> 
    1
    Copy to Clipboard Toggle word wrap
    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
    Copy to Clipboard Toggle word wrap

    $ oc get storageclass
    Copy to Clipboard Toggle word wrap

    출력 예

    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
    Copy to Clipboard Toggle word wrap

    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
    Copy to Clipboard Toggle word wrap
    참고

    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
    Copy to Clipboard Toggle word wrap
참고
  • OADP 1.1.x ROSA STS 환경에서는 컨테이너 이미지 백업 및 복원(spec.backupImages) 값을 지원되지 않으므로 false 로 설정해야 합니다.
  • Restic 기능(restic.enable=false)은 비활성화되어 ROSA STS 환경에서 지원되지 않습니다.
  • DataMover 기능(dataMover.enable=false)은 비활성화되어 ROSA STS 환경에서 지원되지 않습니다.

8.3. 백업 수행

참고

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

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

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

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

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`
    Copy to Clipboard Toggle word wrap

    출력 예

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

  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
    Copy to Clipboard Toggle word wrap
  5. 백업이 완료될 때까지 기다립니다.

    $ watch "oc -n openshift-adp get backup hello-world -o json | jq .status"
    Copy to Clipboard Toggle word wrap

    출력 예

    {
     "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
    }
    Copy to Clipboard Toggle word wrap

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

    $ oc delete ns hello-world
    Copy to Clipboard Toggle word wrap
  7. 백업에서 복원:

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

    $ watch "oc -n openshift-adp get restore hello-world -o json | jq .status"
    Copy to Clipboard Toggle word wrap

    출력 예

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

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

    $ oc -n hello-world get pods
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                              READY   STATUS    RESTARTS   AGE
    hello-openshift-9f885f7c6-kdjpj   1/1     Running   0          90s
    Copy to Clipboard Toggle word wrap

    $ curl `oc get route/hello-openshift -n hello-world -o jsonpath='{.spec.host}'`
    Copy to Clipboard Toggle word wrap

    출력 예

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

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

8.4. cleanup

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

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

    $ oc delete backups.velero.io hello-world
    $ oc delete restores.velero.io hello-world
    Copy to Clipboard Toggle word wrap
  3. s3에서 백업/복원 및 원격 개체를 삭제하려면 다음을 수행합니다.

    $ velero backup delete hello-world
    $ velero restore delete hello-world
    Copy to Clipboard Toggle word wrap
  4. 데이터 보호 애플리케이션 삭제:

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

    $ oc -n openshift-adp delete cloudstorage ${CLUSTER_NAME}-oadp
    Copy to Clipboard Toggle word wrap
    주의

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

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

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

    $ oc delete ns redhat-openshift-adp
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  9. AWS S3 버킷을 삭제합니다.

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

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

    $ aws iam delete-role --role-name "${ROLE_NAME}"
    Copy to Clipboard Toggle word wrap

9장. 튜토리얼: 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 인스턴스를 설치, 관리 및 구성하는 데 사용됩니다.

9.1. 사전 요구 사항

참고

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

9.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}"
    Copy to Clipboard Toggle word wrap

9.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}")
    Copy to Clipboard Toggle word wrap
  2. 클러스터 이름을 사용하여 클러스터의 VPC에 태그를 추가합니다.

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

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

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

9.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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  5. 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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  7. Operator 및 컨트롤러 Pod가 둘 다 실행 중인지 확인합니다.

    $ oc -n aws-load-balancer-operator get pods
    Copy to Clipboard Toggle word wrap

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

    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
    Copy to Clipboard Toggle word wrap

9.3. 배포 검증

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

    $ oc new-project hello-world
    Copy to Clipboard Toggle word wrap
  2. hello world 애플리케이션을 배포합니다.

    $ oc new-app -n hello-world --image=docker.io/openshift/hello-openshift
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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}"
    Copy to Clipboard Toggle word wrap

    출력 예

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

  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
    Copy to Clipboard Toggle word wrap
  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}"
    Copy to Clipboard Toggle word wrap

    출력 예

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

9.4. 정리

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

    $ oc delete project hello-world
    Copy to Clipboard Toggle word wrap
  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"
    Copy to Clipboard Toggle word wrap
  3. AWS IAM 정책을 삭제합니다.

    $ aws iam delete-policy --policy-arn $POLICY_ARN
    Copy to Clipboard Toggle word wrap

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.${domain}/oauth2callback/AAD"
    Copy to Clipboard Toggle word wrap

    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

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 내에서 사용할 사용자의 그룹 멤버십을 제공할 수 있습니다.

10.3.1. 선택적 클레임 구성

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

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

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

프로세스

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

    Azure Portal - Add Groups Claim Page

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

    참고

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

    Azure Portal - Edit Groups Claim Page

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
    Copy to Clipboard Toggle word wrap
    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
      Copy to Clipboard Toggle word wrap
    • 그룹 클레임을 활성화하지 않은 경우 다음 명령을 실행합니다.

      $ 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
      Copy to Clipboard Toggle word wrap

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

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

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

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

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

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

프로세스

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

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

10.5.2. 개별 그룹에 추가 권한 부여

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

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

프로세스

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

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

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

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>
    Copy to Clipboard Toggle word wrap

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

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

    $ oc get authentication.config.openshift.io cluster -o json \
      | jq .spec.serviceAccountIssuer
    Copy to Clipboard Toggle word wrap

    출력 예

    "https://xxxxx.cloudfront.net/xxxxx"
    Copy to Clipboard Toggle word wrap

    출력이 다르면 계속 진행하지 마십시오. 이 프로세스를 계속하기 전에 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
    Copy to Clipboard Toggle word wrap
  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=""
    Copy to Clipboard Toggle word wrap

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

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

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

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

    $ helm upgrade --install -n csi-secrets-store \
        csi-secrets-store-driver secrets-store-csi-driver/secrets-store-csi-driver
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 실행하여 두 데몬 세트 모두 실행 중인지 확인합니다.

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

    $ oc label csidriver.storage.k8s.io/secrets-store.csi.k8s.io security.openshift.io/csi-ephemeral-volume-profile=restricted
    Copy to Clipboard Toggle word wrap

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
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 IAM 액세스 정책 문서를 생성합니다.

    $ cat << EOF > policy.json
    {
       "Version": "2012-10-17",
       "Statement": [{
          "Effect": "Allow",
          "Action": [
            "secretsmanager:GetSecretValue",
            "secretsmanager:DescribeSecret"
          ],
          "Resource": ["$SECRET_ARN"]
          }]
    }
    EOF
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  6. 다음 명령을 실행하여 정책에 역할을 연결합니다.

    $ aws iam attach-role-policy --role-name openshift-access-to-mysecret \
        --policy-arn $POLICY_ARN
    Copy to Clipboard Toggle word wrap

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

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

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

    $ oc annotate -n my-application serviceaccount default \
        eks.amazonaws.com/role-arn=$ROLE_ARN
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 실행하여 Pod에 보안이 마운트되었는지 확인합니다.

    $ oc exec -it my-application -- cat /mnt/secrets-store/MySecret
    Copy to Clipboard Toggle word wrap

11.5. 정리

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

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

    $ helm delete -n csi-secrets-store csi-secrets-store-driver
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  6. 다음 명령을 실행하여 Secrets Manager 시크릿을 삭제합니다.

    $ aws secretsmanager --region $REGION delete-secret --secret-id $SECRET_ARN
    Copy to Clipboard Toggle word wrap

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}
    Copy to Clipboard Toggle word wrap
  2. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "Cluster: ${ROSA_CLUSTER_NAME}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    Copy to Clipboard Toggle word wrap

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
    Copy to Clipboard Toggle word wrap
  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}
    Copy to Clipboard Toggle word wrap

12.4. ACK S3 컨트롤러 설치

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

    $ oc new-project ack-system
    Copy to Clipboard Toggle word wrap
  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=
    RECONCILE_DEFAULT_MAX_CONCURRENT_SYNCS=1
    FEATURE_FLAGS=
    FEATURE_GATES=
    EOF
    Copy to Clipboard Toggle word wrap
  3. 이전 단계의 파일을 사용하여 ConfigMap을 생성합니다.

    $ oc -n ack-system create configmap \
      --from-env-file=${SCRATCH}/config.txt ack-${ACK_SERVICE}-user-config
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  6. ACK S3 Operator가 실행 중인지 확인합니다.

    $ oc -n ack-system get pods
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                                 READY   STATUS    RESTARTS   AGE
    ack-s3-controller-585f6775db-s4lfz   1/1     Running   0          51s
    Copy to Clipboard Toggle word wrap

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
    Copy to Clipboard Toggle word wrap
  2. S3 버킷이 AWS에서 생성되었는지 확인합니다.

    $ aws s3 ls | grep ${CLUSTER_NAME}-bucket
    Copy to Clipboard Toggle word wrap

    출력 예

    2023-10-04 14:51:45 mrmc-test-maz-bucket
    Copy to Clipboard Toggle word wrap

12.6. 정리

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

    $ oc -n ack-system delete bucket.s3.services.k8s.aws/${CLUSTER-NAME}-bucket
    Copy to Clipboard Toggle word wrap
  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"
    Copy to Clipboard Toggle word wrap
  3. ack-system 프로젝트를 삭제합니다.

    $ oc delete project ack-system
    Copy to Clipboard Toggle word wrap

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

외부 DNS Operator는 ExternalDNS 를 배포 및 관리하여 Amazon Route 53과 같은 외부 DNS 공급자의 서비스 및 경로의 이름 확인을 AWS(ROSA) 클러스터에서 Red Hat OpenShift Service로 제공합니다. 이 튜토리얼에서는 Amazon Route 53에서 DNS 레코드를 관리하도록 보조 수신 컨트롤러를 사용하여 외부 DNS Operator를 배포 및 구성합니다.

중요

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

13.1. 사전 요구 사항

  • ROSA Classic 클러스터

    참고

    현재 HCP를 사용하는 ROSA는 지원되지 않습니다.

  • cluster-admin 권한이 있는 사용자 계정
  • OpenShift CLI(oc)
  • AWS(Amazon Web Services) CLI(aws)
  • apps.example.com과 같은 고유 도메인
  • 위의 도메인의 Amazon Route 53 공용 호스팅 영역

13.2. 환경 설정

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

    $ export DOMAIN=<apps.example.com> 
    1
    
    $ export AWS_PAGER=""
    $ export CLUSTER=$(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}/external-dns"
    $ mkdir -p ${SCRATCH}
    Copy to Clipboard Toggle word wrap
    1
    IngressController 에 사용할 사용자 정의 도메인으로 바꿉니다.
  2. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "Cluster: ${CLUSTER}, Region: ${REGION}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    Copy to Clipboard Toggle word wrap
    참고

    이전 명령의 "클러스터" 출력은 클러스터의 이름, 클러스터의 내부 ID 또는 클러스터의 도메인 접두사일 수 있습니다. 다른 식별자를 사용하려는 경우 다음 명령을 실행하여 이 값을 수동으로 설정할 수 있습니다.

    $ export CLUSTER=my-custom-value
    Copy to Clipboard Toggle word wrap

13.3. 보조 수신 컨트롤러 설정

사용자 정의 도메인을 사용하여 보조 수신 컨트롤러를 배포하려면 다음 절차를 사용하십시오.

사전 요구 사항

  • apps.example.com과 같은 고유 도메인
  • 위에서 선택한 사용자 정의 도메인으로 구성된 와일드카드 또는 SAN TLS 인증서(CN=*.apps.example.com)

프로세스

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

    $ oc -n openshift-ingress create secret tls external-dns-tls --cert=fullchain.pem --key=privkey.pem
    Copy to Clipboard Toggle word wrap
  2. IngressController 리소스를 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: external-dns-ingress
      namespace: openshift-ingress-operator
    spec:
      domain: ${DOMAIN}
      defaultCertificate:
        name: external-dns-tls
      endpointPublishingStrategy:
        loadBalancer:
          dnsManagementPolicy: Unmanaged
          providerParameters:
            aws:
              type: NLB
            type: AWS
          scope: External
        type: LoadBalancerService
    EOF
    Copy to Clipboard Toggle word wrap
    주의

    IngressController 예제에서는 AWS 계정에서 인터넷에 액세스할 수 있는 NLB(Network Load Balancer)를 생성합니다. 대신 내부 NLB를 프로비저닝하려면 IngressController 리소스를 생성하기 전에 .spec.endpointPublishingStrategy.loadBalancer.scope 매개변수를 Internal 로 설정합니다.

  3. 사용자 정의 도메인 IngressController가 외부 로드 밸런서를 성공적으로 생성했는지 확인합니다.

    $ oc -n openshift-ingress get service/router-external-dns-ingress
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                          TYPE           CLUSTER-IP      EXTERNAL-IP                                                                     PORT(S)                      AGE
    router-external-dns-ingress   LoadBalancer   172.30.71.250   a4838bb991c6748439134ab89f132a43-aeae124077b50c01.elb.us-east-1.amazonaws.com   80:32227/TCP,443:30310/TCP   43s
    Copy to Clipboard Toggle word wrap

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\///')
    Copy to Clipboard Toggle word wrap
  2. Ingress 컨트롤러의 정식 도메인에 대한 DNS 확인을 활성화하기 위해 필요한 DNS 변경 사항이 포함된 문서를 준비합니다.

    $ NLB_HOST=$(oc -n openshift-ingress get service/router-external-dns-ingress -ojsonpath="{.status.loadBalancer.ingress[0].hostname}")
    $ cat << EOF > "${SCRATCH}/create-cname.json"
    {
      "Comment":"Add CNAME to ingress controller canonical domain",
      "Changes":[{
          "Action":"CREATE",
          "ResourceRecordSet":{
            "Name": "router-external-dns-ingress.${DOMAIN}",
          "Type":"CNAME",
          "TTL":30,
          "ResourceRecords":[{
            "Value": "${NLB_HOST}"
          }]
        }
      }]
    }
    EOF
    Copy to Clipboard Toggle word wrap

    외부 DNS Operator는 이 정식 도메인을 CNAME 레코드의 대상으로 사용합니다.

  3. 승인을 위해 Amazon Route 53에 변경 사항을 제출합니다.

    aws route53 change-resource-record-sets \
      --hosted-zone-id ${ZONE_ID} \
      --change-batch file://${SCRATCH}/create-cname.json
    Copy to Clipboard Toggle word wrap
  4. 외부 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
    Copy to Clipboard Toggle word wrap
  5. AWS IAM 사용자를 생성합니다.

    $ aws iam create-user --user-name "${CLUSTER}-external-dns-operator"
    Copy to Clipboard Toggle word wrap
  6. 정책을 연결합니다.

    $ aws iam attach-user-policy --user-name "${CLUSTER}-external-dns-operator" --policy-arn $POLICY_ARN
    Copy to Clipboard Toggle word wrap
    참고

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

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

    $ SECRET_ACCESS_KEY=$(aws iam create-access-key --user-name "${CLUSTER}-external-dns-operator")
    Copy to Clipboard Toggle word wrap
  8. 정적 인증 정보를 생성합니다.

    $ 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
    Copy to Clipboard Toggle word wrap

13.5. 외부 DNS Operator 설치

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

    $ oc new-project external-dns-operator
    Copy to Clipboard Toggle word wrap
  2. 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
    Copy to Clipboard Toggle word wrap
  3. 외부 DNS Operator가 실행될 때까지 기다립니다.

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

    $ oc -n external-dns-operator create secret generic external-dns \
      --from-file "${SCRATCH}/credentials"
    Copy to Clipboard Toggle word wrap
  5. 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-ingress
        type: OpenShiftRoute
      zones:
        - ${ZONE_ID}
    EOF
    Copy to Clipboard Toggle word wrap
  6. 컨트롤러가 실행될 때까지 기다립니다.

    $ oc rollout status deploy external-dns-${DOMAIN} --timeout=300s
    Copy to Clipboard Toggle word wrap

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

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

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

    $ oc new-project hello-world
    Copy to Clipboard Toggle word wrap
  2. hello world 애플리케이션을 배포합니다.

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

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

    참고

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

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

    $ aws route53 list-resource-record-sets --hosted-zone-id ${ZONE_ID} \
       --query "ResourceRecordSets[?Type == 'TXT']" | grep ${DOMAIN}
    Copy to Clipboard Toggle word wrap
  6. 새로 생성된 DNS 레코드를 샘플 애플리케이션에 curl하여 hello world 애플리케이션에 액세스할 수 있는지 확인합니다.

    $ curl https://hello-openshift.${DOMAIN}
    Copy to Clipboard Toggle word wrap

    출력 예

    Hello OpenShift!
    Copy to Clipboard Toggle word wrap

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

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

14.1. 사전 요구 사항

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

14.2. 환경 설정

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

    $ export DOMAIN=apps.example.com 
    1
    
    $ export EMAIL=email@example.com 
    2
    
    $ export AWS_PAGER=""
    $ export CLUSTER=$(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}/dynamic-certs"
    $ mkdir -p ${SCRATCH}
    Copy to Clipboard Toggle word wrap
    1
    IngressController 에 사용할 사용자 정의 도메인으로 바꿉니다.
    2
    Let's Encrypt가 인증서에 대한 알림을 보내는 데 사용할 전자 메일로 바꿉니다.
  2. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "Cluster: ${CLUSTER}, Region: ${REGION}, OIDC Endpoint: ${OIDC_ENDPOINT}, AWS Account ID: ${AWS_ACCOUNT_ID}"
    Copy to Clipboard Toggle word wrap
    참고

    이전 명령의 "클러스터" 출력은 클러스터의 이름, 클러스터의 내부 ID 또는 클러스터의 도메인 접두사일 수 있습니다. 다른 식별자를 사용하려는 경우 다음 명령을 실행하여 이 값을 수동으로 설정할 수 있습니다.

    $ export CLUSTER=my-custom-value
    Copy to Clipboard Toggle word wrap

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\///')
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  3. 이전 단계에서 생성한 파일을 사용하여 IAM 정책을 생성합니다.

    $ POLICY_ARN=$(aws iam create-policy --policy-name "${CLUSTER}-cert-manager-policy" \
      --policy-document file://${SCRATCH}/cert-manager-policy.json \
      --query 'Policy.Arn' --output text)
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  5. 이전 단계에서 생성한 신뢰 정책을 사용하여 cert-manager Operator에 대한 IAM 역할을 생성합니다.

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

    $ aws iam attach-role-policy --role-name "${CLUSTER}-cert-manager-operator" \
      --policy-arn ${POLICY_ARN}
    Copy to Clipboard Toggle word wrap

14.4. cert-manager Operator 설치

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

    $ oc new-project cert-manager-operator
    Copy to Clipboard Toggle word wrap
    중요

    클러스터에서 두 개 이상의 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
    Copy to Clipboard Toggle word wrap
    참고

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

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

    $ oc -n cert-manager-operator get pods
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                                                        READY   STATUS    RESTARTS   AGE
    cert-manager-operator-controller-manager-84b8799db5-gv8mx   2/2     Running   0          12s
    Copy to Clipboard Toggle word wrap

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

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

    $ oc -n cert-manager delete pods -l app.kubernetes.io/name=cert-manager
    Copy to Clipboard Toggle word wrap
  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"]}}}'
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap
  8. ClusterIssuer 리소스가 준비되었는지 확인합니다.

    $ oc get clusterissuer.cert-manager.io/letsencrypt-production
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                     READY   AGE
    letsencrypt-production   True    47s
    Copy to Clipboard Toggle word wrap

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

  1. 사용자 정의 도메인 Ingress 컨트롤러의 인증서를 프로비저닝하도록 인증서 리소스를 생성하고 구성합니다.

    참고

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

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

    참고

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

    $ oc -n openshift-ingress get certificate.cert-manager.io/custom-domain-ingress-cert
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                         READY   SECRET                           AGE
    custom-domain-ingress-cert   True    custom-domain-ingress-cert-tls   9m53s
    Copy to Clipboard Toggle word wrap

  3. IngressController 리소스를 생성합니다.

    $ cat << EOF | oc apply -f -
    apiVersion: operator.openshift.io/v1
    kind: IngressController
    metadata:
      name: custom-domain-ingress
      namespace: openshift-ingress-operator
    spec:
      domain: ${DOMAIN}
      defaultCertificate:
        name: custom-domain-ingress-cert-tls
      endpointPublishingStrategy:
        loadBalancer:
          dnsManagementPolicy: Unmanaged
          providerParameters:
            aws:
              type: NLB
            type: AWS
          scope: External
        type: LoadBalancerService
    EOF
    Copy to Clipboard Toggle word wrap
    주의

    IngressController 예제에서는 AWS 계정에서 인터넷에 액세스할 수 있는 NLB(Network Load Balancer)를 생성합니다. 대신 내부 NLB를 프로비저닝하려면 IngressController 리소스를 생성하기 전에 .spec.endpointPublishingStrategy.loadBalancer.scope 매개변수를 Internal 로 설정합니다.

  4. 사용자 정의 도메인 IngressController가 외부 로드 밸런서를 성공적으로 생성했는지 확인합니다.

    $ oc -n openshift-ingress get service/router-custom-domain-ingress
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                           TYPE           CLUSTER-IP      EXTERNAL-IP                                                                     PORT(S)                      AGE
    router-custom-domain-ingress   LoadBalancer   172.30.174.34   a309962c3bd6e42c08cadb9202eca683-1f5bbb64a1f1ec65.elb.us-east-1.amazonaws.com   80:31342/TCP,443:31821/TCP   7m28s
    Copy to Clipboard Toggle word wrap

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

    $ INGRESS=$(oc -n openshift-ingress get service/router-custom-domain-ingress -ojsonpath="{.status.loadBalancer.ingress[0].hostname}")
    $ 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
    Copy to Clipboard Toggle word wrap
  6. 승인을 위해 Amazon Route 53에 변경 사항을 제출합니다.

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

    와일드카드 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
    Copy to Clipboard Toggle word wrap

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

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

    $ oc -n cert-manager get pods
    Copy to Clipboard Toggle word wrap

    결과 예

    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
    Copy to Clipboard Toggle word wrap

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

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

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

    $ oc new-project hello-world
    Copy to Clipboard Toggle word wrap
  2. hello world 애플리케이션을 배포합니다.

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

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

    $ curl -I https://hello.${DOMAIN}
    Copy to Clipboard Toggle word wrap

    출력 예

    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.
    Copy to Clipboard Toggle word wrap

  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
    Copy to Clipboard Toggle word wrap
    참고

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

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

    $ curl -I https://hello.${DOMAIN}
    Copy to Clipboard Toggle word wrap

    출력 예

    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
    Copy to Clipboard Toggle word wrap

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

참고

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

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

$ oc get certificate,certificaterequest,order,challenge
Copy to Clipboard Toggle word wrap

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

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

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

보안 표준을 충족하기 위해 IP 기반 구성이 필요한 보안 그룹과 같이 클러스터를 떠나는 트래픽에 일관된 IP 주소를 할당할 수 있습니다.

기본적으로 AWS(ROSA)의 Red Hat OpenShift Service는 OVN-Kubernetes CNI(Container Network Interface)를 사용하여 풀에서 임의의 IP 주소를 할당합니다. 이로 인해 보안 잠금을 예측할 수 없거나 열 수 없게 만들 수 있습니다.

자세한 내용은 송신 IP 주소 구성 을 참조하십시오.

목표

  • 송신 클러스터 트래픽에 대해 예측 가능한 IP 주소 세트를 구성하는 방법을 알아봅니다.

사전 요구 사항

15.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=worker
    Copy to Clipboard Toggle word wrap

15.2. 용량 확인

각 노드에 할당된 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)
            }'
    Copy to Clipboard Toggle word wrap

    출력 예

    ---
    {
      "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
    }
    ---
    Copy to Clipboard Toggle word wrap

15.3. 송신 IP 규칙 생성

  1. 송신 IP 규칙을 생성하기 전에 사용할 송신 IP를 식별합니다.

    참고

    선택한 송신 IP는 작업자 노드가 프로비저닝되는 서브넷의 일부로 존재해야 합니다.

  2. 선택 사항: AWS VPC(Virtual Private Cloud) DHCP(Dynamic Host Configuration Protocol) 서비스와의 충돌을 방지하기 위해 요청한 송신 IP를 예약합니다.

    CIDR 예약 페이지에 대한 AWS 문서에서 명시적인 IP 예약을 요청합니다.

15.4. 네임스페이스에 송신 IP 할당

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

    $ oc new-project demo-egress-ns
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 네임스페이스 내에서 모든 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
    Copy to Clipboard Toggle word wrap

15.5. Pod에 송신 IP 할당

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

    $ oc new-project demo-egress-pod
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 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
    Copy to Clipboard Toggle word wrap

15.5.1. 노드 레이블 지정

  1. 다음 명령을 실행하여 보류 중인 송신 IP 할당을 확보합니다.

    $ oc get egressips
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME              EGRESSIPS       ASSIGNED NODE   ASSIGNED EGRESSIPS
    demo-egress-ns    10.10.100.253
    demo-egress-pod   10.10.100.254
    Copy to Clipboard Toggle word wrap

    생성한 송신 IP 규칙은 k8s.ovn.org/egress-assignable 레이블이 있는 노드에만 적용됩니다. 레이블이 특정 머신 풀에만 있는지 확인합니다.

  2. 다음 명령을 사용하여 머신 풀에 레이블을 할당합니다.

    주의

    머신 풀의 노드 레이블을 사용하는 경우 이 명령은 해당 라벨을 대체합니다. 노드 라벨이 남아 있도록 원하는 레이블을 --labels 필드에 입력해야 합니다.

    $ rosa update machinepool ${ROSA_MACHINE_POOL_NAME} \
      --cluster="${ROSA_CLUSTER_NAME}" \
      --labels "k8s.ovn.org/egress-assignable="
    Copy to Clipboard Toggle word wrap

15.5.2. 송신 IP 검토

  • 다음 명령을 실행하여 송신 IP 할당을 검토합니다.

    $ oc get egressips
    Copy to Clipboard Toggle word wrap

    출력 예

    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
    Copy to Clipboard Toggle word wrap

15.6. 검증

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

송신 IP 규칙을 테스트하려면 지정한 송신 IP 주소로 제한된 서비스를 생성합니다. 이렇게 하면 IP 주소의 작은 하위 집합을 예상하는 외부 서비스를 시뮬레이션합니다.

  1. echoserver 명령을 실행하여 요청을 복제합니다.

    $ oc -n default run demo-service --image=gcr.io/google_containers/echoserver:1.4
    Copy to Clipboard Toggle word wrap
  2. 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
    Copy to Clipboard Toggle word wrap
  3. 로드 밸런서 호스트 이름을 검색하고 다음 명령을 실행하여 환경 변수로 저장합니다.

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

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

  1. 대화형 쉘을 시작하여 네임스페이스 송신 규칙을 테스트합니다.

    $ 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
    Copy to Clipboard Toggle word wrap
  2. 요청을 로드 밸런서에 전송하고 성공적으로 연결할 수 있는지 확인합니다.

    $ curl -s http://$LOAD_BALANCER_HOSTNAME
    Copy to Clipboard Toggle word wrap
  3. 성공적인 연결에 대한 출력을 확인합니다.

    참고

    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-
    Copy to Clipboard Toggle word wrap

  4. 다음 명령을 실행하여 Pod를 종료합니다.

    $ exit
    Copy to Clipboard Toggle word wrap

15.6.3. Pod 송신 테스트

  1. 대화형 쉘을 시작하여 Pod 송신 규칙을 테스트합니다.

    $ 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
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 로드 밸런서에 요청을 보냅니다.

    $ curl -s http://$LOAD_BALANCER_HOSTNAME
    Copy to Clipboard Toggle word wrap
  3. 성공적인 연결에 대한 출력을 확인합니다.

    참고

    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-
    Copy to Clipboard Toggle word wrap

  4. 다음 명령을 실행하여 Pod를 종료합니다.

    $ exit
    Copy to Clipboard Toggle word wrap

15.6.4. 선택 사항: 테스트 차단 송신

  1. 선택 사항: 다음 명령을 실행하여 송신 규칙이 적용되지 않을 때 트래픽이 성공적으로 차단되었는지 테스트합니다.

    $ 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
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 로드 밸런서에 요청을 보냅니다.

    $ curl -s http://$LOAD_BALANCER_HOSTNAME
    Copy to Clipboard Toggle word wrap
  3. 명령이 실패하면 송신이 성공적으로 차단됩니다.
  4. 다음 명령을 실행하여 Pod를 종료합니다.

    $ exit
    Copy to Clipboard Toggle word wrap

15.7. 클러스터 정리

  1. 다음 명령을 실행하여 클러스터를 정리합니다.

    $ 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
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 할당된 노드 레이블을 정리합니다.

    주의

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

    $ rosa update machinepool ${ROSA_MACHINE_POOL_NAME} \
      --cluster="${ROSA_CLUSTER_NAME}" \
      --labels ""
    Copy to Clipboard Toggle word wrap

이 가이드에서는 ROSA(Red Hat OpenShift Service on AWS) 버전 4.14 이상에서 웹 콘솔, OAuth 서버 및 다운로드 구성 요소 경로의 호스트 이름 및 TLS 인증서를 수정하는 방법을 보여줍니다.[1]

구성 요소 경로에 대한 변경 사항[2] 이 가이드에서는 내부 OAuth 서버 URL 사용자 정의,콘솔 경로 및 OpenShift Container Platform 설명서 다운로드에 자세히 설명되어 있습니다.

16.1. 사전 요구 사항

  • ROSA CLI (rosa) 버전 1.2.37 이상
  • AWS CLI (aws)
  • ROSA Classic 클러스터 버전 4.14 이상

    참고

    현재 HCP를 사용하는 ROSA는 지원되지 않습니다.

  • OpenShift CLI(oc)
  • jq CLI
  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • OpenSSL(데모 SSL/TLS 인증서를 생성하기 위해)

16.2. 환경 설정

  1. cluster-admin 권한이 있는 계정을 사용하여 클러스터에 로그인합니다.
  2. 클러스터 이름에 대한 환경 변수를 구성합니다.

    $ export CLUSTER_NAME=$(oc get infrastructure cluster -o=jsonpath="{.status.infrastructureName}"  | sed 's/-[a-z0-9]\{5\}$//')
    Copy to Clipboard Toggle word wrap
  3. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "Cluster: ${CLUSTER_NAME}"
    Copy to Clipboard Toggle word wrap

    출력 예

    Cluster: my-rosa-cluster
    Copy to Clipboard Toggle word wrap

16.3. 현재 경로 찾기

  1. 기본 호스트 이름에서 구성 요소 경로에 연결할 수 있는지 확인합니다.

    openshift-consoleopenshift-authentication 프로젝트의 경로 목록을 쿼리하여 호스트 이름을 찾을 수 있습니다.

    $ oc get routes -n openshift-console
    $ oc get routes -n openshift-authentication
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME        HOST/PORT                                                                          PATH       SERVICES    PORT    TERMINATION          WILDCARD
    console     console-openshift-console.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com    ... 1 more  console    https   reencrypt/Redirect   None
    downloads   downloads-openshift-console.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com  ... 1 more  downloads  http    edge/Redirect        None
    NAME              HOST/PORT                                                             PATH        SERVICES          PORT   TERMINATION            WILDCARD
    oauth-openshift   oauth-openshift.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com ... 1 more  oauth-openshift   6443   passthrough/Redirect   None
    Copy to Clipboard Toggle word wrap

    이 출력에서 기본 호스트 이름은 z9a9.p1.openshiftapps.com 임을 확인할 수 있습니다.

  2. 다음 명령을 실행하여 기본 수신의 ID를 가져옵니다.

    $ export INGRESS_ID=$(rosa list ingress -c ${CLUSTER_NAME} -o json | jq -r '.[] | select(.default == true) | .id')
    Copy to Clipboard Toggle word wrap
  3. 다음 섹션으로 이동하기 전에 모든 필드가 올바르게 출력되는지 확인합니다.

    $ echo "Ingress ID: ${INGRESS_ID}"
    Copy to Clipboard Toggle word wrap

    출력 예

    Ingress ID: r3l6
    Copy to Clipboard Toggle word wrap

    이러한 명령을 실행하면 클러스터의 기본 구성 요소 경로가 다음과 같습니다.

    • console-openshift-console.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com
    • Downloads-openshift-console.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com
    • oauth-openshift.apps.my-example-cluster-aws.z9a9.p1.openshiftapps.com

rosa edit ingress 명령을 사용하여 각 서비스의 호스트 이름을 변경하고 모든 구성 요소 경로에 대한 TLS 인증서를 추가할 수 있습니다. 관련 매개변수는 rosa edit ingress 명령에 대한 명령줄 도움말의 이 발췌에 표시됩니다.

$ rosa edit ingress -h
Edit a cluster ingress for a cluster. Usage:
  rosa edit ingress ID [flags]
  [...]
  --component-routes string                Component routes settings. Available keys [oauth, console, downloads]. For each key a pair of hostname and tlsSecretRef is expected to be supplied. Format should be a comma separate list 'oauth: hostname=example-hostname;tlsSecretRef=example-secret-ref,downloads:...'
Copy to Clipboard Toggle word wrap

이 예제에서는 다음과 같은 사용자 지정 구성 요소 경로를 사용합니다.

  • console.my-new-domain.dev
  • Downloads.my-new-domain.dev for Downloads
  • OAuth.my-new-domain.dev

16.4. 각 구성 요소 경로에 유효한 TLS 인증서를 생성

이 섹션에서는 별도의 자체 서명된 인증서 키 쌍을 세 개 생성한 다음 이를 신뢰하여 실제 웹 브라우저를 사용하여 새 구성 요소 경로에 액세스할 수 있는지 확인합니다.

주의

이는 설명용으로만 사용되며 프로덕션 워크로드를 위한 솔루션으로는 권장되지 않습니다. 프로덕션 워크로드에 대한 유사한 특성으로 인증서를 생성하는 방법을 알아보려면 인증 기관을 참조하십시오.

중요

HTTP/2 연결 병합 문제를 방지하려면 각 끝점에 대해 별도의 개별 인증서를 사용해야 합니다. 와일드카드 또는 SAN 인증서 사용은 지원되지 않습니다.

  1. 각 구성 요소 경로에 대한 인증서를 생성하고 인증서의 제목(-subj)을 사용하려는 구성 요소 경로의 사용자 지정 도메인으로 설정합니다.

    예제

    $ openssl req -newkey rsa:2048 -new -nodes -x509 -days 365 -keyout key-console.pem -out cert-console.pem -subj "/CN=console.my-new-domain.dev"
    $ openssl req -newkey rsa:2048 -new -nodes -x509 -days 365 -keyout key-downloads.pem -out cert-downloads.pem -subj "/CN=downloads.my-new-domain.dev"
    $ openssl req -newkey rsa:2048 -new -nodes -x509 -days 365 -keyout key-oauth.pem -out cert-oauth.pem -subj "/CN=oauth.my-new-domain.dev"
    Copy to Clipboard Toggle word wrap

    이렇게 하면 .pem 파일, key-<component>.pem 및 cert- <component>.pem 쌍의 세 쌍이 생성됩니다.

16.5. 클러스터에 인증서를 시크릿으로 추가

  1. openshift-config 네임스페이스에 3개의 TLS 시크릿을 생성합니다.

    이는 이 가이드의 뒷부분에 있는 구성 요소 경로를 업데이트할 때 시크릿 참조가 됩니다.

    $ oc create secret tls console-tls --cert=cert-console.pem --key=key-console.pem -n openshift-config
    $ oc create secret tls downloads-tls --cert=cert-downloads.pem --key=key-downloads.pem -n openshift-config
    $ oc create secret tls oauth-tls --cert=cert-oauth.pem --key=key-oauth.pem -n openshift-config
    Copy to Clipboard Toggle word wrap

16.6. 클러스터에서 로드 밸런서의 호스트 이름 찾기

클러스터를 생성할 때 서비스는 로드 밸런서를 생성하고 해당 로드 밸런서의 호스트 이름을 생성합니다. 클러스터에 대한 DNS 레코드를 만들려면 로드 밸런서 호스트 이름을 알아야 합니다.

openshift-ingress 네임스페이스에 대해 oc get svc 명령을 실행하여 호스트 이름을 찾을 수 있습니다. 로드 밸런서의 호스트 이름은 openshift-ingress 네임스페이스의 router-default 서비스와 연결된 EXTERNAL-IP 입니다.

$ oc get svc -n openshift-ingress
NAME            TYPE          CLUSTER-IP     EXTERNAL-IP                                             PORT(S)                     AGE
router-default  LoadBalancer  172.30.237.88  a234gsr3242rsfsfs-1342r624.us-east-1.elb.amazonaws.com  80:31175/TCP,443:31554/TCP  76d
Copy to Clipboard Toggle word wrap

이 경우 호스트 이름은 a234gsr3242rsfsfs-1342r624.us-east-1.elb.amazonaws.com 입니다.

나중에 이 값을 저장하십시오. 새 구성 요소 경로 호스트 이름에 대한 DNS 레코드를 구성해야 하므로 나중에 이 값을 저장합니다.

16.7. 구성 요소 경로 DNS 레코드를 호스팅 공급자에 추가

호스팅 공급자에서 새 구성 요소 경로 호스트 이름의 CNAME 을 이전 단계에서 찾은 로드 밸런서 호스트 이름에 매핑하는 DNS 레코드를 추가합니다.

16.8. ROSA CLI를 사용하여 구성 요소 경로 및 TLS 시크릿 업데이트

DNS 레코드가 업데이트되면 ROSA CLI를 사용하여 구성 요소 경로를 변경할 수 있습니다.

  1. rosa edit ingress 명령을 사용하여 기본 ingress 경로를 새 기본 도메인 및 연결된 보안 참조로 업데이트하여 각 구성 요소 경로의 호스트 이름을 업데이트합니다.

    $ rosa edit ingress -c ${CLUSTER_NAME} ${INGRESS_ID} --component-routes 'console: hostname=console.my-new-domain.dev;tlsSecretRef=console-tls,downloads: hostname=downloads.my-new-domain.dev;tlsSecretRef=downloads-tls,oauth: hostname=oauth.my-new-domain.dev;tlsSecretRef=oauth-tls'
    Copy to Clipboard Toggle word wrap
    참고

    구성 요소 경로를 빈 문자열로 설정하지 않으려는 상태로 두어 구성 요소 경로의 하위 집합만 편집할 수도 있습니다. 예를 들어 콘솔 및 OAuth 서버 호스트 이름 및 TLS 인증서만 변경하려면 다음 명령을 실행합니다.

    $ rosa edit ingress -c ${CLUSTER_NAME} ${INGRESS_ID} --component-routes 'console: hostname=console.my-new-domain.dev;tlsSecretRef=console-tls,downloads: hostname="";tlsSecretRef="", oauth: hostname=oauth.my-new-domain.dev;tlsSecretRef=oauth-tls'
    Copy to Clipboard Toggle word wrap
  2. rosa list ingress 명령을 실행하여 변경 사항이 성공적으로 수행되었는지 확인합니다.

    $ rosa list ingress -c ${CLUSTER_NAME} -ojson | jq ".[] | select(.id == \"${INGRESS_ID}\") | .component_routes"
    Copy to Clipboard Toggle word wrap

    출력 예

    {
      "console": {
        "kind": "ComponentRoute",
        "hostname": "console.my-new-domain.dev",
        "tls_secret_ref": "console-tls"
      },
      "downloads": {
        "kind": "ComponentRoute",
        "hostname": "downloads.my-new-domain.dev",
        "tls_secret_ref": "downloads-tls"
      },
      "oauth": {
        "kind": "ComponentRoute",
        "hostname": "oauth.my-new-domain.dev",
        "tls_secret_ref": "oauth-tls"
      }
    }
    Copy to Clipboard Toggle word wrap

  3. 로컬 시스템의 신뢰 저장소에 인증서를 추가한 다음 로컬 웹 브라우저를 사용하여 새 경로에서 구성 요소에 액세스할 수 있는지 확인합니다.

16.9. ROSA CLI를 사용하여 구성 요소 경로를 기본값으로 재설정

구성 요소 경로를 기본 구성으로 재설정하려면 다음 rosa edit ingress 명령을 실행합니다.

$ rosa edit ingress -c ${CLUSTER_NAME} ${INGRESS_ID} --component-routes 'console: hostname="";tlsSecretRef="",downloads: hostname="";tlsSecretRef="", oauth: hostname="";tlsSecretRef=""'
Copy to Clipboard Toggle word wrap


[1] 4.14 이전 AWS ROSA 버전에서 Red Hat OpenShift Service에서 이러한 경로를 수정하는 것은 일반적으로 지원되지 않습니다. 그러나 버전 4.13을 사용하는 클러스터가 있는 경우 지원 케이스를 열어 Red Hat 지원을 요청하여 버전 4.13 클러스터에서 이 기능에 대한 지원을 활성화할 수 있습니다.
[2] ROSA를 처음 설치할 때 제공되는 OAuth, 콘솔 및 다운로드 경로를 참조하기 위해 "구성 요소 경로"라는 용어를 사용합니다.

17장. ROSA 시작하기

17.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 리소스에 대한 작업을 수행합니다.

17.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를 전 세계적으로 사용할 수 있는 위치를 확인하십시오.

17.1.2. ROSA 및 Kubernetes

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

17.1.3. 기본 역할

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

17.1.4. 로드맵 및 기능 요청

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

17.1.5. AWS 리전 가용성

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

17.1.6. 규정 준수 인증

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

17.1.7. 노드

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

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

17.1.7.2. 최소 작업자 노드 수

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

17.1.7.3. 기본 노드 운영 체제

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

17.1.7.4. 노드 중단 또는 종료

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

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

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

17.1.7.6. 노드 자동 스케일링

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

17.1.7.7. 최대 작업자 노드 수

ROSA 클러스터 버전 4.14.14 이상의 최대 작업자 노드 수는 249입니다. 이전 버전의 경우 제한은 180개입니다.

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

17.1.8. 관리자

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

17.1.9. OpenShift 버전 및 업그레이드

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

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

17.1.10. 지원

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

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

17.1.10.1. 제한된 지원

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

추가 지원 리소스

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

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

17.1.12. 알림 및 통신

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

17.1.13. OBSA(Open Service Broker for AWS)

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

17.1.14. 오프보딩

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

17.1.15. 인증

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

17.1.16. SRE 클러스터 액세스

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

17.1.17. Encryption

17.1.17.1. 암호화 키

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

17.1.17.2. KMS 키

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

17.1.17.3. 데이터 암호화

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

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

17.1.17.4. etcd 암호화

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

참고

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

17.1.17.5. etcd 암호화 구성

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

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

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

17.1.18. 인프라

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

17.1.19. 인증 정보 방법

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

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

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

17.1.21. 스토리지

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

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

17.1.22. VPC 사용

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

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

17.1.23. 네트워크 플러그인

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

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

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

17.1.25. Prometheus 및 Grafana 사용

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

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

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

17.1.27. AWS 권한 경계

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

17.1.28. AMI

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

17.1.29. 클러스터 백업

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

17.1.30. 사용자 정의 도메인

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

17.1.31. ROSA 도메인 인증서

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

17.1.32. 연결이 끊긴 환경

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

17.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의 경우 AWS STS 및 HCP를 사용하는 ROSA에 대해 설명합니다.

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

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

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

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

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

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

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

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

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

17.2.1.1. IAM 사용자와 함께 Rosa

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

17.2.1.2. STS를 사용하는 ROSA

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

17.2.2. STS 보안이 포함된 ROSA

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

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

17.2.3. AWS STS 설명

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

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

17.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 역할 및 정책으로 나뉩니다.

    정책에 따라 각 역할에 허용되는 작업이 결정됩니다. 개별 역할 및 정책에 대한 자세한 내용은 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 역할에 대한 신뢰 정책이 생성됩니다.

17.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 자동 플래그를 사용하여 수동으로 생성할 수 있습니다. 배포에 대한 자세한 내용은 사용자 지정으로 클러스터 생성 또는 클러스터 배포 튜토리얼을 참조하십시오.

17.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에 반환합니다. 시각적 표현의 경우 아래를 참조하십시오.

17.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 인스턴스를 추가할 수 있습니다.

17.3. 튜토리얼: OpenShift 개념

17.3.1. S2I(Source-to-Image)

S2I(Source-to-Image)는 소스 코드에서 재현 가능한 컨테이너 이미지를 빌드하는 툴킷 및 워크플로입니다. S2I는 컨테이너 이미지에 소스 코드를 삽입하고 컨테이너에서 소스 코드를 준비하여 바로 실행할 수 있는 이미지를 생성합니다. 자체 조립 빌더 이미지를 생성하면 컨테이너 이미지를 사용하여 런타임 환경을 버전처럼 빌드 환경을 정확히 버전화하고 제어할 수 있습니다.

17.3.1.1. 작동 방식

Ruby와 같은 동적 언어의 경우 빌드 시간 및 런타임 환경은 일반적으로 동일합니다. Ruby, Bundler, Rake, Apache, GCC 및 Ruby 애플리케이션을 설정하고 실행하는 데 필요한 기타 모든 패키지가 이미 설치되어 있다고 가정하면 빌더 이미지가 다음 단계를 수행합니다.

  1. 빌더 이미지는 알려진 디렉터리에 애플리케이션 소스가 삽입된 컨테이너를 시작합니다.
  2. 컨테이너 프로세스는 해당 소스 코드를 적절한 실행 가능한 설정으로 변환합니다. 예를 들어 Bundler를 사용하여 종속성을 설치하고 소스 코드를 Ruby 구성 파일을 찾기 위해 Apache가 사전 구성된 디렉터리로 이동합니다.
  3. 그런 다음 새 컨테이너를 커밋하고 이미지 진입점을 Ruby 애플리케이션을 호스팅하도록 Apache를 시작하는 스크립트로 설정합니다.

C, C++, Go 또는 Java와 같은 컴파일된 언어의 경우 컴파일에 필요한 종속성이 런타임 아티팩트의 크기를 초과할 수 있습니다. S2I는 런타임 이미지를 작게 유지하기 위해 다중 단계 빌드 프로세스를 활성화합니다. 여기서 첫 번째 빌더 이미지에서 실행 파일과 같은 바이너리 아티팩트가 추출되고 실행 프로그램을 올바른 위치에 배치하는 두 번째 런타임 이미지에 삽입됩니다.

예를 들어 Tomcat 및 Maven에 대한 재현 가능한 빌드 파이프라인을 생성하려면 다음을 수행합니다.

  1. WAR 파일이 삽입될 것으로 예상되는 OpenJDK 및 Tomcat이 포함된 빌더 이미지를 생성합니다.
  2. 첫 번째 이미지 Maven 및 기타 표준 종속 항목에 계층화된 두 번째 이미지를 생성하고 Maven 프로젝트가 삽입될 것으로 예상합니다.
  3. Java 애플리케이션 소스 및 Maven 이미지를 사용하여 S2I를 시작하여 원하는 애플리케이션 WAR를 생성합니다.
  4. 이전 단계의 WAR 파일과 초기 Tomcat 이미지를 사용하여 S2I를 두 번 시작하여 런타임 이미지를 생성합니다.

이미지 내부에 빌드 논리를 배치하고 이미지를 여러 단계로 결합함으로써 런타임 환경은 빌드 툴을 프로덕션에 배포하지 않고도 빌드 환경에 가깝습니다.

17.3.1.2. S2I 이점
재현 가능
컨테이너 이미지 내에서 캡슐화하고 호출자를 위해 삽입된 소스 코드의 간단한 인터페이스를 정의하여 빌드 환경을 엄격하게 버전 지정할 수 있습니다. 재현 가능한 빌드는 컨테이너화된 인프라에서 보안 업데이트 및 지속적인 통합을 가능하게 하는 핵심 요구 사항이며 빌더 이미지는 반복성 및 스왑 실행 시간을 보장합니다.
유연성
Linux에서 실행할 수 있는 기존 빌드 시스템은 컨테이너 내에서 실행할 수 있으며 각 개별 빌더는 더 큰 파이프라인의 일부가 될 수도 있습니다. 애플리케이션 소스 코드를 처리하는 스크립트를 빌더 이미지에 삽입할 수 있으므로 작성자는 기존 이미지를 적용하여 소스 처리를 활성화할 수 있습니다.
속도
단일 Dockerfile에 여러 계층을 빌드하는 대신 작성자는 단일 이미지 계층에서 애플리케이션을 나타낼 것을 권장합니다. 이렇게 하면 생성 및 배포 중에 시간이 단축되고 최종 이미지의 출력을 보다 효과적으로 제어할 수 있습니다.
보안
Dockerfile은 컨테이너의 일반적인 작동 제어 없이 실행됩니다. 일반적으로 root로 실행되며 컨테이너 네트워크에 액세스할 수 있습니다. S2I는 빌드가 단일 컨테이너에서 시작되므로 빌더 이미지에 사용할 수 있는 권한 및 권한을 제어할 수 있습니다. OpenShift와 같은 플랫폼에 어셈블하여 S2I를 사용하면 관리자가 빌드 시 개발자가 보유한 권한을 제어할 수 있습니다.

17.3.2. 라우트

OpenShift 경로는 서비스를 호스트 이름으로 공개하므로 외부 클라이언트가 이름으로 연결할 수 있습니다. OpenShift에서 Route 오브젝트가 생성되면 기본 제공 HAProxy 로드 밸런서에서 요청된 서비스를 노출하고 지정된 구성으로 외부에서 사용할 수 있도록 합니다.

Kubernetes Ingress 오브젝트와 유사하게 Red Hat은 요구 사항을 채우기 위해 경로 개념을 작성한 다음 커뮤니티 뒤에 있는 설계 원칙을 커뮤니티에 기여하여 Ingress 설계에 크게 영향을 미쳤습니다. 경로에는 다음 차트에서 볼 수 있는 몇 가지 추가 기능이 있습니다.

Expand
기능OpenShift에서 IngressOpenShift의 경로

표준 Kubernetes 오브젝트

X

 

서비스에 대한 외부 액세스

X

X

영구(sticky) 세션

X

X

로드 밸런싱 전략(예: 라운드 로빈)

X

X

rate-limit 및 throttling

X

X

IP 허용 목록

X

X

보안을 개선하기 위한 TLS 엣지 종료

X

X

보안 개선을 위한 TLS 재암호화

 

X

보안을 개선하기 위한 TLS passhtrough

 

X

여러 가중치 백엔드(스플릿 트래픽)

 

X

패턴 기반 호스트 이름 생성

 

X

와일드카드 도메인

 

X

참고

호스트 이름의 DNS 확인은 라우팅과 별도로 처리됩니다. 관리자가 항상 라우터로 올바르게 확인하거나 라우터로 확인하도록 독립적으로 호스트 이름 DNS 레코드를 수정하는 클라우드 도메인을 구성했을 수 있습니다.

개별 경로는 주석에 특정 구성을 제공하여 일부 기본값을 덮어쓸 수 있습니다.

17.3.3. 이미지 스트림

이미지 스트림은 이미지에 대한 태그 매핑, 스트림에 이미지가 태그될 때 적용되는 메타데이터 덮어쓰기 및 레지스트리의 Docker 이미지 리포지토리에 대한 선택적 참조를 저장합니다.

17.3.3.1. 이미지 스트림 이점

이미지 스트림을 사용하면 컨테이너 이미지의 태그를 쉽게 변경할 수 있습니다. 그러지 않으면 태그를 수동으로 변경하려면 이미지를 다운로드하여 로컬로 변경한 다음 모두 푸시해야 합니다. 태그를 수동으로 변경한 다음 배포 오브젝트를 업데이트하여 애플리케이션을 승격하는 데는 여러 단계가 포함됩니다.

이미지 스트림을 사용하면 컨테이너 이미지를 한 번 업로드하고 OpenShift에서 해당 가상 태그를 내부적으로 관리합니다. 하나의 프로젝트에서는 developer 태그를 사용하고 내부적으로만 참조할 수 있지만 프로덕션에서는 production 태그를 사용하고 내부적으로도 관리할 수 있습니다. 레지스트리를 처리할 필요가 없습니다.

또한 배포 구성과 함께 이미지 스트림을 사용하여 새 이미지가 표시되거나 태그가 참조가 변경되면 배포를 시작하는 트리거를 설정할 수도 있습니다.

17.3.4. 빌드

빌드는 입력 매개변수를 결과 오브젝트로 변환하는 프로세스입니다. 대부분의 경우 프로세스는 입력 매개변수 또는 소스 코드를 실행 가능한 이미지로 변환하는 데 사용됩니다. BuildConfig 오브젝트는 전체 빌드 프로세스에 대한 정의입니다.

OpenShift Container Platform은 빌드 이미지에서 Docker 형식의 컨테이너를 생성하고 컨테이너 이미지 레지스트리로 푸시하여 Kubernetes를 활용합니다.

build 오브젝트는 일반적인 특성을 공유합니다.

  • 빌드 입력
  • 빌드 프로세스를 완료하기 위한 요구사항
  • 빌드 프로세스 로깅
  • 성공적인 빌드의 리소스 게시
  • 빌드의 최종 상태 게시

빌드에서는 CPU 사용량, 메모리 사용량, 빌드 또는 Pod 실행 시간과 같은 리소스 제한 사항을 활용합니다.

추가 리소스

17.4. 클러스터 배포

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

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

17.4.1.1. 배포 옵션

원하는 경우:

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

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

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

참고

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

17.4.2.1. 사전 요구 사항
  • 설치 튜토리얼에서 사전 요구 사항을 완료했습니다.
17.4.2.2. 계정 역할 생성

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

rosa create account-roles --mode auto --yes
Copy to Clipboard Toggle word wrap
17.4.2.3. 클러스터 배포
  1. 다음 명령을 실행하여 자체 클러스터 이름을 대체하여 기본 구성으로 클러스터를 생성합니다.

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

    rosa list clusters
    Copy to Clipboard Toggle word wrap

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

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

17.4.3.1. CLI 배포 모드

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

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

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

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

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

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

17.4.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 단계가 필요합니다.

17.4.3.3. 자동 모드

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

17.4.3.3.1. 계정 역할 생성

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

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

rosa create account-roles --mode auto --yes
Copy to Clipboard Toggle word wrap

출력 예

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
Copy to Clipboard Toggle word wrap

17.4.3.3.2. 클러스터 생성

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

rosa create cluster --cluster-name <cluster-name> --sts --mode auto --yes
Copy to Clipboard Toggle word wrap
참고

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

입력 예

$ rosa create cluster --cluster-name my-rosa-cluster --sts --mode auto --yes
Copy to Clipboard Toggle word wrap

출력 예

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
Copy to Clipboard Toggle word wrap

17.4.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의 최신 버전
  • 단일 가용성 영역
  • 퍼블릭 클러스터
17.4.3.3.3. 설치 상태 확인
  1. 다음 명령 중 하나를 실행하여 클러스터 상태를 확인합니다.

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

      rosa describe cluster --cluster <cluster-name>
      Copy to Clipboard Toggle word wrap
    • 상태의 abridged 뷰의 경우 다음을 실행합니다.

      rosa list clusters
      Copy to Clipboard Toggle word wrap
  2. 클러스터 상태가 "대기 중"에서 "설치"로 변경됩니다. 이 작업은 약 40분 정도 걸립니다.
  3. 상태가 "준비"로 변경되면 클러스터가 설치됩니다.
17.4.3.4. 수동 모드

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

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

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

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

    rosa create account-roles --mode manual
    Copy to Clipboard Toggle word wrap

    출력 예

    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
    Copy to Clipboard Toggle word wrap

  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
    Copy to Clipboard Toggle word wrap

  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",
                    [...]
    Copy to Clipboard Toggle word wrap

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

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

    rosa create cluster --interactive --sts
    Copy to Clipboard Toggle word wrap

    필드에 대한 설명은 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
    Copy to Clipboard Toggle word wrap

    출력 예

    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'.
    Copy to Clipboard Toggle word wrap

    참고

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

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

    rosa create operator-roles --mode manual --cluster <cluster-name>
    Copy to Clipboard Toggle word wrap

    출력 예

    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
        [...]
    Copy to Clipboard Toggle word wrap

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

    rosa create oidc-provider --mode manual --cluster <cluster-name>
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

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

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

      rosa describe cluster --cluster <cluster-name>
      Copy to Clipboard Toggle word wrap
    • 상태의 abridged 뷰의 경우 다음을 실행합니다.

      rosa list clusters
      Copy to Clipboard Toggle word wrap
  2. 클러스터 상태가 "대기 중"에서 "설치"로 변경됩니다. 이 작업은 약 40분 정도 걸립니다.
  3. 상태가 "준비"로 변경되면 클러스터가 설치됩니다.
17.4.3.5. Red Hat Hybrid Cloud Console URL 가져오기
  • 하이브리드 클라우드 콘솔 URL을 가져오려면 다음 명령을 실행합니다.

    rosa describe cluster -c <cluster-name> | grep Console
    Copy to Clipboard Toggle word wrap

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

17.4.4. 튜토리얼: 간단한 UI 가이드

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

참고

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

17.4.4.1. 사전 요구 사항
  • 설치 튜토리얼에서 사전 요구 사항을 완료했습니다.
17.4.4.2. 계정 역할 생성

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

rosa create account-roles --mode auto --yes
Copy to Clipboard Toggle word wrap
17.4.4.3. Red Hat OpenShift Cluster Manager 역할 생성
  1. 다음 명령을 실행하여 각 AWS 계정에 대해 하나의 OpenShift Cluster Manager 역할을 생성합니다.

    rosa create ocm-role --mode auto --admin --yes
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 각 AWS 계정에 대해 하나의 OpenShift Cluster Manager 사용자 역할을 생성합니다.

    rosa create user-role --mode auto --yes
    Copy to Clipboard Toggle word wrap
  3. OpenShift Cluster Manager 를 사용하여 AWS 계정, 클러스터 옵션을 선택하고 배포를 시작합니다.
  4. OpenShift Cluster Manager UI는 클러스터 상태를 표시합니다.

    cloud experts getting started deployment ui cluster create

17.4.5. 튜토리얼: 자세한 UI 가이드

이 튜토리얼에서는 Red Hat OpenShift Cluster Manager UI(사용자 인터페이스)를 사용하여 AWS(ROSA) 클러스터에 Red Hat OpenShift Service를 배포하는 자세한 단계를 간략하게 설명합니다.

17.4.5.1. 배포 워크플로

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

  1. 계정 전체 역할 및 정책을 생성합니다.
  2. AWS 계정을 Red Hat 계정과 연결합니다.

    1. Red Hat OpenShift Cluster Manager 역할을 생성하고 연결합니다.
    2. 사용자 역할을 생성하고 연결합니다.
  3. 클러스터를 생성합니다.

1단계는 AWS 계정에 처음 배포하는 경우에만 수행해야 합니다. 2 단계는 UI를 처음 사용하는 경우에만 수행해야 합니다. 동일한 y-stream 버전의 연속 클러스터의 경우 클러스터를 생성하기만 하면 됩니다.

17.4.5.2. 계정 전체 역할 생성
참고

이전 배포의 계정 역할이 이미 있는 경우 이 단계를 건너뜁니다. 연결된 AWS 계정을 선택한 후 UI가 기존 역할을 감지합니다.

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

  • 터미널에서 다음 명령을 실행하여 계정 전체 역할을 생성합니다.

    $ rosa create account-roles --mode auto --yes
    Copy to Clipboard Toggle word wrap

    출력 예

    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
    Copy to Clipboard Toggle word wrap

17.4.5.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 를 클릭합니다.

  4. 드롭다운 메뉴가 표시됩니다. 웹 인터페이스 를 클릭합니다.

  5. "AWS 컨트롤 플레인 유형 선택"에서 Classic 을 선택합니다. 그런 다음 다음을 클릭합니다.

  6. 연결된 AWS 인프라 계정 에서 드롭 박스를 클릭합니다. AWS 계정을 아직 연결하지 않은 경우 dropbox가 비어 있을 수 있습니다.
  7. 새 AWS 계정을 연결하는 방법을 클릭합니다.

  8. 사이드바는 새 AWS 계정을 연결하는 데 필요한 지침과 함께 표시됩니다.

17.4.5.4. OpenShift Cluster Manager 역할 생성 및 연결
  1. 다음 명령을 실행하여 OpenShift Cluster Manager 역할이 있는지 확인합니다.

    $ rosa list ocm-role
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

    이 명령은 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'
    Copy to Clipboard Toggle word wrap

  4. 2단계: 사용자 역할을 클릭합니다.
17.4.5.4.1. 기타 OpenShift Cluster Manager 역할 생성 옵션
  • 수동 모드: AWS CLI 명령을 직접 실행하려는 경우 auto 대신 모드를 manual 로 정의할 수 있습니다. CLI는 AWS 명령을 출력하고 관련 JSON 파일은 현재 디렉터리에 생성됩니다.

    다음 명령을 사용하여 수동 모드에서 OpenShift Cluster Manager 역할을 생성합니다.

    $ rosa create ocm-role --mode manual --admin --yes
    Copy to Clipboard Toggle word wrap
  • 기본 OpenShift Cluster Manager 역할: OpenShift Cluster Manager에서 계정에 대한 읽기 전용 액세스 권한을 부여하려면 기본 OpenShift Cluster Manager 역할을 생성합니다. 그런 다음 CLI를 사용하여 필요한 역할, 정책 및 OIDC 공급자를 수동으로 생성해야 합니다.

    다음 명령을 사용하여 기본 OpenShift Cluster Manager 역할을 생성합니다.

    $ rosa create ocm-role --mode auto --yes
    Copy to Clipboard Toggle word wrap
17.4.5.5. OpenShift Cluster Manager 사용자 역할 생성

사용자 역할 문서에 정의된 대로 ROSA가 AWS ID를 확인할 수 있도록 사용자 역할을 생성해야 합니다. 이 역할에는 권한이 없으며 설치 프로그램 계정과 OpenShift Cluster Manager 역할 리소스 간에 신뢰 관계를 생성하는 데만 사용됩니다.

  1. 다음 명령을 실행하여 사용자 역할이 이미 있는지 확인합니다.

    $ rosa list user-role
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 사용자 역할을 생성하고 이를 Red Hat 계정에 연결합니다.

    $ rosa create user-role --mode auto --yes
    Copy to Clipboard Toggle word wrap

    출력 예

    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'
    Copy to Clipboard Toggle word wrap

    참고

    이전과 마찬가지로 AWS CLI 명령을 직접 실행하려는 경우 --mode 설명서 를 정의할 수 있습니다. CLI는 AWS 명령을 출력하고 관련 JSON 파일은 현재 디렉터리에 생성됩니다. 역할을 연결해야 합니다.

  3. 3단계: 계정 역할을 클릭합니다.
17.4.5.6. 계정 역할 생성
  1. 다음 명령을 실행하여 계정 역할을 생성합니다.

    $ rosa create account-roles --mode auto
    Copy to Clipboard Toggle word wrap
  2. OK 를 클릭하여 사이드바를 닫습니다.
17.4.5.7. 성공적인 계정 연결 확인
  1. 이제 Associated AWS 인프라 계정 드롭다운 메뉴에서 AWS 계정이 표시됩니다. 계정이 표시되면 계정 연결에 성공했습니다.
  2. 계정을 선택합니다.
  3. 아래에 채워진 계정 역할 ARN이 표시됩니다.

  4. 다음을 클릭합니다.
17.4.5.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. 다음을 클릭합니다.
17.4.5.8.1. 네트워킹
  1. 구성의 기본값을 모두 그대로 둡니다.
  2. 다음을 클릭합니다.
  3. CIDR 범위의 기본값을 모두 그대로 둡니다.
  4. 다음을 클릭합니다.
17.4.5.8.2. 클러스터 역할 및 정책

이 튜토리얼의 경우 Auto 를 선택된 상태로 둡니다. 클러스터 배포 프로세스를 더 쉽고 빠르게 수행할 수 있습니다.

참고

이전에 기본 OpenShift Cluster Manager 역할을 선택한 경우 수동 모드만 사용할 수 있습니다. Operator 역할 및 OIDC 공급자를 수동으로 생성해야 합니다. "클러스터 업데이트" 섹션을 완료하고 클러스터 생성을 시작한 후 아래의 "기본 OpenShift Cluster Manager 역할" 섹션을 참조하십시오.

17.4.5.8.3. 클러스터 업데이트
  • 이 섹션의 모든 옵션을 기본값으로 둡니다.
17.4.5.8.4. 클러스터 검토 및 생성
  1. 클러스터 구성의 콘텐츠를 검토합니다.
  2. 클러스터 생성을 클릭합니다.
17.4.5.8.5. 설치 진행 상황 모니터링
  • 현재 페이지를 방문하여 설치 진행 상황을 모니터링합니다. 약 40분 정도 소요됩니다.

17.4.5.9. 기본 OpenShift Cluster Manager 역할
참고

위에서 설명한 Admin OpenShift Cluster Manager 역할을 생성한 경우 전체 섹션을 무시합니다. OpenShift Cluster Manager가 리소스를 생성합니다.

이전에 기본 OpenShift Cluster Manager 역할을 생성한 경우 클러스터 설치를 계속하기 전에 두 개의 요소를 수동으로 생성해야 합니다.

  • Operator 역할
  • OIDC 공급자
17.4.5.9.1. Operator 역할 생성
  1. 팝업 창에 실행할 명령이 표시됩니다.

  2. 터미널의 창에서 명령을 실행하여 대화형 모드를 시작합니다. 또는 간단히 하려면 다음 명령을 실행하여 Operator 역할을 생성합니다.

    $ rosa create operator-roles --mode auto --cluster <cluster-name> --yes
    Copy to Clipboard Toggle word wrap

    출력 예

    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'
    Copy to Clipboard Toggle word wrap

17.4.5.9.2. OIDC 공급자 생성
  • 터미널에서 다음 명령을 실행하여 OIDC 공급자를 생성합니다.

    $ rosa create oidc-provider --mode auto --cluster <cluster-name> --yes
    Copy to Clipboard Toggle word wrap

    출력 예

    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'
    Copy to Clipboard Toggle word wrap

17.4.6. 튜토리얼: 호스팅 컨트롤 플레인 (HCP) 가이드

이 워크샵에 따라 호스팅되는 컨트롤 플레인(HCP) 클러스터가 있는 AWS(ROSA)에 샘플 Red Hat OpenShift Service를 배포합니다. 그런 다음 다음 튜토리얼에서 클러스터를 사용할 수 있습니다.

튜토리얼 목표

  • 클러스터 사전 요구 사항을 생성하는 방법을 알아봅니다.

    • 샘플 VPC(가상 프라이빗 클라우드) 생성
    • 샘플 OpenID Connect(OIDC) 리소스 생성
  • 환경 변수 샘플 생성
  • 샘플 ROSA 클러스터 배포

사전 요구 사항

  • ROSA 버전 1.2.31 이상
  • AWS(Amazon Web Service) 명령줄 인터페이스(CLI)
  • ROSA CLI (rosa)
17.4.6.1. 클러스터 사전 요구 사항 생성

HCP 클러스터를 사용하여 ROSA를 배포하기 전에 VPC 및 OIDC 리소스가 모두 있어야 합니다. 먼저 이러한 리소스를 만들 것입니다. ROSA는 BYO-VPC(Bring Your Own VPC) 모델을 사용합니다.

17.4.6.1.1. VPC 생성
  1. ROSA를 사용할 수 있는 리전을 사용하도록 AWS CLI(aws)가 구성되어 있는지 확인합니다. 다음 명령을 실행하여 AWS CLI에서 지원하는 리전을 참조하십시오.

    $ rosa list regions --hosted-cp
    Copy to Clipboard Toggle word wrap
  2. VPC를 생성합니다. 이 튜토리얼의 경우 다음 스크립트 는 VPC 및 필요한 구성 요소를 생성합니다. aws CLI에 구성된 리전을 사용합니다.

    #!/bin/bash
    
    set -e
    ##########
    # This script will create the network requirements for a ROSA cluster. This will be
    # a public cluster. This creates:
    # - VPC
    # - Public and private subnets
    # - Internet Gateway
    # - Relevant route tables
    # - NAT Gateway
    #
    # This will automatically use the region configured for the aws cli
    #
    ##########
    
    VPC_CIDR=10.0.0.0/16
    PUBLIC_CIDR_SUBNET=10.0.1.0/24
    PRIVATE_CIDR_SUBNET=10.0.0.0/24
    
    # Create VPC
    echo -n "Creating VPC..."
    VPC_ID=$(aws ec2 create-vpc --cidr-block $VPC_CIDR --query Vpc.VpcId --output text)
    
    # Create tag name
    aws ec2 create-tags --resources $VPC_ID --tags Key=Name,Value=$CLUSTER_NAME
    
    # Enable dns hostname
    aws ec2 modify-vpc-attribute --vpc-id $VPC_ID --enable-dns-hostnames
    echo "done."
    
    # Create Public Subnet
    echo -n "Creating public subnet..."
    PUBLIC_SUBNET_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block $PUBLIC_CIDR_SUBNET --query Subnet.SubnetId --output text)
    
    aws ec2 create-tags --resources $PUBLIC_SUBNET_ID --tags Key=Name,Value=$CLUSTER_NAME-public
    echo "done."
    
    # Create private subnet
    echo -n "Creating private subnet..."
    PRIVATE_SUBNET_ID=$(aws ec2 create-subnet --vpc-id $VPC_ID --cidr-block $PRIVATE_CIDR_SUBNET --query Subnet.SubnetId --output text)
    
    aws ec2 create-tags --resources $PRIVATE_SUBNET_ID --tags Key=Name,Value=$CLUSTER_NAME-private
    echo "done."
    
    # Create an internet gateway for outbound traffic and attach it to the VPC.
    echo -n "Creating internet gateway..."
    IGW_ID=$(aws ec2 create-internet-gateway --query InternetGateway.InternetGatewayId --output text)
    echo "done."
    
    aws ec2 create-tags --resources $IGW_ID --tags Key=Name,Value=$CLUSTER_NAME
    
    aws ec2 attach-internet-gateway --vpc-id $VPC_ID --internet-gateway-id $IGW_ID > /dev/null 2>&1
    echo "Attached IGW to VPC."
    
    # Create a route table for outbound traffic and associate it to the public subnet.
    echo -n "Creating route table for public subnet..."
    PUBLIC_ROUTE_TABLE_ID=$(aws ec2 create-route-table --vpc-id $VPC_ID --query RouteTable.RouteTableId --output text)
    
    aws ec2 create-tags --resources $PUBLIC_ROUTE_TABLE_ID --tags Key=Name,Value=$CLUSTER_NAME
    echo "done."
    
    aws ec2 create-route --route-table-id $PUBLIC_ROUTE_TABLE_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $IGW_ID > /dev/null 2>&1
    echo "Created default public route."
    
    aws ec2 associate-route-table --subnet-id $PUBLIC_SUBNET_ID --route-table-id $PUBLIC_ROUTE_TABLE_ID > /dev/null 2>&1
    echo "Public route table associated"
    
    # Create a NAT gateway in the public subnet for outgoing traffic from the private network.
    echo -n "Creating NAT Gateway..."
    NAT_IP_ADDRESS=$(aws ec2 allocate-address --domain vpc --query AllocationId --output text)
    
    NAT_GATEWAY_ID=$(aws ec2 create-nat-gateway --subnet-id $PUBLIC_SUBNET_ID --allocation-id $NAT_IP_ADDRESS --query NatGateway.NatGatewayId --output text)
    
    aws ec2 create-tags --resources $NAT_IP_ADDRESS --resources $NAT_GATEWAY_ID --tags Key=Name,Value=$CLUSTER_NAME
    sleep 10
    echo "done."
    
    # Create a route table for the private subnet to the NAT gateway.
    echo -n "Creating a route table for the private subnet to the NAT gateway..."
    PRIVATE_ROUTE_TABLE_ID=$(aws ec2 create-route-table --vpc-id $VPC_ID --query RouteTable.RouteTableId --output text)
    
    aws ec2 create-tags --resources $PRIVATE_ROUTE_TABLE_ID $NAT_IP_ADDRESS --tags Key=Name,Value=$CLUSTER_NAME-private
    
    aws ec2 create-route --route-table-id $PRIVATE_ROUTE_TABLE_ID --destination-cidr-block 0.0.0.0/0 --gateway-id $NAT_GATEWAY_ID > /dev/null 2>&1
    
    aws ec2 associate-route-table --subnet-id $PRIVATE_SUBNET_ID --route-table-id $PRIVATE_ROUTE_TABLE_ID > /dev/null 2>&1
    
    echo "done."
    
    # echo "***********VARIABLE VALUES*********"
    # echo "VPC_ID="$VPC_ID
    # echo "PUBLIC_SUBNET_ID="$PUBLIC_SUBNET_ID
    # echo "PRIVATE_SUBNET_ID="$PRIVATE_SUBNET_ID
    # echo "PUBLIC_ROUTE_TABLE_ID="$PUBLIC_ROUTE_TABLE_ID
    # echo "PRIVATE_ROUTE_TABLE_ID="$PRIVATE_ROUTE_TABLE_ID
    # echo "NAT_GATEWAY_ID="$NAT_GATEWAY_ID
    # echo "IGW_ID="$IGW_ID
    # echo "NAT_IP_ADDRESS="$NAT_IP_ADDRESS
    
    echo "Setup complete."
    echo ""
    echo "To make the cluster create commands easier, please run the following commands to set the environment variables:"
    echo "export PUBLIC_SUBNET_ID=$PUBLIC_SUBNET_ID"
    echo "export PRIVATE_SUBNET_ID=$PRIVATE_SUBNET_ID"
    Copy to Clipboard Toggle word wrap
  3. 스크립트는 명령을 출력합니다. 나중에 사용할 서브넷 ID를 저장하려면 명령을 환경 변수로 설정합니다. 명령을 복사하고 실행합니다.

    $ export PUBLIC_SUBNET_ID=$PUBLIC_SUBNET_ID
    $ export PRIVATE_SUBNET_ID=$PRIVATE_SUBNET_ID
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 환경 변수를 확인합니다.

    $ echo "Public Subnet: $PUBLIC_SUBNET_ID"; echo "Private Subnet: $PRIVATE_SUBNET_ID"
    Copy to Clipboard Toggle word wrap

    출력 예

    Public Subnet: subnet-0faeeeb0000000000
    Private Subnet: subnet-011fe340000000000
    Copy to Clipboard Toggle word wrap

17.4.6.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')
    Copy to Clipboard Toggle word wrap
17.4.6.2. 추가 환경 변수 생성
  • 다음 명령을 실행하여 환경 변수를 설정합니다. 이러한 변수를 사용하면 명령을 실행하여 ROSA 클러스터를 더 쉽게 생성할 수 있습니다.

    $ export CLUSTER_NAME=<cluster_name>
    $ export REGION=<VPC_region>
    Copy to Clipboard Toggle word wrap
    작은 정보

    rosa whoami 를 실행하여 VPC 리전을 찾습니다.

17.4.6.3. 클러스터 생성
  1. 선택 사항: 다음 명령을 실행하여 Operator 정책 및 AWS IAM 역할 및 정책을 포함하여 계정 전체 역할 및 정책을 생성합니다.

    중요

    이 계정에 ROSA를 처음 배포하고 아직 계정 역할 및 정책을 생성하지 않은 경우에만 이 단계를 완료합니다.

    $ rosa create account-roles --mode auto --yes
    Copy to Clipboard Toggle word wrap
  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
    Copy to Clipboard Toggle word wrap

약 10분 후에 클러스터가 준비되었습니다. 클러스터에는 선택한 리전에서 세 개의 AWS 가용성 영역에 걸쳐 컨트롤 플레인이 있으며 AWS 계정에 두 개의 작업자 노드를 생성합니다.

17.4.6.4. 설치 상태 확인
  1. 다음 명령 중 하나를 실행하여 클러스터 상태를 확인합니다.

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

      $ rosa describe cluster --cluster $CLUSTER_NAME
      Copy to Clipboard Toggle word wrap
    • 클러스터 상태에 대한 abridged 뷰의 경우 다음을 실행합니다.

      $ rosa list clusters
      Copy to Clipboard Toggle word wrap
    • 로그가 진행 중인 것을 확인하려면 다음을 실행합니다.

      $ rosa logs install --cluster $CLUSTER_NAME --watch
      Copy to Clipboard Toggle word wrap
  2. 상태가 "준비"로 변경되면 클러스터가 설치됩니다. 작업자 노드가 온라인 상태가 되는 데 몇 분이 더 걸릴 수 있습니다.

17.5. 튜토리얼: 관리자 생성

관리(admin) 사용자를 생성하면 클러스터에 빠르게 액세스할 수 있습니다. 다음 단계에 따라 admin 사용자를 생성합니다.

참고

관리자는 이 튜토리얼 설정에서 잘 작동합니다. 실제 배포의 경우 공식 ID 공급자 를 사용하여 클러스터에 액세스하고 사용자에게 관리자 권한을 부여합니다.

  1. 다음 명령을 실행하여 admin 사용자를 생성합니다.

    rosa create admin --cluster=<cluster-name>
    Copy to Clipboard Toggle word wrap

    출력 예

    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
    Copy to Clipboard Toggle word wrap

  2. 이전 단계에서 반환된 로그인 명령을 복사하여 터미널에 붙여넣습니다. 그러면 클러스터 사용을 시작할 수 있도록 CLI를 사용하여 클러스터에 로그인합니다.

    $ oc login https://api.my-rosa-cluster.abcd.p1.openshiftapps.com:6443 \
    >    --username cluster-admin \
    >    --password FWGYL-2mkJI-00000-00000
    Copy to Clipboard Toggle word wrap

    출력 예

    Login successful.
    
    You have access to 79 projects, the list has been suppressed. You can list all projects with ' projects'
    
    Using project "default".
    Copy to Clipboard Toggle word wrap

  3. admin 사용자로 로그인했는지 확인하려면 다음 명령 중 하나를 실행합니다.

    • 옵션 1:

      $ oc whoami
      Copy to Clipboard Toggle word wrap

      출력 예

      cluster-admin
      Copy to Clipboard Toggle word wrap

    • 옵션 2:

      oc get all -n openshift-apiserver
      Copy to Clipboard Toggle word wrap

      관리자만 오류 없이 이 명령을 실행할 수 있습니다.

  4. 이제 이 튜토리얼에 충분한 관리자 사용자로 클러스터를 사용할 수 있습니다. 실제 배포의 경우 다음 튜토리얼에서 설명하는 ID 공급자를 설정하는 것이 좋습니다.

17.6. 튜토리얼: ID 공급자 설정

클러스터에 로그인하려면 IDP(ID 공급자)를 설정합니다. 이 튜토리얼에서는 GitHub를 예제 IDP로 사용합니다. ROSA에서 지원하는 IDP의 전체 목록을 참조하십시오.

  • 모든 IDP 옵션을 보려면 다음 명령을 실행합니다.

    rosa create idp --help
    Copy to Clipboard Toggle word wrap

17.6.1. GitHub를 사용하여 IDP 설정

  1. GitHub 계정에 로그인합니다.
  2. 관리자인 새 GitHub 조직을 생성합니다.

    작은 정보

    기존 조직의 관리자이고 해당 조직을 사용하려는 경우 9 단계로 건너뜁니다.

    + 아이콘을 클릭한 다음 새 조직을 클릭합니다.

  3. 상황에 가장 적합한 계획을 선택하거나 무료로 조인을 클릭합니다.
  4. 조직 계정 이름, 이메일, 개인 또는 비즈니스 계정인지를 입력합니다. 그런 다음 다음을 클릭합니다.

  5. 선택 사항: 다른 사용자의 GitHub ID를 추가하여 ROSA 클러스터에 대한 추가 액세스 권한을 부여합니다. 나중에 추가할 수도 있습니다.
  6. 설정 완료 를 클릭합니다.
  7. 선택 사항: 다음 페이지에서 요청된 정보를 입력합니다.
  8. Submit 을 클릭합니다.
  9. 터미널로 돌아가서 다음 명령을 입력하여 GitHub IDP를 설정합니다.

    rosa create idp --cluster=<cluster name> --interactive
    Copy to Clipboard Toggle word wrap
  10. 다음 값을 입력합니다.

    Type of identity provider: github
    Identity Provider Name: <IDP-name>
    Restrict to members of: organizations
    GitHub organizations: <organization-account-name>
    Copy to Clipboard Toggle word wrap
  11. CLI에서 링크를 제공합니다. 링크를 복사하여 브라우저에 붙여넣고 Enter 키를 누릅니다. 그러면 OAuth에 이 애플리케이션을 등록하는 데 필요한 정보가 채워집니다. 정보를 수정할 필요가 없습니다.

  12. Register application을 클릭합니다.

  13. 다음 페이지에는 클라이언트 ID 가 표시됩니다. ID를 복사하여 클라이언트 ID 를 요청하는 터미널에 붙여넣습니다.

    참고

    탭을 닫지 마십시오.

  14. CLI에서 클라이언트 시크릿 을 요청합니다. 브라우저로 돌아가서 새 클라이언트 시크릿 생성 을 클릭합니다.

  15. 사용자를 위해 보안이 생성됩니다. 시크릿은 다시 표시되지 않으므로 복사하십시오.
  16. 시크릿을 터미널에 붙여넣고 Enter 를 누릅니다.
  17. GitHub Enterprise 호스트 이름을 비워 둡니다.
  18. 클레임을 선택합니다.
  19. IDP가 생성되고 구성이 클러스터에 배치될 때까지 약 1분 정도 기다립니다.

  20. 반환된 링크를 복사하여 브라우저에 붙여넣습니다. 새 IDP는 선택한 이름으로 사용할 수 있어야 합니다. IDP를 클릭하고 GitHub 인증 정보를 사용하여 클러스터에 액세스합니다.

17.6.2. 다른 사용자에게 클러스터에 대한 액세스 권한 부여

다른 클러스터 사용자에게 액세스 권한을 부여하려면 이 클러스터에 사용되는 GitHub 조직에 GitHub 사용자 ID를 추가해야 합니다.

  1. GitHub에서 조직 페이지로 이동합니다.
  2. 프로필 아이콘을 클릭한 다음 조직을 클릭합니다. 그런 다음 &lt ;your-organization-name>을 클릭합니다. 이 예에서는 my-rosa-cluster 입니다.

  3. 담당자 초대를 클릭합니다.

  4. 새 사용자의 GitHub ID를 입력하고 올바른 사용자를 선택한 다음 Invite 를 클릭합니다.
  5. 새 사용자가 초대를 수락하면 하이브리드 클라우드 콘솔 링크와 GitHub 자격 증명을 사용하여 ROSA 클러스터에 로그인할 수 있습니다.

17.7. 튜토리얼: 관리자 권한 부여

관리(관리자) 권한은 클러스터에 추가한 사용자에게 자동으로 부여되지 않습니다. 특정 사용자에게 관리자 수준 권한을 부여하려면 각 사용자에게 수동으로 권한을 부여해야 합니다. ROSA CLI(명령줄 인터페이스) 또는 Red Hat OpenShift Cluster Manager 웹 UI(사용자 인터페이스)에서 관리자 권한을 부여할 수 있습니다.

Red Hat은 다음 두 가지 유형의 관리자 권한을 제공합니다.

  • cluster-admin:cluster-admin 권한은 admin 사용자에게 클러스터 내에서 전체 권한을 부여합니다.
  • dedicated-admin:dedicated-admin 권한을 사용하면 관리자가 클러스터 손상을 방지하기 위해 특정 제한 사항을 사용하여 대부분의 관리 작업을 완료할 수 있습니다. 승격된 권한이 필요한 경우 dedicated-admin 을 사용하는 것이 좋습니다.

관리자 권한에 대한 자세한 내용은 클러스터 관리 설명서를 참조하십시오.

17.7.1. ROSA CLI 사용

  1. 클러스터를 생성한 사용자라고 가정하면 다음 명령 중 하나를 실행하여 관리자 권한을 부여합니다.

    • cluster-admin 의 경우:

      $ rosa grant user cluster-admin --user <idp_user_name> --cluster=<cluster-name>
      Copy to Clipboard Toggle word wrap
    • dedicated-admin 의 경우 :

      $ rosa grant user dedicated-admin --user <idp_user_name> --cluster=<cluster-name>
      Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 관리자 권한이 추가되었는지 확인합니다.

    $ rosa list users --cluster=<cluster-name>
    Copy to Clipboard Toggle word wrap

    출력 예

    $ rosa list users --cluster=my-rosa-cluster
    ID                 GROUPS
    <idp_user_name>    cluster-admins
    Copy to Clipboard Toggle word wrap

  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
    Copy to Clipboard Toggle word wrap

17.7.2. Red Hat OpenShift Cluster Manager UI 사용

  1. OpenShift Cluster Manager 에 로그인합니다.
  2. 클러스터를 선택합니다.
  3. 액세스 제어 탭을 클릭합니다.
  4. 사이드바에서 클러스터 역할 및 액세스 탭을 클릭합니다.
  5. 사용자 추가를 클릭합니다.

  6. 팝업 화면에서 사용자 ID를 입력합니다.
  7. cluster-admins 또는 dedicated-admins 권한을 부여할지 여부를 선택합니다.

17.8. 튜토리얼: 클러스터에 액세스

CLI(명령줄 인터페이스) 또는 Red Hat Hybrid Cloud Console 사용자 인터페이스(UI)를 사용하여 클러스터에 연결할 수 있습니다.

17.8.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
    Copy to Clipboard Toggle word wrap

    출력 예

    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".
    Copy to Clipboard Toggle word wrap

  7. 다음 명령을 실행하여 로그인했는지 확인합니다.

    $ oc whoami
    Copy to Clipboard Toggle word wrap

    출력 예

    rosa-user
    Copy to Clipboard Toggle word wrap

  8. 이제 클러스터에 액세스할 수 있습니다.

17.8.2. 하이브리드 클라우드 콘솔을 통해 클러스터에 액세스

  1. OpenShift Cluster Manager 에 로그인합니다.

    1. 하이브리드 클라우드 콘솔 URL을 검색하려면 다음을 실행합니다.

      rosa describe cluster -c <cluster-name> | grep Console
      Copy to Clipboard Toggle word wrap
  2. IDP를 클릭합니다. 예를 들면 "rosa-github"입니다.

  3. 사용자 자격 증명을 입력합니다.
  4. 로그인해야 합니다. 튜토리얼을 따르는 경우 cluster-admin이 되고 관리자 패널이 표시되는 Hybrid Cloud Console 웹 페이지가 표시되어야 합니다.

17.9. 튜토리얼: 작업자 노드 관리

ROSA(Red Hat OpenShift Service on AWS)에서는 머신 풀을 사용하여 작업자 노드의 측면을 변경합니다. 시스템 풀을 사용하면 여러 시스템을 단일 엔터티로 관리할 수 있습니다. 모든 ROSA 클러스터에는 클러스터를 생성할 때 생성되는 기본 머신 풀이 있습니다. 자세한 내용은 머신 풀 설명서를 참조하십시오.

17.9.1. 머신 풀 생성

CLI(명령줄 인터페이스) 또는 UI(사용자 인터페이스)를 사용하여 머신 풀을 생성할 수 있습니다.

17.9.1.1. CLI를 사용하여 머신 풀 생성
  1. 다음 명령을 실행합니다.

    rosa create machinepool --cluster=<cluster-name> --name=<machinepool-name> --replicas=<number-nodes>
    Copy to Clipboard Toggle word wrap

    입력 예

     $ rosa create machinepool --cluster=my-rosa-cluster --name=new-mp
     --replicas=2
    Copy to Clipboard Toggle word wrap

    출력 예

    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'
    Copy to Clipboard Toggle word wrap

  2. 선택 사항: 다음 명령을 실행하여 새 머신 풀의 특정 노드에 노드 레이블 또는 테인트를 추가합니다.

    rosa create machinepool --cluster=<cluster-name> --name=<machinepool-name> --replicas=<number-nodes> --labels=`<key=pair>`
    Copy to Clipboard Toggle word wrap

    입력 예

    $ rosa create machinepool --cluster=my-rosa-cluster --name=db-nodes-mp --replicas=2 --labels='app=db','tier=backend'
    Copy to Clipboard Toggle word wrap

    출력 예

    I: Machine pool 'db-nodes-mp' created successfully on cluster 'my-rosa-cluster'
    Copy to Clipboard Toggle word wrap

    이렇게 하면 하나의 단위로 관리할 수 있는 추가 2개의 노드가 생성되고 표시된 레이블을 할당합니다.

  3. 다음 명령을 실행하여 머신 풀 생성 및 할당된 라벨을 확인합니다.

    rosa list machinepools --cluster=<cluster-name>
    Copy to Clipboard Toggle word wrap

    출력 예

    ID          AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS            TAINTS    AVAILABILITY ZONES
    Default     No           2         m5.xlarge                                  us-east-1a
    Copy to Clipboard Toggle word wrap

17.9.1.2. UI를 사용하여 머신 풀 생성
  1. OpenShift Cluster Manager 에 로그인하고 클러스터를 클릭합니다.

  2. 머신 풀을 클릭합니다.

    cloud experts getting started managing mp ocm

  3. 머신 풀 추가를 클릭합니다.
  4. 원하는 구성을 입력합니다.

    작은 정보

    노드 레이블 및 테인트 섹션을 확장하여 머신 풀의 노드에 노드 레이블 및 테인트를 추가할 수도 있습니다.

  5. 생성한 새 머신 풀이 표시됩니다.

17.9.2. 작업자 노드 스케일링

머신 풀을 편집하여 해당 특정 머신 풀의 작업자 노드 수를 확장합니다. CLI 또는 UI를 사용하여 작업자 노드를 확장할 수 있습니다.

17.9.2.1. CLI를 사용하여 작업자 노드 스케일링
  1. 다음 명령을 실행하여 각 클러스터와 함께 생성된 기본 머신 풀을 확인합니다.

    rosa list machinepools --cluster=<cluster-name>
    Copy to Clipboard Toggle word wrap

    출력 예

    ID          AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS            TAINTS    AVAILABILITY ZONES
    Default     No           2         m5.xlarge                                  us-east-1a
    Copy to Clipboard Toggle word wrap

  2. 기본 머신 풀을 다른 수의 노드로 확장하려면 다음 명령을 실행합니다.

    rosa edit machinepool --cluster=<cluster-name> --replicas=<number-nodes> <machinepool-name>
    Copy to Clipboard Toggle word wrap

    입력 예

    rosa edit machinepool --cluster=my-rosa-cluster --replicas 3 Default
    Copy to Clipboard Toggle word wrap

  3. 다음 명령을 실행하여 시스템 풀이 확장되었는지 확인합니다.

    rosa describe cluster --cluster=<cluster-name> | grep Compute
    Copy to Clipboard Toggle word wrap

    입력 예

    $ rosa describe cluster --cluster=my-rosa-cluster | grep Compute
    Copy to Clipboard Toggle word wrap

    출력 예

    - Compute:                 3 (m5.xlarge)
    Copy to Clipboard Toggle word wrap

17.9.2.2. UI를 사용하여 작업자 노드 스케일링
  1. 편집할 머신 풀 오른쪽에 있는 세 개의 점을 클릭합니다.
  2. 편집을 클릭합니다.
  3. 원하는 수의 노드를 입력하고 저장을 클릭합니다.
  4. 클러스터를 선택하고 개요 탭을 클릭하고 Compute 목록으로 스크롤하여 클러스터가 확장되었는지 확인합니다. 컴퓨팅 목록은 확장된 노드와 같아야 합니다. 예: 3/3입니다.

17.9.2.3. 노드 라벨 추가
  1. 다음 명령을 사용하여 노드 레이블을 추가합니다.

    rosa edit machinepool --cluster=<cluster-name> --replicas=<number-nodes> --labels='key=value' <machinepool-name>
    Copy to Clipboard Toggle word wrap

    입력 예

    rosa edit machinepool --cluster=my-rosa-cluster --replicas=2 --labels 'foo=bar','baz=one' new-mp
    Copy to Clipboard Toggle word wrap

    새 머신 풀에 레이블을 2개 추가합니다.

중요

이 명령은 모든 시스템 풀 구성을 새로 정의된 구성으로 교체합니다. 다른 레이블을 추가하고 이전 레이블을 유지하려면 새 레이블과 기존 레이블을 모두 지정해야 합니다. 그렇지 않으면 명령은 기존의 모든 레이블을 추가하려는 레이블로 교체합니다. 마찬가지로 레이블을 삭제하려면 삭제하려는 명령을 제외하고 명령을 실행하고 원하는 상태를 표시합니다.

17.9.3. 노드 유형 혼합

새 머신 풀을 사용하여 동일한 클러스터에서 다른 작업자 노드 머신 유형을 혼합할 수도 있습니다. 생성된 후에는 머신 풀의 노드 유형을 변경할 수 없지만 --instance-type 플래그를 추가하여 다른 노드로 새 머신 풀을 생성할 수 있습니다.

  1. 예를 들어 데이터베이스 노드를 다른 노드 유형으로 변경하려면 다음 명령을 실행합니다.

    rosa create machinepool --cluster=<cluster-name> --name=<mp-name> --replicas=<number-nodes> --labels='<key=pair>' --instance-type=<type>
    Copy to Clipboard Toggle word wrap

    입력 예

    rosa create machinepool --cluster=my-rosa-cluster --name=db-nodes-large-mp --replicas=2 --labels='app=db','tier=backend' --instance-type=m5.2xlarge
    Copy to Clipboard Toggle word wrap

  2. 사용 가능한 모든 인스턴스 유형을 보려면 다음 명령을 실행합니다.

    rosa list instance-types
    Copy to Clipboard Toggle word wrap
  3. 단계별 변경을 수행하려면 --interactive 플래그를 사용합니다.

    rosa create machinepool -c <cluster-name> --interactive
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 머신 풀을 나열하고 새로운 대규모 인스턴스 유형을 확인합니다.

    rosa list machinepools -c <cluster-name>
    Copy to Clipboard Toggle word wrap

17.10. 튜토리얼: 자동 확장

클러스터 자동 스케일러 는 Pod 리소스를 기반으로 클러스터에서 작업자 노드를 추가하거나 제거합니다.

클러스터 자동 스케일러는 다음과 같은 경우 클러스터 크기를 늘립니다.

  • 리소스가 부족하여 Pod가 현재 노드에서 예약되지 않습니다.
  • 배포 요구 사항을 충족하기 위해 다른 노드가 필요합니다.

클러스터 자동 스케일러는 사용자가 지정한 제한을 초과하여 클러스터 리소스를 늘리지 않습니다.

클러스터 자동 스케일러는 다음과 같은 경우 클러스터 크기를 줄입니다.

  • 일부 노드는 상당한 기간 동안 지속적으로 필요하지 않습니다. 예를 들어 노드에 리소스 사용량이 부족하고 중요한 모든 Pod가 다른 노드에 적합할 수 있는 경우입니다.

17.10.1. CLI를 사용하여 기존 머신 풀에 대한 자동 스케일링 활성화

참고

클러스터 생성 시 및 --enable-autoscaling 옵션을 사용하여 새 머신 풀을 생성할 때 클러스터 자동 스케일링을 활성화할 수 있습니다.

  1. 자동 스케일링은 머신 풀 가용성에 따라 설정됩니다. 자동 스케일링에 사용할 수 있는 머신 풀을 확인하려면 다음 명령을 실행합니다.

    $ rosa list machinepools -c <cluster-name>
    Copy to Clipboard Toggle word wrap

    출력 예

    ID         AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS     TAINTS    AVAILABILITY ZONES
    Default    No           2         m5.xlarge                           us-east-1a
    Copy to Clipboard Toggle word wrap

  2. 다음 명령을 실행하여 사용 가능한 머신 풀에 자동 스케일링을 추가합니다.

    $ rosa edit machinepool -c <cluster-name> --enable-autoscaling <machinepool-name> --min-replicas=<num> --max-replicas=<num>
    Copy to Clipboard Toggle word wrap

    입력 예

    $ rosa edit machinepool -c my-rosa-cluster --enable-autoscaling Default --min-replicas=2 --max-replicas=4
    Copy to Clipboard Toggle word wrap

    위의 명령은 리소스에 따라 2~4개의 노드 사이를 확장하는 작업자 노드에 대한 자동 스케일러를 생성합니다.

17.10.2. UI를 사용하여 기존 머신 풀에 대한 자동 스케일링 활성화

참고

머신 풀을 생성할 때 자동 스케일링 활성화 확인란을 선택하여 클러스터 생성 시 클러스터 자동 스케일링을 활성화할 수 있습니다.

  1. 머신 풀 탭으로 이동하여 오른쪽에 있는 세 개의 점을 클릭합니다.
  2. 스케일링을 클릭한 다음 자동 스케일링을 활성화합니다.
  3. 다음 명령을 실행하여 자동 스케일링이 추가되었는지 확인합니다.

    $ rosa list machinepools -c <cluster-name>
    Copy to Clipboard Toggle word wrap

    출력 예

    ID         AUTOSCALING  REPLICAS  INSTANCE TYPE  LABELS     TAINTS    AVAILABILITY ZONES
    Default    Yes          2-4       m5.xlarge                           us-east-1a
    Copy to Clipboard Toggle word wrap

17.11. 튜토리얼: 클러스터 업그레이드

ROSA(Red Hat OpenShift Service on AWS)는 관리형 서비스의 일부로 모든 클러스터 업그레이드를 실행합니다. 명령을 실행하거나 클러스터를 변경할 필요가 없습니다. 편리한 시간에 업그레이드를 예약할 수 있습니다.

클러스터 업그레이드 예약 방법은 다음과 같습니다.

  • 수동으로 CLI(명령줄 인터페이스) 사용: 한 번 즉시 업그레이드하거나 향후 날짜 및 시간에 대해 일회성 업그레이드를 예약합니다.
  • Red Hat OpenShift Cluster Manager 사용자 인터페이스(UI)를 수동으로 사용: 즉시 업그레이드하거나 향후 날짜 및 시간에 대해 일회성 업그레이드를 예약합니다.
  • 자동화된 업그레이드: 수동으로 예약하지 않고도 새 버전을 사용할 수 있을 때마다 반복적인 y-stream 업그레이드에 대한 업그레이드 창을 설정합니다. 마이너 버전은 수동으로 예약해야 합니다.

클러스터 업그레이드에 대한 자세한 내용은 다음 명령을 실행합니다.

$ rosa upgrade cluster --help
Copy to Clipboard Toggle word wrap

17.11.1. CLI를 사용하여 클러스터 수동 업그레이드

  1. 다음 명령을 실행하여 업그레이드할 수 있는 업그레이드가 있는지 확인합니다.

    $ rosa list upgrade -c <cluster-name>
    Copy to Clipboard Toggle word wrap

    출력 예

    $ rosa list upgrade -c <cluster-name>
    VERSION  NOTES
    4.14.7   recommended
    4.14.6
    ...
    Copy to Clipboard Toggle word wrap

    위의 예에서 4.14.7 및 4.14.6 버전을 모두 사용할 수 있습니다.

  2. 다음 명령을 실행하여 1시간 이내에 업그레이드할 클러스터를 예약합니다.

    $ rosa upgrade cluster -c <cluster-name> --version <desired-version>
    Copy to Clipboard Toggle word wrap
  3. 선택 사항: 다음 명령을 실행하여 나중에 업그레이드하도록 클러스터를 예약합니다.

    $ rosa upgrade cluster -c <cluster-name> --version <desired-version> --schedule-date <future-date-for-update> --schedule-time <future-time-for-update>
    Copy to Clipboard Toggle word wrap

17.11.2. UI를 사용하여 클러스터 수동 업그레이드

  1. OpenShift Cluster Manager에 로그인하고 업그레이드할 클러스터를 선택합니다.
  2. 설정을 클릭합니다.
  3. 업그레이드할 수 있는 경우 업데이트를 클릭합니다.

  4. 새 창에서 업그레이드할 버전을 선택합니다.
  5. 업그레이드 시간을 예약하거나 즉시 시작합니다.

17.11.3. 자동 반복 업그레이드 설정

  1. OpenShift Cluster Manager에 로그인하고 업그레이드할 클러스터를 선택합니다.
  2. 설정을 클릭합니다.

    1. 업데이트 전략에서 업데이트 반복 을 클릭합니다.
  3. 업그레이드 날짜 및 시간을 설정합니다.
  4. 노드 드레이닝 에서 유예 기간을 선택하여 Pod를 제거하기 전에 노드를 드레이닝할 수 있습니다.
  5. 저장을 클릭합니다.

17.12. 튜토리얼: 클러스터 삭제

CLI(명령줄 인터페이스) 또는 UI(사용자 인터페이스)를 사용하여 AWS(ROSA)에서 Red Hat OpenShift Service를 삭제할 수 있습니다.

17.12.1. CLI를 사용하여 ROSA 클러스터 삭제

  1. 선택 사항: 다음 명령을 실행하여 올바른 클러스터를 삭제하도록 클러스터를 나열합니다.

    $ rosa list clusters
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 클러스터를 삭제합니다.

    $ rosa delete cluster --cluster <cluster-name>
    Copy to Clipboard Toggle word wrap
    주의

    이 명령은 복구할 수 없습니다.

  3. CLI에서 클러스터를 삭제할지 묻는 메시지를 표시합니다. y 를 누른 다음 Enter 를 누릅니다. 클러스터 및 관련 인프라가 모두 삭제됩니다.

    참고

    모든 AWS STS 및 IAM 역할 및 정책은 다음 단계에 따라 클러스터 삭제가 완료되면 수동으로 삭제해야 합니다.

  4. CLI는 생성된 OpenID Connect(OIDC) 공급자 및 Operator IAM 역할 리소스를 삭제하는 명령을 출력합니다. 이러한 리소스를 삭제하기 전에 클러스터가 삭제를 완료할 때까지 기다립니다. 다음 명령을 실행하여 빠른 상태 점검을 수행합니다.

    $ rosa list clusters
    Copy to Clipboard Toggle word wrap
  5. 클러스터가 삭제되면 다음 명령을 실행하여 OIDC 공급자를 삭제합니다.

    $ rosa delete oidc-provider -c <clusterID> --mode auto --yes
    Copy to Clipboard Toggle word wrap
  6. 다음 명령을 실행하여 Operator IAM 역할을 삭제합니다.

    $ rosa delete operator-roles -c <clusterID> --mode auto --yes
    Copy to Clipboard Toggle word wrap
    참고

    이 명령에는 클러스터 이름이 아닌 클러스터 ID가 필요합니다.

  7. 동일한 계정의 다른 클러스터에 더 이상 필요하지 않은 경우에만 나머지 계정 역할을 제거합니다. 이 계정에 다른 ROSA 클러스터를 만들려면 이 단계를 수행하지 마십시오.

    계정 역할을 삭제하려면 해당 역할을 생성할 때 사용되는 접두사를 알아야 합니다. 달리 지정하지 않는 한 기본값은 "ManagedOpenShift"입니다.

    다음 명령을 실행하여 계정 역할을 삭제합니다.

    $ rosa delete account-roles --prefix <prefix> --mode auto --yes
    Copy to Clipboard Toggle word wrap

17.12.2. UI를 사용하여 ROSA 클러스터 삭제

  1. OpenShift Cluster Manager 에 로그인하고 삭제할 클러스터를 찾습니다.
  2. 클러스터 오른쪽에 있는 점 세 개를 클릭합니다.

  3. 드롭다운 메뉴에서 클러스터 삭제 를 클릭합니다.

  4. 삭제를 확인할 클러스터 이름을 입력하고 삭제를 클릭합니다.

17.13. 튜토리얼: 지원 받기

필요한 경우 올바른 도움말을 찾는 것이 중요합니다. 이는 도움이 필요할 때 필요한 리소스 중 일부입니다.

17.13.1. 지원 연락처 추가

클러스터에 대한 통신을 위해 추가 이메일 주소를 추가할 수 있습니다.

  1. Red Hat OpenShift Cluster Manager UI(사용자 인터페이스)에서 클러스터 선택을 클릭합니다.
  2. 지원 탭을 클릭합니다.
  3. 알림 연락처 추가 를 클릭하고 추가 이메일 주소를 입력합니다.

17.13.2. UI를 사용한 지원을 위해 Red Hat에 문의

  1. OpenShift Cluster Manager UI에서 지원 탭을 클릭합니다.
  2. 지원 케이스 열기를 클릭합니다.

17.13.3. 지원 페이지를 사용하여 Red Hat에 문의하십시오.

  1. Red Hat 지원 페이지로 이동합니다.
  2. 새 케이스 열기를 클릭합니다.

  3. Red Hat 계정에 로그인합니다.
  4. 지원에 문의하는 이유를 선택합니다.

  5. AWS의 Red Hat OpenShift Service를 선택합니다.
  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를 선택해야 합니다.

  9. Submit 을 클릭합니다.
  10. 표시된 심각도 수준에 대해 커밋된 응답 시간을 기반으로 연락을 취할 것입니다.

18장. 애플리케이션 배포

18.1. 튜토리얼: 애플리케이션 배포

18.1.1. 소개

클러스터를 성공적으로 프로비저닝한 후 애플리케이션을 배포할 수 있습니다. 이 애플리케이션을 사용하면 AWS(ROSA) 및 Kubernetes에서 Red Hat OpenShift Service의 일부 기능을 보다 잘 이해할 수 있습니다.

18.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)를 사용합니다.

18.2. 튜토리얼: 애플리케이션 배포

18.2.1. 사전 요구 사항

  1. 프로비저닝된 ROSA 클러스터

    이 랩은 ROSA 클러스터를 성공적으로 프로비저닝한 것으로 가정합니다. ROSA 클러스터를 아직 생성하지 않은 경우 ROSA 퀵 스타트 가이드를 참조하십시오.

  2. OpenShift CLI(명령줄 인터페이스)

    자세한 내용은 OpenShift CLI 시작하기를 참조하십시오.

  3. GitHub 계정

    기존 GitHub 계정을 사용하거나 https://github.com/signup 에 등록합니다.

18.2.1.1. AWS 계정 연결 이해

Red Hat Hybrid Cloud Console 에서 Red Hat OpenShift Cluster Manager를 사용하여 AWS(STS)에서 Red Hat OpenShift Service를 생성하려면 먼저 AWS 계정을 Red Hat 조직과 연결해야 합니다. 다음 IAM 역할을 생성하고 연결하여 계정을 연결할 수 있습니다.

OpenShift Cluster Manager 역할

OpenShift Cluster Manager IAM 역할을 생성하여 Red Hat 조직에 연결합니다.

OpenShift Cluster Manager 역할에 기본 또는 관리 권한을 적용할 수 있습니다. 기본 권한을 사용하면 OpenShift Cluster Manager를 사용하여 클러스터 유지 관리를 수행할 수 있습니다. 관리 권한을 사용하면 OpenShift Cluster Manager를 사용하여 클러스터별 Operator 역할 및 OpenID Connect(OIDC) 공급자를 자동으로 배포할 수 있습니다.

사용자 역할

사용자 IAM 역할을 생성하여 Red Hat 사용자 계정에 연결합니다. Red Hat 사용자 계정은 OpenShift Cluster Manager 역할에 연결된 Red Hat 조직에 있어야 합니다.

OpenShift Cluster Manager Hybrid Cloud Console을 사용하여 클러스터 및 필요한 STS 리소스를 설치할 때 Red Hat에서 사용자 역할을 사용하여 AWS ID를 확인합니다.

AWS 계정과 Red Hat 조직 연결

Red Hat Hybrid Cloud Console 에서 Red Hat OpenShift Cluster Manager를 사용하여 AWS(STS)에서 Red Hat OpenShift Service를 생성하고, OpenShift Cluster Manager IAM 역할을 생성하여 Red Hat 조직에 연결하기 전에 그런 다음 사용자 IAM 역할을 생성하여 동일한 Red Hat 조직의 Red Hat 사용자 계정에 연결합니다.

프로세스

  1. OpenShift Cluster Manager 역할을 생성하여 Red Hat 조직에 연결합니다.

    참고

    OpenShift Cluster Manager Hybrid Cloud Console을 사용하는 클러스터별 Operator 역할 및 OpenID Connect(OIDC) 공급자를 자동으로 배포하려면 ROSA 클러스터를 생성하는 Accounts 및 역할 단계에서 Admin OCM 역할 명령을 선택하여 역할에 관리 권한을 적용해야 합니다. OpenShift Cluster Manager 역할의 기본 및 관리 권한에 대한 자세한 내용은 AWS 계정 연결 이해 를 참조하십시오.

    참고

    OpenShift Cluster Manager Hybrid Cloud Console에서 ROSA 클러스터를 생성하는 계정 및 역할 단계에서 기본 OCM 역할 명령을 선택하는 경우 수동 모드를 사용하여 ROSA 클러스터를 배포해야 합니다. 이후 단계에서 클러스터별 Operator 역할 및 OpenID Connect(OIDC) 공급자를 구성하라는 메시지가 표시됩니다.

    $ rosa create ocm-role
    Copy to Clipboard Toggle word wrap

    프롬프트에 있는 기본값을 선택하여 역할을 신속하게 생성하고 연결합니다.

  2. 사용자 역할을 생성하여 Red Hat 사용자 계정에 연결합니다.

    $ rosa create user-role
    Copy to Clipboard Toggle word wrap

    프롬프트에 있는 기본값을 선택하여 역할을 신속하게 생성하고 연결합니다.

    참고

    Red Hat 사용자 계정은 OpenShift Cluster Manager 역할에 연결된 Red Hat 조직에 있어야 합니다.

18.3. 튜토리얼: 애플리케이션 배포

18.3.1. 랩 개요

18.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
    Copy to Clipboard Toggle word wrap

    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
    Copy to Clipboard Toggle word wrap

  • ACK S3용 S3 버킷 매니페스트

    s3-bucket.yaml

    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    metadata:
      name: ostoy-bucket
      namespace: ostoy
    spec:
      name: ostoy-bucket
    Copy to Clipboard Toggle word wrap

참고

OSToy 애플리케이션의 배포를 단순화하기 위해 위의 배포 매니페스트에 필요한 모든 오브젝트가 함께 그룹화됩니다. 일반적인 엔터프라이즈 배포에는 각 Kubernetes 오브젝트에 대한 별도의 매니페스트 파일이 권장됩니다.

18.3.1.2. OSToy 애플리케이션 정보

OSToy는 Kubernetes의 기능을 탐색하는 데 도움이 되도록 ROSA 클러스터에 배포할 간단한 Node.js 애플리케이션입니다. 이 애플리케이션에는 다음을 수행할 수 있는 사용자 인터페이스가 있습니다.

  • 로그에 메시지를 작성합니다(stdout / stderr).
  • 자동 복구 보기를 위해 의도적으로 애플리케이션을 충돌합니다.
  • 활성 상태 프로브를 전환하고 OpenShift 동작을 모니터링합니다.
  • 구성 맵, 시크릿 및 env 변수를 읽습니다.
  • 공유 스토리지에 연결된 경우 파일을 읽고 씁니다.
  • 포함된 마이크로 서비스를 사용하여 네트워크 연결, 클러스터 내 DNS 및 intra-communication을 확인합니다.
  • Horizontal Pod Autoscaler를 사용하여 부하를 처리하도록 Pod의 자동 스케일링을 보려면 부하를 늘립니다.
  • 선택 사항: AWS S3 버킷에 연결하여 오브젝트를 읽고 씁니다.
18.3.1.3. OSToy Application Diagram
18.3.1.4. OSToy UI 이해
  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. 정보: 애플리케이션에 대한 자세한 정보를 표시합니다.

18.4. 튜토리얼: 애플리케이션 배포

18.4.1. Kubernetes를 사용하여 OSToy 애플리케이션 배포

이미지 리포지토리에 프런트 엔드 및 백엔드 마이크로 서비스 컨테이너의 이미지를 생성하고 저장하여 OSToy 애플리케이션을 배포할 수 있습니다. 그런 다음 Kubernetes 배포를 생성하여 애플리케이션을 배포할 수 있습니다.

18.4.1.1. 로그인 명령 검색
  1. CLI에 로그인하지 않은 경우 웹 콘솔을 사용하여 클러스터에 액세스합니다.
  2. 오른쪽 상단에 있는 로그인 이름 옆에 있는 드롭다운 화살표를 클릭하고 로그인 명령 복사를 선택합니다.

    새 탭이 열립니다.

  3. 인증 방법을 선택합니다.
  4. 토큰 표시를 클릭합니다.
  5. 이 토큰을 사용하여 로그인 아래에 명령을 복사합니다.
  6. 터미널에서 복사된 명령을 붙여넣고 실행합니다. 로그인에 성공하면 다음 확인 메시지가 표시됩니다.

    $ oc login --token=<your_token> --server=https://api.osd4-demo.abc1.p1.openshiftapps.com:6443
    Logged into "https://api.myrosacluster.abcd.p1.openshiftapps.com:6443" as "rosa-user" using the token provided.
    
    You don't have any projects. You can try to create a new project, by running
    
    oc new-project <project name>
    Copy to Clipboard Toggle word wrap
18.4.1.2. 새 프로젝트 생성
18.4.1.2.1. CLI 사용
  1. 다음 명령을 실행하여 클러스터에서 ostoy 라는 새 프로젝트를 생성합니다.

    $ oc new-project ostoy
    Copy to Clipboard Toggle word wrap

    출력 예

    Now using project "ostoy" on server "https://api.myrosacluster.abcd.p1.openshiftapps.com:6443".
    Copy to Clipboard Toggle word wrap

  2. 선택 사항: 또는 다음 명령을 실행하여 고유한 프로젝트 이름을 생성합니다.

    $ oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')
    Copy to Clipboard Toggle word wrap
18.4.1.2.2. 웹 콘솔 사용
  1. 웹 콘솔에서 홈 → 프로젝트를 클릭합니다.
  2. 프로젝트 페이지에서 프로젝트 생성 을 클릭합니다.

18.4.1.3. 백엔드 마이크로 서비스 배포

마이크로 서비스는 내부 웹 요청을 제공하고 현재 호스트 이름과 무작위로 생성된 색상 문자열이 포함된 JSON 오브젝트를 반환합니다.

  • 터미널에서 다음 명령을 실행하여 마이크로 서비스를 배포합니다.

    $ oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
    Copy to Clipboard Toggle word wrap

    출력 예

    $ oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
    deployment.apps/ostoy-microservice created
    service/ostoy-microservice-svc created
    Copy to Clipboard Toggle word wrap

18.4.1.4. 프런트 엔드 서비스 배포

프런트 엔드 배포에서는 애플리케이션 및 추가 Kubernetes 오브젝트에 Node.js 프런트 엔드를 사용합니다.

ostoy-frontend-deployment.yaml 파일은 프런트 엔드 배포에서 다음 기능을 정의하는 것을 보여줍니다.

  • 영구 볼륨 클레임
  • Deployment 오브젝트
  • Service
  • 경로
  • ConfigMaps
  • 보안

    • 애플리케이션 프런트 엔드를 배포하고 다음 명령을 입력하여 모든 오브젝트를 생성합니다.

      $ oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yaml
      Copy to Clipboard Toggle word wrap

      출력 예

      persistentvolumeclaim/ostoy-pvc created
      deployment.apps/ostoy-frontend created
      service/ostoy-frontend-svc created
      route.route.openshift.io/ostoy-route created
      configmap/ostoy-configmap-env created
      secret/ostoy-secret-env created
      configmap/ostoy-configmap-files created
      secret/ostoy-secret created
      Copy to Clipboard Toggle word wrap

      생성된 모든 오브젝트가 표시됩니다.

18.4.1.5. 경로 가져오기

애플리케이션에 액세스하려면 경로를 가져와야 합니다.

  • 다음 명령을 실행하여 애플리케이션의 경로를 가져옵니다.

    $ oc get route
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME          HOST/PORT                                                 PATH   SERVICES             PORT    TERMINATION   WILDCARD
    ostoy-route   ostoy-route-ostoy.apps.<your-rosa-cluster>.abcd.p1.openshiftapps.com          ostoy-frontend-svc   <all>                 None
    Copy to Clipboard Toggle word wrap

18.4.1.6. 애플리케이션 보기
  1. 이전 단계에서 ostoy-route-ostoy.apps.<your-rosa-cluster>.abcd.p1.openshiftapps.com URL 출력을 복사합니다.
  2. 복사한 URL을 웹 브라우저에 붙여넣고 Enter 키를 누릅니다. 애플리케이션 홈페이지가 표시됩니다. 페이지가 로드되지 않는 경우 https 가 아닌 http 를 사용해야 합니다.

18.5. 튜토리얼: 상태 점검

Pod를 의도적으로 충돌하고 Kubernetes 활성 프로브에 응답하지 않도록 하여 Kubernetes가 Pod 오류에 응답하는 방법을 확인할 수 있습니다.

18.5.1. 데스크탑 준비

  1. 작업 결과를 즉시 확인할 수 있도록 OpenShift 웹 콘솔과 OSToy 애플리케이션 웹 콘솔 간에 데스크탑 화면을 분할합니다.

    화면을 분할할 수 없는 경우 OSToy 애플리케이션 웹 콘솔을 다른 탭에서 열어 애플리케이션의 기능을 활성화한 후 OpenShift 웹 콘솔로 빠르게 전환할 수 있습니다.

  2. OpenShift 웹 콘솔에서 워크로드 > 배포 > ostoy-frontend 를 선택하여 OSToy 배포를 확인합니다.

18.5.2. Pod 충돌

  1. OSToy 애플리케이션 웹 콘솔의 왼쪽 메뉴에서 Home 을 클릭하고 Crash Pod 상자에 메시지를 입력합니다(예: 이 값은 goodbye! ).
  2. Crash Pod 를 클릭합니다.

    Pod 충돌 및 Kubernetes는 Pod를 다시 시작해야 합니다.

18.5.3. revived Pod 보기

  1. OpenShift 웹 콘솔에서 신속하게 배포 화면으로 전환합니다. pod가 노란색으로 설정되어 있음을 알 수 있습니다. 즉, 다운된 것입니다. 신속하게 재부팅하고 파란색으로 전환해야 합니다. 재생 프로세스가 빠르게 수행되므로 누락될 수 있습니다.

검증

  1. 웹 콘솔에서 포드 > ostoy-frontend-xxxxxxx-xxxx 를 클릭하여 Pod 화면으로 변경합니다.

  2. Events 하위 탭을 클릭하고 컨테이너가 충돌하여 다시 시작되었는지 확인합니다.

18.5.4. 애플리케이션 오작동으로 만들기

Pod 이벤트 페이지를 이전 절차에서 열린 상태로 유지합니다.

  • OSToy 애플리케이션에서 토글 상태 타일에서 상태 토글 을 클릭합니다. 현재 상태 전환을 볼 수 있습니다. 이 모든 것이 좋지 않습니다.

검증

이전 단계 후에 애플리케이션은 200 HTTP 코드로 응답하지 않습니다. 연속 장애가 3번 실패한 후 Kubernetes는 Pod를 중지하고 다시 시작합니다. 웹 콘솔에서 Pod 이벤트 페이지로 다시 전환하면 활성 프로브가 실패하고 Pod가 재시작된 것을 확인할 수 있습니다.

다음 이미지는 Pod 이벤트 페이지에 표시되는 내용의 예를 보여줍니다.

A. Pod에는 3개의 연속 오류가 있습니다.

B. Kubernetes는 Pod를 중지합니다.

C. Kubernetes는 Pod를 다시 시작합니다.

18.6. 튜토리얼: 클러스터 스토리지를 위한 영구 볼륨

Red Hat OpenShift Service on AWS(ROSA)(classic architecture) 및 Red Hat OpenShift Service on AWS(ROSA)는 AWS( Amazon Web Services) EBS(Elastic Block Store) 또는 AWS EBS(Elastic File System ) 를 사용하여 영구 볼륨 저장을 지원합니다.

18.6.1. 영구 볼륨 사용

다음 절차에 따라 파일을 생성하고 클러스터의 영구 볼륨에 저장한 후 Pod가 실패하고 다시 생성되는지 확인합니다.

18.6.1.1. 영구 볼륨 클레임 보기
  1. 클러스터의 OpenShift 웹 콘솔로 이동합니다.
  2. 왼쪽 메뉴에서 Storage 를 클릭한 다음 PersistentVolumeClaims 를 클릭하여 모든 영구 볼륨 클레임 목록을 확인합니다.
  3. 지속성 볼륨 클레임을 클릭하여 크기, 액세스 모드, 스토리지 클래스 및 기타 추가 클레임 세부 정보를 확인합니다.

    참고

    액세스 모드는 RWO( ReadWriteOnce )입니다. 즉, 볼륨은 하나의 노드에만 마운트할 수 있으며 Pod 또는 Pod는 볼륨을 읽고 쓸 수 있습니다.

18.6.1.2. 파일 저장
  1. OSToy 앱 콘솔의 왼쪽 메뉴에서 영구 스토리지를 클릭합니다.
  2. 파일 이름 상자에 .txt 확장자가 있는 파일 이름을 입력합니다(예: test-pv.txt ).
  3. 파일 콘텐츠 상자에 텍스트 문장을 입력합니다. 예를 들어 OpenShift는 슬라이스된 bread! 이므로 가장 큰 것입니다.
  4. 파일 생성을 클릭합니다.

  5. OSToy 앱 콘솔의 기존 파일로 스크롤합니다.
  6. 생성한 파일을 클릭하여 파일 이름과 내용을 확인합니다.

18.6.1.3. Pod 충돌
  1. OSToy 앱 콘솔의 왼쪽 메뉴에서 홈을 클릭합니다.
  2. Crash Pod를 클릭합니다.
18.6.1.4. 영구 스토리지 확인
  1. 포드가 다시 생성될 때까지 기다립니다.
  2. OSToy 앱 콘솔의 왼쪽 메뉴에서 영구 스토리지를 클릭합니다.
  3. 만든 파일을 찾아서 열어 내용을 보고 확인합니다.

검증

배포 YAML 파일은 /var/demo_files 디렉토리를 영구 볼륨 클레임에 마운트했음을 보여줍니다.

  1. 다음 명령을 실행하여 프런트 엔드 Pod의 이름을 검색합니다.

    $ oc get pods
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 컨테이너에서 SSH(Secure Shell) 세션을 시작합니다.

    $ oc rsh <pod_name>
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 디렉터리로 이동합니다.

    $ cd /var/demo_files
    Copy to Clipboard Toggle word wrap
  4. 선택 사항: 다음 명령을 실행하여 생성한 모든 파일을 확인합니다.

    $ ls
    Copy to Clipboard Toggle word wrap
  5. 다음 명령을 실행하여 내용을 보려면 파일을 엽니다.

    $ cat test-pv.txt
    Copy to Clipboard Toggle word wrap
  6. 출력이 OSToy 앱 콘솔에 입력한 텍스트인지 확인합니다.

    터미널 예

    $ oc get pods
    NAME                                  READY     STATUS    RESTARTS   AGE
    ostoy-frontend-5fc8d486dc-wsw24       1/1       Running   0          18m
    ostoy-microservice-6cf764974f-hx4qm   1/1       Running   0          18m
    
    $ oc rsh ostoy-frontend-5fc8d486dc-wsw24
    
    $ cd /var/demo_files/
    
    $ ls
    lost+found   test-pv.txt
    
    $ cat test-pv.txt
    OpenShift is the greatest thing since sliced bread!
    Copy to Clipboard Toggle word wrap

18.6.1.5. 세션 종료
  • 터미널에 exit 를 입력하여 세션을 종료하고 CLI로 돌아갑니다.

18.7. 튜토리얼: ConfigMaps, secrets, environment variables

이 튜토리얼에서는 구성 ,시크릿환경 변수 를 사용하여 OSToy 애플리케이션을 구성하는 방법을 보여줍니다. 자세한 내용은 이러한 연결된 항목을 참조하십시오.

18.7.1. ConfigMap을 사용한 구성

구성 맵을 사용하면 컨테이너 이미지 콘텐츠에서 구성 아티팩트를 분리하여 컨테이너화된 애플리케이션을 이식할 수 있습니다.

프로세스

  • OSToy 앱의 왼쪽 메뉴에서 Config Maps 을 클릭하여 OSToy 애플리케이션에서 사용할 수 있는 구성 맵의 내용을 표시합니다. 코드 스니펫은 구성 맵 구성의 예를 보여줍니다.

    출력 예

    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: ostoy-configmap-files
    data:
      config.json:  '{ "default": "123" }'
    Copy to Clipboard Toggle word wrap

18.7.2. 보안을 사용한 구성

Kubernetes Secret 오브젝트를 사용하면 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장하고 관리할 수 있습니다. 이 정보를 시크릿에 배치하는 것은 포드 정의 또는 컨테이너 이미지에 일반 텍스트에 배치하는 것보다 더 안전하고 유연합니다.

프로세스

  • OSToy 앱의 왼쪽 메뉴에서 시크릿을 클릭하여 OSToy 애플리케이션에서 사용할 수 있는 시크릿 내용을 표시합니다. 코드 스니펫은 보안 구성의 예를 보여줍니다.

    출력 예

    USERNAME=my_user
    PASSWORD=VVNFUk5BTUU9bXlfdXNlcgpQQVNTV09SRD1AT3RCbCVYQXAhIzYzMlk1RndDQE1UUWsKU01UUD1sb2NhbGhvc3QKU01UUF9QT1JUPTI1
    SMTP=localhost
    SMTP_PORT=25
    Copy to Clipboard Toggle word wrap

18.7.3. 환경 변수를 사용한 구성

환경 변수를 사용하면 코드를 변경할 필요 없이 애플리케이션 동작을 쉽게 변경할 수 있습니다. 동일한 애플리케이션의 다양한 배포가 환경 변수에 따라 다르게 작동할 수 있습니다. Red Hat OpenShift Service on AWS를 사용하면 Pod 또는 배포의 환경 변수를 쉽게 설정, 보기 및 업데이트할 수 있습니다.

프로세스

  • OSToy 앱의 왼쪽 메뉴에서 ENV 변수 를 클릭하여 OSToy 애플리케이션에서 사용할 수 있는 환경 변수를 표시합니다. 코드 스니펫은 환경 변수 구성의 예를 보여줍니다.

    출력 예

    {
      "npm_config_local_prefix": "/opt/app-root/src",
      "STI_SCRIPTS_PATH": "/usr/libexec/s2i",
      "npm_package_version": "1.7.0",
      "APP_ROOT": "/opt/app-root",
      "NPM_CONFIG_PREFIX": "/opt/app-root/src/.npm-global",
      "OSTOY_MICROSERVICE_PORT_8080_TCP_PORT": "8080",
      "NODE": "/usr/bin/node",
      "LD_PRELOAD": "libnss_wrapper.so",
      "KUBERNETES_SERVICE_HOST": "172.30.0.1",
      "OSTOY_MICROSERVICE_PORT": "tcp://172.30.60.255:8080",
      "OSTOY_PORT": "tcp://172.30.152.25:8080",
      "npm_package_name": "ostoy",
      "OSTOY_SERVICE_PORT_8080_TCP": "8080",
      "_": "/usr/bin/node"
      "ENV_TOY_CONFIGMAP": "ostoy-configmap -env"
    }
    Copy to Clipboard Toggle word wrap

18.8. 튜토리얼: 네트워킹

이 튜토리얼에서는 OSToy 앱에서 클러스터 내부 네트워킹을 사용하여 마이크로서비스를 사용하고 Pod 스케일링을 시각화하여 기능을 분리하는 방법을 보여줍니다.

다이어그램에서는 두 개 이상의 개별 Pod가 있으며 각각 자체 서비스가 있음을 보여줍니다.

하나의 pod는 서비스와 공개적으로 액세스 가능한 경로를 사용하여 프런트 엔드 웹 애플리케이션으로 작동합니다. 다른 pod는 서비스 오브젝트를 사용하여 backend 마이크로 서비스로 작동하므로 프런트 엔드 포드에서 마이크로 서비스와 통신할 수 있습니다. 이 통신은 Pod에서 둘 이상의 경우 발생합니다. 이러한 통신 제한으로 인해 이 마이크로 서비스는 구성된 경우 이 클러스터 외부에서 또는 다른 네임스페이스 또는 프로젝트에서 액세스할 수 없습니다. 이 마이크로 서비스의 유일한 용도는 내부 웹 요청을 제공하고 포드 이름인 현재 호스트 이름 및 무작위로 생성된 색상 문자열이 포함된 JSON 오브젝트를 반환하는 것입니다. 이 색상 문자열은 "Intra-cluster communication"이라는 제목의 타일에 표시되는 해당 색상이 있는 상자를 표시하는 데 사용됩니다.

네트워킹 제한에 대한 자세한 내용은 네트워크 정책 정보를 참조하십시오.

18.8.1. 클러스터 내 네트워킹

OSToy 애플리케이션에서 네트워킹 구성을 볼 수 있습니다.

프로세스

  1. OSToy 애플리케이션의 왼쪽 메뉴에서 네트워킹 을 클릭합니다.
  2. 네트워킹 구성을 검토합니다. "Hostname Lookup"이라는 제목의 올바른 타일은 Pod에 대해 생성된 서비스 이름을 사용하여 내부 ClusterIP 주소로 변환하는 방법을 보여줍니다.

  3. < service_name>.<namespace>.svc.cluster.local의 형식에 따라 오른쪽 타일에 생성된 마이크로 서비스의 이름을 입력합니다. 다음 명령을 실행하여 ostoy-microservice.yaml 의 서비스 정의에서 이 서비스 이름을 찾을 수 있습니다.

    $ oc get service <name_of_service> -o yaml
    Copy to Clipboard Toggle word wrap

    출력 예

    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
    Copy to Clipboard Toggle word wrap

    이 예에서 전체 호스트 이름은 ostoy-microservice-svc.ostoy.svc.cluster.local 입니다.

  4. IP 주소가 반환됩니다. 이 예에서는 172.30.165.246 입니다. 클러스터 내 IP 주소이며 클러스터 내에서만 액세스할 수 있습니다.

18.9. 튜토리얼: 애플리케이션 확장

18.9.1. 스케일링

HPA(horizontal Pod Autoscaler)를 사용하여 Pod를 수동으로 또는 자동으로 스케일링할 수 있습니다. 클러스터 노드를 확장할 수도 있습니다.

18.9.1.1. 수동 Pod 스케일링

다음 방법 중 하나를 사용하여 애플리케이션 Pod를 수동으로 스케일링할 수 있습니다.

  • ReplicaSet 또는 배포 정의 변경
  • 명령줄 사용
  • 웹 콘솔 사용

이 워크샵은 마이크로 서비스에 하나의 Pod만 사용하여 시작됩니다. 배포 정의에서 1 개의 복제본을 정의하면 Kubernetes Replication Controller에서 하나의 Pod를 활성 상태로 유지합니다. 그런 다음 부하가 많은 경우 로드를 기반으로 하고 초기 정의 이상으로 더 많은 Pod를 확장하는 HPA(수평 Pod Autoscaler)를 사용하여 Pod 자동 스케일링을 정의하는 방법을 알아봅니다.

사전 요구 사항

  • 활성 ROSA 클러스터
  • OSToy 애플리케이션이 해제됨

프로세스

  1. OSToy 앱의 탐색 메뉴에서 네트워킹 탭을 클릭합니다.
  2. "Intra-cluster communication" 섹션에서 무작위로 색상을 변경하는 "원격 Pod" 아래에 있는 상자를 찾습니다. 박스 내에는 마이크로 서비스의 포드 이름이 표시됩니다. 마이크로 서비스 pod가 하나뿐이므로 이 예제에는 하나의 박스만 있습니다.

  3. 다음 명령을 실행하여 마이크로 서비스에 대해 실행 중인 포드가 하나뿐인지 확인합니다.

    $ oc get pods
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                                  READY     STATUS    RESTARTS   AGE
    ostoy-frontend-679cb85695-5cn7x       1/1       Running   0          1h
    ostoy-microservice-86b4c6f559-p594d   1/1       Running   0          1h
    Copy to Clipboard Toggle word wrap

  4. ostoy-microservice-deployment.yaml 을 다운로드하여 로컬 머신에 저장합니다.
  5. 다음 예제를 사용하여 배포 정의를 1개 대신 3개의 Pod로 변경합니다.

    spec:
        selector:
          matchLabels:
            app: ostoy-microservice
        replicas: 3
    Copy to Clipboard Toggle word wrap
  6. 다음 명령을 실행하여 복제본 변경 사항을 적용합니다.

    $ oc apply -f ostoy-microservice-deployment.yaml
    Copy to Clipboard Toggle word wrap
    참고

    워크로드 > Deployments > ostoy-microservice > YAML 탭으로 이동하여 OpenShift 웹 콘솔에서 ostoy-microservice- deployment.yaml 파일을 편집할 수도 있습니다.

  7. 다음 명령을 실행하여 Pod 3개가 있는지 확인합니다.

    $ oc get pods
    Copy to Clipboard Toggle word wrap

    출력에서는 이제 마이크로 서비스에 대한 포드가 하나만 아니라 3개의 포드가 있음을 보여줍니다.

    출력 예

    NAME                                  READY   STATUS    RESTARTS   AGE
    ostoy-frontend-5fbcc7d9-rzlgz         1/1     Running   0          26m
    ostoy-microservice-6666dcf455-2lcv4   1/1     Running   0          81s
    ostoy-microservice-6666dcf455-5z56w   1/1     Running   0          81s
    ostoy-microservice-6666dcf455-tqzmn   1/1     Running   0          26m
    Copy to Clipboard Toggle word wrap

  8. CLI를 사용하거나 웹 UI를 사용하여 애플리케이션을 확장합니다.

    • CLI에서 다음 명령을 실행하여 Pod 수를 3 에서 2 로 줄입니다.

      $ oc scale deployment ostoy-microservice --replicas=2
      Copy to Clipboard Toggle word wrap
    • OpenShift 웹 콘솔 UI의 탐색 메뉴에서 워크로드 > 배포 > ostoy-microservice 를 클릭합니다.
    • 페이지 왼쪽에서 중간에 "3 Pod" 라벨이 있는 파란색 원을 찾습니다.
    • 원 옆에 있는 화살표를 선택하면 Pod 수가 스케일링됩니다. 2 의 아래쪽 화살표를 선택합니다.

검증

CLI, 웹 UI 또는 OSToy 앱을 사용하여 Pod 수를 확인합니다.

  • CLI에서 다음 명령을 실행하여 마이크로 서비스에 두 개의 포드를 사용하고 있는지 확인합니다.

    $ oc get pods
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                                  READY   STATUS    RESTARTS   AGE
    ostoy-frontend-5fbcc7d9-rzlgz         1/1     Running   0          75m
    ostoy-microservice-6666dcf455-2lcv4   1/1     Running   0          50m
    ostoy-microservice-6666dcf455-tqzmn   1/1     Running   0          75m
    Copy to Clipboard Toggle word wrap

  • 웹 UI에서 워크로드 > 배포 > ostoy-microservice 를 선택합니다.

  • OSToy 앱의 탐색 메뉴에서 네트워킹 을 선택하여 사용 중인 두 개의 포드가 있는지 확인할 수도 있습니다. 두 Pod에는 두 개의 색상이 지정된 박스가 있어야 합니다.

18.9.1.2. Pod 자동 확장

AWS의 Red Hat OpenShift Service는 Horizontal Pod Autoscaler (HPA)를 제공합니다. HPA는 필요한 경우 메트릭을 사용하여 Pod 수를 늘리거나 줄입니다.

프로세스

  1. 웹 UI의 탐색 메뉴에서 Pod 자동 스케일링을 선택합니다.

  2. 다음 명령을 실행하여 HPA를 생성합니다.

    $ oc autoscale deployment/ostoy-microservice --cpu-percent=80 --min=1 --max=10
    Copy to Clipboard Toggle word wrap

    이 명령은 ostoy-microservice 배포에서 제어하는 Pod의 복제본 1~10개 사이를 유지 관리하는 HPA를 생성합니다. 배포가 충분하지만 HPA는 모든 Pod의 평균 CPU 사용을 80% 및 40밀리코어로 유지하기 위해 복제본 수를 늘리고 줄입니다.

  3. Pod 자동 확장 > Horizontal Pod 자동 확장 페이지에서 로드 증가를 선택합니다.

    중요

    부하를 늘리면 CPU 집약적 계산이 생성되므로 페이지가 응답하지 않을 수 있습니다. 이는 예상된 응답입니다. Increase the Load only once을 클릭합니다. 프로세스에 대한 자세한 내용은 마이크로 서비스의 GitHub 리포지토리 를 참조하십시오.

    몇 분 후에 새 Pod가 색상이 지정된 박스로 표시되는 페이지에 표시됩니다.

    참고

    이 페이지는 지연이 발생할 수 있습니다.

검증

다음 방법 중 하나를 사용하여 Pod 수를 확인합니다.

  • OSToy 애플리케이션의 웹 UI에서 원격 pod 상자를 참조하십시오.

    Pod가 하나뿐이므로 워크로드를 늘리면 Pod 증가가 트리거됩니다.

  • CLI에서 다음 명령을 실행합니다.

    oc get pods --field-selector=status.phase=Running | grep microservice
    Copy to Clipboard Toggle word wrap

    출력 예

    ostoy-microservice-79894f6945-cdmbd   1/1     Running   0          3m14s
    ostoy-microservice-79894f6945-mgwk7   1/1     Running   0          4h24m
    ostoy-microservice-79894f6945-q925d   1/1     Running   0          3m14s
    Copy to Clipboard Toggle word wrap

  • OpenShift Cluster Manager에서 자동 스케일링을 확인할 수도 있습니다.

    1. OpenShift 웹 콘솔 탐색 메뉴에서 모니터링 > 대시보드를 클릭합니다.
    2. 대시보드에서 Kubernetes / Compute Resources / Namespace (Pods) 및 네임스페이스 ostoy 를 선택합니다.

    3. CPU 및 메모리 전반에 걸쳐 리소스 사용량이 표시되는 그래프가 표시됩니다. 상단 그래프는 Pod당 최근 CPU 사용량이 표시되고 더 낮은 그래프는 메모리 사용량을 나타냅니다. 다음은 그래프의 호출을 나열합니다.

      1. 부하 증가(A).
      2. 두 개의 새 Pod(B 및 C)가 생성되었습니다.
      3. 각 그래프의 간격은 CPU 소비를 나타내며 더 많은 로드를 처리하는 Pod를 나타냅니다.
      4. 로드가 감소하고 Pod가 삭제되었습니다.

18.9.1.3. 노드 자동 확장

AWS의 Red Hat OpenShift Service를 사용하면 노드 자동 스케일링을 사용할 수 있습니다. 이 시나리오에서는 클러스터가 처리할 수 없는 대규모 워크로드가 있는 작업으로 새 프로젝트를 생성합니다. 자동 스케일링이 활성화되면 로드가 현재 용량보다 크면 클러스터에서 자동으로 로드를 처리할 새 노드를 생성합니다.

사전 요구 사항

  • 머신 풀에서 자동 스케일링이 활성화됩니다.

프로세스

  1. 다음 명령을 실행하여 autoscale-ex 라는 새 프로젝트를 생성합니다.

    $ oc new-project autoscale-ex
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 작업을 생성합니다.

    $ oc create -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/job-work-queue.yaml
    Copy to Clipboard Toggle word wrap
  3. 몇 가지 minuts 후 다음 명령을 실행하여 Pod를 확인합니다.

    $ oc get pods
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                     READY   STATUS    RESTARTS   AGE
    work-queue-5x2nq-24xxn   0/1     Pending   0          10s
    work-queue-5x2nq-57zpt   0/1     Pending   0          10s
    work-queue-5x2nq-58bvs   0/1     Pending   0          10s
    work-queue-5x2nq-6c5tl   1/1     Running   0          10s
    work-queue-5x2nq-7b84p   0/1     Pending   0          10s
    work-queue-5x2nq-7hktm   0/1     Pending   0          10s
    work-queue-5x2nq-7md52   0/1     Pending   0          10s
    work-queue-5x2nq-7qgmp   0/1     Pending   0          10s
    work-queue-5x2nq-8279r   0/1     Pending   0          10s
    work-queue-5x2nq-8rkj2   0/1     Pending   0          10s
    work-queue-5x2nq-96cdl   0/1     Pending   0          10s
    work-queue-5x2nq-96tfr   0/1     Pending   0          10s
    Copy to Clipboard Toggle word wrap

  4. Pending 상태에 Pod가 많이 있으므로 이 상태는 자동 스케일러를 트리거하여 머신 풀에 더 많은 노드를 생성해야 합니다. 이러한 작업자 노드를 생성하는 시간을 허용합니다.
  5. 몇 분 후에 다음 명령을 사용하여 현재 보유하고 있는 작업자 노드 수를 확인합니다.

    $ oc get nodes
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                                         STATUS   ROLES          AGE     VERSION
    ip-10-0-138-106.us-west-2.compute.internal   Ready    infra,worker   22h     v1.23.5+3afdacb
    ip-10-0-153-68.us-west-2.compute.internal    Ready    worker         2m12s   v1.23.5+3afdacb
    ip-10-0-165-183.us-west-2.compute.internal   Ready    worker         2m8s    v1.23.5+3afdacb
    ip-10-0-176-123.us-west-2.compute.internal   Ready    infra,worker   22h     v1.23.5+3afdacb
    ip-10-0-195-210.us-west-2.compute.internal   Ready    master         23h     v1.23.5+3afdacb
    ip-10-0-196-84.us-west-2.compute.internal    Ready    master         23h     v1.23.5+3afdacb
    ip-10-0-203-104.us-west-2.compute.internal   Ready    worker         2m6s    v1.23.5+3afdacb
    ip-10-0-217-202.us-west-2.compute.internal   Ready    master         23h     v1.23.5+3afdacb
    ip-10-0-225-141.us-west-2.compute.internal   Ready    worker         23h     v1.23.5+3afdacb
    ip-10-0-231-245.us-west-2.compute.internal   Ready    worker         2m11s   v1.23.5+3afdacb
    ip-10-0-245-27.us-west-2.compute.internal    Ready    worker         2m8s    v1.23.5+3afdacb
    ip-10-0-245-7.us-west-2.compute.internal     Ready    worker         23h     v1.23.5+3afdacb
    Copy to Clipboard Toggle word wrap

    워크로드를 처리하기 위해 작업자 노드가 자동으로 생성되었는지 확인할 수 있습니다.

  6. 다음 명령을 입력하여 OSToy 앱으로 돌아갑니다.

    $ oc project ostoy
    Copy to Clipboard Toggle word wrap

18.10. 튜토리얼: 로깅

AWS(ROSA)의 Red Hat OpenShift Service에서 로그를 확인하는 방법은 여러 가지가 있습니다. 다음 절차에 따라 로그를 AWS CloudMonitor로 전달하고 oc logs 를 사용하여 Pod를 통해 로그를 직접 확인합니다.

참고

ROSA는 로깅 솔루션으로 사전 구성되지 않았습니다.

18.10.1. CloudMonitor로 로그 전달

로깅 애드온 서비스를 설치하여 로그를 AWS CloudMonitor로 전달합니다.

  1. 다음 스크립트를 실행하여 로그를 CloudMonitor로 전달하도록 ROSA 클러스터를 구성합니다.

    $ curl https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/resources/configure-cloudwatch.sh | bash
    Copy to Clipboard Toggle word wrap
    참고

    CloudMonitor에 로그를 보내도록 ROSA를 구성하는 것은 이 튜토리얼의 범위를 벗어납니다. AWS와 통합 및 CloudWatch 로깅 활성화는 ROSA의 중요한 측면이므로 구성 프로세스를 단순화하기 위해 스크립트가 포함됩니다. 이 스크립트는 AWS CloudMonitor를 자동으로 설정합니다. 스크립트를 검사하여 관련 단계를 이해할 수 있습니다.

    출력 예

    Varaibles are set...ok.
    Policy already exists...ok.
    Created RosaCloudWatch-mycluster role.
    Attached role policy.
    Deploying the Red Hat OpenShift Logging Operator
    namespace/openshift-logging configured
    operatorgroup.operators.coreos.com/cluster-logging created
    subscription.operators.coreos.com/cluster-logging created
    Waiting for Red Hat OpenShift Logging Operator deployment to complete...
    Red Hat OpenShift Logging Operator deployed.
    secret/cloudwatch-credentials created
    clusterlogforwarder.logging.openshift.io/instance created
    clusterlogging.logging.openshift.io/instance created
    Complete.
    Copy to Clipboard Toggle word wrap

  2. 몇 분 후에 AWS CloudMonitor 내부에 로그 그룹을 볼 수 있습니다. 다음 명령을 실행하여 로그 그룹을 확인합니다.

    $ aws logs describe-log-groups --log-group-name-prefix rosa-mycluster
    Copy to Clipboard Toggle word wrap

    출력 예

    {
        "logGroups": [
            {
                "logGroupName": "rosa-mycluster.application",
                "creationTime": 1724104537717,
                "metricFilterCount": 0,
                "arn": "arn:aws:logs:us-west-2:000000000000:log-group:rosa-mycluster.application:*",
                "storedBytes": 0,
                "logGroupClass": "STANDARD",
                "logGroupArn": "arn:aws:logs:us-west-2:000000000000:log-group:rosa-mycluster.application"
            },
            {
                "logGroupName": "rosa-mycluster.audit",
                "creationTime": 1724104152968,
                "metricFilterCount": 0,
                "arn": "arn:aws:logs:us-west-2:000000000000:log-group:rosa-mycluster.audit:*",
                "storedBytes": 0,
                "logGroupClass": "STANDARD",
                "logGroupArn": "arn:aws:logs:us-west-2:000000000000:log-group:rosa-mycluster.audit"
            },
    Copy to Clipboard Toggle word wrap

18.10.2. 스트림 및 로그에 데이터 출력

  1. 메시지를 stdout 에 출력합니다.

    1. OSToy 애플리케이션에서 홈을 클릭한 다음 로그 메시지(stdout)에 대한 메시지 상자를 클릭합니다.
    2. stdout 스트림에 출력할 메시지를 작성합니다(예: "All is well!").
    3. 메시지 전송을 클릭합니다.

      cloud experts deploying application logging ostoy stdout

  2. stderr 에 메시지를 출력합니다.

    1. 로그 메시지(stderr)의 메시지 상자를 클릭합니다.
    2. stderr 스트림(예: "Oh no!)으로 출력할 메시지를 작성합니다. 오류!".
    3. 메시지 전송을 클릭합니다.

      cloud experts deploying application logging ostoy stderr

18.10.3. oc 명령을 사용하여 애플리케이션 로그 보기

  1. CLI(명령줄 인터페이스)에 다음 명령을 입력하여 프런트 엔드 Pod의 이름을 검색합니다.

    $ oc get pods -o name
    Copy to Clipboard Toggle word wrap

    출력 예

    pod/ostoy-frontend-679cb85695-5cn7x 
    1
    
    pod/ostoy-microservice-86b4c6f559-p594d
    Copy to Clipboard Toggle word wrap

    1
    포드 이름은 ostoy-frontend-679cb85695-5cn7x 입니다.
  2. 다음 명령을 실행하여 stdoutstderr 메시지를 모두 확인합니다.

    $ oc logs <pod-name>
    Copy to Clipboard Toggle word wrap

    출력 예

    $ oc logs ostoy-frontend-679cb85695-5cn7x
    [...]
    ostoy-frontend-679cb85695-5cn7x: server starting on port 8080
    Redirecting to /home
    stdout: All is well!
    stderr: Oh no! Error!
    Copy to Clipboard Toggle word wrap

18.10.4. CloudMonitor를 사용하여 로그 보기

  1. AWS 웹 콘솔에서 CloudWatch 로 이동합니다.
  2. 왼쪽 메뉴에서 로그 및 로그 를 클릭하여 다른 로그 그룹을 확인합니다. 세 개의 그룹이 표시됩니다.

    • rosa-<cluster-name>.application
    • rosa-<cluster-name>.audit
    • rosa-<cluster-name>.infrastructure

      cloud experts deploying application logging cw

  3. rosa-<cluster-name>.application 을 클릭합니다.
  4. 프런트 엔드 포드의 로그 스트림을 클릭합니다.

    cloud experts deploying application logging logstream2

  5. stdoutstderr 에 대해 필터링합니다.
  6. 행을 확장하여 이전에 입력한 메시지 및 기타 관련 정보를 표시합니다.

    cloud experts deploying application logging stderr

  7. 로그 스트림으로 돌아가서 마이크로 서비스를 선택합니다.
  8. 검색 창에 "microservice"를 입력하여 로그에 다른 메시지를 확인합니다.
  9. 항목 중 하나를 확장하여 마이크로 서비스에서 수신한 프런트 엔드 포드의 색상과 해당 색상을 frontend 포드에 보낸 포드를 확인합니다.

    cloud experts deploying application logging messages

18.11. 튜토리얼: S2I 배포

OpenShift에 애플리케이션을 배포하는 방법은 여러 가지가 있습니다. 이 튜토리얼에서는 통합된 S2I(Source-to-Image) 빌더를 사용하는 방법을 설명합니다. OpenShift 개념 섹션에서 언급했듯이 S2I는 재현 가능한 Docker 형식의 컨테이너 이미지를 빌드하는 툴입니다.

18.11.1. 사전 요구 사항

이 튜토리얼을 사용하려면 먼저 다음 요구 사항을 완료해야 합니다.

  1. ROSA 클러스터를 생성했습니다.
  2. 로그인 명령 검색

    1. CLI를 통해 로그인하지 않은 경우 OpenShift Cluster Manager 에서 오른쪽 상단에 있는 이름 옆에 있는 드롭다운 화살표를 클릭하고 로그인 명령 복사를 선택합니다.

    2. 새 탭이 열립니다. 사용자 이름과 암호를 입력하고 인증 방법을 선택합니다.
    3. 토큰 표시를클릭합니다.
    4. "이 토큰을 사용하여 로그인"에서 명령을 복사합니다.
    5. 터미널에서 복사한 명령을 실행하여 CLI(명령줄 인터페이스)에 로그인합니다. 다음과 유사한 내용이 표시되어야 합니다.

      $ oc login --token=RYhFlXXXXXXXXXXXX --server=https://api.osd4-demo.abc1.p1.openshiftapps.com:6443
      Copy to Clipboard Toggle word wrap

      출력 예

      Logged into "https://api.myrosacluster.abcd.p1.openshiftapps.com:6443" as "rosa-user" using the token provided.
      
      You don't have any projects. You can try to create a new project, by running
      
      oc new-project <project name>
      Copy to Clipboard Toggle word wrap

  3. 다음 명령을 실행하여 CLI에서 새 프로젝트를 생성합니다.

    $ oc new-project ostoy-s2i
    Copy to Clipboard Toggle word wrap

18.11.2. OSToy 리포지토리 분기

다음 섹션에서는 소스 코드 변경 사항을 기반으로 자동화된 빌드를 트리거하는 데 중점을 둡니다. GitHub 리포지터리로 코드를 내보낼 때 S2I 빌드를 트리거하려면 GitHub Webhook를 설정해야 합니다. Webhook를 설정하려면 먼저 리포지터리를 분기 해야 합니다.

참고

이 가이드에서 < UserName >을 다음 URL의 고유한 GitHub 사용자 이름으로 바꿉니다.

18.11.3. S2i를 사용하여 클러스터에 OSToy 배포

  1. OpenShift에 시크릿 추가

    이 예제에서는 .env 파일을 에뮬레이션하고 이를 OpenShift 환경으로 직접 이동하는 것이 얼마나 쉬운지 보여줍니다. 시크릿에서 파일의 이름을 변경할 수도 있습니다. CLI에서 다음 명령을 입력하고 < UserName>을 GitHub 사용자 이름으로 바꿉니다.

    $ oc create -f https://raw.githubusercontent.com/<UserName>/ostoy/master/deployment/yaml/secret.yaml
    Copy to Clipboard Toggle word wrap
  2. OpenShift에 ConfigMap 추가

    이 예제에서는 HAProxy 구성 파일을 에뮬레이션하며 일반적으로 OpenShift 애플리케이션의 기본 구성을 재정의하는 데 사용됩니다. ConfigMap에서 파일의 이름을 변경할 수도 있습니다.

    CLI에서 다음 명령을 입력하고 < UserName>을 GitHub 사용자 이름으로 바꿉니다.

    $ oc create -f https://raw.githubusercontent.com/<UserName>/ostoy/master/deployment/yaml/configmap.yaml
    Copy to Clipboard Toggle word wrap
  3. 마이크로 서비스 배포

    UI 애플리케이션에서 SERVICE 환경 변수를 사용할 수 있도록 먼저 마이크로 서비스를 배포해야 합니다. --context-dir 은 git 리포지토리의 마이크로 서비스 디렉터리에 정의된 애플리케이션만 빌드하는 데 사용됩니다. app 레이블을 사용하면 UI 애플리케이션과 마이크로 서비스가 모두 OpenShift UI로 그룹화되었는지 확인할 수 있습니다. CLI에서 다음 명령을 실행하여 마이크로 서비스를 생성하고 < UserName >을 GitHub 사용자 이름으로 교체합니다.

    $ oc new-app https://github.com/<UserName>/ostoy \
        --context-dir=microservice \
        --name=ostoy-microservice \
        --labels=app=ostoy
    Copy to Clipboard Toggle word wrap

    출력 예

    --> Creating resources with label app=ostoy ...
        imagestream.image.openshift.io "ostoy-microservice" created
        buildconfig.build.openshift.io "ostoy-microservice" created
        deployment.apps "ostoy-microservice" created
        service "ostoy-microservice" created
    --> Success
        Build scheduled, use 'oc logs -f buildconfig/ostoy-microservice' to track its progress.
        Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
         'oc expose service/ostoy-microservice'
        Run 'oc status' to view your app.
    Copy to Clipboard Toggle word wrap

  4. 마이크로 서비스의 상태 확인

    다음 단계로 이동하기 전에 다음 명령을 실행하여 마이크로 서비스가 생성되었고 올바르게 실행되고 있는지 확인해야 합니다.

    $ oc status
    Copy to Clipboard Toggle word wrap

    출력 예

    In project ostoy-s2i on server https://api.myrosacluster.g14t.p1.openshiftapps.com:6443
    
    svc/ostoy-microservice - 172.30.47.74:8080
      dc/ostoy-microservice deploys istag/ostoy-microservice:latest <-
        bc/ostoy-microservice source builds https://github.com/UserName/ostoy on openshift/nodejs:14-ubi8
        deployment #1 deployed 34 seconds ago - 1 pod
    Copy to Clipboard Toggle word wrap

    성공적으로 배포될 때까지 기다립니다. 웹 UI를 통해 이를 확인할 수도 있습니다.

  5. 프런트 엔드 UI 배포

    애플리케이션은 여러 환경 변수를 사용하여 외부 설정을 정의하도록 설계되었습니다. 이전에 생성된 Secret 및 ConfigMap을 나중에 PersistentVolume 생성과 함께 연결합니다. CLI에 다음을 입력합니다.

    $ oc new-app https://github.com/<UserName>/ostoy \
        --env=MICROSERVICE_NAME=OSTOY_MICROSERVICE
    Copy to Clipboard Toggle word wrap

    출력 예

    --> Creating resources ...
        imagestream.image.openshift.io "ostoy" created
        buildconfig.build.openshift.io "ostoy" created
        deployment.apps "ostoy" created
        service "ostoy" created
    --> Success
        Build scheduled, use 'oc logs -f buildconfig/ostoy' to track its progress.
        Application is not exposed. You can expose services to the outside world by executing one or more of the commands below:
         'oc expose service/ostoy'
        Run 'oc status' to view your app.
    Copy to Clipboard Toggle word wrap

  6. 배포 업데이트

    영구 볼륨과의 일관된 배포를 위해 "Recreate" 배포 전략(기본값 RollingUpdate)을 사용하도록 배포를 업데이트합니다. 여기에서 추론하는 것은 PV가 EBS에 의해 지원되기 때문에 RWO 방법만 지원되기 때문입니다. 기존 Pod가 모두 종료되지 않고 배포를 업데이트하는 경우 기존 Pod에 바인딩되어도 PV에 대한 PVC를 생성하고 새 Pod를 예약할 수 없을 수 있습니다. EFS를 사용하는 경우 이를 변경할 필요가 없습니다.

    $ oc patch deployment ostoy --type=json -p \
        '[{"op": "replace", "path": "/spec/strategy/type", "value": "Recreate"}, {"op": "remove", "path": "/spec/strategy/rollingUpdate"}]'
    Copy to Clipboard Toggle word wrap
  7. 활성 상태 프로브 설정

    배포 시 활성 상태 프로브를 생성하여 애플리케이션 내에서 정상이 아닌 경우 Pod가 다시 시작되었는지 확인합니다. CLI에 다음을 입력합니다.

    $ oc set probe deployment ostoy --liveness --get-url=http://:8080/health
    Copy to Clipboard Toggle word wrap
  8. 배포에 Secret, ConfigMap, PersistentVolume 연결

    다음 명령을 실행하여 보안, ConfigMap 및 PersistentVolume을 연결합니다.

    1. 시크릿 연결

      $ oc set volume deployment ostoy --add \
          --secret-name=ostoy-secret \
          --mount-path=/var/secret
      Copy to Clipboard Toggle word wrap
    2. 연결 ConfigMap

      $ oc set volume deployment ostoy --add \
          --configmap-name=ostoy-config \
          -m /var/config
      Copy to Clipboard Toggle word wrap
    3. PersistentVolume 생성 및 연결

      $ oc set volume deployment ostoy --add \
          --type=pvc \
          --claim-size=1G \
          -m /var/demo_files
      Copy to Clipboard Toggle word wrap
  9. UI 애플리케이션을 OpenShift 경로로 노출

    다음 명령을 실행하여 포함된 TLS 와일드카드 인증서를 사용하는 HTTPS 애플리케이션으로 배포합니다.

    $ oc create route edge --service=ostoy --insecure-policy=Redirect
    Copy to Clipboard Toggle word wrap
  10. 다음 방법을 사용하여 애플리케이션을 찾습니다.

    • 다음 명령을 실행하면 OSToy 애플리케이션이 있는 웹 브라우저가 열립니다.

      $ python -m webbrowser "$(oc get route ostoy -o template --template='https://{{.spec.host}}')"
      Copy to Clipboard Toggle word wrap
    • 다음 명령을 실행하여 애플리케이션의 경로를 가져오고 브라우저에 경로를 복사하여 붙여넣을 수 있습니다.

      $ oc get route
      Copy to Clipboard Toggle word wrap

18.12. 튜토리얼: 자동화된 배포를 위해 S2I(Source-to-Image) Webhook 사용

Webhook를 사용하여 소스 코드를 변경할 때마다 빌드를 자동으로 트리거하고 배포합니다. 이 프로세스에 대한 자세한 내용은 빌드 트리거를 참조하십시오.

프로세스

  1. 터미널에서 GitHub Webhook 트리거 보안을 가져오려면 다음 명령을 실행합니다.

    $ oc get bc/ostoy-microservice -o=jsonpath='{.spec.triggers..github.secret}'
    Copy to Clipboard Toggle word wrap

    출력 예

    `o_3x9M1qoI2Wj_cz1WiK`
    Copy to Clipboard Toggle word wrap

    중요

    이 프로세스의 이후 단계에서 이 시크릿을 사용해야 합니다.

  2. OSToy의 buildconfig에서 GitHub Webhook 트리거 URL을 가져오려면 다음 명령을 실행합니다.

    $ oc describe bc/ostoy-microservice
    Copy to Clipboard Toggle word wrap

    출력 예

    [...]
    Webhook GitHub:
    	URL:	https://api.demo1234.openshift.com:443/apis/build.openshift.io/v1/namespaces/ostoy-s2i/buildconfigs/ostoy/webhooks/<secret>/github
    [...]
    Copy to Clipboard Toggle word wrap

  3. GitHub Webhook URL에서 < secret> 텍스트를 검색한 시크릿으로 바꿉니다. URL은 다음 예제 출력과 유사합니다.

    출력 예

    https://api.demo1234.openshift.com:443/apis/build.openshift.io/v1/namespaces/ostoy-s2i/buildconfigs/ostoy-microservice/webhooks/o_3x9M1qoI2Wj_czR1WiK/github
    Copy to Clipboard Toggle word wrap

  4. GitHub 리포지토리에 Webhook URL을 설정합니다.

    1. 리포지토리에서 설정 > Webhook > Webhook 추가 를 클릭합니다.

    2. "Payload URL" 필드에 포함된 Secret 을 사용하여 GitHub Webhook URL을 붙여넣습니다.
    3. "Content type"을 application/json 으로 변경합니다.
    4. Webhook 추가 버튼을 클릭합니다.

      GitHub에서 Webhook가 성공적으로 구성되었음을 알리는 메시지가 표시됩니다. 이제 GitHub 리포지토리에 변경 사항을 푸시할 때마다 새 빌드가 자동으로 시작되고 빌드가 성공하면 새 배포가 시작됩니다.

  5. 이제 소스 코드를 변경합니다. 모든 변경 사항은 빌드 및 배포를 자동으로 트리거합니다. 이 예에서는 OSToy 앱의 상태를 나타내는 색상이 임의로 선택됩니다. 구성을 테스트하려면 상자를 회색 스케일링만 표시하도록 변경합니다.

    1. 리포지토리의 소스 코드로 이동합니다 https://github.com/<username>/ostoy/blob/master/microservice/app.js.
    2. 파일을 편집합니다.
    3. 8행을 주석으로 주석 처리(로우를 허용하면 random color = getRandom Cryostat();).
    4. Uncomment line 9 (containing let randomColor = getRandomGrayScaleColor();).

      7   app.get('/', function(request, response) {
      8   //let randomColor = getRandomColor(); // <-- comment this
      9   let randomColor = getRandomGrayScaleColor(); // <-- uncomment this
      10
      11  response.writeHead(200, {'Content-Type': 'application/json'});
      Copy to Clipboard Toggle word wrap
    5. "Graphscale 색상으로 변경됨"과 같은 업데이트 메시지를 입력합니다.
    6. 하단에서 커밋 을 클릭하여 기본 분기에 대한 변경 사항을 커밋합니다.
  6. 클러스터의 웹 UI에서 빌드 > 빌드 를 클릭하여 빌드 상태를 확인합니다. 이 빌드가 완료되면 배포가 시작됩니다. 터미널에서 oc 상태를 실행하여 상태를 확인할 수도 있습니다.

  7. 배포가 완료되면 브라우저의 OSToy 애플리케이션으로 돌아갑니다. 왼쪽의 Networking 메뉴 항목에 액세스합니다. 이제 상자 색상은 회색 영역 색상으로만 제한됩니다.

18.13. 튜토리얼: AWS 서비스와 통합

OSToy 애플리케이션이 독립적으로 작동하지만 많은 실제 애플리케이션에는 데이터베이스, 개체 저장소 또는 메시징 서비스와 같은 외부 서비스가 필요합니다.

목표

  • OSToy 애플리케이션을 다른 AWS(Amazon Web Services) 서비스, 특히 AWS S3 Storage와 통합하는 방법을 알아보십시오. 이 섹션이 끝나면 애플리케이션은 AWS S3 Storage에서 오브젝트를 안전하게 생성하고 읽습니다.
  • Kubernetes(ACK)용 Amazon Controller를 사용하여 Kubernetes에서 직접 애플리케이션에 필요한 서비스를 생성합니다.
  • 서비스 계정에서 액세스 및 인증을 관리하려면 IAM(Identity and Access Management) 역할을 사용합니다.
  • OSToy를 사용하여 기본 텍스트 파일을 생성하여 S3 버킷에 저장합니다.
  • 파일이 성공적으로 추가되었으며 버킷에서 읽을 수 있는지 확인합니다.

18.13.1. Amazon Controller for Kubernetes (ACK)

ACK 를 사용하여 Kubernetes에서 직접 AWS 서비스를 생성하고 사용합니다. 친숙한 구조를 사용하여 S3 버킷 또는 RDS(Database Service) 데이터베이스와 같은 AWS 서비스를 선언적으로 정의하고 생성하는 방식으로 Kubernetes 프레임워크에 애플리케이션을 직접 배포할 수 있습니다.

ACK를 사용하면 S3 버킷을 만들고 OSToy 애플리케이션과 통합하고 파일을 업로드한 후 애플리케이션에서 파일을 볼 수 있습니다.

18.13.2. 서비스 계정의 IAM 역할

서비스 계정에 IAM 역할을 사용하여 Kubernetes 서비스 계정에 직접 IAM 역할을 할당할 수 있습니다. 이를 사용하여 AWS 계정에 서비스를 배포하기 위해 ACK 컨트롤러 자격 증명을 부여할 수 있습니다. 서비스 계정에 IAM 역할을 사용하여 임시 인증 정보의 관리 및 순환을 자동화합니다.

Pod는 유효한 OpenID Connect(OIDC) JSON 웹 토큰(JWT)을 수신하고 이를 AWS STS AssumeRoleWithWebIdentity API 작업에 전달하여 IAM 임시 역할 인증 정보를 수신합니다. 이 프로세스는 AWS IAM 액세스가 필요한 Pod를 수정하는 EKS Pod ID 변경 Webhook를 사용합니다.

서비스 계정의 IAM 역할은 다음과 같은 모범 사례를 따릅니다.

  • 최소 권한 원칙: 제한된 액세스만 허용하는 AWS 역할에 대한 IAM 권한을 생성할 수 있습니다. 이러한 권한은 역할과 연결된 서비스 계정으로 제한되며 해당 서비스 계정을 사용하는 Pod만 액세스할 수 있습니다.
  • 인증 정보 격리: Pod는 Pod가 사용 중인 서비스 계정과 연결된 IAM 역할에 대한 인증 정보만 검색할 수 있습니다.
  • 감사: 모든 AWS 리소스 액세스는 CloudTrail에서 볼 수 있습니다.

18.13.3. ACK 컨트롤러 설치

버킷에 Kubernetes 사용자 지정 리소스를 사용하여 S3 서비스에서 버킷을 생성하고 삭제하려면 ACK 컨트롤러를 설치합니다. 컨트롤러를 설치하면 필요한 네임스페이스 및 서비스 계정도 생성됩니다.

Operator를 사용하여 쉽게 수행할 수 있습니다. Operator 설치에서는 ack-system 네임스페이스와 서비스 계정 ack-s3-controller 도 생성합니다.

  1. 클러스터 콘솔에 로그인합니다.
  2. 왼쪽 메뉴에서 Operator를 클릭한 다음 OperatorHub 를 클릭합니다.
  3. 필터 상자에 "S3"를 입력하고 AWS Controller for Kubernetes - Amazon S3 를 선택합니다.

    cloud experts deploying integrating ack operator

  4. 커뮤니티 운영자에 대한 팝업이 표시되면 Continue 를 클릭합니다.
  5. 설치를 클릭합니다.
  6. "설치 모드" 에서 클러스터의 모든 네임스페이스를 선택합니다.
  7. "설치된 네임스페이스"에서 ack-system 을 선택합니다.
  8. "업데이트 승인"에서 수동 을 선택합니다.

    중요

    수동 모드가 선택되어 있는지 확인하므로 서비스 계정에 대한 변경 사항이 자동 운영자 업데이트로 덮어쓰지 않습니다.

  9. 설치를 클릭합니다.

    설정은 아래 이미지와 같아야 합니다.

    cloud experts deployment integrating ack install

  10. 승인 을 클릭합니다.
  11. ACK 컨트롤러에 대한 IAM 역할 및 정책을 생성할 때까지 설치가 시작되지만 완료되지 않습니다.

18.13.4. ACK 컨트롤러에 대한 IAM 역할 및 정책 생성

  1. 다음 스크립트 중 하나를 실행하여 ACK 컨트롤러에 대한 AWS IAM 역할을 생성하고 S3 정책을 할당합니다.

    • 자동으로 setup-s3-ack-controller.sh 스크립트를 다운로드하여 사용자를 위한 프로세스를 자동화합니다.
    • CLI(명령줄 인터페이스)에서 다음 스크립트를 실행합니다.

      $ curl https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/resources/setup-s3-ack-controller.sh | bash
      Copy to Clipboard Toggle word wrap
  2. 스크립트가 완료되면 서비스 계정 환경 변수에 대한 IAM 역할로 서비스 컨트롤러 Pod를 업데이트하는 배포를 재시작합니다.
  3. 다음 명령을 실행하여 환경 변수가 설정되었는지 확인합니다.

    $ oc describe pod ack-s3-controller -n ack-system | grep "^\s*AWS_"
    Copy to Clipboard Toggle word wrap

    출력 예

    AWS_ROLE_ARN:                 arn:aws:iam::000000000000:role/ack-s3-controller
    AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
    Copy to Clipboard Toggle word wrap

  4. Operator 및 설치된 Operator를 클릭하여 웹 콘솔에서 ACK 컨트롤러의 설치를 성공적으로 확인합니다.

    cloud experts deployment installing ack oper installed

  5. Operator 설치 및 환경 변수가 표시되지 않는 경우 다음 명령을 실행하여 배포를 수동으로 다시 시작합니다.

    $ oc rollout restart deployment ack-s3-controller -n ack-system
    Copy to Clipboard Toggle word wrap

18.13.5. 애플리케이션에 대한 액세스 설정

OSToy가 S3 버킷에 오브젝트를 읽고 쓸 수 있도록 AWS IAM 역할 및 서비스 계정을 생성할 수 있습니다.

  1. 다음 명령을 실행하여 OSToy에 대한 새 고유 프로젝트를 생성합니다.

    $ oc new-project ostoy-$(uuidgen | cut -d - -f 2 | tr '[:upper:]' '[:lower:]')
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 네임스페이스 및 프로젝트의 이름을 환경 변수에 저장합니다.

    $ export OSTOY_NAMESPACE=$(oc config view --minify -o 'jsonpath={..namespace}')
    Copy to Clipboard Toggle word wrap

18.13.6. AWS IAM 역할 생성

  1. 다음 명령을 실행하여 AWS 계정 ID를 가져옵니다.

    $ export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text)
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 OIDC 공급자를 가져와서 < cluster-name >을 클러스터 이름으로 교체합니다.

    $ export OIDC_PROVIDER=$(rosa describe cluster -c <cluster-name> -o yaml | awk '/oidc_endpoint_url/ {print $2}' | cut -d '/' -f 3,4)
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 신뢰 정책 파일을 생성합니다.

    $ cat <<EOF > ./ostoy-sa-trust.json
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::${AWS_ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "${OIDC_PROVIDER}:sub": "system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa"
            }
          }
        }
      ]
    }
    EOF
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 서비스 계정과 함께 사용할 AWS IAM 역할을 생성합니다.

    $ aws iam create-role --role-name "ostoy-sa-role" --assume-role-policy-document file://ostoy-sa-trust.json
    Copy to Clipboard Toggle word wrap

18.13.7. IAM 역할에 S3 정책 연결

  1. 다음 명령을 실행하여 S3 전체 액세스 정책 ARN을 가져옵니다.

    $ export POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`AmazonS3FullAccess`].Arn' --output text)
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 AWS IAM 역할에 정책을 연결합니다.

    $ aws iam attach-role-policy --role-name "ostoy-sa-role" --policy-arn "${POLICY_ARN}"
    Copy to Clipboard Toggle word wrap

18.13.8. Pod의 서비스 계정 생성

  1. 다음 명령을 실행하여 서비스 계정을 생성할 때 주석으로 포함되도록 생성한 AWS IAM 역할에 대한 ARN을 가져옵니다.

    $ export APP_IAM_ROLE_ARN=$(aws iam get-role --role-name=ostoy-sa-role --query Role.Arn --output text)
    Copy to Clipboard Toggle word wrap
  2. 다음 명령을 실행하여 서비스 계정을 생성합니다.

    $ cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: ostoy-sa
      namespace: ${OSTOY_NAMESPACE}
      annotations:
        eks.amazonaws.com/role-arn: "$APP_IAM_ROLE_ARN"
    EOF
    Copy to Clipboard Toggle word wrap
    중요

    서비스 계정의 이름을 "ostoy-sa"에서 변경하지 마십시오. 그렇지 않으면 AWS IAM 역할에 대한 신뢰 관계를 변경해야 합니다.

  3. 다음 명령을 실행하여 서비스 계정에 restricted 역할을 부여합니다.

    $ oc adm policy add-scc-to-user restricted system:serviceaccount:${OSTOY_NAMESPACE}:ostoy-sa
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 주석이 성공했는지 확인합니다.

    $ oc describe serviceaccount ostoy-sa -n ${OSTOY_NAMESPACE}
    Copy to Clipboard Toggle word wrap

    출력 예

    Name:                ostoy-sa
    Namespace:           ostoy
    Labels:              <none>
    Annotations:         eks.amazonaws.com/role-arn: arn:aws:iam::000000000000:role/ostoy-sa-role
    Image pull secrets:  ostoy-sa-dockercfg-b2l94
    Mountable secrets:   ostoy-sa-dockercfg-b2l94
    Tokens:              ostoy-sa-token-jlc6d
    Events:              <none>
    Copy to Clipboard Toggle word wrap

18.13.9. S3 버킷 생성

  1. 다음 명령을 실행하여 매니페스트 파일을 사용하여 S3 버킷을 생성합니다.

    $ cat <<EOF | oc apply -f -
    apiVersion: s3.services.k8s.aws/v1alpha1
    kind: Bucket
    metadata:
      name: ${OSTOY_NAMESPACE}-bucket
      namespace: ${OSTOY_NAMESPACE}
    spec:
      name: ${OSTOY_NAMESPACE}-bucket
    EOF
    Copy to Clipboard Toggle word wrap
    중요

    OSToy 애플리케이션은 < namespace>-bucket이라는 버킷을 찾을 것으로 예상합니다. OSToy 프로젝트의 네임스페이스 이외의 항목을 사용하는 경우 이 기능이 작동하지 않습니다. 예를 들어, 프로젝트가 "ostoy"인 경우 name 값은 ostoy-bucket 이어야 합니다.

  2. 다음 명령을 실행하여 버킷이 생성되었는지 확인합니다.

    $ aws s3 ls | grep ${OSTOY_NAMESPACE}-bucket
    Copy to Clipboard Toggle word wrap

18.13.10. 새 서비스 계정으로 OSToy 앱 재배포

  1. 생성한 서비스 계정으로 Pod를 실행합니다.
  2. 다음 명령을 실행하여 마이크로 서비스를 배포합니다.

    $ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-microservice-deployment.yaml
    Copy to Clipboard Toggle word wrap
  3. 다음 명령을 실행하여 ostoy-frontend 를 배포합니다.

    $ - oc apply -f https://raw.githubusercontent.com/openshift-cs/rosaworkshop/master/rosa-workshop/ostoy/yaml/ostoy-frontend-deployment.yaml
    Copy to Clipboard Toggle word wrap
  4. 다음 명령을 실행하여 ostoy-frontend 배포를 패치합니다.

    $ oc patch deploy ostoy-frontend -n ${OSTOY_NAMESPACE} --type=merge --patch '{"spec": {"template": {"spec":{"serviceAccount":"ostoy-sa"}}}}'
    Copy to Clipboard Toggle word wrap

    출력 예

    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
        image: quay.io/ostoylab/ostoy-frontend:1.6.0
        imagePullPolicy: IfNotPresent
    [...]
    Copy to Clipboard Toggle word wrap

  5. Pod가 업데이트될 때까지 기다립니다.

18.13.11. 환경 변수 확인

  • 다음 명령을 사용하여 Pod를 설명하고 애플리케이션에 대한 AWS_LOAD_IDENTITY_TOKEN_FILEAWS_ROLE_ARN 환경 변수가 있는지 확인합니다.

    $ oc describe pod ostoy-frontend -n ${OSTOY_NAMESPACE} | grep "^\s*AWS_"
    Copy to Clipboard Toggle word wrap

    출력 예

    AWS_ROLE_ARN:                 arn:aws:iam::000000000000:role/ostoy-sa
    AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
    Copy to Clipboard Toggle word wrap

18.13.12. OSToy를 통해 버킷 콘텐츠 보기

앱을 사용하여 S3 버킷의 콘텐츠를 봅니다.

  1. 다음 명령을 실행하여 새로 배포된 애플리케이션의 경로를 가져옵니다.

    $ oc get route ostoy-route -n ${OSTOY_NAMESPACE} -o jsonpath='{.spec.host}{"\n"}'
    Copy to Clipboard Toggle word wrap
  2. 새 브라우저 탭을 열고 이전 단계에서 가져온 경로를 입력합니다.

    중요

    https:// 가 아닌 http:// 를 사용해야 합니다.

  3. OSToy의 왼쪽 메뉴에서 ACK S3 을 클릭합니다.
  4. 새 버킷이므로 버킷이 비어 있어야 합니다.

    cloud expert deploying integrating ack views3contents

18.13.13. S3 버킷에 파일 생성

OStoy를 사용하여 파일을 생성하고 S3 버킷에 업로드합니다. S3는 모든 종류의 파일을 허용할 수 있지만 이 튜토리얼에서는 브라우저에서 내용을 쉽게 렌더링할 수 있도록 텍스트 파일을 사용합니다.

  1. OSToy의 왼쪽 메뉴에서 ACK S3 을 클릭합니다.
  2. 아래로 스크롤하여 텍스트 파일을 S3에 업로드 합니다.
  3. 파일의 파일 이름을 입력합니다.
  4. 파일에 대한 콘텐츠를 입력합니다.
  5. 파일 생성을 클릭합니다.

    cloud expert deploying integrating ack creates3obj

  6. 기존 파일의 맨 위 섹션으로 스크롤하여 방금 만든 파일이 있는지 확인합니다.
  7. 파일 이름을 클릭하여 파일을 확인합니다.

    cloud experts deploying integrating ack viewobj

  8. 다음 명령을 실행하여 버킷의 콘텐츠를 나열하여 AWS CLI로 확인합니다.

    $ aws s3 ls s3://${OSTOY_NAMESPACE}-bucket
    Copy to Clipboard Toggle word wrap

    출력 예

    $ aws s3 ls s3://ostoy-bucket
    2023-05-04 22:20:51         51 OSToy.txt
    Copy to Clipboard Toggle word wrap

Legal Notice

Copyright © 2025 Red Hat

OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).

Modified versions must remove all Red Hat trademarks.

Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.

Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman 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 Software Collections 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.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2025 Red Hat