사용자 가이드
OpenShift Container Platform에서 샌드박스 컨테이너 배포
초록
머리말 링크 복사링크가 클립보드에 복사되었습니다!
Red Hat 문서에 관한 피드백 제공
Jira에서 문제 생성 양식을 제출하여 피드백을 제공하거나 오류를 보고할 수 있습니다. Jira 문제는 Red Hat Hybrid Cloud Infrastructure Jira 프로젝트에서 생성되어 피드백의 진행 상황을 추적할 수 있습니다.
- Jira에 로그인했는지 확인합니다. Jira 계정이 없는 경우 Red Hat Jira 계정을 생성해야 합니다.
- Create Issue 양식을 시작합니다.
요약,설명 및 보고자 필드를 완료합니다.
설명 필드에 문서 URL, 장 또는 섹션 번호, 문제에 대한 자세한 설명을 포함합니다.
- 생성을 클릭합니다.
1장. OpenShift 샌드박스 컨테이너 정보 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform용 OpenShift 샌드박스 컨테이너는 Kata Containers를 선택적 런타임으로 통합하여 경량 가상 머신에서 컨테이너화된 애플리케이션을 실행하여 향상된 보안 및 격리 기능을 제공합니다. 이러한 통합은 기존 OpenShift 워크플로우를 크게 변경하지 않고 민감한 워크로드를 위한 보다 안전한 런타임 환경을 제공합니다. 이 런타임은 전용 VM(가상 머신)의 컨테이너를 지원하므로 워크로드 분리가 향상됩니다.
1.1. 기능 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너는 다음과 같은 기능을 제공합니다.
- 권한이 있거나 신뢰할 수 없는 워크로드 실행
권한 있는 컨테이너를 실행하여 클러스터 노드를 손상시킬 위험이 없으면 특정 권한이 필요한 워크로드를 안전하게 실행할 수 있습니다. 특수 권한이 필요한 워크로드에는 다음이 포함됩니다.
- 커널의 특수 기능이 필요한 워크로드는 CRI-O와 같은 표준 컨테이너 런타임에서 부여하는 기본 기능 이상으로, 예를 들어 낮은 수준의 네트워킹 기능에 액세스합니다.
- 예를 들어 특정 물리적 장치에 액세스하기 위해 높은 루트 권한이 필요한 워크로드입니다. OpenShift 샌드박스 컨테이너를 사용하면 특정 장치만 VM(가상 머신)에 전달하여 워크로드가 나머지 시스템에 액세스하거나 잘못 구성할 수 없도록 할 수 있습니다.
set-uid루트 바이너리를 설치하거나 사용하는 워크로드입니다. 이러한 바이너리는 특수 권한을 부여하므로 보안 위험이 발생할 수 있습니다. OpenShift 샌드박스 컨테이너를 사용하면 추가 권한이 가상 머신으로 제한되며 클러스터 노드에 대한 특별한 액세스 권한이 부여되지 않습니다.일부 워크로드에서는 특히 클러스터 노드를 구성하려면 권한이 필요합니다. 가상 머신에서 실행하면 이러한 워크로드가 작동하지 않기 때문에 권한 있는 컨테이너를 계속 사용해야 합니다.
- 민감한 워크로드에 대한 격리 확인
- Red Hat OpenShift Container Platform의 OpenShift 샌드박스 컨테이너는 Kata Containers를 선택적 런타임으로 통합하여 경량 가상 머신에서 컨테이너화된 애플리케이션을 실행하여 향상된 보안 및 격리 기능을 제공합니다. 이러한 통합은 기존 OpenShift 워크플로우를 크게 변경하지 않고 민감한 워크로드를 위한 보다 안전한 런타임 환경을 제공합니다. 이 런타임은 전용 VM(가상 머신)의 컨테이너를 지원하므로 워크로드 분리가 향상됩니다.
- 각 워크로드에 대한 커널 격리 확인
-
사용자 지정 커널 튜닝(예:
sysctl, 스케줄러 변경 또는 캐시 튜닝)이 필요한 워크로드와 사용자 지정 커널 모듈 생성(예:트리 부족또는 특수 인수)을 실행할 수 있습니다. - 테넌트 간에 동일한 워크로드를 공유
-
동일한 OpenShift Container Platform 클러스터를 공유하는 다양한 조직의 여러 사용자(테넌트)를 지원하는 워크로드를 실행할 수 있습니다. 또한 이 시스템은 컨테이너 네트워크 기능(CNF) 및 엔터프라이즈 애플리케이션과 같은 여러 벤더의 타사 워크로드 실행을 지원합니다. 예를 들어 타사 CNF는 사용자 지정 설정이 패킷 튜닝 또는 다른 애플리케이션에서 설정한
sysctl변수를 방해하는 것을 원하지 않을 수 있습니다. 완전히 격리된 커널 내에서 실행하면 "noisy neighbor" 구성 문제를 방지하는 데 도움이 됩니다. - 소프트웨어 테스트를 위한 적절한 격리 및 샌드박스 확인
-
알려진 취약점으로 컨테이너화된 워크로드를 실행하거나 기존 애플리케이션의 문제를 처리할 수 있습니다. 관리자는 이러한 격리를 통해 개발자에게 pod에 대한 관리 권한을 부여할 수 있습니다. 이 제어는 개발자가 일반적으로 부여한 것 이외의 구성을 테스트하거나 검증하려고 할 때 유용합니다. 예를 들어 관리자는 커널 패킷 필터링(eBPF)을 개발자에게 안전하게 위임할 수 있습니다. eBPF에는
CAP_ADMIN또는CAP_BPF권한이 필요하므로 컨테이너 호스트 작업자 노드의 모든 프로세스에 대한 액세스 권한이 부여되므로 표준 CRI-O 설정에서 허용되지 않습니다. 마찬가지로 관리자는SystemTap과 같은 침입 툴에 대한 액세스 권한을 부여하거나 개발 중에 사용자 지정 커널 모듈 로드를 지원할 수 있습니다. - VM 경계를 통한 기본 리소스 포함 확인
- 기본적으로 OpenShift 샌드박스 컨테이너는 CPU, 메모리, 스토리지 및 네트워킹과 같은 리소스를 강력하고 안전한 방식으로 관리합니다. OpenShift 샌드박스 컨테이너는 VM에 배포되므로 추가 격리 및 보안 계층을 통해 리소스에 대한 보다 세분화된 액세스 제어가 가능합니다. 예를 들어, 잘못된 컨테이너는 VM에서 사용할 수 있는 것보다 더 많은 메모리를 할당할 수 없습니다. 반대로 네트워크 카드 또는 디스크에 대한 전용 액세스 권한이 필요한 컨테이너는 다른 장치에 액세스하지 않고도 해당 장치를 완전히 제어할 수 있습니다.
1.2. OpenShift Container Platform과의 호환성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 플랫폼에 필요한 기능은 다음 두 가지 주요 구성 요소에서 지원됩니다.
- Kata 런타임: 모든 OpenShift Container Platform 릴리스와 함께 RHCOS(Red Hat Enterprise Linux CoreOS) 및 업데이트가 포함됩니다.
-
OpenShift 샌드박스 컨테이너 Operator: 웹 콘솔 또는 OpenShift CLI(
oc)를 사용하여 Operator를 설치합니다.
OpenShift 샌드박스 컨테이너 Operator는 Rolling Stream Operator 로, 최신 버전이 지원되는 유일한 버전입니다. 현재 지원되는 모든 OpenShift Container Platform 버전에서 작동합니다. 자세한 내용은 OpenShift Container Platform 라이프 사이클 정책을 참조하십시오.
Operator는 RHCOS 호스트와 함께 제공되는 기능과 실행되는 환경에 따라 다릅니다.
작업자 노드에 RHCOS(Red Hat Enterprise Linux CoreOS)를 설치해야 합니다. RHEL 노드는 지원되지 않습니다.
OpenShift 샌드박스 컨테이너 및 OpenShift Container Platform 릴리스의 호환성 매트릭스는 호환되는 기능 및 환경을 식별합니다.
| 아키텍처 | OpenShift Container Platform 버전 |
|---|---|
| x86_64 | 4.8 이상 |
| s390x | 4.14 이상 |
Kata 컨테이너 런타임을 배포하는 방법은 다음 두 가지가 있습니다.
- 베어 메탈
- 피어 Pod
퍼블릭 클라우드에서 OpenShift 샌드박스 컨테이너 배포를 위한 피어 Pod 기술은 OpenShift 샌드박스 컨테이너 1.5 및 OpenShift Container Platform 4.14에서 개발자 프리뷰로 사용할 수 있었습니다.
OpenShift 샌드박스 컨테이너 1.7을 릴리스하면 Operator에 OpenShift Container Platform 버전 4.15 이상이 필요합니다.
| 기능 | 배포 방법 | OpenShift Container Platform 4.15 | OpenShift Container Platform 4.16 |
|---|---|---|---|
| 기밀 컨테이너 | 베어 메탈 | ||
| 피어 Pod | 기술 프리뷰 | 기술 프리뷰 [1] | |
| GPU 지원 [2] | 베어 메탈 | ||
| 피어 Pod | 개발자 프리뷰 | 개발자 프리뷰 |
- OpenShift 샌드박스 컨테이너 1.7.0 이후 기밀 컨테이너의 기술 프리뷰를 사용할 수 있습니다.
- IBM Z에서는 GPU 기능을 사용할 수 없습니다.
| 플랫폼 | GPU | 기밀 컨테이너 |
|---|---|---|
| AWS 클라우드 컴퓨팅 서비스 | 개발자 프리뷰 | |
| Microsoft Azure 클라우드 컴퓨팅 서비스 | 개발자 프리뷰 | 기술 프리뷰 [1] |
- OpenShift 샌드박스 컨테이너 1.7.0 이후 기밀 컨테이너의 기술 프리뷰를 사용할 수 있습니다.
1.3. 노드 자격 확인 링크 복사링크가 클립보드에 복사되었습니다!
노드 자격 검사를 실행하여 베어 메탈 클러스터 노드가 OpenShift 샌드박스 컨테이너를 지원하는지 확인할 수 있습니다. 노드 자격에 대한 가장 일반적인 이유는 가상화 지원 부족입니다. 자격 없는 노드에서 샌드박스 워크로드를 실행하는 경우 오류가 발생합니다.
고급 워크플로
- Node Feature Discovery Operator를 설치합니다.
-
NodeFeatureDiscoveryCR(사용자 정의 리소스)을 생성합니다. -
KataconfigCR을 생성할 때 노드 자격 검사를 활성화합니다. 모든 작업자 노드 또는 선택한 노드에서 노드 자격 검사를 실행할 수 있습니다.
1.4. 일반 용어 링크 복사링크가 클립보드에 복사되었습니다!
설명서 전반에 걸쳐 다음 용어가 사용됩니다.
- 샌드 박스
샌드박스는 프로그램을 실행할 수 있는 격리된 환경입니다. 샌드박스에서는 호스트 시스템이나 운영 체제에 손상을 주지 않고 테스트되지 않았거나 신뢰할 수 없는 프로그램을 실행할 수 있습니다.
OpenShift 샌드박스 컨테이너의 경우 가상화를 사용하여 다른 커널에서 워크로드를 실행하여 동일한 호스트에서 실행되는 여러 워크로드 간의 상호 작용을 보다 효과적으로 제어할 수 있습니다.
- Pod
Pod는 Kubernetes 및 OpenShift Container Platform에서 상속된 구성 요소입니다. 컨테이너를 배포할 수 있는 리소스를 나타냅니다. 컨테이너는 Pod 내부에서 실행되며 Pod는 여러 컨테이너 간에 공유할 수 있는 리소스를 지정하는 데 사용됩니다.
OpenShift 샌드박스 컨테이너의 컨텍스트에서 Pod가 가상 시스템으로 구현됩니다. 동일한 가상 시스템의 동일한 Pod에서 여러 컨테이너를 실행할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator
- OpenShift 샌드박스 컨테이너 Operator는 클러스터에서 샌드박스 컨테이너의 라이프사이클을 관리합니다. OpenShift 샌드박스 컨테이너 Operator를 사용하여 샌드박스 컨테이너 설치 및 제거, 소프트웨어 업데이트 및 상태 모니터링과 같은 작업을 수행할 수 있습니다.
- Kata 컨테이너
- Kata 컨테이너는 OpenShift 샌드박스 컨테이너를 빌드하는 데 사용되는 핵심 업스트림 프로젝트입니다. OpenShift 샌드 박스 컨테이너는 Kata Container와 OpenShift Container Platform을 통합합니다.
- KataConfig
-
KataConfig오브젝트는 샌드박스 컨테이너의 구성을 나타냅니다. 소프트웨어가 배포된 노드와 같이 클러스터 상태에 대한 정보를 저장합니다. - 런타임 클래스
-
RuntimeClass오브젝트는 지정된 워크로드를 실행하는 데 사용할 수 있는 런타임에 대해 설명합니다.kata라는 런타임 클래스가 OpenShift 샌드박스 컨테이너 Operator에 의해 설치 및 배포됩니다. 런타임 클래스에는 Pod 오버헤드와 같이 런타임에서 작동해야 하는 리소스를 설명하는 런타임에 대한 정보가 포함되어 있습니다.
- 피어 Pod
OpenShift 샌드박스 컨테이너의 피어 Pod는 표준 Pod의 개념을 확장합니다. 가상 머신이 작업자 노드 자체에서 생성되는 표준 샌드박스 컨테이너와 달리 피어 Pod에서 지원되는 하이퍼바이저 또는 클라우드 공급자 API를 사용하여 원격 하이퍼바이저를 통해 가상 머신이 생성됩니다.
피어 포드는 작업자 노드에서 일반 pod 역할을 하며 해당 VM이 다른 위치에서 실행됩니다. VM의 원격 위치는 사용자에게 투명하며 Pod 사양의 런타임 클래스에 의해 지정됩니다. 피어 Pod 설계는 중첩된 가상화의 필요성을 우회합니다.
- IBM Secure Execution
- IBM Secure Execution for Linux는 IBM z15® 및 LinuxONE III에서 도입된 고급 보안 기능입니다. 이 기능은 광범위한 암호화에서 제공하는 보호 기능을 확장합니다. IBM Secure Execution는 미사용 데이터, 전송 중 및 사용 중인 데이터를 보호합니다. 워크로드를 안전하게 배포할 수 있으며 라이프사이클 전반에 걸쳐 데이터 보호를 보장합니다. 자세한 내용은 Linux용 IBM Secure Execution 소개 를 참조하십시오.
- 기밀 컨테이너
기밀 컨테이너는 워크로드가 TEE(신뢰할 수 있는 실행 환경)에서 실행되고 있는지 확인하여 컨테이너 및 데이터를 보호합니다. 이 기능을 배포하여 빅 데이터 분석 및 머신 러닝 추론의 개인 정보를 보호할 수 있습니다.
신뢰 자는 기밀 컨테이너의 구성 요소입니다. 신뢰할 수 있는 서비스는 워크로드를 실행하려는 위치 또는 기밀 정보를 보낼 계획의 위치를 확인하는 인증 서비스입니다. 신뢰에는 신뢰할 수 있는 측에 배포되고 원격 워크로드가 신뢰할 수 있는 실행 환경(TEE)에서 실행되고 있는지 확인하는 데 사용되는 구성 요소가 포함되어 있습니다. 신뢰자는 유연하며 다양한 애플리케이션 및 하드웨어 플랫폼을 지원하기 위해 여러 다른 구성으로 배포할 수 있습니다.
- 기밀 컴퓨팅 인증 Operator
- Confidential Compute attestation Operator는 기밀 컨테이너의 설치, 라이프사이클 및 구성을 관리합니다.
1.5. OpenShift 샌드박스 컨테이너 Operator 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너 Operator는 Kata 컨테이너의 모든 구성 요소를 캡슐화합니다. 설치, 라이프사이클 및 구성 작업을 관리합니다.
OpenShift 샌드박스 컨테이너 Operator는 Operator 번들 형식으로 두 개의 컨테이너 이미지로 패키지됩니다.
- 번들 이미지에는 Operator OLM을 준비하는데 필요한 메타데이터가 포함되어 있습니다.
-
두 번째 컨테이너 이미지에는
KataConfig리소스를 모니터링하고 관리하는 실제 컨트롤러가 포함되어 있습니다.
OpenShift 샌드박스 컨테이너 Operator는 RHCOS(Red Hat Enterprise Linux CoreOS) 확장 개념을 기반으로 합니다. RHCOS 확장은 선택적 OpenShift Container Platform 소프트웨어를 설치하는 메커니즘입니다. OpenShift 샌드박스된 컨테이너 Operator는 이 메커니즘을 사용하여 클러스터에 샌드박스 컨테이너를 배포합니다.
샌드박스 컨테이너 RHCOS 확장에는 Kata, QEMU 및 종속 항목에 대한 RPM이 포함되어 있습니다. Machine Config Operator에서 제공하는 MachineConfig 리소스를 사용하여 활성화할 수 있습니다.
추가 리소스
1.6. 기밀 컨테이너 정보 링크 복사링크가 클립보드에 복사되었습니다!
기밀 컨테이너는 신뢰할 수 있는 실행 환경을 활용하여 컨테이너와 데이터를 보호할 수 있는 기밀 컴퓨팅 환경을 제공합니다.
Microsoft Azure Cloud Computing Services, IBM Z® 및 IBM® LinuxONE의 기밀 컨테이너는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
Red Hat Trusted Artifact Signer 와 같은 툴을 사용하여 컨테이너 이미지에 서명할 수 있습니다. 그런 다음 컨테이너 이미지 서명 확인 정책을 생성합니다.
Trustee Operator는 서명을 확인하여 신뢰할 수 있고 인증된 컨테이너 이미지만 환경에 배포되도록 합니다.
자세한 내용은 OpenShift 기밀 컨테이너 솔루션 탐색을 참조하십시오.
1.7. OpenShift Virtualization 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Virtualization을 사용하여 클러스터에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
OpenShift Virtualization 및 OpenShift 샌드박스 컨테이너를 동시에 실행하려면 가상 머신이 실시간 업그레이드 가능해야 노드 재부팅을 차단하지 않도록 합니다. 자세한 내용은 OpenShift Virtualization 설명서의 실시간 마이그레이션 정보를 참조하십시오.
1.8. 블록 볼륨 지원 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform은 원시 블록 볼륨을 정적으로 프로비저닝할 수 있습니다. 이러한 볼륨에는 파일 시스템이 없으며 디스크에 직접 쓰거나 자체 스토리지 서비스를 구현하는 애플리케이션에 성능 이점을 제공할 수 있습니다.
로컬 블록 장치를 OpenShift 샌드박스 컨테이너의 PV(영구 볼륨) 스토리지로 사용할 수 있습니다. 이 블록 장치는 LSO(Local Storage Operator)를 사용하여 프로비저닝할 수 있습니다.
Local Storage Operator는 기본적으로 OpenShift Container Platform에 설치되지 않습니다. 설치 지침은 Local Storage Operator 설치를 참조하십시오.
PV 사양에 volumeMode: Block 을 지정하여 OpenShift 샌드박스 컨테이너의 원시 블록 볼륨을 프로비저닝할 수 있습니다.
블록 볼륨 예
apiVersion: "local.storage.openshift.io/v1"
kind: "LocalVolume"
metadata:
name: "local-disks"
namespace: "openshift-local-storage"
spec:
nodeSelector:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker-0
storageClassDevices:
- storageClassName: "local-sc"
forceWipeDevicesAndDestroyAllData: false
volumeMode: Block
devicePaths:
- /path/to/device
1.9. FIPS 컴플라이언스 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform은 FIPS(Federal Information Processing Standards) 140-2 및 140-3를 위해 설계되었습니다. FIPS 모드에서 부팅된 RHEL(Red Hat Enterprise Linux CoreOS) 또는 RHCOS(Red Hat Enterprise Linux CoreOS)를 실행하는 경우 OpenShift Container Platform 코어 구성 요소는 x86_64,ppc64le, s390x 아키텍처에서만 FIPS 140-2/140-3 Validation에 대해 NIST에 제출된 RHEL 암호화 라이브러리를 사용합니다.
NIST 검증 프로그램에 대한 자세한 내용은 암호화 모듈 유효성 검사 프로그램을 참조하십시오. 검증을 위해 제출된 개별 RHEL 암호화 라이브러리의 최신 NIST 상태는 규정 준수 활동 및 정부 표준을 참조하십시오.
OpenShift 샌드박스 컨테이너는 FIPS가 활성화된 클러스터에서 사용할 수 있습니다.
FIPS 모드에서 실행하면 OpenShift 샌드박스 컨테이너 구성 요소, VM 및 VM 이미지가 FIPS를 준수하도록 조정됩니다.
OpenShift 샌드박스 컨테이너에 대한 FIPS 컴플라이언스는 kata 런타임 클래스에만 적용됩니다. 피어 Pod 런타임 클래스 kata-remote 는 아직 완전히 지원되지 않으며 FIPS 규정 준수를 위해 테스트되지 않았습니다.
FIPS 컴플라이언스는 보안 수준이 높은 환경에서 요구되는 가장 중요한 구성요소 중 하나로, 지원되는 암호화 기술만 노드에서 허용합니다.
FIPS 검증 / 진행중인 모듈 암호화 라이브러리 사용은 x86_64 아키텍처의 OpenShift Container Platform 배포에서만 지원됩니다.
OpenShift Container Platform 컴플라이언스 프레임워크에 대한 Red Hat의 관점을 이해하려면 OpenShift 보안 가이드의 위험 관리 및 규제 준비 장을 참조하십시오.
2장. 베어 메탈에 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
작업자 노드에 RHCOS(Red Hat Enterprise Linux CoreOS)가 설치된 온프레미스 베어 메탈 클러스터에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- RHEL 노드는 지원되지 않습니다.
- 중첩된 가상화는 지원되지 않습니다.
사용자 프로비저닝 , 설치 관리자 프로비저닝 또는 지원설치 프로그램을 포함하여 설치 방법을 사용하여 클러스터를 배포할 수 있습니다.
AWS(Amazon Web Services) 베어 메탈 인스턴스에 OpenShift 샌드박스 컨테이너를 설치할 수도 있습니다. 다른 클라우드 공급자가 제공하는 베어 메탈 인스턴스는 지원되지 않습니다.
클러스터 요구 사항
- OpenShift 샌드박스 컨테이너 Operator를 설치하는 클러스터에 Red Hat OpenShift Container Platform 4.14 이상을 설치했습니다.
- 클러스터에 작업자 노드가 하나 이상 있습니다.
베어 메탈에 OpenShift Container Platform을 설치하는 방법에 대한 자세한 내용은 베어 메탈에 설치를 참조하십시오.
2.1. OpenShift 샌드박스 컨테이너 리소스 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
클러스터에 충분한 리소스가 있는지 확인해야 합니다.
OpenShift 샌드박스 컨테이너를 사용하면 사용자가 샌드박스 런타임(Kata) 내의 OpenShift Container Platform 클러스터에서 워크로드를 실행할 수 있습니다. 각 Pod는 VM(가상 머신)으로 표시됩니다. 각 VM은 QEMU 프로세스에서 실행되며 컨테이너 워크로드를 관리하기 위한 감독자 역할을 하는 kata-agent 프로세스 및 해당 컨테이너에서 실행되는 프로세스를 호스팅합니다. 두 개의 추가 프로세스는 오버헤드를 더 추가합니다.
-
containerd-shim-kata-v2는 pod와 통신하는 데 사용됩니다. -
virtiofsd는 게스트 대신 호스트 파일 시스템 액세스를 처리합니다.
각 VM은 기본 메모리 양으로 구성됩니다. 메모리를 명시적으로 요청하는 컨테이너의 경우 VM에 추가 메모리가 핫플러그됩니다.
메모리 리소스 없이 실행되는 컨테이너는 VM에서 사용하는 총 메모리가 기본 할당에 도달할 때까지 사용 가능한 메모리를 사용합니다. 게스트와 I/O 버퍼도 메모리를 소비합니다.
컨테이너에 특정 양의 메모리가 제공되면 컨테이너를 시작하기 전에 해당 메모리는 VM에 핫플러그됩니다.
메모리 제한을 지정하면 제한보다 많은 메모리를 사용하는 경우 워크로드가 종료됩니다. 메모리 제한을 지정하지 않으면 VM에서 실행 중인 커널이 메모리 부족을 실행할 수 있습니다. 커널이 메모리 부족하면 VM의 다른 프로세스를 종료할 수 있습니다.
기본 메모리 크기
다음 표에는 리소스 할당에 대한 기본값이 나열되어 있습니다.
| 리소스 | 현재의 |
|---|---|
| 기본적으로 가상 머신에 할당된 메모리 | 2Gi |
| 부팅 시 게스트 Linux 커널 메모리 사용량 | ~110Mi |
| QEMU 프로세스에서 사용하는 메모리 (VM 메모리 제외) | ~30Mi |
|
| ~10Mi |
|
| ~20Mi |
|
Fedora에서 | ~300Mi* [1] |
파일 버퍼가 나타나고 다음과 같은 여러 위치에서 고려됩니다.
- 게스트에서 파일 버퍼 캐시로 표시
-
허용된 사용자 공간 파일 I/O 작업을 매핑된
virtiofsd데몬 - 게스트 메모리로 사용되는 QEMU 프로세스
총 메모리 사용량은 메모리 사용량 통계에 따라 적절히 계산되며, 이 메트릭은 해당 메모리를 한 번만 계산합니다.
Pod 오버헤드는 노드의 Pod에서 사용하는 시스템 리소스의 양을 설명합니다. 다음과 같이 oc describe runtimeclass kata 를 사용하여 Kata 런타임에 대한 현재 Pod 오버헤드를 가져올 수 있습니다.
예
$ oc describe runtimeclass kata
출력 예
kind: RuntimeClass
apiVersion: node.k8s.io/v1
metadata:
name: kata
overhead:
podFixed:
memory: "500Mi"
cpu: "500m"
RuntimeClass의 spec.overhead 필드를 변경하여 Pod 오버헤드를 변경할 수 있습니다. 예를 들어 컨테이너에 대해 실행하는 구성이 QEMU 프로세스 및 게스트 커널 데이터에 350Mi 이상의 메모리를 사용하는 경우 필요에 맞게 RuntimeClass 오버헤드를 변경할 수 있습니다.
Red Hat은 지정된 기본 오버헤드 값을 지원합니다. 기본 오버헤드 값 변경은 지원되지 않으며 값을 변경하면 기술적인 문제가 발생할 수 있습니다.
게스트에서 모든 유형의 파일 시스템 I/O를 수행할 때 게스트 커널에 파일 버퍼가 할당됩니다. 파일 버퍼는 virtiofsd 프로세스뿐만 아니라 호스트의 QEMU 프로세스에도 매핑됩니다.
예를 들어 게스트에서 300Mi 파일 버퍼 캐시를 사용하는 경우 QEMU와 virtiofsd는 모두 300Mi 추가 메모리를 사용하는 것처럼 나타납니다. 그러나 세 가지 경우 모두 동일한 메모리가 사용됩니다. 따라서 총 메모리 사용량은 300Mi에 불과하며 3개의 다른 위치에 매핑됩니다. 이는 메모리 사용량 메트릭을 보고할 때 올바르게 계산됩니다.
2.2. 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 다음 작업을 수행하여 베어 메탈에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator를 설치합니다.
- 선택 사항: NFD(Node Feature Discovery) Operator를 설치하여 노드 자격 검사를 구성합니다. 자세한 내용은 노드 자격 검사 및 NFD Operator 설명서를 참조하십시오.
-
KataConfig사용자 지정 리소스를 생성합니다. - OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성합니다.
2.2.1. OpenShift 샌드박스 컨테이너 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
- 웹 콘솔에서 Operator → OperatorHub 로 이동합니다.
-
키워드로 필터링 필드에
OpenShift sandboxed containers를 입력합니다. - OpenShift 샌드박스 컨테이너 Operator 타일을 선택하고 설치를 클릭합니다.
- Operator 설치 페이지의 사용 가능한 업데이트 채널 옵션 목록에서 stable 을 선택합니다.
설치된 네임스페이스 용으로 Operator 권장 네임스페이스 가 선택되어 있는지 확인합니다. 이렇게 하면 필수
openshift-sandboxed-containers-operator네임스페이스에 Operator가 설치됩니다. 이 네임스페이스가 아직 존재하지 않으면 자동으로 생성됩니다.참고openshift-sandboxed-containers-operator이외의 네임스페이스에 OpenShift 샌드박스 컨테이너 Operator를 설치하려고 하면 설치가 실패합니다.- 승인 전략에 대해 자동 이 선택되어 있는지 확인합니다. Automatic 은 기본값이며 새 z-stream 릴리스를 사용할 수 있을 때 OpenShift 샌드박스 컨테이너에 대한 자동 업데이트를 활성화합니다.
- 설치를 클릭합니다.
- Operator → 설치된 Operator 로 이동하여 Operator가 설치되었는지 확인합니다.
2.2.2. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
작업자 노드에 kata 를 설치하려면 KataConfig CR(사용자 정의 리소스)을 생성해야 합니다.
kata 런타임 클래스는 기본적으로 모든 작업자 노드에 설치됩니다. 특정 노드에 kata 를 설치하려면 해당 노드에 라벨을 추가한 다음 KataConfig CR에 라벨을 정의할 수 있습니다.
OpenShift 샌드박스 컨테이너는 kata 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 다음 요인은 재부팅 시간을 늘릴 수 있습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - 선택 사항: 노드 자격 검사를 활성화하려면 Node Feature Discovery Operator를 설치했습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- KataConfig 탭에서 KataConfig 만들기 를 클릭합니다.
다음 세부 정보를 입력합니다.
-
이름: 선택 사항: 기본 이름은
example-kataconfig입니다. -
labels: 선택 사항:
KataConfig리소스에 대한 특성을 식별하는 모든 관련 정보를 입력합니다. 각 레이블은 키-값 쌍을 나타냅니다. - checkNodeEligibility: 선택 사항: NFD(Node Feature Discovery Operator)를 사용하여 노드 자격을 감지하도록 선택합니다.
kataConfigPoolSelector. 선택 사항: 선택한 노드에
kata를 설치하려면 선택한 노드의 라벨에 일치하는 표현식을 추가합니다.- kataConfigPoolSelector 영역을 확장합니다.
- kataConfigPoolSelector 영역에서 matchExpressions 를 확장합니다. 이는 라벨 선택기 요구 사항 목록입니다.
- matchExpressions 추가를 클릭합니다.
- 키 필드에 선택기가 적용되는 라벨 키를 입력합니다.
-
Operator 필드에 레이블 값과의 키 관계를 입력합니다. 유효한 연산자는
In,NotIn,Exists및DoesNotExist입니다. - 값 영역을 확장한 다음 값 추가 를 클릭합니다.
-
값 필드에 키 레이블 값에
true또는false를 입력합니다.
-
loglevel:
kata런타임 클래스가 있는 노드에 대해 검색된 로그 데이터의 수준을 정의합니다.
-
이름: 선택 사항: 기본 이름은
생성을 클릭합니다.
KataConfigCR이 생성되고 작업자 노드에kata런타임 클래스를 설치합니다.kata설치가 완료되고 설치를 확인하기 전에 작업자 노드가 재부팅될 때까지 기다립니다.
검증
-
KataConfig 탭에서
KataConfigCR을 클릭하여 세부 정보를 확인합니다. YAML 탭을 클릭하여
상태 스탠자를 확인합니다.상태스탠자에는조건및kataNodes키가 포함되어 있습니다.status.kataNodes의 값은 노드 배열이며 각각 특정 상태의kata설치 노드를 나열합니다. 업데이트가 있을 때마다 메시지가 표시됩니다.Reload (다시 로드)를 클릭하여 YAML을 새로 고칩니다.
status.kataNodes어레이의 모든 작업자가설치및조건.InProgress: False를 지정하는 이유 없이 False를 표시하면 클러스터에kata가 설치됩니다.
추가 리소스
2.2.3. 워크로드 오브젝트 구성 링크 복사링크가 클립보드에 복사되었습니다!
kata 를 다음 pod 템플릿 오브젝트의 런타임 클래스로 설정하여 OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성해야 합니다.
-
Pod오브젝트 -
ReplicaSet오브젝트 -
ReplicationController오브젝트 -
StatefulSet오브젝트 -
Deployment오브젝트 -
DeploymentConfig오브젝트
Operator 네임스페이스에 워크로드를 배포하지 마십시오. 이러한 리소스에 대한 전용 네임스페이스를 생성합니다.
사전 요구 사항
-
KataConfigCR(사용자 정의 리소스)을 생성했습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 워크로드 → 워크로드 유형(예: Pod )으로 이동합니다.
- 워크로드 유형 페이지에서 오브젝트를 클릭하여 세부 정보를 확인합니다.
- YAML 탭을 클릭합니다.
다음 예와 같이
spec.runtimeClassName: kata를 각 pod 템플릿 워크로드 오브젝트의 매니페스트에 추가합니다.apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata # ...OpenShift Container Platform은 워크로드 오브젝트를 생성하고 스케줄링을 시작합니다.
검증
-
pod-templated 오브젝트의
spec.runtimeClassName필드를 검사합니다. 값이kata이면 피어 Pod를 사용하여 OpenShift 샌드박스 컨테이너에서 워크로드가 실행됩니다.
2.3. 명령줄을 사용하여 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
CLI(명령줄 인터페이스)를 사용하여 다음 작업을 수행하여 베어 메탈에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator를 설치합니다.
Operator를 설치한 후 다음 옵션을 구성할 수 있습니다.
- 블록 스토리지 장치를 구성합니다.
NFD(Node Feature Discovery) Operator를 설치하여 노드 자격 검사를 구성합니다. 자세한 내용은 노드 자격 검사 및 NFD Operator 설명서를 참조하십시오.
-
NodeFeatureDiscovery사용자 정의 리소스를 생성합니다.
-
-
KataConfig사용자 지정 리소스를 생성합니다. - 선택 사항: 각 작업자 노드에서 실행되는 가상 머신 수를 수정합니다.
- 선택 사항: Pod 오버헤드를 수정합니다.
- OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성합니다.
2.3.1. OpenShift 샌드박스 컨테이너 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
CLI를 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
osc-namespace.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator다음 명령을 실행하여 네임스페이스를 생성합니다.
$ oc apply -f osc-namespace.yamlosc-operatorgroup.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sandboxed-containers-operator-group namespace: openshift-sandboxed-containers-operator spec: targetNamespaces: - openshift-sandboxed-containers-operator다음 명령을 실행하여 operator 그룹을 생성합니다.
$ oc apply -f osc-operatorgroup.yamlosc-subscription.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sandboxed-containers-operator namespace: openshift-sandboxed-containers-operator spec: channel: stable installPlanApproval: Automatic name: sandboxed-containers-operator source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: sandboxed-containers-operator.v1.9.0다음 명령을 실행하여 서브스크립션을 생성합니다.
$ oc apply -f osc-subscription.yaml다음 명령을 실행하여 Operator가 올바르게 설치되었는지 확인합니다.
$ oc get csv -n openshift-sandboxed-containers-operator이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.
다음 명령을 실행하여 프로세스를 확인합니다.
$ watch oc get csv -n openshift-sandboxed-containers-operator출력 예
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.9.0 1.8.1 Succeeded
2.3.2. 선택적 구성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너 Operator를 설치한 후 다음 옵션을 구성할 수 있습니다.
2.3.2.1. 로컬 블록 볼륨 프로비저닝 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너와 함께 로컬 블록 볼륨을 사용할 수 있습니다. 먼저 LSO(Local Storage Operator)를 사용하여 로컬 블록 볼륨을 프로비저닝해야 합니다. 그런 다음 로컬 블록 볼륨이 있는 노드를 활성화해야 OpenShift 샌드박스 컨테이너 워크로드를 실행해야 합니다.
LSO(Local Storage Operator)를 사용하여 OpenShift 샌드박스 컨테이너의 로컬 블록 볼륨을 프로비저닝할 수 있습니다. 로컬 볼륨 프로비저너는 정의된 리소스에 지정된 경로에서 블록 볼륨 장치를 찾습니다.
사전 요구 사항
- Local Storage Operator가 설치되어 있습니다.
다음 조건을 충족하는 로컬 디스크가 있습니다.
- 노드에 연결되어 있습니다.
- 마운트되지 않았습니다.
- 파티션이 포함되어 있지 않습니다.
프로세스
로컬 볼륨 리소스를 생성합니다. 이 리소스는 로컬 볼륨에 대한 노드 및 경로를 정의해야 합니다.
참고동일한 장치에 다른 스토리지 클래스 이름을 사용하지 마십시오. 이렇게 하면 여러 PV(영구 볼륨)가 생성됩니다.
예: 블록
apiVersion: "local.storage.openshift.io/v1" kind: "LocalVolume" metadata: name: "local-disks" namespace: "openshift-local-storage"1 spec: nodeSelector:2 nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - ip-10-0-136-143 - ip-10-0-140-255 - ip-10-0-144-180 storageClassDevices: - storageClassName: "local-sc"3 forceWipeDevicesAndDestroyAllData: false4 volumeMode: Block devicePaths:5 - /path/to/device6 - 1
- Local Storage Operator가 설치된 네임스페이스입니다.
- 2
- 선택 사항: 로컬 스토리지 볼륨이 연결된 노드 목록이 포함된 노드 선택기입니다. 이 예에서는
oc get node에서 가져온 노드 호스트 이름을 사용합니다. 값을 정의하지 않으면 Local Storage Operator에서 사용 가능한 모든 노드에서 일치하는 디스크를 찾습니다. - 3
- 영구 볼륨 오브젝트를 생성할 때 사용할 스토리지 클래스의 이름입니다.
- 4
- 이 설정은
wipefs를 호출할지 여부를 정의합니다. 즉, 파티션 테이블 서명(마이크 문자열)을 제거하여 Local Storage Operator 프로비저닝에 디스크를 사용할 준비가 되었습니다. 서명 이외의 다른 데이터는 삭제되지 않습니다. 기본값은 "false"입니다(wipefs가 호출되지 않음).forceWipeDevicesAndDestroyAllData를 "true"로 설정하면 이전 데이터를 다시 사용해야 하는 디스크에 남아 있을 수 있는 시나리오에서 유용할 수 있습니다. 이러한 시나리오에서는 이 필드를 true로 설정하면 관리자가 디스크를 수동으로 지울 필요가 없습니다. - 5
- 선택할 로컬 스토리지 장치 목록이 포함된 경로입니다. 로컬 블록 장치가 있는 노드를 활성화하여 OpenShift 샌드박스 컨테이너 워크로드를 실행할 때 이 경로를 사용해야 합니다.
- 6
- 이 값을
LocalVolume리소스의 filepath로 바꿉니다(예:/dev/disk/). 프로비저너가 배포되면 이러한 로컬 디스크에 PV가 생성됩니다.by-id/wwn
OpenShift Container Platform 클러스터에 로컬 볼륨 리소스를 생성합니다. 방금 생성한 파일을 지정합니다.
$ oc apply -f <local-volume>.yaml프로비저너가 생성되었고 해당 데몬 세트가 생성되었는지 확인합니다.
$ oc get all -n openshift-local-storage출력 예
NAME READY STATUS RESTARTS AGE pod/diskmaker-manager-9wzms 1/1 Running 0 5m43s pod/diskmaker-manager-jgvjp 1/1 Running 0 5m43s pod/diskmaker-manager-tbdsj 1/1 Running 0 5m43s pod/local-storage-operator-7db4bd9f79-t6k87 1/1 Running 0 14m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/local-storage-operator-metrics ClusterIP 172.30.135.36 <none> 8383/TCP,8686/TCP 14m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/diskmaker-manager 3 3 3 3 3 <none> 5m43s NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/local-storage-operator 1/1 1 1 14m NAME DESIRED CURRENT READY AGE replicaset.apps/local-storage-operator-7db4bd9f79 1 1 1 14m원하는데몬 세트 프로세스 및현재개수를 기록해 둡니다.원하는개수가0이면 라벨 선택기가 유효하지 않음을 나타냅니다.영구 볼륨이 생성되었는지 확인합니다.
$ oc get pv출력 예
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE local-pv-1cec77cf 100Gi RWO Delete Available local-sc 88m local-pv-2ef7cd2a 100Gi RWO Delete Available local-sc 82m local-pv-3fa1c73 100Gi RWO Delete Available local-sc 48m
LocalVolume 오브젝트를 편집해도 안전하지 않은 작업이 발생할 수 있으므로 기존 영구 볼륨이 변경되지 않습니다.
2.3.2.2. 노드가 로컬 블록 장치를 사용하도록 활성화 링크 복사링크가 클립보드에 복사되었습니다!
로컬 블록 장치로 노드를 구성하여 정의된 볼륨 리소스에 지정된 경로에서 OpenShift 샌드박스 컨테이너 워크로드를 실행할 수 있습니다.
사전 요구 사항
- LSO(Local Storage Operator)를 사용하여 블록 장치를 프로비저닝합니다.
프로세스
로컬 블록 장치가 있는 각 노드를 활성화하여 다음 명령을 실행하여 OpenShift 샌드박스 컨테이너 워크로드를 실행합니다.
$ oc debug node/worker-0 -- chcon -vt container_file_t /host/path/to/device/path/to/device는 로컬 스토리지 리소스를 생성할 때 정의한 경로와 동일해야 합니다.출력 예
system_u:object_r:container_file_t:s0 /host/path/to/device
2.3.2.3. NodeFeatureDiscovery 사용자 정의 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
NodeFeatureDiscovery CR(사용자 정의 리소스)을 생성하여 NFD(Node Feature Discovery) Operator에서 작업자 노드에서 OpenShift 샌드박스 컨테이너를 지원할 수 있는지 확인하는 구성 매개변수를 정의합니다.
사용자가 알고 있는 선택된 작업자 노드에만 kata 런타임을 설치하려면 feature.node.kubernetes.io/runtime.kata=true 레이블을 선택한 노드에 적용하고 KataConfig CR에서 checkNodeEligibility: true 를 설정합니다.
모든 작업자 노드에 kata 런타임을 설치하려면 KataConfig CR에 checkNodeEligibility: false 를 설정합니다.
이러한 두 시나리오에서는 NodeFeatureDiscovery CR을 생성할 필요가 없습니다. 노드가 OpenShift 샌드박스 컨테이너를 실행할 수 있는지 확인하는 경우 feature.node.kubernetes.io/runtime.kata=true 레이블만 수동으로 적용해야 합니다.
다음 절차에서는 feature.node.kubernetes.io/runtime.kata=true 레이블을 모든 적격 노드에 적용하고 노드 자격을 확인하도록 KataConfig 리소스를 구성합니다.
사전 요구 사항
- NFD Operator가 설치되어 있습니다.
프로세스
다음 예에 따라
nfd.yaml매니페스트 파일을 생성합니다.apiVersion: nfd.openshift.io/v1 kind: NodeFeatureDiscovery metadata: name: nfd-kata namespace: openshift-nfd spec: workerConfig: configData: | sources: custom: - name: "feature.node.kubernetes.io/runtime.kata" matchOn: - cpuId: ["SSE4", "VMX"] loadedKMod: ["kvm", "kvm_intel"] - cpuId: ["SSE4", "SVM"] loadedKMod: ["kvm", "kvm_amd"] # ...NodeFeatureDiscoveryCR을 생성합니다.$ oc create -f nfd.yamlNodeFeatureDiscoveryCR은feature.node.kubernetes.io/runtime.kata=true레이블을 모든 적격 작업자 노드에 적용합니다.
다음 예에 따라
kata-config.yaml매니페스트 파일을 생성합니다.apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: checkNodeEligibility: trueKataConfigCR을 생성합니다.$ oc create -f kata-config.yaml
검증
클러스터의 적격한 노드에 올바른 레이블이 적용되었는지 확인합니다.
$ oc get nodes --selector='feature.node.kubernetes.io/runtime.kata=true'출력 예
NAME STATUS ROLES AGE VERSION compute-3.example.com Ready worker 4h38m v1.25.0 compute-2.example.com Ready worker 4h35m v1.25.0
2.3.3. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
작업자 노드에 kata 를 런타임 클래스로 설치하려면 KataConfig CR(사용자 정의 리소스)을 생성해야 합니다.
KataConfig CR을 생성하면 OpenShift 샌드박스 컨테이너 Operator가 다음을 수행합니다.
-
RHCOS 노드에 QEMU 및
kata-containers와 같은 필요한 RHCOS 확장을 설치합니다. - CRI-O 런타임이 올바른 런타임 처리기로 구성되었는지 확인합니다.
-
기본 구성으로
kata라는RuntimeClassCR을 생성합니다. 이를 통해 사용자는RuntimeClassName필드에서 CR을 참조하여kata를 런타임으로 사용하도록 워크로드를 구성할 수 있습니다. 이 CR은 런타임의 리소스 오버헤드도 지정합니다.
OpenShift 샌드박스 컨테이너는 kata 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - 선택 사항: 노드 자격 검사를 활성화하려면 Node Feature Discovery Operator를 설치했습니다.
프로세스
다음 예에 따라
example-kataconfig.yaml매니페스트 파일을 생성합니다.apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: checkNodeEligibility: false1 logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'2 다음 명령을 실행하여
KataConfigCR을 생성합니다.$ oc apply -f example-kataconfig.yaml새로운
KataConfigCR이 생성되고 작업자 노드에kata를 런타임 클래스로 설치합니다.kata설치가 완료되고 설치를 확인하기 전에 작업자 노드가 재부팅될 때까지 기다립니다.다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"kataNodes아래의 모든 작업자의 상태가설치되고이유를 지정하지 않고InProgress조건이False이면 클러스터에kata가 설치됩니다.
2.3.4. 노드당 피어 Pod VM 수 수정 링크 복사링크가 클립보드에 복사되었습니다!
peerpodConfig CR(사용자 정의 리소스)을 편집하여 노드당 피어 Pod 가상 머신(VM) 제한을 수정할 수 있습니다.
프로세스
다음 명령을 실행하여 현재 제한을 확인합니다.
$ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ -o jsonpath='{.spec.limit}{"\n"}'다음 명령을 실행하여
peerpodConfigCR의limit속성을 수정합니다.$ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ --type merge --patch '{"spec":{"limit":"<value>"}}'1 - 1
- <value>를 정의할 제한으로 바꿉니다.
2.3.5. Pod 오버헤드 수정 링크 복사링크가 클립보드에 복사되었습니다!
Pod 오버헤드는 노드의 Pod에서 사용하는 시스템 리소스의 양을 설명합니다. RuntimeClass 사용자 정의 리소스의 spec.overhead 필드를 변경하여 Pod 오버헤드를 수정할 수 있습니다. 예를 들어 컨테이너에 대해 실행하는 구성이 QEMU 프로세스 및 게스트 커널 데이터에 350Mi 이상의 메모리를 사용하는 경우 필요에 맞게 RuntimeClass 오버헤드를 변경할 수 있습니다.
게스트에서 모든 유형의 파일 시스템 I/O를 수행할 때 게스트 커널에 파일 버퍼가 할당됩니다. 파일 버퍼는 virtiofsd 프로세스뿐만 아니라 호스트의 QEMU 프로세스에도 매핑됩니다.
예를 들어 게스트에서 300Mi 파일 버퍼 캐시를 사용하는 경우 QEMU와 virtiofsd는 모두 300Mi 추가 메모리를 사용하는 것처럼 나타납니다. 그러나 세 가지 경우 모두 동일한 메모리가 사용됩니다. 따라서 총 메모리 사용량은 300Mi에 불과하며 3개의 다른 위치에 매핑됩니다. 이는 메모리 사용량 메트릭을 보고할 때 올바르게 계산됩니다.
기본값은 Red Hat에서 지원합니다. 기본 오버헤드 값 변경은 지원되지 않으며 값을 변경하면 기술적인 문제가 발생할 수 있습니다.
프로세스
다음 명령을 실행하여
RuntimeClass오브젝트를 가져옵니다.$ oc describe runtimeclass kataoverhead.podFixed.memory및cpu값을 업데이트하고 파일로runtimeclass.yaml로 저장합니다.kind: RuntimeClass apiVersion: node.k8s.io/v1 metadata: name: kata overhead: podFixed: memory: "500Mi" cpu: "500m"다음 명령을 실행하여 변경 사항을 적용합니다.
$ oc apply -f runtimeclass.yaml
2.3.6. 워크로드 오브젝트 구성 링크 복사링크가 클립보드에 복사되었습니다!
kata 를 다음 pod 템플릿 오브젝트의 런타임 클래스로 설정하여 OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성해야 합니다.
-
Pod오브젝트 -
ReplicaSet오브젝트 -
ReplicationController오브젝트 -
StatefulSet오브젝트 -
Deployment오브젝트 -
DeploymentConfig오브젝트
Operator 네임스페이스에 워크로드를 배포하지 마십시오. 이러한 리소스에 대한 전용 네임스페이스를 생성합니다.
사전 요구 사항
-
KataConfigCR(사용자 정의 리소스)을 생성했습니다.
프로세스
다음 예와 같이
spec.runtimeClassName: kata를 각 pod 템플릿 워크로드 오브젝트의 매니페스트에 추가합니다.apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata # ...OpenShift Container Platform은 워크로드 오브젝트를 생성하고 스케줄링을 시작합니다.
검증
-
pod-templated 오브젝트의
spec.runtimeClassName필드를 검사합니다. 값이kata이면 피어 Pod를 사용하여 OpenShift 샌드박스 컨테이너에서 워크로드가 실행됩니다.
3장. AWS에 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔 또는 CLI(명령줄 인터페이스)를 사용하여 AWS 클라우드 컴퓨팅 서비스에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
OpenShift 샌드박스 컨테이너는 피어 Pod를 배포합니다. 피어 Pod 설계는 중첩된 가상화의 필요성을 우회합니다. 자세한 내용은 피어 Pod 및 Peer Pod 기술 상세 정보를 참조하십시오.
클러스터 요구 사항
- OpenShift 샌드박스 컨테이너 Operator를 설치하는 클러스터에 Red Hat OpenShift Container Platform 4.14 이상을 설치했습니다.
- 클러스터에 작업자 노드가 하나 이상 있습니다.
AWS 클라우드 컴퓨팅 서비스에 OpenShift Container Platform을 설치하는 방법에 대한 자세한 내용은 AWS에 설치를 참조하십시오.
3.1. 피어 Pod 리소스 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
클러스터에 충분한 리소스가 있는지 확인해야 합니다.
피어 Pod 가상 머신(VM)에는 다음 두 위치에 있는 리소스가 필요합니다.
-
작업자 노드입니다. 작업자 노드는 메타데이터, Kata shim 리소스(
containerd-shim-kata-v2), remote-hypervisor 리소스(cloud-api-adaptor) 및 작업자 노드와 피어 Pod VM 간의 터널 설정을 저장합니다. - 클라우드 인스턴스입니다. 클라우드에서 실행되는 실제 피어 Pod VM입니다.
Kubernetes 작업자 노드에 사용되는 CPU 및 메모리 리소스는 피어 Pod를 생성하는 데 사용되는 RuntimeClass(kata-remote) 정의에 포함된 Pod 오버헤드 에 의해 처리됩니다.
클라우드에서 실행되는 총 피어 Pod VM 수는 Kubernetes 노드 확장 리소스로 정의됩니다. 이 제한은 노드당이며 peer-pods-cm 구성 맵의 PEERPODS_LIMIT_PER_NODE 속성에 의해 설정됩니다.
확장된 리소스의 이름은 kata.peerpods.io/vm 이며 Kubernetes 스케줄러에서 용량 추적 및 계정을 처리할 수 있습니다.
OpenShift 샌드박스 컨테이너 Operator를 설치한 후 환경의 요구 사항에 따라 노드당 제한을 편집할 수 있습니다.
변경 웹 후크 는 확장된 리소스 kata.peerpods.io/vm 을 Pod 사양에 추가합니다. 또한 Pod 사양에서 리소스별 항목도 제거합니다(있는 경우). 이를 통해 Kubernetes 스케줄러에서 이러한 확장 리소스를 고려하여 리소스를 사용할 수 있는 경우에만 피어 Pod를 예약할 수 있습니다.
변경 웹 후크는 다음과 같이 Kubernetes Pod를 수정합니다.
-
변경 웹 후크는
TARGET_RUNTIME_CLASS환경 변수에 지정된 예상RuntimeClassName값을 Pod에 확인합니다. Pod 사양의 값이TARGET_RUNTIME_CLASS의 값과 일치하지 않으면 Pod를 수정하지 않고 웹 후크가 종료됩니다. RuntimeClassName값이 일치하는 경우 Webhook에서 Pod 사양을 다음과 같이 변경합니다.-
Webhook는 Pod에 있는 모든 컨테이너 및 init 컨테이너의
resources필드에서 모든 리소스 사양을 제거합니다. -
Webhook는 Pod의 첫 번째 컨테이너의 resources 필드를 수정하여 확장 리소스(
kata.peerpods.io/vm)를 사양에 추가합니다. 확장된 리소스kata.peerpods.io/vm은 회계 목적으로 Kubernetes 스케줄러에서 사용합니다.
-
Webhook는 Pod에 있는 모든 컨테이너 및 init 컨테이너의
변경 웹 후크는 OpenShift Container Platform의 특정 시스템 네임스페이스가 변경되지 않습니다. 해당 시스템 네임스페이스에 피어 Pod가 생성되면 Pod 사양에 확장 리소스가 포함되지 않는 한 Kubernetes 확장 리소스를 사용하는 리소스 계정이 작동하지 않습니다.
특정 네임스페이스에서 피어 Pod 생성만 허용하도록 클러스터 전체 정책을 정의하는 것이 좋습니다.
3.2. 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 다음 작업을 수행하여 AWS에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator를 설치합니다.
- 선택 사항: 포트 15150 및 9000을 활성화하여 피어 Pod와의 내부 통신을 허용합니다.
- 선택 사항: OpenShift 샌드박스 컨테이너 Operator와 함께 설치된 Cloud Credential Operator를 설치 제거한 경우 피어 Pod 시크릿을 생성합니다.
- 선택 사항: 사용자 정의 Pod VM 이미지를 선택합니다.
- 선택 사항: Kata 에이전트 정책을 사용자 지정합니다.
- 피어 Pod 구성 맵을 생성합니다.
-
KataConfig사용자 지정 리소스를 생성합니다. - OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성합니다.
3.2.1. OpenShift 샌드박스 컨테이너 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
- 웹 콘솔에서 Operator → OperatorHub 로 이동합니다.
-
키워드로 필터링 필드에
OpenShift sandboxed containers를 입력합니다. - OpenShift 샌드박스 컨테이너 Operator 타일을 선택하고 설치를 클릭합니다.
- Operator 설치 페이지의 사용 가능한 업데이트 채널 옵션 목록에서 stable 을 선택합니다.
설치된 네임스페이스 용으로 Operator 권장 네임스페이스 가 선택되어 있는지 확인합니다. 이렇게 하면 필수
openshift-sandboxed-containers-operator네임스페이스에 Operator가 설치됩니다. 이 네임스페이스가 아직 존재하지 않으면 자동으로 생성됩니다.참고openshift-sandboxed-containers-operator이외의 네임스페이스에 OpenShift 샌드박스 컨테이너 Operator를 설치하려고 하면 설치가 실패합니다.- 승인 전략에 대해 자동 이 선택되어 있는지 확인합니다. Automatic 은 기본값이며 새 z-stream 릴리스를 사용할 수 있을 때 OpenShift 샌드박스 컨테이너에 대한 자동 업데이트를 활성화합니다.
- 설치를 클릭합니다.
- Operator → 설치된 Operator 로 이동하여 Operator가 설치되었는지 확인합니다.
3.2.2. AWS의 포트 활성화 링크 복사링크가 클립보드에 복사되었습니다!
AWS에서 실행되는 피어 Pod와의 내부 통신을 허용하려면 포트 15150 및 9000을 활성화해야 합니다.
사전 요구 사항
- OpenShift 샌드박스 컨테이너 Operator가 설치되어 있습니다.
- AWS 명령줄 툴을 설치했습니다.
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
OpenShift Container Platform 클러스터에 로그인하고 인스턴스 ID를 검색합니다.
$ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' \ -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')AWS 리전을 검색합니다.
$ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}')보안 그룹 ID를 검색하여 배열에 저장합니다.
$ AWS_SG_IDS=($(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} \ --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' \ --output text --region $AWS_REGION))각 보안 그룹 ID에 대해 피어 pod shim에 kata-agent 통신에 액세스하고 피어 Pod 터널을 설정하도록 권한을 부여합니다.
$ for AWS_SG_ID in "${AWS_SG_IDS[@]}"; do \ aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 15150 --source-group $AWS_SG_ID --region $AWS_REGION \ aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 9000 --source-group $AWS_SG_ID --region $AWS_REGION \ done
이제 포트가 활성화됩니다.
3.2.3. 피어 Pod 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod 보안이 비어 있고 CCO(Cloud Credential Operator)가 설치되면 OpenShift 샌드박스 컨테이너 Operator는 CCO를 사용하여 시크릿을 검색합니다. CCO를 설치 제거한 경우 OpenShift 샌드박스 컨테이너의 피어 Pod 시크릿을 수동으로 생성해야 합니다. 그렇지 않으면 피어 Pod가 작동하지 않습니다.
시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.
기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.
사전 요구 사항
AWS 콘솔을 사용하여 다음 값을 생성합니다.
-
AWS_ACCESS_KEY_ID -
AWS_SECRET_ACCESS_KEY
-
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- OpenShift 샌드박스 컨테이너 Operator 타일을 클릭합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣습니다.
apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: AWS_ACCESS_KEY_ID: "<aws_access_key>"1 AWS_SECRET_ACCESS_KEY: "<aws_secret_access_key>"2 - 저장을 클릭하여 변경 사항을 적용합니다.
- 워크로드 → 시크릿 으로 이동하여 피어 Pod 시크릿을 확인합니다.
3.2.4. 피어 Pod 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너에 대한 피어 Pod 구성 맵을 생성해야 합니다.
사전 요구 사항
- 클러스터 인증 정보를 기반으로 기본 AMI ID를 사용하지 않는 경우 AMI(Amazon Machine Image) ID가 있습니다.
프로세스
AWS 인스턴스에서 다음 값을 가져옵니다.
인스턴스 ID를 검색하고 기록합니다.
$ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')이는 secret 오브젝트의 다른 값을 검색하는 데 사용됩니다.
AWS 리전을 검색하고 기록합니다.
$ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}') && echo "AWS_REGION: \"$AWS_REGION\""AWS 서브넷 ID를 검색하고 기록합니다.
$ AWS_SUBNET_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SubnetId' --region ${AWS_REGION} --output text) && echo "AWS_SUBNET_ID: \"$AWS_SUBNET_ID\""AWS VPC ID를 검색하고 기록합니다.
$ AWS_VPC_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].VpcId' --region ${AWS_REGION} --output text) && echo "AWS_VPC_ID: \"$AWS_VPC_ID\""AWS 보안 그룹 ID를 검색하고 기록합니다.
$ AWS_SG_IDS=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --region $AWS_REGION --output json | jq -r '.[][][]' | paste -sd ",") && echo "AWS_SG_IDS: \"$AWS_SG_IDS\""
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- Operator 목록에서 OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣습니다.
apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "aws" VXLAN_PORT: "9000" PODVM_INSTANCE_TYPE: "t3.medium"1 PODVM_INSTANCE_TYPES: "t2.small,t2.medium,t3.large"2 PROXY_TIMEOUT: "5m" PODVM_AMI_ID: "<podvm_ami_id>"3 AWS_REGION: "<aws_region>"4 AWS_SUBNET_ID: "<aws_subnet_id>"5 AWS_VPC_ID: "<aws_vpc_id>"6 AWS_SG_IDS: "<aws_sg_ids>"7 PEERPODS_LIMIT_PER_NODE: "10"8 TAGS: "key1=value1,key2=value2"9 DISABLECVM: "true"- 1
- 유형이 워크로드에 정의되지 않은 경우 사용되는 기본 인스턴스 유형을 정의합니다.
- 2
- Pod를 생성하기 위해 공백 없이 인스턴스 유형을 지정합니다. 이를 통해 더 적은 메모리와 더 적은 CPU 또는 대규모 워크로드에 대해 더 큰 인스턴스 유형이 필요한 워크로드에 대해 더 작은 인스턴스 유형을 정의할 수 있습니다.
- 3
- 선택 사항: 기본적으로 클러스터 인증 정보를 기반으로 AMI ID를 사용하여
KataConfigCR을 실행할 때 이 값이 채워집니다. 고유한 AMI를 생성하는 경우 올바른 AMI ID를 지정합니다. - 4
- 검색한
AWS_REGION값을 지정합니다. - 5
- 검색한
AWS_SUBNET_ID값을 지정합니다. - 6
- 검색한
AWS_VPC_ID값을 지정합니다. - 7
- 검색한
AWS_SG_IDS값을 지정합니다. - 8
- 노드당 생성할 수 있는 최대 피어 Pod 수를 지정합니다. 기본값은
10입니다. - 9
- 사용자 정의 태그를 Pod VM 인스턴스의
키:값쌍으로 구성하여 피어 Pod 비용을 추적하거나 다른 클러스터에서 피어 Pod를 식별할 수 있습니다.
- 저장을 클릭하여 변경 사항을 적용합니다.
- 워크로드 → ConfigMap 으로 이동하여 새 구성 맵을 확인합니다.
3.2.5. 사용자 정의 피어 Pod VM 이미지 선택 링크 복사링크가 클립보드에 복사되었습니다!
Pod 매니페스트에 주석을 추가하여 워크로드 요구 사항에 맞게 사용자 정의 피어 Pod 가상 머신(VM) 이미지를 선택할 수 있습니다. 사용자 정의 이미지는 피어 Pod 구성 맵에 지정된 기본 이미지를 덮어씁니다.
사전 요구 사항
- 클라우드 공급자 또는 하이퍼바이저와 호환되는 사용자 정의 Pod VM 이미지의 ID를 사용할 수 있습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- Operator 목록에서 OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣습니다.
apiVersion: v1 kind: Pod metadata: name: pod-manifest annotations: io.katacontainers.config.hypervisor.image: "<custom_image_id>"1 spec: runtimeClassName: kata-remote2 containers: - name: <example_container>3 image: registry.access.redhat.com/ubi9/ubi:9.3 command: ["sleep", "36000"]- 저장을 클릭하여 변경 사항을 적용합니다.
3.2.6. Kata 에이전트 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kata 에이전트 정책은 Kata 런타임으로 실행되는 Pod에 대한 에이전트 API 요청을 제어하는 보안 메커니즘입니다. Pod VM(가상 시스템) 내에서 Kata 에이전트가 Rego로 작성하고 강제 적용하는 이 정책은 허용 또는 거부되는 작업을 결정합니다.
보안이 중요하지 않은 개발 및 테스트와 같은 특정 사용 사례에 대해 사용자 지정 정책을 사용하여 기본 정책을 덮어쓸 수 있습니다. 예를 들어 컨트롤 플레인을 신뢰할 수 있는 환경에서 실행할 수 있습니다. 다음과 같은 다양한 방법으로 사용자 지정 정책을 적용할 수 있습니다.
- Pod VM 이미지에 포함
- 피어 Pod 구성 맵의 패치 적용.
- 워크로드 Pod YAML에 주석을 추가합니다.
프로덕션 시스템의 경우 기본 방법은 initdata를 사용하여 Kata 에이전트 정책을 재정의하는 것입니다. 다음 절차에서는 io.katacontainers.config.agent.policy 주석을 사용하는 개별 Pod에 사용자 지정 정책을 적용합니다. 정책은 Base64로 인코딩된 Rego 형식으로 제공됩니다. 이 방법은 Pod VM 이미지를 수정하지 않고 Pod 생성 시 기본 정책을 재정의합니다.
사용자 지정 정책은 기본 정책을 완전히 대체합니다. 특정 API만 수정하려면 전체 정책을 포함하고 관련 규칙을 조정합니다.
프로세스
사용자 지정 정책으로
policy.rego파일을 생성합니다. 다음 예제는 데모에exec및log가 활성화된 모든 구성 가능한 API를 보여줍니다.package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false이 정책은
exec(ExecProcessRequest) 및로그(ReadStreamRequest) API를 활성화합니다. 필요에 따라 정책을 추가로 사용자 지정하도록true또는false값을 조정합니다.다음 명령을 실행하여
policy.rego파일을 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 policy.regoyaml 파일에 사용할 출력을 저장합니다.
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- Operator 목록에서 OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣고 Base64로 인코딩된 정책을 추가합니다.
apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy> spec: runtimeClassName: kata-remote containers: - name: <container_name> image: registry.access.redhat.com/ubi9/ubi:latest command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault- 저장을 클릭하여 변경 사항을 적용합니다.
3.2.7. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR(사용자 정의 리소스)을 생성하여 작업자 노드에 kata-remote 를 RuntimeClass 로 설치해야 합니다.
kata-remote 런타임 클래스는 기본적으로 모든 작업자 노드에 설치됩니다. 특정 노드에 kata-remote 를 설치하려면 해당 노드에 레이블을 추가한 다음 KataConfig CR에 레이블을 정의할 수 있습니다.
OpenShift 샌드박스 컨테이너는 kata-remote 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 다음 요인은 재부팅 시간을 늘릴 수 있습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - 선택 사항: 노드 자격 검사를 활성화하려면 Node Feature Discovery Operator를 설치했습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- KataConfig 탭에서 KataConfig 만들기 를 클릭합니다.
다음 세부 정보를 입력합니다.
-
이름: 선택 사항: 기본 이름은
example-kataconfig입니다. -
labels: 선택 사항:
KataConfig리소스에 대한 특성을 식별하는 모든 관련 정보를 입력합니다. 각 레이블은 키-값 쌍을 나타냅니다. - enablePeerPods: 퍼블릭 클라우드, IBM Z® 및 IBM® LinuxONE 배포에는 선택합니다.
kataConfigPoolSelector. 선택 사항: 선택한 노드에
kata-remote를 설치하려면 선택한 노드의 라벨에 일치하는 표현식을 추가합니다.- kataConfigPoolSelector 영역을 확장합니다.
- kataConfigPoolSelector 영역에서 matchExpressions 를 확장합니다. 이는 라벨 선택기 요구 사항 목록입니다.
- matchExpressions 추가를 클릭합니다.
- 키 필드에 선택기가 적용되는 라벨 키를 입력합니다.
-
Operator 필드에 레이블 값과의 키 관계를 입력합니다. 유효한 연산자는
In,NotIn,Exists및DoesNotExist입니다. - 값 영역을 확장한 다음 값 추가 를 클릭합니다.
-
값 필드에 키 레이블 값에
true또는false를 입력합니다.
-
loglevel:
kata-remote런타임 클래스를 사용하여 노드에 대해 검색된 로그 데이터의 수준을 정의합니다.
-
이름: 선택 사항: 기본 이름은
생성을 클릭합니다.
KataConfigCR이 생성되고 작업자 노드에kata-remote런타임 클래스를 설치합니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.
검증
-
KataConfig 탭에서
KataConfigCR을 클릭하여 세부 정보를 확인합니다. YAML 탭을 클릭하여
상태 스탠자를 확인합니다.상태스탠자에는조건및kataNodes키가 포함되어 있습니다.status.kataNodes의 값은 노드 배열이며 각 노드는 특정kata-remote설치의 노드를 나열합니다. 업데이트가 있을 때마다 메시지가 표시됩니다.Reload (다시 로드)를 클릭하여 YAML을 새로 고칩니다.
status.kataNodes어레이의 모든 작업자가설치및조건.InProgress: False를 지정하는 이유 없이 False를 표시하면 클러스터에kata-remote가 설치됩니다.
추가 리소스
Pod VM 이미지 확인
클러스터에 kata-remote 가 설치되면 OpenShift 샌드박스 컨테이너 Operator에서 피어 Pod를 생성하는 데 사용되는 Pod VM 이미지를 생성합니다. 이 프로세스는 클라우드 인스턴스에서 이미지가 생성되므로 시간이 오래 걸릴 수 있습니다. 클라우드 공급자에 대해 생성한 구성 맵을 확인하여 Pod VM 이미지가 성공적으로 생성되었는지 확인할 수 있습니다.
프로세스
- 워크로드 → ConfigMap 으로 이동합니다.
- 공급자 구성 맵을 클릭하여 세부 정보를 확인합니다.
- YAML 탭을 클릭합니다.
YAML 파일의
상태스탠자를 확인합니다.PODVM_AMI_ID매개변수가 채워지면 Pod VM 이미지가 성공적으로 생성됩니다.
문제 해결
다음 명령을 실행하여 이벤트 로그를 검색합니다.
$ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation다음 명령을 실행하여 작업 로그를 검색합니다.
$ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation
문제를 해결할 수 없는 경우 Red Hat 지원 케이스를 제출하고 두 로그의 출력을 첨부합니다.
3.2.8. 워크로드 오브젝트 구성 링크 복사링크가 클립보드에 복사되었습니다!
kata-remote 를 다음 pod 템플릿 오브젝트의 런타임 클래스로 설정하여 OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성해야 합니다.
-
Pod오브젝트 -
ReplicaSet오브젝트 -
ReplicationController오브젝트 -
StatefulSet오브젝트 -
Deployment오브젝트 -
DeploymentConfig오브젝트
Operator 네임스페이스에 워크로드를 배포하지 마십시오. 이러한 리소스에 대한 전용 네임스페이스를 생성합니다.
YAML 파일에 주석을 추가하여 구성 맵에 정의한 기본 인스턴스 유형을 사용하여 워크로드를 배포해야 하는지 여부를 정의할 수 있습니다.
인스턴스 유형을 수동으로 정의하지 않으려면 사용 가능한 메모리에 따라 자동 인스턴스 유형을 사용하도록 주석을 추가할 수 있습니다.
사전 요구 사항
-
KataConfigCR(사용자 정의 리소스)을 생성했습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 워크로드 → 워크로드 유형(예: Pod )으로 이동합니다.
- 워크로드 유형 페이지에서 오브젝트를 클릭하여 세부 정보를 확인합니다.
- YAML 탭을 클릭합니다.
다음 예와 같이
spec.runtimeClassName: kata-remote를 각 pod 템플릿 워크로드 오브젝트의 매니페스트에 추가합니다.apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata-remote # ...pod-templated 오브젝트에 주석을 추가하여 수동으로 정의된 인스턴스 유형 또는 자동 인스턴스 유형을 사용합니다.
수동으로 정의한 인스턴스 유형을 사용하려면 다음 주석을 추가합니다.
apiVersion: v1 kind: <object> metadata: annotations: io.katacontainers.config.hypervisor.machine_type: "t3.medium"1 # ...자동 인스턴스 유형을 사용하려면 다음 주석을 추가합니다.
apiVersion: v1 kind: <Pod> metadata: annotations: io.katacontainers.config.hypervisor.default_vcpus: <vcpus> io.katacontainers.config.hypervisor.default_memory: <memory> # ...워크로드에서 사용할 수 있는 메모리 양을 정의합니다. 워크로드는 사용 가능한 메모리 양에 따라 자동 인스턴스 유형에서 실행됩니다.
저장을 클릭하여 변경 사항을 적용합니다.
OpenShift Container Platform은 워크로드 오브젝트를 생성하고 스케줄링을 시작합니다.
검증
-
pod-templated 오브젝트의
spec.runtimeClassName필드를 검사합니다. 값이kata-remote이면 피어 Pod를 사용하여 OpenShift 샌드박스 컨테이너에서 워크로드가 실행됩니다.
3.3. 명령줄을 사용하여 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
CLI(명령줄 인터페이스)를 사용하여 다음 작업을 수행하여 AWS에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator를 설치합니다.
- 선택 사항: 포트 15150 및 9000을 활성화하여 피어 Pod와의 내부 통신을 허용합니다.
- 선택 사항: OpenShift 샌드박스 컨테이너 Operator와 함께 설치된 Cloud Credential Operator를 설치 제거한 경우 피어 Pod 시크릿을 생성합니다.
- 선택 사항: 사용자 정의 Pod VM 이미지를 선택합니다.
- 피어 Pod 구성 맵을 생성합니다.
- 선택 사항: Kata 에이전트 정책을 사용자 지정합니다.
-
KataConfig사용자 지정 리소스를 생성합니다. - 선택 사항: 각 작업자 노드에서 실행되는 가상 머신 수를 수정합니다.
- OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성합니다.
3.3.1. OpenShift 샌드박스 컨테이너 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
CLI를 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
osc-namespace.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator다음 명령을 실행하여 네임스페이스를 생성합니다.
$ oc apply -f osc-namespace.yamlosc-operatorgroup.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sandboxed-containers-operator-group namespace: openshift-sandboxed-containers-operator spec: targetNamespaces: - openshift-sandboxed-containers-operator다음 명령을 실행하여 operator 그룹을 생성합니다.
$ oc apply -f osc-operatorgroup.yamlosc-subscription.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sandboxed-containers-operator namespace: openshift-sandboxed-containers-operator spec: channel: stable installPlanApproval: Automatic name: sandboxed-containers-operator source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: sandboxed-containers-operator.v1.9.0다음 명령을 실행하여 서브스크립션을 생성합니다.
$ oc apply -f osc-subscription.yaml다음 명령을 실행하여 Operator가 올바르게 설치되었는지 확인합니다.
$ oc get csv -n openshift-sandboxed-containers-operator이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.
다음 명령을 실행하여 프로세스를 확인합니다.
$ watch oc get csv -n openshift-sandboxed-containers-operator출력 예
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.9.0 1.8.1 Succeeded
3.3.2. AWS의 포트 활성화 링크 복사링크가 클립보드에 복사되었습니다!
AWS에서 실행되는 피어 Pod와의 내부 통신을 허용하려면 포트 15150 및 9000을 활성화해야 합니다.
사전 요구 사항
- OpenShift 샌드박스 컨테이너 Operator가 설치되어 있습니다.
- AWS 명령줄 툴을 설치했습니다.
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
OpenShift Container Platform 클러스터에 로그인하고 인스턴스 ID를 검색합니다.
$ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' \ -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')AWS 리전을 검색합니다.
$ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}')보안 그룹 ID를 검색하여 배열에 저장합니다.
$ AWS_SG_IDS=($(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} \ --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' \ --output text --region $AWS_REGION))각 보안 그룹 ID에 대해 피어 pod shim에 kata-agent 통신에 액세스하고 피어 Pod 터널을 설정하도록 권한을 부여합니다.
$ for AWS_SG_ID in "${AWS_SG_IDS[@]}"; do \ aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 15150 --source-group $AWS_SG_ID --region $AWS_REGION \ aws ec2 authorize-security-group-ingress --group-id $AWS_SG_ID --protocol tcp --port 9000 --source-group $AWS_SG_ID --region $AWS_REGION \ done
이제 포트가 활성화됩니다.
3.3.3. 피어 Pod 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod 보안이 비어 있고 CCO(Cloud Credential Operator)가 설치되면 OpenShift 샌드박스 컨테이너 Operator는 CCO를 사용하여 시크릿을 검색합니다. CCO를 설치 제거한 경우 OpenShift 샌드박스 컨테이너의 피어 Pod 시크릿을 수동으로 생성해야 합니다. 그렇지 않으면 피어 Pod가 작동하지 않습니다.
시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.
기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.
사전 요구 사항
AWS 콘솔을 사용하여 다음 값을 생성합니다.
-
AWS_ACCESS_KEY_ID -
AWS_SECRET_ACCESS_KEY
-
프로세스
다음 예에 따라
peer-pods-secret.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: AWS_ACCESS_KEY_ID: "<aws_access_key>"1 AWS_SECRET_ACCESS_KEY: "<aws_secret_access_key>"2 다음 명령을 실행하여 시크릿을 생성합니다.
$ oc apply -f peer-pods-secret.yaml
3.3.4. 피어 Pod 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너에 대한 피어 Pod 구성 맵을 생성해야 합니다.
사전 요구 사항
- 클러스터 인증 정보를 기반으로 기본 AMI ID를 사용하지 않는 경우 AMI(Amazon Machine Image) ID가 있습니다.
프로세스
AWS 인스턴스에서 다음 값을 가져옵니다.
인스턴스 ID를 검색하고 기록합니다.
$ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')이는 secret 오브젝트의 다른 값을 검색하는 데 사용됩니다.
AWS 리전을 검색하고 기록합니다.
$ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}') && echo "AWS_REGION: \"$AWS_REGION\""AWS 서브넷 ID를 검색하고 기록합니다.
$ AWS_SUBNET_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SubnetId' --region ${AWS_REGION} --output text) && echo "AWS_SUBNET_ID: \"$AWS_SUBNET_ID\""AWS VPC ID를 검색하고 기록합니다.
$ AWS_VPC_ID=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].VpcId' --region ${AWS_REGION} --output text) && echo "AWS_VPC_ID: \"$AWS_VPC_ID\""AWS 보안 그룹 ID를 검색하고 기록합니다.
$ AWS_SG_IDS=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --region $AWS_REGION --output json | jq -r '.[][][]' | paste -sd ",") && echo "AWS_SG_IDS: \"$AWS_SG_IDS\""
다음 예에 따라
peer-pods-cm.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "aws" VXLAN_PORT: "9000" PODVM_INSTANCE_TYPE: "t3.medium"1 PODVM_INSTANCE_TYPES: "t2.small,t2.medium,t3.large"2 PROXY_TIMEOUT: "5m" PODVM_AMI_ID: "<podvm_ami_id>"3 AWS_REGION: "<aws_region>"4 AWS_SUBNET_ID: "<aws_subnet_id>"5 AWS_VPC_ID: "<aws_vpc_id>"6 AWS_SG_IDS: "<aws_sg_ids>"7 PEERPODS_LIMIT_PER_NODE: "10"8 TAGS: "key1=value1,key2=value2"9 DISABLECVM: "true"- 1
- 유형이 워크로드에 정의되지 않은 경우 사용되는 기본 인스턴스 유형을 정의합니다.
- 2
- Pod를 생성하기 위해 공백 없이 인스턴스 유형을 지정합니다. 이를 통해 더 적은 메모리와 더 적은 CPU 또는 대규모 워크로드에 대해 더 큰 인스턴스 유형이 필요한 워크로드에 대해 더 작은 인스턴스 유형을 정의할 수 있습니다.
- 3
- 선택 사항: 기본적으로 클러스터 인증 정보를 기반으로 AMI ID를 사용하여
KataConfigCR을 실행할 때 이 값이 채워집니다. 고유한 AMI를 생성하는 경우 올바른 AMI ID를 지정합니다. - 4
- 검색한
AWS_REGION값을 지정합니다. - 5
- 검색한
AWS_SUBNET_ID값을 지정합니다. - 6
- 검색한
AWS_VPC_ID값을 지정합니다. - 7
- 검색한
AWS_SG_IDS값을 지정합니다. - 8
- 노드당 생성할 수 있는 최대 피어 Pod 수를 지정합니다. 기본값은
10입니다. - 9
- 사용자 정의 태그를 Pod VM 인스턴스의
키:값쌍으로 구성하여 피어 Pod 비용을 추적하거나 다른 클러스터에서 피어 Pod를 식별할 수 있습니다.
다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f peer-pods-cm.yaml
3.3.5. 사용자 정의 피어 Pod VM 이미지 선택 링크 복사링크가 클립보드에 복사되었습니다!
Pod 매니페스트에 주석을 추가하여 워크로드 요구 사항에 맞게 사용자 정의 피어 Pod 가상 머신(VM) 이미지를 선택할 수 있습니다. 사용자 정의 이미지는 피어 Pod 구성 맵에 지정된 기본 이미지를 덮어씁니다.
사전 요구 사항
- 클라우드 공급자 또는 하이퍼바이저와 호환되는 사용자 정의 Pod VM 이미지의 ID를 사용할 수 있습니다.
프로세스
io.katacontainers.config.hypervisor.image주석을 추가하여 Pod 매니페스트를 편집하여pod-manifest.yaml파일에 저장합니다.apiVersion: v1 kind: Pod metadata: name: pod-manifest annotations: io.katacontainers.config.hypervisor.image: "<custom_image_id>"1 spec: runtimeClassName: kata-remote2 containers: - name: <example_container>3 image: registry.access.redhat.com/ubi9/ubi:9.3 command: ["sleep", "36000"]다음 명령을 실행하여 Pod를 생성합니다.
$ oc apply -f pod-manifest.yaml
3.3.6. Kata 에이전트 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kata 에이전트 정책은 Kata 런타임으로 실행되는 Pod에 대한 에이전트 API 요청을 제어하는 보안 메커니즘입니다. Pod VM(가상 시스템) 내에서 Kata 에이전트가 Rego로 작성하고 강제 적용하는 이 정책은 허용 또는 거부되는 작업을 결정합니다.
보안이 중요하지 않은 개발 및 테스트와 같은 특정 사용 사례에 대해 사용자 지정 정책을 사용하여 기본 정책을 덮어쓸 수 있습니다. 예를 들어 컨트롤 플레인을 신뢰할 수 있는 환경에서 실행할 수 있습니다. 다음과 같은 다양한 방법으로 사용자 지정 정책을 적용할 수 있습니다.
- Pod VM 이미지에 포함
- 피어 Pod 구성 맵의 패치 적용.
- 워크로드 Pod YAML에 주석을 추가합니다.
프로덕션 시스템의 경우 기본 방법은 initdata를 사용하여 Kata 에이전트 정책을 재정의하는 것입니다. 다음 절차에서는 io.katacontainers.config.agent.policy 주석을 사용하는 개별 Pod에 사용자 지정 정책을 적용합니다. 정책은 Base64로 인코딩된 Rego 형식으로 제공됩니다. 이 방법은 Pod VM 이미지를 수정하지 않고 Pod 생성 시 기본 정책을 재정의합니다.
사용자 지정 정책은 기본 정책을 완전히 대체합니다. 특정 API만 수정하려면 전체 정책을 포함하고 관련 규칙을 조정합니다.
프로세스
사용자 지정 정책으로
policy.rego파일을 생성합니다. 다음 예제는 데모에exec및log가 활성화된 모든 구성 가능한 API를 보여줍니다.package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false이 정책은
exec(ExecProcessRequest) 및로그(ReadStreamRequest) API를 활성화합니다. 필요에 따라 정책을 추가로 사용자 지정하도록true또는false값을 조정합니다.다음 명령을 실행하여
policy.rego파일을 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 policy.regoyaml 파일에 사용할 출력을 저장합니다.
my-pod.yamlPod 사양 파일에 Base64로 인코딩된 정책을 추가합니다.apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy> spec: runtimeClassName: kata-remote containers: - name: <container_name> image: registry.access.redhat.com/ubi9/ubi:latest command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault다음 명령을 실행하여 Pod 매니페스트를 적용합니다.
$ oc apply -f my-pod.yaml
3.3.7. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR(사용자 정의 리소스)을 생성하여 작업자 노드에 kata-remote 를 런타임 클래스로 설치해야 합니다.
KataConfig CR을 생성하면 OpenShift 샌드박스 컨테이너 Operator가 다음을 수행합니다.
-
기본 구성을 사용하여
kata-remote라는RuntimeClassCR을 생성합니다. 이를 통해 사용자는RuntimeClassName필드에서 CR을 참조하여kata-remote를 런타임으로 사용하도록 워크로드를 구성할 수 있습니다. 이 CR은 런타임의 리소스 오버헤드도 지정합니다.
OpenShift 샌드박스 컨테이너는 kata-remote 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 예에 따라
example-kataconfig.yaml매니페스트 파일을 생성합니다.apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: enablePeerPods: true logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'1 - 1
- 선택 사항: 노드 레이블을 적용하여 특정 노드에
kata-remote를 설치한 경우 키와 값(예:osc: 'true')을 지정합니다.
다음 명령을 실행하여
KataConfigCR을 생성합니다.$ oc apply -f example-kataconfig.yaml새로운
KataConfigCR이 생성되고 작업자 노드에kata-remote가 런타임 클래스로 설치됩니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"kataNodes아래의 모든 작업자의 상태가설치되고이유를 지정하지 않고InProgress조건이False이면 클러스터에kata-remote가 설치됩니다.다음 명령을 실행하여 데몬 세트를 확인합니다.
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds다음 명령을 실행하여 런타임 클래스를 확인합니다.
$ oc get runtimeclass출력 예
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
3.3.8. 노드당 피어 Pod VM 수 수정 링크 복사링크가 클립보드에 복사되었습니다!
peerpodConfig CR(사용자 정의 리소스)을 편집하여 노드당 피어 Pod 가상 머신(VM) 제한을 수정할 수 있습니다.
프로세스
다음 명령을 실행하여 현재 제한을 확인합니다.
$ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ -o jsonpath='{.spec.limit}{"\n"}'다음 명령을 실행하여
peerpodConfigCR의limit속성을 수정합니다.$ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ --type merge --patch '{"spec":{"limit":"<value>"}}'1 - 1
- <value>를 정의할 제한으로 바꿉니다.
Pod VM 이미지 확인
클러스터에 kata-remote 가 설치되면 OpenShift 샌드박스 컨테이너 Operator에서 피어 Pod를 생성하는 데 사용되는 Pod VM 이미지를 생성합니다. 이 프로세스는 클라우드 인스턴스에서 이미지가 생성되므로 시간이 오래 걸릴 수 있습니다. 클라우드 공급자에 대해 생성한 구성 맵을 확인하여 Pod VM 이미지가 성공적으로 생성되었는지 확인할 수 있습니다.
프로세스
피어 Pod에 대해 생성한 구성 맵을 가져옵니다.
$ oc get configmap peer-pods-cm -n openshift-sandboxed-containers-operator -o yamlYAML 파일의
상태스탠자를 확인합니다.PODVM_AMI_ID매개변수가 채워지면 Pod VM 이미지가 성공적으로 생성됩니다.
문제 해결
다음 명령을 실행하여 이벤트 로그를 검색합니다.
$ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation다음 명령을 실행하여 작업 로그를 검색합니다.
$ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation
문제를 해결할 수 없는 경우 Red Hat 지원 케이스를 제출하고 두 로그의 출력을 첨부합니다.
3.3.9. 워크로드 오브젝트 구성 링크 복사링크가 클립보드에 복사되었습니다!
kata-remote 를 다음 pod 템플릿 오브젝트의 런타임 클래스로 설정하여 OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성해야 합니다.
-
Pod오브젝트 -
ReplicaSet오브젝트 -
ReplicationController오브젝트 -
StatefulSet오브젝트 -
Deployment오브젝트 -
DeploymentConfig오브젝트
Operator 네임스페이스에 워크로드를 배포하지 마십시오. 이러한 리소스에 대한 전용 네임스페이스를 생성합니다.
YAML 파일에 주석을 추가하여 구성 맵에 정의한 기본 인스턴스 유형을 사용하여 워크로드를 배포해야 하는지 여부를 정의할 수 있습니다.
인스턴스 유형을 수동으로 정의하지 않으려면 사용 가능한 메모리에 따라 자동 인스턴스 유형을 사용하도록 주석을 추가할 수 있습니다.
사전 요구 사항
-
KataConfigCR(사용자 정의 리소스)을 생성했습니다.
프로세스
다음 예와 같이
spec.runtimeClassName: kata-remote를 각 pod 템플릿 워크로드 오브젝트의 매니페스트에 추가합니다.apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata-remote # ...pod-templated 오브젝트에 주석을 추가하여 수동으로 정의된 인스턴스 유형 또는 자동 인스턴스 유형을 사용합니다.
수동으로 정의한 인스턴스 유형을 사용하려면 다음 주석을 추가합니다.
apiVersion: v1 kind: <object> metadata: annotations: io.katacontainers.config.hypervisor.machine_type: "t3.medium"1 # ...- 1
- 구성 맵에서 정의한 인스턴스 유형을 지정합니다.
자동 인스턴스 유형을 사용하려면 다음 주석을 추가합니다.
apiVersion: v1 kind: <Pod> metadata: annotations: io.katacontainers.config.hypervisor.default_vcpus: <vcpus> io.katacontainers.config.hypervisor.default_memory: <memory> # ...워크로드에서 사용할 수 있는 메모리 양을 정의합니다. 워크로드는 사용 가능한 메모리 양에 따라 자동 인스턴스 유형에서 실행됩니다.
다음 명령을 실행하여 워크로드 오브젝트에 변경 사항을 적용합니다.
$ oc apply -f <object.yaml>OpenShift Container Platform은 워크로드 오브젝트를 생성하고 스케줄링을 시작합니다.
검증
-
pod-templated 오브젝트의
spec.runtimeClassName필드를 검사합니다. 값이kata-remote이면 피어 Pod를 사용하여 OpenShift 샌드박스 컨테이너에서 워크로드가 실행됩니다.
4장. Azure에 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
Microsoft Azure 클라우드 컴퓨팅 서비스에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
OpenShift 샌드박스 컨테이너는 피어 Pod를 배포합니다. 피어 Pod 설계는 중첩된 가상화의 필요성을 우회합니다. 자세한 내용은 피어 Pod 및 Peer Pod 기술 상세 정보를 참조하십시오.
클러스터 요구 사항
- OpenShift 샌드박스 컨테이너 Operator를 설치하는 클러스터에 Red Hat OpenShift Container Platform 4.14 이상을 설치했습니다.
- 클러스터에 작업자 노드가 하나 이상 있습니다.
Microsoft Azure 클라우드 컴퓨팅 서비스에 OpenShift Container Platform을 설치하는 방법에 대한 자세한 내용은 Azure에 설치를 참조하십시오.
4.1. 피어 Pod 리소스 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
클러스터에 충분한 리소스가 있는지 확인해야 합니다.
피어 Pod 가상 머신(VM)에는 다음 두 위치에 있는 리소스가 필요합니다.
-
작업자 노드입니다. 작업자 노드는 메타데이터, Kata shim 리소스(
containerd-shim-kata-v2), remote-hypervisor 리소스(cloud-api-adaptor) 및 작업자 노드와 피어 Pod VM 간의 터널 설정을 저장합니다. - 클라우드 인스턴스입니다. 클라우드에서 실행되는 실제 피어 Pod VM입니다.
Kubernetes 작업자 노드에 사용되는 CPU 및 메모리 리소스는 피어 Pod를 생성하는 데 사용되는 RuntimeClass(kata-remote) 정의에 포함된 Pod 오버헤드 에 의해 처리됩니다.
클라우드에서 실행되는 총 피어 Pod VM 수는 Kubernetes 노드 확장 리소스로 정의됩니다. 이 제한은 노드당이며 peer-pods-cm 구성 맵의 PEERPODS_LIMIT_PER_NODE 속성에 의해 설정됩니다.
확장된 리소스의 이름은 kata.peerpods.io/vm 이며 Kubernetes 스케줄러에서 용량 추적 및 계정을 처리할 수 있습니다.
OpenShift 샌드박스 컨테이너 Operator를 설치한 후 환경의 요구 사항에 따라 노드당 제한을 편집할 수 있습니다.
변경 웹 후크 는 확장된 리소스 kata.peerpods.io/vm 을 Pod 사양에 추가합니다. 또한 Pod 사양에서 리소스별 항목도 제거합니다(있는 경우). 이를 통해 Kubernetes 스케줄러에서 이러한 확장 리소스를 고려하여 리소스를 사용할 수 있는 경우에만 피어 Pod를 예약할 수 있습니다.
변경 웹 후크는 다음과 같이 Kubernetes Pod를 수정합니다.
-
변경 웹 후크는
TARGET_RUNTIME_CLASS환경 변수에 지정된 예상RuntimeClassName값을 Pod에 확인합니다. Pod 사양의 값이TARGET_RUNTIME_CLASS의 값과 일치하지 않으면 Pod를 수정하지 않고 웹 후크가 종료됩니다. RuntimeClassName값이 일치하는 경우 Webhook에서 Pod 사양을 다음과 같이 변경합니다.-
Webhook는 Pod에 있는 모든 컨테이너 및 init 컨테이너의
resources필드에서 모든 리소스 사양을 제거합니다. -
Webhook는 Pod의 첫 번째 컨테이너의 resources 필드를 수정하여 확장 리소스(
kata.peerpods.io/vm)를 사양에 추가합니다. 확장된 리소스kata.peerpods.io/vm은 회계 목적으로 Kubernetes 스케줄러에서 사용합니다.
-
Webhook는 Pod에 있는 모든 컨테이너 및 init 컨테이너의
변경 웹 후크는 OpenShift Container Platform의 특정 시스템 네임스페이스가 변경되지 않습니다. 해당 시스템 네임스페이스에 피어 Pod가 생성되면 Pod 사양에 확장 리소스가 포함되지 않는 한 Kubernetes 확장 리소스를 사용하는 리소스 계정이 작동하지 않습니다.
특정 네임스페이스에서 피어 Pod 생성만 허용하도록 클러스터 전체 정책을 정의하는 것이 좋습니다.
4.2. 아웃바운드 연결 구성 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod가 공용 인터넷과 같은 외부 네트워크와 통신할 수 있도록 하려면 Pod VM(가상 머신) 서브넷에 대한 아웃바운드 연결을 구성해야 합니다. 이를 위해서는 NAT 게이트웨이를 설정해야 하며, 선택적으로 Azure에서 서브넷이 클러스터의 가상 네트워크(VNet)와 통합되는 방법을 정의합니다.
- 피어 Pod 및 서브넷
- 피어 Pod는 아웃바운드 액세스를 위한 명시적 구성이 필요한 전용 Azure 서브넷에서 작동합니다. 이 서브넷은 OpenShift Container Platform 노드에서 사용하는 기본 작업자 서브넷 또는 피어 Pod를 위해 특별히 생성된 별도의 사용자 정의 서브넷일 수 있습니다.
- VNet 피어링
- 별도의 서브넷을 사용하는 경우 VNet 피어링은 피어 Pod VNet을 클러스터의 VNet에 연결하여 격리를 유지하면서 내부 통신을 보장합니다. 이를 위해서는 VNet 간에 겹치지 않는 CIDR 범위가 필요합니다.
아웃바운드 연결은 다음 두 가지 방법으로 구성할 수 있습니다.
- 기본 작업자 서브넷: NAT 게이트웨이를 포함하도록 기존 작업자 서브넷을 수정합니다. 이는 더 간단하고 클러스터 리소스를 재사용하지만 격리를 줄일 수 있습니다.
- 피어 Pod VNet: 피어 Pod의 전용 VNet 및 서브넷을 설정하고 NAT 게이트웨이를 연결하며 클러스터 VNet과 피어링합니다. 이로 인해 추가 복잡성으로 인해 격리와 유연성이 향상됩니다.
4.2.1. 아웃바운드 연결에 대한 기본 작업자 서브넷 구성 링크 복사링크가 클립보드에 복사되었습니다!
NAT 게이트웨이를 사용하여 기본 작업자 서브넷을 구성할 수 있습니다.
사전 요구 사항
-
Azure CLI(
az)가 설치 및 인증됩니다. - Azure 리소스 그룹 및 VNet에 대한 관리자 액세스 권한이 있습니다.
프로세스
다음 명령을 실행하여
AZURE_RESOURCE_GROUP환경 변수를 설정합니다.$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster \ -o jsonpath='{.status.platformStatus.azure.resourceGroupName}')다음 명령을 실행하여
AZURE_REGION환경 변수를 설정합니다.$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP}\ --query "{Location:location}" --output tsv) && \ echo "AZURE_REGION: \"$AZURE_REGION\""다음 명령을 실행하여
AZURE_VNET_NAME환경 변수를 설정합니다.$ AZURE_VNET_NAME=$(az network vnet list \ -g "${AZURE_RESOURCE_GROUP}" --query '[].name' -o tsv)다음 명령을 실행하여
AZURE_SUBNET_ID환경 변수를 설정합니다.$ AZURE_SUBNET_ID=$(az network vnet subnet list \ --resource-group "${AZURE_RESOURCE_GROUP}" \ --vnet-name "${AZURE_VNET_NAME}" --query "[].{Id:id} \ | [? contains(Id, 'worker')]" --output tsv)다음 명령을 실행하여 피어 Pod 서브넷의 NAT 게이트웨이 환경 변수를 설정합니다.
$ export PEERPOD_NAT_GW=peerpod-nat-gw$ export PEERPOD_NAT_GW_IP=peerpod-nat-gw-ip다음 명령을 실행하여 NAT 게이트웨이의 공용 IP 주소를 만듭니다.
$ az network public-ip create -g "${AZURE_RESOURCE_GROUP}" \ -n "${PEERPOD_NAT_GW_IP}" -l "${AZURE_REGION}" --sku StandardNAT 게이트웨이를 생성하고 다음 명령을 실행하여 공용 IP 주소와 연결합니다.
$ az network nat gateway create -g "${AZURE_RESOURCE_GROUP}" \ -l "${AZURE_REGION}" --public-ip-addresses "${PEERPOD_NAT_GW_IP}" \ -n "${PEERPOD_NAT_GW}"다음 명령을 실행하여 NAT 게이트웨이를 사용하도록 VNet 서브넷을 업데이트합니다.
$ az network vnet subnet update --nat-gateway "${PEERPOD_NAT_GW}" \ --ids "${AZURE_SUBNET_ID}"
검증
다음 명령을 실행하여 NAT 게이트웨이가 VNet 서브넷에 연결되었는지 확인합니다.
$ az network vnet subnet show --ids "${AZURE_SUBNET_ID}" \ --query "natGateway.id" -o tsv출력에는 NAT 게이트웨이 리소스 ID가 포함됩니다. NAT 게이트웨이가 연결되지 않은 경우 출력이 비어 있습니다.
출력 예
/subscriptions/12345678-1234-1234-1234-1234567890ab/resourceGroups/myResourceGroup/providers/Microsoft.Network/natGateways/myNatGateway
4.2.2. 아웃 바운드 연결을 위한 피어 Pod VNet 생성 링크 복사링크가 클립보드에 복사되었습니다!
공용 인터넷 액세스를 활성화하려면 피어 pod에 대한 전용 가상 네트워크(VNet)를 생성하고 NAT(네트워크 주소 변환) 게이트웨이를 연결하며 서브넷을 생성하고, 덮어쓰지 않는 주소 공간을 사용하여 VNet 피어를 활성화할 수 있습니다.
사전 요구 사항
-
Azure CLI(
az)가 설치됨 - Azure에 로그인했습니다. Azure CLI를 사용하여 Azure 인증을 참조하십시오.
- Azure 리소스 그룹과 클러스터를 호스팅하는 VNet에 대한 관리자 액세스 권한이 있습니다.
-
클러스터 VNet CIDR(Classless inter-domain routing) 주소를 확인했습니다. 기본값은
10.0.0.0/14입니다. 기본값을 덮어쓰는 경우 피어 Pod VNet에 대해 겹치지 않는 CIDR 주소를 선택했는지 확인했습니다. 예를 들면192.168.0.0/16입니다.
프로세스
피어 Pod 네트워크의 환경 변수를 설정합니다.
다음 명령을 실행하여 피어 Pod VNet 환경 변수를 설정합니다.
$ export PEERPOD_VNET_NAME="${PEERPOD_VNET_NAME:-peerpod-vnet}"$ export PEERPOD_VNET_CIDR="${PEERPOD_VNET_CIDR:-192.168.0.0/16}"다음 명령을 실행하여 피어 Pod 서브넷 환경 변수를 설정합니다.
$ export PEERPOD_SUBNET_NAME="${PEERPOD_SUBNET_NAME:-peerpod-subnet}"$ export PEERPOD_SUBNET_CIDR="${PEERPOD_SUBNET_CIDR:-192.168.0.0/16}"
Azure의 환경 변수를 설정합니다.
$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster \ -o jsonpath='{.status.platformStatus.azure.resourceGroupName}')$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP}\ --query "{Location:location}" --output tsv) && \ echo "AZURE_REGION: \"$AZURE_REGION\""$ AZURE_VNET_NAME=$(az network vnet list \ -g "${AZURE_RESOURCE_GROUP}" --query '[].name' -o tsv)다음 명령을 실행하여 피어 포드 NAT 게이트웨이 환경 변수를 설정합니다.
$ export PEERPOD_NAT_GW="${PEERPOD_NAT_GW:-peerpod-nat-gw}"$ export PEERPOD_NAT_GW_IP="${PEERPOD_NAT_PUBLIC_IP:-peerpod-nat-gw-ip}"VNET을 구성합니다.
다음 명령을 실행하여 피어 Pod VNet을 생성합니다.
$ az network vnet create --resource-group "${AZURE_RESOURCE_GROUP}" \ --name "${PEERPOD_VNET_NAME}" \ --address-prefixes "${PEERPOD_VNET_CIDR}"다음 명령을 실행하여 피어 Pod VNet의 공용 IP 주소를 생성합니다.
$ az network public-ip create -g "${AZURE_RESOURCE_GROUP}" \ -n "${PEERPOD_NAT_GW_IP}" -l "${AZURE_REGION}"다음 명령을 실행하여 피어 Pod VNet의 NAT 게이트웨이를 생성합니다.
$ az network nat gateway create -g "${AZURE_RESOURCE_GROUP}" \ -l "${AZURE_REGION}" \ --public-ip-addresses "${PEERPOD_NAT_GW_IP}" \ -n "${PEERPOD_NAT_GW}"피어 Pod VNet에 서브넷을 생성하고 다음 명령을 실행하여 NAT 게이트웨이를 연결합니다.
$ az network vnet subnet create \ --resource-group "${AZURE_RESOURCE_GROUP}" \ --vnet-name "${PEERPOD_VNET_NAME}" \ --name "${PEERPOD_SUBNET_NAME}" \ --address-prefixes "${PEERPOD_SUBNET_CIDR}" \ --nat-gateway "${PEERPOD_NAT_GW}"
가상 네트워크 피어링 연결을 구성합니다.
다음 명령을 실행하여 피어링 연결을 생성합니다.
$ az network vnet peering create -g "${AZURE_RESOURCE_GROUP}" \ -n peerpod-azure-vnet-to-peerpod-vnet \ --vnet-name "${AZURE_VNET_NAME}" \ --remote-vnet "${PEERPOD_VNET_NAME}" --allow-vnet-access \ --allow-forwarded-traffic다음 명령을 실행하여 피어링 연결을 동기화합니다.
$ az network vnet peering sync -g "${AZURE_RESOURCE_GROUP}" \ -n peerpod-azure-vnet-to-peerpod-vnet \ --vnet-name "${AZURE_VNET_NAME}"다음 명령을 실행하여 피어링 연결을 완료합니다.
$ az network vnet peering create -g "${AZURE_RESOURCE_GROUP}" \ -n peerpod-peerpod-vnet-to-azure-vnet \ --vnet-name "${PEERPOD_VNET_NAME}" \ --remote-vnet "${AZURE_VNET_NAME}" --allow-vnet-access \ --allow-forwarded-traffic
검증
다음 명령을 실행하여 클러스터 VNet에서 피어링 연결 상태를 확인합니다.
$ az network vnet peering show -g "${AZURE_RESOURCE_GROUP}" \ -n peerpod-azure-vnet-to-peerpod-vnet \ --vnet-name "${AZURE_VNET_NAME}" \ --query "peeringState" -o tsv연결된값이 반환되어야 합니다.다음 명령을 실행하여 NAT 게이트웨이가 피어 포드 서브넷에 연결되었는지 확인합니다.
$ az network vnet subnet show --resource-group "${AZURE_RESOURCE_GROUP}" \ --vnet-name "${PEERPOD_VNET_NAME}" --name "${PEERPOD_SUBNET_NAME}" \ --query "natGateway.id" -o tsv
4.3. 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 다음 작업을 수행하여 Azure에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator를 설치합니다.
- 선택 사항: OpenShift 샌드박스 컨테이너 Operator와 함께 설치된 Cloud Credential Operator를 설치 제거한 경우 피어 Pod 시크릿을 생성합니다.
- 선택 사항: 사용자 정의 Pod VM 이미지를 선택합니다.
- 선택 사항: Azure 시크릿을 생성합니다.
- 선택 사항: Kata 에이전트 정책을 사용자 지정합니다.
- 피어 Pod 구성 맵을 생성합니다.
-
KataConfig사용자 지정 리소스를 생성합니다. - OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성합니다.
4.3.1. OpenShift 샌드박스 컨테이너 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
- 웹 콘솔에서 Operator → OperatorHub 로 이동합니다.
-
키워드로 필터링 필드에
OpenShift sandboxed containers를 입력합니다. - OpenShift 샌드박스 컨테이너 Operator 타일을 선택하고 설치를 클릭합니다.
- Operator 설치 페이지의 사용 가능한 업데이트 채널 옵션 목록에서 stable 을 선택합니다.
설치된 네임스페이스 용으로 Operator 권장 네임스페이스 가 선택되어 있는지 확인합니다. 이렇게 하면 필수
openshift-sandboxed-containers-operator네임스페이스에 Operator가 설치됩니다. 이 네임스페이스가 아직 존재하지 않으면 자동으로 생성됩니다.참고openshift-sandboxed-containers-operator이외의 네임스페이스에 OpenShift 샌드박스 컨테이너 Operator를 설치하려고 하면 설치가 실패합니다.- 승인 전략에 대해 자동 이 선택되어 있는지 확인합니다. Automatic 은 기본값이며 새 z-stream 릴리스를 사용할 수 있을 때 OpenShift 샌드박스 컨테이너에 대한 자동 업데이트를 활성화합니다.
- 설치를 클릭합니다.
- Operator → 설치된 Operator 로 이동하여 Operator가 설치되었는지 확인합니다.
4.3.2. 피어 Pod 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod 보안이 비어 있고 CCO(Cloud Credential Operator)가 설치되면 OpenShift 샌드박스 컨테이너 Operator는 CCO를 사용하여 시크릿을 검색합니다. CCO를 설치 제거한 경우 OpenShift 샌드박스 컨테이너의 피어 Pod 시크릿을 수동으로 생성해야 합니다. 그렇지 않으면 피어 Pod가 작동하지 않습니다.
시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.
기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.
사전 요구 사항
- Azure CLI 도구를 설치하고 구성했습니다.
프로세스
다음 명령을 실행하여 Azure 서브스크립션 ID를 검색합니다.
$ AZURE_SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" \ -o tsv) && echo "AZURE_SUBSCRIPTION_ID: \"$AZURE_SUBSCRIPTION_ID\""다음 명령을 실행하여 RBAC 콘텐츠를 생성합니다.
$ az ad sp create-for-rbac --role Contributor --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID \ --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"출력 예
{ "client_id": `AZURE_CLIENT_ID`, "client_secret": `AZURE_CLIENT_SECRET`, "tenant_id": `AZURE_TENANT_ID` }-
보안오브젝트에 사용할 RBAC 출력을 기록합니다. - OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- OpenShift 샌드박스 컨테이너 Operator 타일을 클릭합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣습니다.
apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: AZURE_CLIENT_ID: "<azure_client_id>"1 AZURE_CLIENT_SECRET: "<azure_client_secret>"2 AZURE_TENANT_ID: "<azure_tenant_id>"3 AZURE_SUBSCRIPTION_ID: "<azure_subscription_id>"4 - 저장을 클릭하여 변경 사항을 적용합니다.
- 워크로드 → 시크릿 으로 이동하여 피어 Pod 시크릿을 확인합니다.
4.3.3. 피어 Pod 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너에 대한 피어 Pod 구성 맵을 생성해야 합니다.
프로세스
Azure 인스턴스에서 다음 값을 가져옵니다.
Azure 리소스 그룹을 검색하고 기록합니다.
$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""Azure VNet 이름을 검색하고 기록합니다.
$ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)이 값은 Azure 서브넷 ID를 검색하는 데 사용됩니다.
Azure 서브넷 ID를 검색하고 기록합니다.
$ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""Azure NSS(Network Security Group) ID를 검색하고 기록합니다.
$ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""Azure 리전을 검색하고 기록합니다.
$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- Operator 목록에서 OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣습니다.
apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "azure" VXLAN_PORT: "9000" AZURE_INSTANCE_SIZE: "Standard_B2als_v2"1 AZURE_INSTANCE_SIZES: "Standard_B2als_v2,Standard_D2as_v5,Standard_D4as_v5,Standard_D2ads_v5"2 AZURE_SUBNET_ID: "<azure_subnet_id>"3 AZURE_NSG_ID: "<azure_nsg_id>"4 PROXY_TIMEOUT: "5m" AZURE_IMAGE_ID: "<azure_image_id>"5 AZURE_REGION: "<azure_region>"6 AZURE_RESOURCE_GROUP: "<azure_resource_group>"7 PEERPODS_LIMIT_PER_NODE: "10"8 TAGS: "key1=value1,key2=value2"9 DISABLECVM: "true"- 1
"Standard_B2als_v2"인스턴스 크기는 워크로드에 인스턴스 크기가 정의되지 않은 경우 기본값입니다.- 2
- Pod 생성을 위해 공백 없이 인스턴스 크기를 지정합니다. 이를 통해 더 적은 메모리와 더 적은 CPU 또는 대규모 워크로드의 인스턴스 크기가 필요한 워크로드에 대해 더 작은 인스턴스 크기를 정의할 수 있습니다.
- 3
- 검색한
AZURE_SUBNET_ID값을 지정합니다. - 4
- 검색한
AZURE_NSG_ID값을 지정합니다. - 5
- 선택 사항: 기본적으로 클러스터 인증 정보를 기반으로 Azure 이미지 ID를 사용하여
KataConfigCR을 실행할 때 이 값이 채워집니다. 자체 Azure 이미지를 생성하는 경우 올바른 이미지 ID를 지정합니다. - 6
- 검색한
AZURE_REGION값을 지정합니다. - 7
- 검색한
AZURE_RESOURCE_GROUP값을 지정합니다. - 8
- 노드당 생성할 수 있는 최대 피어 Pod 수를 지정합니다. 기본값은
10입니다. - 9
- 사용자 정의 태그를 Pod VM 인스턴스의
키:값쌍으로 구성하여 피어 Pod 비용을 추적하거나 다른 클러스터에서 피어 Pod를 식별할 수 있습니다.
- 저장을 클릭하여 변경 사항을 적용합니다.
- 워크로드 → ConfigMap 으로 이동하여 새 구성 맵을 확인합니다.
4.3.4. 사용자 정의 피어 Pod VM 이미지 선택 링크 복사링크가 클립보드에 복사되었습니다!
Pod 매니페스트에 주석을 추가하여 워크로드 요구 사항에 맞게 사용자 정의 피어 Pod 가상 머신(VM) 이미지를 선택할 수 있습니다. 사용자 정의 이미지는 피어 Pod 구성 맵에 지정된 기본 이미지를 덮어씁니다.
사전 요구 사항
- 클라우드 공급자 또는 하이퍼바이저와 호환되는 사용자 정의 Pod VM 이미지의 ID를 사용할 수 있습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- Operator 목록에서 OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣습니다.
apiVersion: v1 kind: Pod metadata: name: pod-manifest annotations: io.katacontainers.config.hypervisor.image: "<custom_image_id>"1 spec: runtimeClassName: kata-remote2 containers: - name: <example_container>3 image: registry.access.redhat.com/ubi9/ubi:9.3 command: ["sleep", "36000"]- 저장을 클릭하여 변경 사항을 적용합니다.
4.3.5. Azure 시크릿 생성 링크 복사링크가 클립보드에 복사되었습니다!
Azure VM(가상 머신) 생성 API에 필요한 SSH 키 시크릿을 생성해야 합니다. Azure에는 SSH 공개 키만 필요합니다. 기밀 컨테이너는 VM에서 SSH를 비활성화하므로 키가 VM에 영향을 미치지 않습니다.
프로세스
다음 명령을 실행하여 SSH 키 쌍을 생성합니다.
$ ssh-keygen -f ./id_rsa -N ""- OpenShift Container Platform 웹 콘솔에서 워크로드 → 시크릿 으로 이동합니다.
- 시크릿 페이지에서 openshift-sandboxed-containers-operator 프로젝트에 있는지 확인합니다.
- 생성을 클릭하고 키/값 시크릿을 선택합니다.
-
시크릿 이름 필드에
ssh-key-secret을 입력합니다. -
키 필드에
id_rsa.pub를 입력합니다. - 값 필드에 공개 SSH 키를 붙여넣습니다.
- 생성을 클릭합니다.
생성한 SSH 키를 삭제합니다.
$ shred --remove id_rsa.pub id_rsa
4.3.6. Kata 에이전트 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kata 에이전트 정책은 Kata 런타임으로 실행되는 Pod에 대한 에이전트 API 요청을 제어하는 보안 메커니즘입니다. Pod VM(가상 시스템) 내에서 Kata 에이전트가 Rego로 작성하고 강제 적용하는 이 정책은 허용 또는 거부되는 작업을 결정합니다.
보안이 중요하지 않은 개발 및 테스트와 같은 특정 사용 사례에 대해 사용자 지정 정책을 사용하여 기본 정책을 덮어쓸 수 있습니다. 예를 들어 컨트롤 플레인을 신뢰할 수 있는 환경에서 실행할 수 있습니다. 다음과 같은 다양한 방법으로 사용자 지정 정책을 적용할 수 있습니다.
- Pod VM 이미지에 포함
- 피어 Pod 구성 맵의 패치 적용.
- 워크로드 Pod YAML에 주석을 추가합니다.
프로덕션 시스템의 경우 기본 방법은 initdata를 사용하여 Kata 에이전트 정책을 재정의하는 것입니다. 다음 절차에서는 io.katacontainers.config.agent.policy 주석을 사용하는 개별 Pod에 사용자 지정 정책을 적용합니다. 정책은 Base64로 인코딩된 Rego 형식으로 제공됩니다. 이 방법은 Pod VM 이미지를 수정하지 않고 Pod 생성 시 기본 정책을 재정의합니다.
사용자 지정 정책은 기본 정책을 완전히 대체합니다. 특정 API만 수정하려면 전체 정책을 포함하고 관련 규칙을 조정합니다.
프로세스
사용자 지정 정책으로
policy.rego파일을 생성합니다. 다음 예제는 데모에exec및log가 활성화된 모든 구성 가능한 API를 보여줍니다.package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false이 정책은
exec(ExecProcessRequest) 및로그(ReadStreamRequest) API를 활성화합니다. 필요에 따라 정책을 추가로 사용자 지정하도록true또는false값을 조정합니다.다음 명령을 실행하여
policy.rego파일을 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 policy.regoyaml 파일에 사용할 출력을 저장합니다.
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- Operator 목록에서 OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣고 Base64로 인코딩된 정책을 추가합니다.
apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy> spec: runtimeClassName: kata-remote containers: - name: <container_name> image: registry.access.redhat.com/ubi9/ubi:latest command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault- 저장을 클릭하여 변경 사항을 적용합니다.
4.3.7. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR(사용자 정의 리소스)을 생성하여 작업자 노드에 kata-remote 를 RuntimeClass 로 설치해야 합니다.
kata-remote 런타임 클래스는 기본적으로 모든 작업자 노드에 설치됩니다. 특정 노드에 kata-remote 를 설치하려면 해당 노드에 레이블을 추가한 다음 KataConfig CR에 레이블을 정의할 수 있습니다.
OpenShift 샌드박스 컨테이너는 kata-remote 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 다음 요인은 재부팅 시간을 늘릴 수 있습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - 선택 사항: 노드 자격 검사를 활성화하려면 Node Feature Discovery Operator를 설치했습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- KataConfig 탭에서 KataConfig 만들기 를 클릭합니다.
다음 세부 정보를 입력합니다.
-
이름: 선택 사항: 기본 이름은
example-kataconfig입니다. -
labels: 선택 사항:
KataConfig리소스에 대한 특성을 식별하는 모든 관련 정보를 입력합니다. 각 레이블은 키-값 쌍을 나타냅니다. - enablePeerPods: 퍼블릭 클라우드, IBM Z® 및 IBM® LinuxONE 배포에는 선택합니다.
kataConfigPoolSelector. 선택 사항: 선택한 노드에
kata-remote를 설치하려면 선택한 노드의 라벨에 일치하는 표현식을 추가합니다.- kataConfigPoolSelector 영역을 확장합니다.
- kataConfigPoolSelector 영역에서 matchExpressions 를 확장합니다. 이는 라벨 선택기 요구 사항 목록입니다.
- matchExpressions 추가를 클릭합니다.
- 키 필드에 선택기가 적용되는 라벨 키를 입력합니다.
-
Operator 필드에 레이블 값과의 키 관계를 입력합니다. 유효한 연산자는
In,NotIn,Exists및DoesNotExist입니다. - 값 영역을 확장한 다음 값 추가 를 클릭합니다.
-
값 필드에 키 레이블 값에
true또는false를 입력합니다.
-
loglevel:
kata-remote런타임 클래스를 사용하여 노드에 대해 검색된 로그 데이터의 수준을 정의합니다.
-
이름: 선택 사항: 기본 이름은
생성을 클릭합니다.
KataConfigCR이 생성되고 작업자 노드에kata-remote런타임 클래스를 설치합니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.
검증
-
KataConfig 탭에서
KataConfigCR을 클릭하여 세부 정보를 확인합니다. YAML 탭을 클릭하여
상태 스탠자를 확인합니다.상태스탠자에는조건및kataNodes키가 포함되어 있습니다.status.kataNodes의 값은 노드 배열이며 각 노드는 특정kata-remote설치의 노드를 나열합니다. 업데이트가 있을 때마다 메시지가 표시됩니다.Reload (다시 로드)를 클릭하여 YAML을 새로 고칩니다.
status.kataNodes어레이의 모든 작업자가설치및조건.InProgress: False를 지정하는 이유 없이 False를 표시하면 클러스터에kata-remote가 설치됩니다.
추가 리소스
Pod VM 이미지 확인
클러스터에 kata-remote 가 설치되면 OpenShift 샌드박스 컨테이너 Operator에서 피어 Pod를 생성하는 데 사용되는 Pod VM 이미지를 생성합니다. 이 프로세스는 클라우드 인스턴스에서 이미지가 생성되므로 시간이 오래 걸릴 수 있습니다. 클라우드 공급자에 대해 생성한 구성 맵을 확인하여 Pod VM 이미지가 성공적으로 생성되었는지 확인할 수 있습니다.
프로세스
- 워크로드 → ConfigMap 으로 이동합니다.
- 공급자 구성 맵을 클릭하여 세부 정보를 확인합니다.
- YAML 탭을 클릭합니다.
YAML 파일의
상태스탠자를 확인합니다.AZURE_IMAGE_ID매개변수가 채워지면 Pod VM 이미지가 성공적으로 생성되었습니다.
문제 해결
다음 명령을 실행하여 이벤트 로그를 검색합니다.
$ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation다음 명령을 실행하여 작업 로그를 검색합니다.
$ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation
문제를 해결할 수 없는 경우 Red Hat 지원 케이스를 제출하고 두 로그의 출력을 첨부합니다.
4.3.8. 워크로드 오브젝트 구성 링크 복사링크가 클립보드에 복사되었습니다!
kata-remote 를 다음 pod 템플릿 오브젝트의 런타임 클래스로 설정하여 OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성해야 합니다.
-
Pod오브젝트 -
ReplicaSet오브젝트 -
ReplicationController오브젝트 -
StatefulSet오브젝트 -
Deployment오브젝트 -
DeploymentConfig오브젝트
Operator 네임스페이스에 워크로드를 배포하지 마십시오. 이러한 리소스에 대한 전용 네임스페이스를 생성합니다.
YAML 파일에 주석을 추가하여 구성 맵에 정의된 기본 인스턴스 크기를 사용하여 워크로드를 배포해야 하는지 여부를 정의할 수 있습니다.
인스턴스 크기를 수동으로 정의하지 않으려면 사용 가능한 메모리에 따라 자동 인스턴스 크기를 사용하도록 주석을 추가할 수 있습니다.
사전 요구 사항
-
KataConfigCR(사용자 정의 리소스)을 생성했습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 워크로드 → 워크로드 유형(예: Pod )으로 이동합니다.
- 워크로드 유형 페이지에서 오브젝트를 클릭하여 세부 정보를 확인합니다.
- YAML 탭을 클릭합니다.
다음 예와 같이
spec.runtimeClassName: kata-remote를 각 pod 템플릿 워크로드 오브젝트의 매니페스트에 추가합니다.apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata-remote # ...수동으로 정의된 인스턴스 크기 또는 자동 인스턴스 크기를 사용하도록 pod-templated 오브젝트에 주석을 추가합니다.
수동으로 정의한 인스턴스 크기를 사용하려면 다음 주석을 추가합니다.
apiVersion: v1 kind: <object> metadata: annotations: io.katacontainers.config.hypervisor.machine_type: "Standard_B2als_v2"1 # ...- 1
- 구성 맵에서 정의한 인스턴스 크기를 지정합니다.
자동 인스턴스 크기를 사용하려면 다음 주석을 추가합니다.
apiVersion: v1 kind: <Pod> metadata: annotations: io.katacontainers.config.hypervisor.default_vcpus: <vcpus> io.katacontainers.config.hypervisor.default_memory: <memory> # ...워크로드에서 사용할 수 있는 메모리 양을 정의합니다. 워크로드는 사용 가능한 메모리 크기에 따라 자동 인스턴스 크기에서 실행됩니다.
저장을 클릭하여 변경 사항을 적용합니다.
OpenShift Container Platform은 워크로드 오브젝트를 생성하고 스케줄링을 시작합니다.
검증
-
pod-templated 오브젝트의
spec.runtimeClassName필드를 검사합니다. 값이kata-remote이면 피어 Pod를 사용하여 OpenShift 샌드박스 컨테이너에서 워크로드가 실행됩니다.
4.4. 명령줄을 사용하여 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
CLI(명령줄 인터페이스)를 사용하여 다음 작업을 수행하여 Azure에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator를 설치합니다.
- 선택 사항: OpenShift 샌드박스 컨테이너 Operator와 함께 설치된 Cloud Credential Operator를 설치 제거한 경우 피어 Pod 시크릿을 생성합니다.
- 선택 사항: 사용자 정의 Pod VM 이미지를 선택합니다.
- 피어 Pod 구성 맵을 생성합니다.
- 선택 사항: Azure 시크릿을 생성합니다.
- 선택 사항: Kata 에이전트 정책을 사용자 지정합니다.
-
KataConfig사용자 지정 리소스를 생성합니다. - 선택 사항: 각 작업자 노드에서 실행되는 가상 머신 수를 수정합니다.
- OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성합니다.
4.4.1. OpenShift 샌드박스 컨테이너 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
CLI를 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
osc-namespace.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator다음 명령을 실행하여 네임스페이스를 생성합니다.
$ oc apply -f osc-namespace.yamlosc-operatorgroup.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sandboxed-containers-operator-group namespace: openshift-sandboxed-containers-operator spec: targetNamespaces: - openshift-sandboxed-containers-operator다음 명령을 실행하여 operator 그룹을 생성합니다.
$ oc apply -f osc-operatorgroup.yamlosc-subscription.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sandboxed-containers-operator namespace: openshift-sandboxed-containers-operator spec: channel: stable installPlanApproval: Automatic name: sandboxed-containers-operator source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: sandboxed-containers-operator.v1.9.0다음 명령을 실행하여 서브스크립션을 생성합니다.
$ oc apply -f osc-subscription.yaml다음 명령을 실행하여 Operator가 올바르게 설치되었는지 확인합니다.
$ oc get csv -n openshift-sandboxed-containers-operator이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.
다음 명령을 실행하여 프로세스를 확인합니다.
$ watch oc get csv -n openshift-sandboxed-containers-operator출력 예
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.9.0 1.8.1 Succeeded
4.4.2. 피어 Pod 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod 보안이 비어 있고 CCO(Cloud Credential Operator)가 설치되면 OpenShift 샌드박스 컨테이너 Operator는 CCO를 사용하여 시크릿을 검색합니다. CCO를 설치 제거한 경우 OpenShift 샌드박스 컨테이너의 피어 Pod 시크릿을 수동으로 생성해야 합니다. 그렇지 않으면 피어 Pod가 작동하지 않습니다.
시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.
기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.
사전 요구 사항
- Azure CLI 도구를 설치하고 구성했습니다.
프로세스
다음 명령을 실행하여 Azure 서브스크립션 ID를 검색합니다.
$ AZURE_SUBSCRIPTION_ID=$(az account list --query "[?isDefault].id" \ -o tsv) && echo "AZURE_SUBSCRIPTION_ID: \"$AZURE_SUBSCRIPTION_ID\""다음 명령을 실행하여 RBAC 콘텐츠를 생성합니다.
$ az ad sp create-for-rbac --role Contributor --scopes /subscriptions/$AZURE_SUBSCRIPTION_ID \ --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"출력 예
{ "client_id": `AZURE_CLIENT_ID`, "client_secret": `AZURE_CLIENT_SECRET`, "tenant_id": `AZURE_TENANT_ID` }-
보안오브젝트에 사용할 RBAC 출력을 기록합니다. 다음 예에 따라
peer-pods-secret.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: AZURE_CLIENT_ID: "<azure_client_id>"1 AZURE_CLIENT_SECRET: "<azure_client_secret>"2 AZURE_TENANT_ID: "<azure_tenant_id>"3 AZURE_SUBSCRIPTION_ID: "<azure_subscription_id>"4 다음 명령을 실행하여 시크릿을 생성합니다.
$ oc apply -f peer-pods-secret.yaml
4.4.3. 피어 Pod 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너에 대한 피어 Pod 구성 맵을 생성해야 합니다.
프로세스
Azure 인스턴스에서 다음 값을 가져옵니다.
Azure 리소스 그룹을 검색하고 기록합니다.
$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""Azure VNet 이름을 검색하고 기록합니다.
$ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)이 값은 Azure 서브넷 ID를 검색하는 데 사용됩니다.
Azure 서브넷 ID를 검색하고 기록합니다.
$ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""Azure NSS(Network Security Group) ID를 검색하고 기록합니다.
$ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""Azure 리전을 검색하고 기록합니다.
$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
다음 예에 따라
peer-pods-cm.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "azure" VXLAN_PORT: "9000" AZURE_INSTANCE_SIZE: "Standard_B2als_v2"1 AZURE_INSTANCE_SIZES: "Standard_B2als_v2,Standard_D2as_v5,Standard_D4as_v5,Standard_D2ads_v5"2 AZURE_SUBNET_ID: "<azure_subnet_id>"3 AZURE_NSG_ID: "<azure_nsg_id>"4 PROXY_TIMEOUT: "5m" AZURE_IMAGE_ID: "<azure_image_id>"5 AZURE_REGION: "<azure_region>"6 AZURE_RESOURCE_GROUP: "<azure_resource_group>"7 PEERPODS_LIMIT_PER_NODE: "10"8 TAGS: "key1=value1,key2=value2"9 DISABLECVM: "true"- 1
"Standard_B2als_v2"인스턴스 크기는 워크로드에 인스턴스 크기가 정의되지 않은 경우 기본값입니다.- 2
- Pod 생성을 위해 공백 없이 인스턴스 크기를 지정합니다. 이를 통해 더 적은 메모리와 더 적은 CPU 또는 대규모 워크로드의 인스턴스 크기가 필요한 워크로드에 대해 더 작은 인스턴스 크기를 정의할 수 있습니다.
- 3
- 검색한
AZURE_SUBNET_ID값을 지정합니다. - 4
- 검색한
AZURE_NSG_ID값을 지정합니다. - 5
- 선택 사항: 기본적으로 클러스터 인증 정보를 기반으로 Azure 이미지 ID를 사용하여
KataConfigCR을 실행할 때 이 값이 채워집니다. 자체 Azure 이미지를 생성하는 경우 올바른 이미지 ID를 지정합니다. - 6
- 검색한
AZURE_REGION값을 지정합니다. - 7
- 검색한
AZURE_RESOURCE_GROUP값을 지정합니다. - 8
- 노드당 생성할 수 있는 최대 피어 Pod 수를 지정합니다. 기본값은
10입니다. - 9
- 사용자 정의 태그를 Pod VM 인스턴스의
키:값쌍으로 구성하여 피어 Pod 비용을 추적하거나 다른 클러스터에서 피어 Pod를 식별할 수 있습니다.
다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f peer-pods-cm.yaml
4.4.4. 사용자 정의 피어 Pod VM 이미지 선택 링크 복사링크가 클립보드에 복사되었습니다!
Pod 매니페스트에 주석을 추가하여 워크로드 요구 사항에 맞게 사용자 정의 피어 Pod 가상 머신(VM) 이미지를 선택할 수 있습니다. 사용자 정의 이미지는 피어 Pod 구성 맵에 지정된 기본 이미지를 덮어씁니다.
사전 요구 사항
- 클라우드 공급자 또는 하이퍼바이저와 호환되는 사용자 정의 Pod VM 이미지의 ID를 사용할 수 있습니다.
프로세스
io.katacontainers.config.hypervisor.image주석을 추가하여 Pod 매니페스트를 편집하여pod-manifest.yaml파일에 저장합니다.apiVersion: v1 kind: Pod metadata: name: pod-manifest annotations: io.katacontainers.config.hypervisor.image: "<custom_image_id>"1 spec: runtimeClassName: kata-remote2 containers: - name: <example_container>3 image: registry.access.redhat.com/ubi9/ubi:9.3 command: ["sleep", "36000"]다음 명령을 실행하여 Pod를 생성합니다.
$ oc apply -f pod-manifest.yaml
4.4.5. Azure 시크릿 생성 링크 복사링크가 클립보드에 복사되었습니다!
Azure VM(가상 머신) 생성 API에 필요한 SSH 키 시크릿을 생성해야 합니다. Azure에는 SSH 공개 키만 필요합니다. 기밀 컨테이너는 VM에서 SSH를 비활성화하므로 키가 VM에 영향을 미치지 않습니다.
프로세스
다음 명령을 실행하여 SSH 키 쌍을 생성합니다.
$ ssh-keygen -f ./id_rsa -N ""다음 명령을 실행하여
Secret오브젝트를 생성합니다.$ oc create secret generic ssh-key-secret \ -n openshift-sandboxed-containers-operator \ --from-file=id_rsa.pub=./id_rsa.pub \ --from-file=id_rsa=./id_rsa생성한 SSH 키를 삭제합니다.
$ shred --remove id_rsa.pub id_rsa
4.4.6. Kata 에이전트 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kata 에이전트 정책은 Kata 런타임으로 실행되는 Pod에 대한 에이전트 API 요청을 제어하는 보안 메커니즘입니다. Pod VM(가상 시스템) 내에서 Kata 에이전트가 Rego로 작성하고 강제 적용하는 이 정책은 허용 또는 거부되는 작업을 결정합니다.
보안이 중요하지 않은 개발 및 테스트와 같은 특정 사용 사례에 대해 사용자 지정 정책을 사용하여 기본 정책을 덮어쓸 수 있습니다. 예를 들어 컨트롤 플레인을 신뢰할 수 있는 환경에서 실행할 수 있습니다. 다음과 같은 다양한 방법으로 사용자 지정 정책을 적용할 수 있습니다.
- Pod VM 이미지에 포함
- 피어 Pod 구성 맵의 패치 적용.
- 워크로드 Pod YAML에 주석을 추가합니다.
프로덕션 시스템의 경우 기본 방법은 initdata를 사용하여 Kata 에이전트 정책을 재정의하는 것입니다. 다음 절차에서는 io.katacontainers.config.agent.policy 주석을 사용하는 개별 Pod에 사용자 지정 정책을 적용합니다. 정책은 Base64로 인코딩된 Rego 형식으로 제공됩니다. 이 방법은 Pod VM 이미지를 수정하지 않고 Pod 생성 시 기본 정책을 재정의합니다.
사용자 지정 정책은 기본 정책을 완전히 대체합니다. 특정 API만 수정하려면 전체 정책을 포함하고 관련 규칙을 조정합니다.
프로세스
사용자 지정 정책으로
policy.rego파일을 생성합니다. 다음 예제는 데모에exec및log가 활성화된 모든 구성 가능한 API를 보여줍니다.package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false이 정책은
exec(ExecProcessRequest) 및로그(ReadStreamRequest) API를 활성화합니다. 필요에 따라 정책을 추가로 사용자 지정하도록true또는false값을 조정합니다.다음 명령을 실행하여
policy.rego파일을 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 policy.regoyaml 파일에 사용할 출력을 저장합니다.
my-pod.yamlPod 사양 파일에 Base64로 인코딩된 정책을 추가합니다.apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy> spec: runtimeClassName: kata-remote containers: - name: <container_name> image: registry.access.redhat.com/ubi9/ubi:latest command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault다음 명령을 실행하여 Pod 매니페스트를 적용합니다.
$ oc apply -f my-pod.yaml
4.4.7. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR(사용자 정의 리소스)을 생성하여 작업자 노드에 kata-remote 를 런타임 클래스로 설치해야 합니다.
KataConfig CR을 생성하면 OpenShift 샌드박스 컨테이너 Operator가 다음을 수행합니다.
-
기본 구성을 사용하여
kata-remote라는RuntimeClassCR을 생성합니다. 이를 통해 사용자는RuntimeClassName필드에서 CR을 참조하여kata-remote를 런타임으로 사용하도록 워크로드를 구성할 수 있습니다. 이 CR은 런타임의 리소스 오버헤드도 지정합니다.
OpenShift 샌드박스 컨테이너는 kata-remote 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 예에 따라
example-kataconfig.yaml매니페스트 파일을 생성합니다.apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: enablePeerPods: true logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'1 - 1
- 선택 사항: 노드 레이블을 적용하여 특정 노드에
kata-remote를 설치한 경우 키와 값(예:osc: 'true')을 지정합니다.
다음 명령을 실행하여
KataConfigCR을 생성합니다.$ oc apply -f example-kataconfig.yaml새로운
KataConfigCR이 생성되고 작업자 노드에kata-remote가 런타임 클래스로 설치됩니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"kataNodes아래의 모든 작업자의 상태가설치되고이유를 지정하지 않고InProgress조건이False이면 클러스터에kata-remote가 설치됩니다.다음 명령을 실행하여 데몬 세트를 확인합니다.
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds다음 명령을 실행하여 런타임 클래스를 확인합니다.
$ oc get runtimeclass출력 예
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
4.4.8. 노드당 피어 Pod VM 수 수정 링크 복사링크가 클립보드에 복사되었습니다!
peerpodConfig CR(사용자 정의 리소스)을 편집하여 노드당 피어 Pod 가상 머신(VM) 제한을 수정할 수 있습니다.
프로세스
다음 명령을 실행하여 현재 제한을 확인합니다.
$ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ -o jsonpath='{.spec.limit}{"\n"}'다음 명령을 실행하여
peerpodConfigCR의limit속성을 수정합니다.$ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ --type merge --patch '{"spec":{"limit":"<value>"}}'1 - 1
- <value>를 정의할 제한으로 바꿉니다.
Pod VM 이미지 확인
클러스터에 kata-remote 가 설치되면 OpenShift 샌드박스 컨테이너 Operator에서 피어 Pod를 생성하는 데 사용되는 Pod VM 이미지를 생성합니다. 이 프로세스는 클라우드 인스턴스에서 이미지가 생성되므로 시간이 오래 걸릴 수 있습니다. 클라우드 공급자에 대해 생성한 구성 맵을 확인하여 Pod VM 이미지가 성공적으로 생성되었는지 확인할 수 있습니다.
프로세스
피어 Pod에 대해 생성한 구성 맵을 가져옵니다.
$ oc get configmap peer-pods-cm -n openshift-sandboxed-containers-operator -o yamlYAML 파일의
상태스탠자를 확인합니다.AZURE_IMAGE_ID매개변수가 채워지면 Pod VM 이미지가 성공적으로 생성되었습니다.
문제 해결
다음 명령을 실행하여 이벤트 로그를 검색합니다.
$ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation다음 명령을 실행하여 작업 로그를 검색합니다.
$ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation
문제를 해결할 수 없는 경우 Red Hat 지원 케이스를 제출하고 두 로그의 출력을 첨부합니다.
4.4.9. 워크로드 오브젝트 구성 링크 복사링크가 클립보드에 복사되었습니다!
kata-remote 를 다음 pod 템플릿 오브젝트의 런타임 클래스로 설정하여 OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성해야 합니다.
-
Pod오브젝트 -
ReplicaSet오브젝트 -
ReplicationController오브젝트 -
StatefulSet오브젝트 -
Deployment오브젝트 -
DeploymentConfig오브젝트
Operator 네임스페이스에 워크로드를 배포하지 마십시오. 이러한 리소스에 대한 전용 네임스페이스를 생성합니다.
YAML 파일에 주석을 추가하여 구성 맵에 정의된 기본 인스턴스 크기를 사용하여 워크로드를 배포해야 하는지 여부를 정의할 수 있습니다.
인스턴스 크기를 수동으로 정의하지 않으려면 사용 가능한 메모리에 따라 자동 인스턴스 크기를 사용하도록 주석을 추가할 수 있습니다.
사전 요구 사항
-
KataConfigCR(사용자 정의 리소스)을 생성했습니다.
프로세스
다음 예와 같이
spec.runtimeClassName: kata-remote를 각 pod 템플릿 워크로드 오브젝트의 매니페스트에 추가합니다.apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata-remote # ...수동으로 정의된 인스턴스 크기 또는 자동 인스턴스 크기를 사용하도록 pod-templated 오브젝트에 주석을 추가합니다.
수동으로 정의한 인스턴스 크기를 사용하려면 다음 주석을 추가합니다.
apiVersion: v1 kind: <object> metadata: annotations: io.katacontainers.config.hypervisor.machine_type: "Standard_B2als_v2"1 # ...- 1
- 구성 맵에서 정의한 인스턴스 크기를 지정합니다.
자동 인스턴스 크기를 사용하려면 다음 주석을 추가합니다.
apiVersion: v1 kind: <Pod> metadata: annotations: io.katacontainers.config.hypervisor.default_vcpus: <vcpus> io.katacontainers.config.hypervisor.default_memory: <memory> # ...워크로드에서 사용할 수 있는 메모리 양을 정의합니다. 워크로드는 사용 가능한 메모리 크기에 따라 자동 인스턴스 크기에서 실행됩니다.
다음 명령을 실행하여 워크로드 오브젝트에 변경 사항을 적용합니다.
$ oc apply -f <object.yaml>OpenShift Container Platform은 워크로드 오브젝트를 생성하고 스케줄링을 시작합니다.
검증
-
pod-templated 오브젝트의
spec.runtimeClassName필드를 검사합니다. 값이kata-remote이면 피어 Pod를 사용하여 OpenShift 샌드박스 컨테이너에서 워크로드가 실행됩니다.
5장. Google Cloud에 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
Google Cloud에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
OpenShift 샌드박스 컨테이너는 피어 Pod를 배포합니다. 피어 Pod 설계는 중첩된 가상화의 필요성을 우회합니다. 자세한 내용은 피어 Pod 및 Peer Pod 기술 상세 정보를 참조하십시오.
클러스터 요구 사항
- Google Cloud용 OpenShift 샌드박스 컨테이너 Operator를 설치하는 클러스터에 OpenShift Container Platform 4.17 이상을 설치했습니다.
- 클러스터에 작업자 노드가 하나 이상 있습니다.
자세한 내용은 OpenShift Container Platform 설명서의 Google Cloud에 설치를 참조하십시오.
5.1. 피어 Pod 리소스 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
클러스터에 충분한 리소스가 있는지 확인해야 합니다.
피어 Pod 가상 머신(VM)에는 다음 두 위치에 있는 리소스가 필요합니다.
-
작업자 노드입니다. 작업자 노드는 메타데이터, Kata shim 리소스(
containerd-shim-kata-v2), remote-hypervisor 리소스(cloud-api-adaptor) 및 작업자 노드와 피어 Pod VM 간의 터널 설정을 저장합니다. - 클라우드 인스턴스입니다. 클라우드에서 실행되는 실제 피어 Pod VM입니다.
Kubernetes 작업자 노드에 사용되는 CPU 및 메모리 리소스는 피어 Pod를 생성하는 데 사용되는 RuntimeClass(kata-remote) 정의에 포함된 Pod 오버헤드 에 의해 처리됩니다.
클라우드에서 실행되는 총 피어 Pod VM 수는 Kubernetes 노드 확장 리소스로 정의됩니다. 이 제한은 노드당이며 peer-pods-cm 구성 맵의 PEERPODS_LIMIT_PER_NODE 속성에 의해 설정됩니다.
확장된 리소스의 이름은 kata.peerpods.io/vm 이며 Kubernetes 스케줄러에서 용량 추적 및 계정을 처리할 수 있습니다.
OpenShift 샌드박스 컨테이너 Operator를 설치한 후 환경의 요구 사항에 따라 노드당 제한을 편집할 수 있습니다.
변경 웹 후크 는 확장된 리소스 kata.peerpods.io/vm 을 Pod 사양에 추가합니다. 또한 Pod 사양에서 리소스별 항목도 제거합니다(있는 경우). 이를 통해 Kubernetes 스케줄러에서 이러한 확장 리소스를 고려하여 리소스를 사용할 수 있는 경우에만 피어 Pod를 예약할 수 있습니다.
변경 웹 후크는 다음과 같이 Kubernetes Pod를 수정합니다.
-
변경 웹 후크는
TARGET_RUNTIME_CLASS환경 변수에 지정된 예상RuntimeClassName값을 Pod에 확인합니다. Pod 사양의 값이TARGET_RUNTIME_CLASS의 값과 일치하지 않으면 Pod를 수정하지 않고 웹 후크가 종료됩니다. RuntimeClassName값이 일치하는 경우 Webhook에서 Pod 사양을 다음과 같이 변경합니다.-
Webhook는 Pod에 있는 모든 컨테이너 및 init 컨테이너의
resources필드에서 모든 리소스 사양을 제거합니다. -
Webhook는 Pod의 첫 번째 컨테이너의 resources 필드를 수정하여 확장 리소스(
kata.peerpods.io/vm)를 사양에 추가합니다. 확장된 리소스kata.peerpods.io/vm은 회계 목적으로 Kubernetes 스케줄러에서 사용합니다.
-
Webhook는 Pod에 있는 모든 컨테이너 및 init 컨테이너의
변경 웹 후크는 OpenShift Container Platform의 특정 시스템 네임스페이스가 변경되지 않습니다. 해당 시스템 네임스페이스에 피어 Pod가 생성되면 Pod 사양에 확장 리소스가 포함되지 않는 한 Kubernetes 확장 리소스를 사용하는 리소스 계정이 작동하지 않습니다.
특정 네임스페이스에서 피어 Pod 생성만 허용하도록 클러스터 전체 정책을 정의하는 것이 좋습니다.
5.2. 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 다음 작업을 수행하여 Google Cloud에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator를 설치합니다.
- 선택 사항: 포트 15150을 활성화하여 피어 Pod와의 내부 통신을 허용합니다.
- 선택 사항: OpenShift 샌드박스 컨테이너 Operator와 함께 설치된 Cloud Credential Operator를 설치 제거한 경우 피어 Pod 시크릿을 생성합니다.
- 선택 사항: Kata 에이전트 정책을 사용자 지정합니다.
- 피어 Pod 구성 맵을 생성합니다.
- 선택 사항: 피어 Pod 가상 머신(VM) 이미지 및 VM 이미지 구성 맵을 생성합니다.
-
KataConfig사용자 지정 리소스를 생성합니다. - OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성합니다.
5.2.1. OpenShift 샌드박스 컨테이너 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
- 웹 콘솔에서 Operator → OperatorHub 로 이동합니다.
-
키워드로 필터링 필드에
OpenShift sandboxed containers를 입력합니다. - OpenShift 샌드박스 컨테이너 Operator 타일을 선택하고 설치를 클릭합니다.
- Operator 설치 페이지의 사용 가능한 업데이트 채널 옵션 목록에서 stable 을 선택합니다.
설치된 네임스페이스 용으로 Operator 권장 네임스페이스 가 선택되어 있는지 확인합니다. 이렇게 하면 필수
openshift-sandboxed-containers-operator네임스페이스에 Operator가 설치됩니다. 이 네임스페이스가 아직 존재하지 않으면 자동으로 생성됩니다.참고openshift-sandboxed-containers-operator이외의 네임스페이스에 OpenShift 샌드박스 컨테이너 Operator를 설치하려고 하면 설치가 실패합니다.- 승인 전략에 대해 자동 이 선택되어 있는지 확인합니다. Automatic 은 기본값이며 새 z-stream 릴리스를 사용할 수 있을 때 OpenShift 샌드박스 컨테이너에 대한 자동 업데이트를 활성화합니다.
- 설치를 클릭합니다.
- Operator → 설치된 Operator 로 이동하여 Operator가 설치되었는지 확인합니다.
5.2.2. Google Cloud용 포트 15150 활성화 링크 복사링크가 클립보드에 복사되었습니다!
컴퓨팅 엔진에서 실행 중인 피어 Pod와의 내부 통신을 허용하려면 OpenShift Container Platform에서 포트 15150을 활성화해야 합니다.
사전 요구 사항
- Google Cloud CLI(명령줄 인터페이스) 툴을 설치했습니다.
-
roles/container.admin역할의 사용자로 OpenShift Container Platform 클러스터에 액세스할 수 있습니다.
프로세스
다음 명령을 실행하여 프로젝트 ID 변수를 설정합니다.
$ export GCP_PROJECT_ID="<project_id>"다음 명령을 실행하여 Google Cloud에 로그인합니다.
$ gcloud auth login다음 명령을 실행하여 Google Cloud 프로젝트 ID를 설정합니다.
$ gcloud config set project ${GCP_PROJECT_ID}다음 명령을 실행하여 포트 15150을 엽니다.
$ gcloud compute firewall-rules create allow-port-15150-restricted \ --project=${GCP_PROJECT_ID} \ --network=default \ --allow=tcp:15150 \ --source-ranges=<external_ip_cidr-1>[,<external_ip_cidr-2>,...]1 - 1
- 하나 이상의 IP 주소 또는 범위를 쉼표로 구분하여 CIDR 형식으로 지정합니다. 예:
203.0.113.5/32,198.51.100.0/24.
검증
다음 명령을 실행하여 포트 15150이 열려 있는지 확인합니다.
$ gcloud compute firewall-rule list
5.2.3. 피어 Pod 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod 보안이 비어 있고 CCO(Cloud Credential Operator)가 설치되면 OpenShift 샌드박스 컨테이너 Operator는 CCO를 사용하여 시크릿을 검색합니다. CCO를 설치 제거한 경우 OpenShift 샌드박스 컨테이너의 피어 Pod 시크릿을 수동으로 생성해야 합니다. 그렇지 않으면 피어 Pod가 작동하지 않습니다.
시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.
기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.
사전 요구 사항
-
Compute Engine 리소스를 관리하기 위해
roles/compute.instanceAdmin.v1과 같은 권한이 있는 Google Cloud 서비스 계정을 생성했습니다.
프로세스
- Google Cloud 콘솔에서 IAM & Admin → Service Accounts → Keys 로 이동하여 키를 JSON 파일로 저장합니다.
다음 명령을 실행하여 JSON 파일을 한 줄 문자열로 변환합니다.
$ cat <key_file>.json | jq -c .- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- OpenShift 샌드박스 컨테이너 Operator 타일을 클릭합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣습니다.
apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: GCP_CREDENTIALS: "<gc_service_account_key_json>"1 - 1
- 을 Google Cloud 서비스 계정 키 JSON 파일에서 생성한 단일 줄 문자열로 바꿉니다
.
- 저장을 클릭하여 변경 사항을 적용합니다.
- 워크로드 → 시크릿 으로 이동하여 피어 Pod 시크릿을 확인합니다.
5.2.4. 피어 Pod 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너에 대한 피어 Pod 구성 맵을 생성해야 합니다.
프로세스
Compute Engine 인스턴스에 로그인하여 다음 환경 변수를 설정합니다.
다음 명령을 실행하여 프로젝트 ID를 가져옵니다.
$ GCP_PROJECT_ID=$(gcloud config get-value project)다음 명령을 실행하여 영역을 가져옵니다.
$ GCP_ZONE=$(gcloud config get-value compute/zone)다음 명령을 실행하여 네트워크 이름 목록을 검색합니다.
$ gcloud compute networks list --format="value(name)"다음 명령을 실행하여 네트워크를 지정합니다.
$ GCP_NETWORK=<network_name>1 - 1
- &
lt;network_name>을 네트워크 이름으로 바꿉니다.
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- Operator 목록에서 OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣습니다.
apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "gcp" PROXY_TIMEOUT: "5m" GCP_PROJECT_ID: "<gcp_project_id>"1 GCP_ZONE: "<gcp_zone>"2 GCP_MACHINE_TYPE: "e2-medium"3 GCP_NETWORK: "<gcp_network>"4 PEERPODS_LIMIT_PER_NODE: "10"5 TAGS: "key1=value1,key2=value2"6 DISABLECVM: "true"- 저장을 클릭하여 변경 사항을 적용합니다.
- 워크로드 → ConfigMap 으로 이동하여 새 구성 맵을 확인합니다.
5.2.5. 피어 Pod VM 이미지 생성 링크 복사링크가 클립보드에 복사되었습니다!
QCOW2 VM(가상 머신) 이미지를 생성해야 합니다.
사전 요구 사항
-
podman을 설치했습니다. - 컨테이너 레지스트리에 액세스할 수 있습니다.
프로세스
다음 명령을 실행하여 OpenShift 샌드박스 컨테이너 리포지토리를 복제합니다.
$ git clone https://github.com/openshift/sandboxed-containers-operator.git다음 명령을 실행하여
샌드박스-containers-operator/config/peerpods/podvm/bootc로 이동합니다.$ cd sandboxed-containers-operator/config/peerpods/podvm/bootc다음 명령을 실행하여
registry.redhat.io에 로그인합니다.$ podman login registry.redhat.iopodman 빌드프로세스에서 레지스트리에서 호스팅되는Containerfile.rhel컨테이너 이미지에 액세스해야 하므로registry.redhat.io에 로그인해야 합니다.다음 명령을 실행하여 컨테이너 레지스트리의 이미지 경로를 설정합니다.
$ IMG="<container_registry_url>/<username>/podvm-bootc:latest"다음 명령을 실행하여 Pod VM
bootc이미지를 빌드합니다.$ podman build -t ${IMG} -f Containerfile.rhel .다음 명령을 실행하여 컨테이너 레지스트리에 로그인합니다.
$ podman login <container_registry_url>다음 명령을 실행하여 컨테이너 레지스트리로 이미지를 푸시합니다.
$ podman push ${IMG}테스트 및 개발을 위해 이미지를 공용으로 만들 수 있습니다.
다음 명령을 실행하여
podvm-bootc이미지를 확인합니다.$ podman images출력 예
REPOSITORY TAG IMAGE ID CREATED SIZE example.com/example_user/podvm-bootc latest 88ddab975a07 2 seconds ago 1.82 GB
5.2.6. 피어 Pod VM 이미지 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
Pod VM(가상 머신) 이미지에 대한 구성 맵을 생성합니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- Operator 목록에서 OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣습니다.
apiVersion: v1 kind: ConfigMap metadata: name: gc-podvm-image-cm namespace: openshift-sandboxed-containers-operator data: IMAGE_TYPE: pre-built PODVM_IMAGE_URI: <container_registry_url>/<username>/podvm-bootc:latest IMAGE_BASE_NAME: "podvm-image" IMAGE_VERSION: "0-0-0" INSTALL_PACKAGES: "no" DISABLE_CLOUD_CONFIG: "true" UPDATE_PEERPODS_CM: "yes" BOOT_FIPS: "no" BOOTC_BUILD_CONFIG: | [[customizations.user]] name = "peerpod" password = "peerpod" groups = ["wheel", "root"] [[customizations.filesystem]] mountpoint = "/" minsize = "5 GiB" [[customizations.filesystem]] mountpoint = "/var/kata-containers" minsize = "15 GiB"- 저장을 클릭하여 변경 사항을 적용합니다.
- 워크로드 → ConfigMap 으로 이동하여 새 구성 맵을 확인합니다.
5.2.7. Kata 에이전트 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kata 에이전트 정책은 Kata 런타임으로 실행되는 Pod에 대한 에이전트 API 요청을 제어하는 보안 메커니즘입니다. Pod VM(가상 시스템) 내에서 Kata 에이전트가 Rego로 작성하고 강제 적용하는 이 정책은 허용 또는 거부되는 작업을 결정합니다.
보안이 중요하지 않은 개발 및 테스트와 같은 특정 사용 사례에 대해 사용자 지정 정책을 사용하여 기본 정책을 덮어쓸 수 있습니다. 예를 들어 컨트롤 플레인을 신뢰할 수 있는 환경에서 실행할 수 있습니다. 다음과 같은 다양한 방법으로 사용자 지정 정책을 적용할 수 있습니다.
- Pod VM 이미지에 포함
- 피어 Pod 구성 맵의 패치 적용.
- 워크로드 Pod YAML에 주석을 추가합니다.
프로덕션 시스템의 경우 기본 방법은 initdata를 사용하여 Kata 에이전트 정책을 재정의하는 것입니다. 다음 절차에서는 io.katacontainers.config.agent.policy 주석을 사용하는 개별 Pod에 사용자 지정 정책을 적용합니다. 정책은 Base64로 인코딩된 Rego 형식으로 제공됩니다. 이 방법은 Pod VM 이미지를 수정하지 않고 Pod 생성 시 기본 정책을 재정의합니다.
사용자 지정 정책은 기본 정책을 완전히 대체합니다. 특정 API만 수정하려면 전체 정책을 포함하고 관련 규칙을 조정합니다.
프로세스
사용자 지정 정책으로
policy.rego파일을 생성합니다. 다음 예제는 데모에exec및log가 활성화된 모든 구성 가능한 API를 보여줍니다.package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false이 정책은
exec(ExecProcessRequest) 및로그(ReadStreamRequest) API를 활성화합니다. 필요에 따라 정책을 추가로 사용자 지정하도록true또는false값을 조정합니다.다음 명령을 실행하여
policy.rego파일을 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 policy.regoyaml 파일에 사용할 출력을 저장합니다.
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- Operator 목록에서 OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- 오른쪽 상단에 있는 가져오기 아이콘(+)을 클릭합니다.
YAML 가져오기 창에서 다음 YAML 매니페스트를 붙여넣고 Base64로 인코딩된 정책을 추가합니다.
apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy> spec: runtimeClassName: kata-remote containers: - name: <container_name> image: registry.access.redhat.com/ubi9/ubi:latest command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault- 저장을 클릭하여 변경 사항을 적용합니다.
5.2.8. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR(사용자 정의 리소스)을 생성하여 작업자 노드에 kata-remote 를 RuntimeClass 로 설치해야 합니다.
kata-remote 런타임 클래스는 기본적으로 모든 작업자 노드에 설치됩니다. 특정 노드에 kata-remote 를 설치하려면 해당 노드에 레이블을 추가한 다음 KataConfig CR에 레이블을 정의할 수 있습니다.
OpenShift 샌드박스 컨테이너는 kata-remote 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 다음 요인은 재부팅 시간을 늘릴 수 있습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - 선택 사항: 노드 자격 검사를 활성화하려면 Node Feature Discovery Operator를 설치했습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
- OpenShift 샌드박스 컨테이너 Operator를 선택합니다.
- KataConfig 탭에서 KataConfig 만들기 를 클릭합니다.
다음 세부 정보를 입력합니다.
-
이름: 선택 사항: 기본 이름은
example-kataconfig입니다. -
labels: 선택 사항:
KataConfig리소스에 대한 특성을 식별하는 모든 관련 정보를 입력합니다. 각 레이블은 키-값 쌍을 나타냅니다. - enablePeerPods: 퍼블릭 클라우드, IBM Z® 및 IBM® LinuxONE 배포에는 선택합니다.
kataConfigPoolSelector. 선택 사항: 선택한 노드에
kata-remote를 설치하려면 선택한 노드의 라벨에 일치하는 표현식을 추가합니다.- kataConfigPoolSelector 영역을 확장합니다.
- kataConfigPoolSelector 영역에서 matchExpressions 를 확장합니다. 이는 라벨 선택기 요구 사항 목록입니다.
- matchExpressions 추가를 클릭합니다.
- 키 필드에 선택기가 적용되는 라벨 키를 입력합니다.
-
Operator 필드에 레이블 값과의 키 관계를 입력합니다. 유효한 연산자는
In,NotIn,Exists및DoesNotExist입니다. - 값 영역을 확장한 다음 값 추가 를 클릭합니다.
-
값 필드에 키 레이블 값에
true또는false를 입력합니다.
-
loglevel:
kata-remote런타임 클래스를 사용하여 노드에 대해 검색된 로그 데이터의 수준을 정의합니다.
-
이름: 선택 사항: 기본 이름은
생성을 클릭합니다.
KataConfigCR이 생성되고 작업자 노드에kata-remote런타임 클래스를 설치합니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.
검증
-
KataConfig 탭에서
KataConfigCR을 클릭하여 세부 정보를 확인합니다. YAML 탭을 클릭하여
상태 스탠자를 확인합니다.상태스탠자에는조건및kataNodes키가 포함되어 있습니다.status.kataNodes의 값은 노드 배열이며 각 노드는 특정kata-remote설치의 노드를 나열합니다. 업데이트가 있을 때마다 메시지가 표시됩니다.Reload (다시 로드)를 클릭하여 YAML을 새로 고칩니다.
status.kataNodes어레이의 모든 작업자가설치및조건.InProgress: False를 지정하는 이유 없이 False를 표시하면 클러스터에kata-remote가 설치됩니다.
추가 리소스
Pod VM 이미지 확인
클러스터에 kata-remote 가 설치되면 OpenShift 샌드박스 컨테이너 Operator에서 피어 Pod를 생성하는 데 사용되는 Pod VM 이미지를 생성합니다. 이 프로세스는 클라우드 인스턴스에서 이미지가 생성되므로 시간이 오래 걸릴 수 있습니다. 클라우드 공급자에 대해 생성한 구성 맵을 확인하여 Pod VM 이미지가 성공적으로 생성되었는지 확인할 수 있습니다.
프로세스
- 워크로드 → ConfigMap 으로 이동합니다.
- 공급자 구성 맵을 클릭하여 세부 정보를 확인합니다.
- YAML 탭을 클릭합니다.
YAML 파일의
상태스탠자를 확인합니다.PODVM_IMAGE_NAME매개변수가 채워지면 Pod VM 이미지가 성공적으로 생성됩니다.
문제 해결
다음 명령을 실행하여 이벤트 로그를 검색합니다.
$ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation다음 명령을 실행하여 작업 로그를 검색합니다.
$ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation
문제를 해결할 수 없는 경우 Red Hat 지원 케이스를 제출하고 두 로그의 출력을 첨부합니다.
5.2.9. 워크로드 오브젝트 구성 링크 복사링크가 클립보드에 복사되었습니다!
kata-remote 를 다음 pod 템플릿 오브젝트의 런타임 클래스로 설정하여 OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성해야 합니다.
-
Pod오브젝트 -
ReplicaSet오브젝트 -
ReplicationController오브젝트 -
StatefulSet오브젝트 -
Deployment오브젝트 -
DeploymentConfig오브젝트
Operator 네임스페이스에 워크로드를 배포하지 마십시오. 이러한 리소스에 대한 전용 네임스페이스를 생성합니다.
사전 요구 사항
-
KataConfigCR(사용자 정의 리소스)을 생성했습니다.
프로세스
다음 예와 같이
spec.runtimeClassName: kata-remote를 각 pod 템플릿 워크로드 오브젝트의 매니페스트에 추가합니다.apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata-remote # ...OpenShift Container Platform은 워크로드 오브젝트를 생성하고 스케줄링을 시작합니다.
검증
-
pod-templated 오브젝트의
spec.runtimeClassName필드를 검사합니다. 값이kata-remote이면 피어 Pod를 사용하여 OpenShift 샌드박스 컨테이너에서 워크로드가 실행됩니다.
5.3. 명령줄을 사용하여 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
CLI(명령줄 인터페이스)를 사용하여 다음 작업을 수행하여 Google Cloud에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator를 설치합니다.
- 선택 사항: 포트 15150을 활성화하여 피어 Pod와의 내부 통신을 허용합니다.
- 선택 사항: OpenShift 샌드박스 컨테이너 Operator와 함께 설치된 Cloud Credential Operator를 설치 제거한 경우 피어 Pod 시크릿을 생성합니다.
- 피어 Pod 구성 맵을 생성합니다.
- Pod VM 이미지 구성 맵을 생성합니다.
- 선택 사항: Kata 에이전트 정책을 사용자 지정합니다.
-
KataConfig사용자 지정 리소스를 생성합니다. - 선택 사항: 각 작업자 노드에서 실행되는 가상 머신 수를 수정합니다.
- OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성합니다.
5.3.1. OpenShift 샌드박스 컨테이너 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
CLI를 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
osc-namespace.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator다음 명령을 실행하여 네임스페이스를 생성합니다.
$ oc apply -f osc-namespace.yamlosc-operatorgroup.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sandboxed-containers-operator-group namespace: openshift-sandboxed-containers-operator spec: targetNamespaces: - openshift-sandboxed-containers-operator다음 명령을 실행하여 operator 그룹을 생성합니다.
$ oc apply -f osc-operatorgroup.yamlosc-subscription.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sandboxed-containers-operator namespace: openshift-sandboxed-containers-operator spec: channel: stable installPlanApproval: Automatic name: sandboxed-containers-operator source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: sandboxed-containers-operator.v1.9.0다음 명령을 실행하여 서브스크립션을 생성합니다.
$ oc apply -f osc-subscription.yaml다음 명령을 실행하여 Operator가 올바르게 설치되었는지 확인합니다.
$ oc get csv -n openshift-sandboxed-containers-operator이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.
다음 명령을 실행하여 프로세스를 확인합니다.
$ watch oc get csv -n openshift-sandboxed-containers-operator출력 예
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.9.0 1.8.1 Succeeded
5.3.2. Google Cloud용 포트 15150 활성화 링크 복사링크가 클립보드에 복사되었습니다!
컴퓨팅 엔진에서 실행 중인 피어 Pod와의 내부 통신을 허용하려면 OpenShift Container Platform에서 포트 15150을 활성화해야 합니다.
사전 요구 사항
- Google Cloud CLI(명령줄 인터페이스) 툴을 설치했습니다.
-
roles/container.admin역할의 사용자로 OpenShift Container Platform 클러스터에 액세스할 수 있습니다.
프로세스
다음 명령을 실행하여 프로젝트 ID 변수를 설정합니다.
$ export GCP_PROJECT_ID="<project_id>"다음 명령을 실행하여 Google Cloud에 로그인합니다.
$ gcloud auth login다음 명령을 실행하여 Google Cloud 프로젝트 ID를 설정합니다.
$ gcloud config set project ${GCP_PROJECT_ID}다음 명령을 실행하여 포트 15150을 엽니다.
$ gcloud compute firewall-rules create allow-port-15150-restricted \ --project=${GCP_PROJECT_ID} \ --network=default \ --allow=tcp:15150 \ --source-ranges=<external_ip_cidr-1>[,<external_ip_cidr-2>,...]1 - 1
- 하나 이상의 IP 주소 또는 범위를 쉼표로 구분하여 CIDR 형식으로 지정합니다. 예:
203.0.113.5/32,198.51.100.0/24.
검증
다음 명령을 실행하여 포트 15150이 열려 있는지 확인합니다.
$ gcloud compute firewall-rule list
5.3.3. 피어 Pod 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod 보안이 비어 있고 CCO(Cloud Credential Operator)가 설치되면 OpenShift 샌드박스 컨테이너 Operator는 CCO를 사용하여 시크릿을 검색합니다. CCO를 설치 제거한 경우 OpenShift 샌드박스 컨테이너의 피어 Pod 시크릿을 수동으로 생성해야 합니다. 그렇지 않으면 피어 Pod가 작동하지 않습니다.
시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.
기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.
사전 요구 사항
-
Compute Engine 리소스를 관리하기 위해
roles/compute.instanceAdmin.v1과 같은 권한이 있는 Google Cloud 서비스 계정을 생성했습니다. -
Google Cloud SDK (
gcloud)를 설치하고 서비스 계정으로 인증했습니다.
프로세스
다음 명령을 실행하여 Google Cloud 서비스 계정 키를 생성하고 JSON 파일로 저장합니다.
$ gcloud iam service-accounts keys create <key_filename>.json \ --iam-account=<service_account_email_address>다음 명령을 실행하여 JSON 파일을 한 줄 문자열로 변환합니다.
$ cat <key_file>.json | jq -c .다음 예에 따라
peer-pods-secret.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: GCP_CREDENTIALS: "<gc_service_account_key_json>"1 - 1
- 을 Google Cloud 서비스 계정 키 JSON 파일에서 생성한 단일 줄 문자열로 바꿉니다
.
다음 명령을 실행하여 시크릿을 생성합니다.
$ oc apply -f peer-pods-secret.yaml
5.3.4. 피어 Pod 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너에 대한 피어 Pod 구성 맵을 생성해야 합니다.
프로세스
Compute Engine 인스턴스에 로그인하여 다음 환경 변수를 설정합니다.
다음 명령을 실행하여 프로젝트 ID를 가져옵니다.
$ GCP_PROJECT_ID=$(gcloud config get-value project)다음 명령을 실행하여 영역을 가져옵니다.
$ GCP_ZONE=$(gcloud config get-value compute/zone)다음 명령을 실행하여 네트워크 이름 목록을 검색합니다.
$ gcloud compute networks list --format="value(name)"다음 명령을 실행하여 네트워크를 지정합니다.
$ GCP_NETWORK=<network_name>1 - 1
- &
lt;network_name>을 네트워크 이름으로 바꿉니다.
다음 예에 따라
peer-pods-cm.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "gcp" PROXY_TIMEOUT: "5m" GCP_PROJECT_ID: "<gcp_project_id>"1 GCP_ZONE: "<gcp_zone>"2 GCP_MACHINE_TYPE: "e2-medium"3 GCP_NETWORK: "<gcp_network>"4 PEERPODS_LIMIT_PER_NODE: "10"5 TAGS: "key1=value1,key2=value2"6 DISABLECVM: "true"다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f peer-pods-cm.yaml
5.3.5. 피어 Pod VM 이미지 생성 링크 복사링크가 클립보드에 복사되었습니다!
QCOW2 VM(가상 머신) 이미지를 생성해야 합니다.
사전 요구 사항
-
podman을 설치했습니다. - 컨테이너 레지스트리에 액세스할 수 있습니다.
프로세스
다음 명령을 실행하여 OpenShift 샌드박스 컨테이너 리포지토리를 복제합니다.
$ git clone https://github.com/openshift/sandboxed-containers-operator.git다음 명령을 실행하여
샌드박스-containers-operator/config/peerpods/podvm/bootc로 이동합니다.$ cd sandboxed-containers-operator/config/peerpods/podvm/bootc다음 명령을 실행하여
registry.redhat.io에 로그인합니다.$ podman login registry.redhat.iopodman 빌드프로세스에서 레지스트리에서 호스팅되는Containerfile.rhel컨테이너 이미지에 액세스해야 하므로registry.redhat.io에 로그인해야 합니다.다음 명령을 실행하여 컨테이너 레지스트리의 이미지 경로를 설정합니다.
$ IMG="<container_registry_url>/<username>/podvm-bootc:latest"다음 명령을 실행하여 Pod VM
bootc이미지를 빌드합니다.$ podman build -t ${IMG} -f Containerfile.rhel .다음 명령을 실행하여 컨테이너 레지스트리에 로그인합니다.
$ podman login <container_registry_url>다음 명령을 실행하여 컨테이너 레지스트리로 이미지를 푸시합니다.
$ podman push ${IMG}테스트 및 개발을 위해 이미지를 공용으로 만들 수 있습니다.
다음 명령을 실행하여
podvm-bootc이미지를 확인합니다.$ podman images출력 예
REPOSITORY TAG IMAGE ID CREATED SIZE example.com/example_user/podvm-bootc latest 88ddab975a07 2 seconds ago 1.82 GB
5.3.6. 피어 Pod VM 이미지 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
Pod VM(가상 머신) 이미지에 대한 구성 맵을 생성합니다.
프로세스
다음 콘텐츠를 사용하여
gc-podvm-image-cm.yaml이라는 Pod VM 이미지에 대한 구성 맵 매니페스트를 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: gc-podvm-image-cm namespace: openshift-sandboxed-containers-operator data: IMAGE_TYPE: pre-built PODVM_IMAGE_URI: <container_registry_url>/<username>/podvm-bootc:latest IMAGE_BASE_NAME: "podvm-image" IMAGE_VERSION: "0-0-0" INSTALL_PACKAGES: "no" DISABLE_CLOUD_CONFIG: "true" UPDATE_PEERPODS_CM: "yes" BOOT_FIPS: "no" BOOTC_BUILD_CONFIG: | [[customizations.user]] name = "peerpod" password = "peerpod" groups = ["wheel", "root"] [[customizations.filesystem]] mountpoint = "/" minsize = "5 GiB" [[customizations.filesystem]] mountpoint = "/var/kata-containers" minsize = "15 GiB"다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f gc-podvm-image-cm.yaml
5.3.7. Kata 에이전트 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kata 에이전트 정책은 Kata 런타임으로 실행되는 Pod에 대한 에이전트 API 요청을 제어하는 보안 메커니즘입니다. Pod VM(가상 시스템) 내에서 Kata 에이전트가 Rego로 작성하고 강제 적용하는 이 정책은 허용 또는 거부되는 작업을 결정합니다.
보안이 중요하지 않은 개발 및 테스트와 같은 특정 사용 사례에 대해 사용자 지정 정책을 사용하여 기본 정책을 덮어쓸 수 있습니다. 예를 들어 컨트롤 플레인을 신뢰할 수 있는 환경에서 실행할 수 있습니다. 다음과 같은 다양한 방법으로 사용자 지정 정책을 적용할 수 있습니다.
- Pod VM 이미지에 포함
- 피어 Pod 구성 맵의 패치 적용.
- 워크로드 Pod YAML에 주석을 추가합니다.
프로덕션 시스템의 경우 기본 방법은 initdata를 사용하여 Kata 에이전트 정책을 재정의하는 것입니다. 다음 절차에서는 io.katacontainers.config.agent.policy 주석을 사용하는 개별 Pod에 사용자 지정 정책을 적용합니다. 정책은 Base64로 인코딩된 Rego 형식으로 제공됩니다. 이 방법은 Pod VM 이미지를 수정하지 않고 Pod 생성 시 기본 정책을 재정의합니다.
사용자 지정 정책은 기본 정책을 완전히 대체합니다. 특정 API만 수정하려면 전체 정책을 포함하고 관련 규칙을 조정합니다.
프로세스
사용자 지정 정책으로
policy.rego파일을 생성합니다. 다음 예제는 데모에exec및log가 활성화된 모든 구성 가능한 API를 보여줍니다.package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false이 정책은
exec(ExecProcessRequest) 및로그(ReadStreamRequest) API를 활성화합니다. 필요에 따라 정책을 추가로 사용자 지정하도록true또는false값을 조정합니다.다음 명령을 실행하여
policy.rego파일을 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 policy.regoyaml 파일에 사용할 출력을 저장합니다.
my-pod.yamlPod 사양 파일에 Base64로 인코딩된 정책을 추가합니다.apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy> spec: runtimeClassName: kata-remote containers: - name: <container_name> image: registry.access.redhat.com/ubi9/ubi:latest command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault다음 명령을 실행하여 Pod 매니페스트를 적용합니다.
$ oc apply -f my-pod.yaml
5.3.8. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR(사용자 정의 리소스)을 생성하여 작업자 노드에 kata-remote 를 런타임 클래스로 설치해야 합니다.
KataConfig CR을 생성하면 OpenShift 샌드박스 컨테이너 Operator가 다음을 수행합니다.
-
기본 구성을 사용하여
kata-remote라는RuntimeClassCR을 생성합니다. 이를 통해 사용자는RuntimeClassName필드에서 CR을 참조하여kata-remote를 런타임으로 사용하도록 워크로드를 구성할 수 있습니다. 이 CR은 런타임의 리소스 오버헤드도 지정합니다.
OpenShift 샌드박스 컨테이너는 kata-remote 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 예에 따라
example-kataconfig.yaml매니페스트 파일을 생성합니다.apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: enablePeerPods: true logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'1 - 1
- 선택 사항: 노드 레이블을 적용하여 특정 노드에
kata-remote를 설치한 경우 키와 값(예:osc: 'true')을 지정합니다.
다음 명령을 실행하여
KataConfigCR을 생성합니다.$ oc apply -f example-kataconfig.yaml새로운
KataConfigCR이 생성되고 작업자 노드에kata-remote가 런타임 클래스로 설치됩니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"kataNodes아래의 모든 작업자의 상태가설치되고이유를 지정하지 않고InProgress조건이False이면 클러스터에kata-remote가 설치됩니다.다음 명령을 실행하여 데몬 세트를 확인합니다.
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds다음 명령을 실행하여 런타임 클래스를 확인합니다.
$ oc get runtimeclass출력 예
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
5.3.9. 노드당 피어 Pod VM 수 수정 링크 복사링크가 클립보드에 복사되었습니다!
peerpodConfig CR(사용자 정의 리소스)을 편집하여 노드당 피어 Pod 가상 머신(VM) 제한을 수정할 수 있습니다.
프로세스
다음 명령을 실행하여 현재 제한을 확인합니다.
$ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ -o jsonpath='{.spec.limit}{"\n"}'다음 명령을 실행하여
peerpodConfigCR의limit속성을 수정합니다.$ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ --type merge --patch '{"spec":{"limit":"<value>"}}'1 - 1
- <value>를 정의할 제한으로 바꿉니다.
Pod VM 이미지 확인
클러스터에 kata-remote 가 설치되면 OpenShift 샌드박스 컨테이너 Operator에서 피어 Pod를 생성하는 데 사용되는 Pod VM 이미지를 생성합니다. 이 프로세스는 클라우드 인스턴스에서 이미지가 생성되므로 시간이 오래 걸릴 수 있습니다. 클라우드 공급자에 대해 생성한 구성 맵을 확인하여 Pod VM 이미지가 성공적으로 생성되었는지 확인할 수 있습니다.
프로세스
피어 Pod에 대해 생성한 구성 맵을 가져옵니다.
$ oc get configmap peer-pods-cm -n openshift-sandboxed-containers-operator -o yamlYAML 파일의
상태스탠자를 확인합니다.PODVM_IMAGE_NAME매개변수가 채워지면 Pod VM 이미지가 성공적으로 생성됩니다.
문제 해결
다음 명령을 실행하여 이벤트 로그를 검색합니다.
$ oc get events -n openshift-sandboxed-containers-operator --field-selector involvedObject.name=osc-podvm-image-creation다음 명령을 실행하여 작업 로그를 검색합니다.
$ oc logs -n openshift-sandboxed-containers-operator jobs/osc-podvm-image-creation
문제를 해결할 수 없는 경우 Red Hat 지원 케이스를 제출하고 두 로그의 출력을 첨부합니다.
5.3.10. 워크로드 오브젝트 구성 링크 복사링크가 클립보드에 복사되었습니다!
kata-remote 를 다음 pod 템플릿 오브젝트의 런타임 클래스로 설정하여 OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성해야 합니다.
-
Pod오브젝트 -
ReplicaSet오브젝트 -
ReplicationController오브젝트 -
StatefulSet오브젝트 -
Deployment오브젝트 -
DeploymentConfig오브젝트
Operator 네임스페이스에 워크로드를 배포하지 마십시오. 이러한 리소스에 대한 전용 네임스페이스를 생성합니다.
사전 요구 사항
-
KataConfigCR(사용자 정의 리소스)을 생성했습니다.
프로세스
다음 예와 같이
spec.runtimeClassName: kata-remote를 각 pod 템플릿 워크로드 오브젝트의 매니페스트에 추가합니다.apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata-remote # ...OpenShift Container Platform은 워크로드 오브젝트를 생성하고 스케줄링을 시작합니다.
검증
-
pod-templated 오브젝트의
spec.runtimeClassName필드를 검사합니다. 값이kata-remote이면 피어 Pod를 사용하여 OpenShift 샌드박스 컨테이너에서 워크로드가 실행됩니다.
6장. IBM Z 및 IBM LinuxONE에 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
IBM Z® 및 IBM® LinuxONE에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
OpenShift 샌드박스 컨테이너는 피어 Pod를 배포합니다. 피어 Pod 설계는 중첩된 가상화의 필요성을 우회합니다. 자세한 내용은 피어 Pod 및 Peer Pod 기술 상세 정보를 참조하십시오.
IBM Z® 및 IBM® LinuxONE의 OpenShift 샌드박스 컨테이너는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
클러스터 요구 사항
- OpenShift 샌드박스 컨테이너 Operator를 설치하는 클러스터에 Red Hat OpenShift Container Platform 4.14 이상을 설치했습니다.
- 클러스터에는 컨트롤 플레인 노드 3개와 작업자 노드가 두 개 이상 있습니다.
- 클러스터 노드와 피어 Pod는 동일한 IBM Z® KVM 호스트 논리 파티션(LPAR)에 있습니다.
- 클러스터 노드와 피어 Pod가 동일한 서브넷에 연결되어 있습니다.
IBM Z® 및 IBM® LinuxONE에 OpenShift Container Platform을 설치하는 방법에 대한 자세한 내용은 IBM Z® 및 IBM® LinuxONE 에 설치를 참조하십시오.
6.1. 피어 Pod 리소스 요구 사항 링크 복사링크가 클립보드에 복사되었습니다!
클러스터에 충분한 리소스가 있는지 확인해야 합니다.
피어 Pod 가상 머신(VM)에는 다음 두 위치에 있는 리소스가 필요합니다.
-
작업자 노드입니다. 작업자 노드는 메타데이터, Kata shim 리소스(
containerd-shim-kata-v2), remote-hypervisor 리소스(cloud-api-adaptor) 및 작업자 노드와 피어 Pod VM 간의 터널 설정을 저장합니다. - libvirt 가상 시스템 인스턴스입니다. 이는 LPAR(KVM 호스트)에서 실행되는 실제 피어 Pod VM입니다.
Kubernetes 작업자 노드에 사용되는 CPU 및 메모리 리소스는 피어 Pod를 생성하는 데 사용되는 RuntimeClass(kata-remote) 정의에 포함된 Pod 오버헤드 에 의해 처리됩니다.
클라우드에서 실행되는 총 피어 Pod VM 수는 Kubernetes 노드 확장 리소스로 정의됩니다. 이 제한은 노드당이며 peer-pods-cm 구성 맵의 PEERPODS_LIMIT_PER_NODE 속성에 의해 설정됩니다.
확장된 리소스의 이름은 kata.peerpods.io/vm 이며 Kubernetes 스케줄러에서 용량 추적 및 계정을 처리할 수 있습니다.
OpenShift 샌드박스 컨테이너 Operator를 설치한 후 환경의 요구 사항에 따라 노드당 제한을 편집할 수 있습니다.
변경 웹 후크 는 확장된 리소스 kata.peerpods.io/vm 을 Pod 사양에 추가합니다. 또한 Pod 사양에서 리소스별 항목도 제거합니다(있는 경우). 이를 통해 Kubernetes 스케줄러에서 이러한 확장 리소스를 고려하여 리소스를 사용할 수 있는 경우에만 피어 Pod를 예약할 수 있습니다.
변경 웹 후크는 다음과 같이 Kubernetes Pod를 수정합니다.
-
변경 웹 후크는
TARGET_RUNTIME_CLASS환경 변수에 지정된 예상RuntimeClassName값을 Pod에 확인합니다. Pod 사양의 값이TARGET_RUNTIME_CLASS의 값과 일치하지 않으면 Pod를 수정하지 않고 웹 후크가 종료됩니다. RuntimeClassName값이 일치하는 경우 Webhook에서 Pod 사양을 다음과 같이 변경합니다.-
Webhook는 Pod에 있는 모든 컨테이너 및 init 컨테이너의
resources필드에서 모든 리소스 사양을 제거합니다. -
Webhook는 Pod의 첫 번째 컨테이너의 resources 필드를 수정하여 확장 리소스(
kata.peerpods.io/vm)를 사양에 추가합니다. 확장된 리소스kata.peerpods.io/vm은 회계 목적으로 Kubernetes 스케줄러에서 사용합니다.
-
Webhook는 Pod에 있는 모든 컨테이너 및 init 컨테이너의
변경 웹 후크는 OpenShift Container Platform의 특정 시스템 네임스페이스가 변경되지 않습니다. 해당 시스템 네임스페이스에 피어 Pod가 생성되면 Pod 사양에 확장 리소스가 포함되지 않는 한 Kubernetes 확장 리소스를 사용하는 리소스 계정이 작동하지 않습니다.
특정 네임스페이스에서 피어 Pod 생성만 허용하도록 클러스터 전체 정책을 정의하는 것이 좋습니다.
6.2. IBM Z 및 IBM LinuxONE에 OpenShift 샌드박스 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
CLI(명령줄 인터페이스)를 사용하여 다음 작업을 수행하여 IBM Z® 및 IBM® LinuxONE에 OpenShift 샌드박스 컨테이너를 배포할 수 있습니다.
- OpenShift 샌드박스 컨테이너 Operator를 설치합니다.
- 선택 사항: libvirt 볼륨을 구성합니다.
- 선택 사항: 사용자 정의 피어 Pod VM 이미지를 생성합니다.
- 피어 Pod 시크릿을 생성합니다.
- 피어 Pod 구성 맵을 생성합니다.
- Pod VM 이미지 구성 맵을 생성합니다.
- KVM 호스트 시크릿을 생성합니다.
- 선택 사항: 사용자 정의 피어 Pod VM 이미지를 선택합니다.
- 선택 사항: Kata 에이전트 정책을 사용자 지정합니다.
-
KataConfig사용자 지정 리소스를 생성합니다. - 선택 사항: 각 작업자 노드에서 실행되는 가상 머신 수를 수정합니다.
- OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성합니다.
6.2.1. OpenShift 샌드박스 컨테이너 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
CLI를 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
osc-namespace.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Namespace metadata: name: openshift-sandboxed-containers-operator다음 명령을 실행하여 네임스페이스를 생성합니다.
$ oc apply -f osc-namespace.yamlosc-operatorgroup.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sandboxed-containers-operator-group namespace: openshift-sandboxed-containers-operator spec: targetNamespaces: - openshift-sandboxed-containers-operator다음 명령을 실행하여 operator 그룹을 생성합니다.
$ oc apply -f osc-operatorgroup.yamlosc-subscription.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sandboxed-containers-operator namespace: openshift-sandboxed-containers-operator spec: channel: stable installPlanApproval: Automatic name: sandboxed-containers-operator source: redhat-operators sourceNamespace: openshift-marketplace startingCSV: sandboxed-containers-operator.v1.9.0다음 명령을 실행하여 서브스크립션을 생성합니다.
$ oc apply -f osc-subscription.yaml다음 명령을 실행하여 Operator가 올바르게 설치되었는지 확인합니다.
$ oc get csv -n openshift-sandboxed-containers-operator이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.
다음 명령을 실행하여 프로세스를 확인합니다.
$ watch oc get csv -n openshift-sandboxed-containers-operator출력 예
NAME DISPLAY VERSION REPLACES PHASE openshift-sandboxed-containers openshift-sandboxed-containers-operator 1.9.0 1.8.1 Succeeded
6.2.2. libvirt 볼륨 구성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너 Operator는 설치 중에 KVM 호스트에서 libvirt 볼륨 및 풀을 자동으로 구성합니다. 필요한 경우 libvirt 볼륨 및 풀을 수동으로 구성하거나 생성할 수 있습니다.
사전 요구 사항
- OpenShift Container Platform 웹 콘솔 또는 명령줄을 사용하여 OpenShift Container Platform 클러스터에 OpenShift 샌드박스 컨테이너 Operator를 설치했습니다.
- KVM 호스트에 대한 관리자 권한이 있습니다.
-
KVM 호스트에
podman을 설치했습니다. -
KVM 호스트에
virt-customize를 설치했습니다. -
이미지에 대한
/var/lib/libvirt/images/디렉터리가 있습니다.
프로세스
- KVM 호스트에 로그인합니다.
다음 명령을 실행하여 libvirt 풀의 이름을 설정합니다.
$ export LIBVIRT_POOL=<libvirt_pool>libvirt 공급자의 시크릿을 생성하려면
LIBVIRT_POOL값이 필요합니다.다음 명령을 실행하여 libvirt 볼륨의 이름을 설정합니다.
$ export LIBVIRT_VOL_NAME=<libvirt_volume>libvirt 공급자의 시크릿을 생성하려면
LIBVIRT_VOL_NAME값이 필요합니다.다음 명령을 실행하여 기본 스토리지 풀 위치의 경로를 설정합니다.
$ export LIBVIRT_POOL_DIRECTORY="/var/lib/libvirt/images/"다음 명령을 실행하여 libvirt 풀을 생성합니다.
$ virsh pool-define-as $LIBVIRT_POOL --type dir --target "$LIBVIRT_POOL_DIRECTORY"다음 명령을 실행하여 libvirt 풀을 시작합니다.
$ virsh pool-start $LIBVIRT_POOL다음 명령을 실행하여 풀에 대한 libvirt 볼륨을 만듭니다.
$ virsh -c qemu:///system \ vol-create-as --pool $LIBVIRT_POOL \ --name $LIBVIRT_VOL_NAME \ --capacity 20G \ --allocation 2G \ --prealloc-metadata \ --format qcow2
6.2.3. 사용자 정의 피어 Pod VM 이미지 생성 링크 복사링크가 클립보드에 복사되었습니다!
기본 Operator 빌드 이미지를 사용하는 대신 VM(사용자 정의 피어 Pod 가상 머신) 이미지를 생성할 수 있습니다.
피어 Pod QCOW2 이미지를 사용하여 OCI(Open Container Initiative) 컨테이너를 빌드합니다. 나중에 컨테이너 레지스트리 URL과 피어 Pod VM 이미지 구성 맵에 이미지 경로를 추가합니다.
프로세스
Dockerfile.podvm-oci파일을 생성합니다.FROM scratch ARG PODVM_IMAGE_SRC ENV PODVM_IMAGE_PATH="/image/podvm.qcow2" COPY $PODVM_IMAGE_SRC $PODVM_IMAGE_PATH다음 명령을 실행하여 Pod VM QCOW2 이미지를 사용하여 컨테이너를 빌드합니다.
$ docker build -t podvm-libvirt \ --build-arg PODVM_IMAGE_SRC=<podvm_image_source> \1 --build-arg PODVM_IMAGE_PATH=<podvm_image_path> \2 -f Dockerfile.podvm-oci .
6.2.4. 피어 Pod 시크릿 업데이트 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod 시크릿을 업데이트해야 합니다.
시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.
기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.
사전 요구 사항
LIBVIRT_URI. 이 값은 libvirt 네트워크의 기본 게이트웨이 IP 주소입니다. libvirt 네트워크 설정을 확인하여 이 값을 가져옵니다.참고libvirt에서 기본 브리지 가상 네트워크를 사용하는 경우 다음 명령을 실행하여
LIBVIRT_URI를 가져올 수 있습니다.$ virtint=$(bridge_line=$(virsh net-info default | grep Bridge); echo "${bridge_line//Bridge:/}" | tr -d [:blank:]) $ LIBVIRT_URI=$( ip -4 addr show $virtint | grep -oP '(?<=inet\s)\d+(\.\d+){3}') $ LIBVIRT_GATEWAY_URI="qemu+ssh://root@${LIBVIRT_URI}/system?no_verify=1"-
REDHAT_OFFLINE_TOKEN. Red Hat API 토큰에서 RHEL 이미지를 다운로드하기 위해 이 토큰 을 생성했습니다.
프로세스
다음 예에 따라
peer-pods-secret.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: CLOUD_PROVIDER: "libvirt" LIBVIRT_URI: "<libvirt_gateway_uri>"1 REDHAT_OFFLINE_TOKEN: "<rh_offline_token>"2 다음 명령을 실행하여 시크릿을 생성합니다.
$ oc apply -f peer-pods-secret.yaml
6.2.5. 피어 Pod 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너에 대한 피어 Pod 구성 맵을 생성해야 합니다.
프로세스
다음 예에 따라
peer-pods-cm.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "libvirt" PEERPODS_LIMIT_PER_NODE: "10"1 LIBVIRT_POOL: "<libvirt_pool>"2 LIBVIRT_VOL_NAME: "<libvirt_volume>"3 LIBVIRT_DIR_NAME: "/var/lib/libvirt/images/<directory_name>"4 LIBVIRT_NET: "default"5 DISABLECVM: "true"- 1
- 노드당 생성할 수 있는 최대 피어 Pod 수를 지정합니다. 기본값은
10입니다. - 2
- libvirt 풀을 지정합니다. libvirt 풀을 수동으로 구성한 경우 KVM 호스트 구성과 동일한 이름을 사용합니다.
- 3
- libvirt 볼륨 이름을 지정합니다. libvirt 볼륨을 수동으로 구성한 경우 KVM 호스트 구성과 동일한 이름을 사용합니다.
- 4
- 가상 머신 디스크 이미지(예:
.qcow2또는.raw파일)를 저장할 libvirt 디렉터리를 지정합니다. libvirt에 읽기 및 쓰기 액세스 권한이 있는지 확인하려면 libvirt 스토리지 디렉터리의 하위 디렉터리를 사용합니다. 기본값은/var/lib/libvirt/images/입니다. - 5
- 선택 사항: 기본 네트워크를 사용하지 않으려면 libvirt 네트워크를 지정합니다.
다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f peer-pods-cm.yaml
6.2.6. 피어 Pod VM 이미지 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod VM(가상 머신) 이미지에 대한 구성 맵을 생성해야 합니다.
사전 요구 사항
- Red Hat Hybrid Cloud Console 을 사용하여 활성화 키를 생성해야 합니다.
- 선택 사항: Cloud API Adaptor 사용자 정의 이미지를 사용하려면 이미지의 이름, URL, 분기 또는 태그가 있어야 합니다.
프로세스
다음 예에 따라
libvirt-podvm-image-cm.yaml매니페스트를 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: libvirt-podvm-image-cm namespace: openshift-sandboxed-containers-operator data: PODVM_DISTRO: "rhel" DOWNLOAD_SOURCES: "no"1 CAA_SRC: "https://github.com/confidential-containers/cloud-api-adaptor"2 CAA_REF: "main"3 CONFIDENTIAL_COMPUTE_ENABLED: "yes" UPDATE_PEERPODS_CM: "yes" ORG_ID: "<rhel_organization_id>" ACTIVATION_KEY: "<rhel_activation_key>"4 IMAGE_NAME: "<podvm_libvirt_image>"5 PODVM_IMAGE_URI: "oci::<image_repo_url>:<image_tag>::<image_path>"6 SE_BOOT: "true"7 BASE_OS_VERSION: "<rhel_image_os_version>"8 - 1
- 사용자 정의 Cloud API Adaptor 소스를 사용하여 Pod VM 이미지를 빌드하려면
yes를 지정합니다. - 2
- 선택 사항: Cloud API Adaptor 사용자 정의 이미지의 URL을 지정합니다.
- 3
- 선택 사항: Cloud API Adaptor 사용자 정의 이미지의 분기 또는 태그를 지정합니다.
- 4
- RHEL 활성화 키를 지정합니다.
- 5
- 사용자 정의 피어 Pod VM 이미지 이름을 지정합니다.
- 6
- 선택 사항: 사용자 정의 피어 Pod VM 이미지를 생성한 경우 컨테이너 레지스트리 URL, 이미지 태그 및 이미지 경로(기본값:
/image/podvm.qcow2)를 지정합니다. 그렇지 않으면 값을""로 설정합니다. - 7
- 기본값
true에서는 기본 Operator 빌드 이미지에 대해 IBM Secure Execution를 활성화합니다. 사용자 정의 피어 Pod VM 이미지를 사용하는 경우false로 설정합니다. - 8
- RHEL 이미지 운영 체제 버전을 지정합니다. IBM Z® Secure Execution는 RHEL 9.5 이상 버전을 지원합니다.
다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f libvirt-podvm-image-cm.yamllibvirt 공급자에 대해 libvirt Pod VM 이미지 구성 맵이 생성됩니다.
6.2.7. KVM 호스트 시크릿 생성 링크 복사링크가 클립보드에 복사되었습니다!
KVM 호스트에 대한 시크릿을 생성해야 합니다.
프로세스
다음 명령을 실행하여 SSH 키 쌍을 생성합니다.
$ ssh-keygen -f ./id_rsa -N ""공개 SSH 키를 KVM 호스트에 복사합니다.
$ ssh-copy-id -i ./id_rsa.pub <KVM_HOST_IP>1 - 1
- KVM 호스트의 IP 주소 또는 피어 Pod VM이 실행 중인 LPAR을 지정합니다. 예를 들면
192.168.122.1입니다.
다음 명령을 실행하여
Secret오브젝트를 생성합니다.$ oc create secret generic ssh-key-secret \ -n openshift-sandboxed-containers-operator \ --from-file=id_rsa.pub=./id_rsa.pub \ --from-file=id_rsa=./id_rsa생성한 SSH 키를 삭제합니다.
$ shred --remove id_rsa.pub id_rsa
6.2.8. 사용자 정의 피어 Pod VM 이미지 선택 링크 복사링크가 클립보드에 복사되었습니다!
Pod 매니페스트에 주석을 추가하여 워크로드 요구 사항에 맞게 사용자 정의 피어 Pod 가상 머신(VM) 이미지를 선택할 수 있습니다. 사용자 정의 이미지는 피어 Pod 구성 맵에 지정된 기본 이미지를 덮어씁니다. libvirt 풀에 새 libvirt 볼륨을 생성하고 사용자 지정 피어 포드 VM 이미지를 새 볼륨에 업로드합니다. 그런 다음 사용자 정의 피어 Pod VM 이미지를 사용하도록 Pod 매니페스트를 업데이트합니다.
사전 요구 사항
- 클라우드 공급자 또는 하이퍼바이저와 호환되는 사용자 정의 Pod VM 이미지의 ID를 사용할 수 있습니다.
프로세스
다음 명령을 실행하여 libvirt 풀의 이름을 설정합니다.
$ export LIBVIRT_POOL=<libvirt_pool>1 - 1
- 기존 libvirt 풀 이름을 지정합니다.
다음 명령을 실행하여 새 libvirt 볼륨의 이름을 설정합니다.
$ export LIBVIRT_VOL_NAME=<new_libvirt_volume>다음 명령을 실행하여 풀에 대한 libvirt 볼륨을 만듭니다.
$ virsh -c qemu:///system \ vol-create-as --pool $LIBVIRT_POOL \ --name $LIBVIRT_VOL_NAME \ --capacity 20G \ --allocation 2G \ --prealloc-metadata \ --format qcow2사용자 정의 피어 Pod VM 이미지를 libvirt 볼륨에 업로드합니다.
$ virsh -c qemu:///system vol-upload \ --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \1 --pool $LIBVIRT_POOL --sparse- 1
- 사용자 정의 피어 Pod VM 이미지 이름을 지정합니다.
다음 예에 따라
pod-manifest.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: pod-manifest annotations: io.katacontainers.config.hypervisor.image: "<new_libvirt_volume>"1 spec: runtimeClassName: kata-remote2 containers: - name: <example_container>3 image: registry.access.redhat.com/ubi9/ubi:9.3 command: ["sleep", "36000"]다음 명령을 실행하여 Pod를 생성합니다.
$ oc apply -f pod-manifest.yaml
6.2.9. Kata 에이전트 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kata 에이전트 정책은 Kata 런타임으로 실행되는 Pod에 대한 에이전트 API 요청을 제어하는 보안 메커니즘입니다. Pod VM(가상 시스템) 내에서 Kata 에이전트가 Rego로 작성하고 강제 적용하는 이 정책은 허용 또는 거부되는 작업을 결정합니다.
보안이 중요하지 않은 개발 및 테스트와 같은 특정 사용 사례에 대해 사용자 지정 정책을 사용하여 기본 정책을 덮어쓸 수 있습니다. 예를 들어 컨트롤 플레인을 신뢰할 수 있는 환경에서 실행할 수 있습니다. 다음과 같은 다양한 방법으로 사용자 지정 정책을 적용할 수 있습니다.
- Pod VM 이미지에 포함
- 피어 Pod 구성 맵의 패치 적용.
- 워크로드 Pod YAML에 주석을 추가합니다.
프로덕션 시스템의 경우 기본 방법은 initdata를 사용하여 Kata 에이전트 정책을 재정의하는 것입니다. 다음 절차에서는 io.katacontainers.config.agent.policy 주석을 사용하는 개별 Pod에 사용자 지정 정책을 적용합니다. 정책은 Base64로 인코딩된 Rego 형식으로 제공됩니다. 이 방법은 Pod VM 이미지를 수정하지 않고 Pod 생성 시 기본 정책을 재정의합니다.
사용자 지정 정책은 기본 정책을 완전히 대체합니다. 특정 API만 수정하려면 전체 정책을 포함하고 관련 규칙을 조정합니다.
프로세스
사용자 지정 정책으로
policy.rego파일을 생성합니다. 다음 예제는 데모에exec및log가 활성화된 모든 구성 가능한 API를 보여줍니다.package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false이 정책은
exec(ExecProcessRequest) 및로그(ReadStreamRequest) API를 활성화합니다. 필요에 따라 정책을 추가로 사용자 지정하도록true또는false값을 조정합니다.다음 명령을 실행하여
policy.rego파일을 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 policy.regoyaml 파일에 사용할 출력을 저장합니다.
my-pod.yamlPod 사양 파일에 Base64로 인코딩된 정책을 추가합니다.apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy> spec: runtimeClassName: kata-remote containers: - name: <container_name> image: registry.access.redhat.com/ubi9/ubi:latest command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault다음 명령을 실행하여 Pod 매니페스트를 적용합니다.
$ oc apply -f my-pod.yaml
6.2.10. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR(사용자 정의 리소스)을 생성하여 작업자 노드에 kata-remote 를 런타임 클래스로 설치해야 합니다.
KataConfig CR을 생성하면 OpenShift 샌드박스 컨테이너 Operator가 다음을 수행합니다.
-
기본 구성을 사용하여
kata-remote라는RuntimeClassCR을 생성합니다. 이를 통해 사용자는RuntimeClassName필드에서 CR을 참조하여kata-remote를 런타임으로 사용하도록 워크로드를 구성할 수 있습니다. 이 CR은 런타임의 리소스 오버헤드도 지정합니다.
OpenShift 샌드박스 컨테이너는 kata-remote 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 예에 따라
example-kataconfig.yaml매니페스트 파일을 생성합니다.apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: enablePeerPods: true logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'1 - 1
- 선택 사항: 노드 레이블을 적용하여 특정 노드에
kata-remote를 설치한 경우 키와 값(예:osc: 'true')을 지정합니다.
다음 명령을 실행하여
KataConfigCR을 생성합니다.$ oc apply -f example-kataconfig.yaml새로운
KataConfigCR이 생성되고 작업자 노드에kata-remote가 런타임 클래스로 설치됩니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"kataNodes아래의 모든 작업자의 상태가설치되고이유를 지정하지 않고InProgress조건이False이면 클러스터에kata-remote가 설치됩니다.다음 명령을 실행하여 피어 Pod 이미지를 빌드하고 libvirt 볼륨에 업로드했는지 확인합니다.
$ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator출력 예
Name: peer-pods-cm Namespace: openshift-sandboxed-containers-operator Labels: <none> Annotations: <none> Data ==== CLOUD_PROVIDER: libvirt BinaryData ==== Events: <none>다음 명령을 실행하여
UPDATEDMACHINECOUNT가MACHINECOUNT와 같은 경우UPDATEDMACHINECOUNT가 UPDATED 상태에 있는지 확인하려면kata-oc머신 구성 풀 진행 상황을 모니터링합니다.$ watch oc get mcp/kata-oc다음 명령을 실행하여 데몬 세트를 확인합니다.
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds다음 명령을 실행하여 런타임 클래스를 확인합니다.
$ oc get runtimeclass출력 예
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
6.2.11. 노드당 피어 Pod VM 수 수정 링크 복사링크가 클립보드에 복사되었습니다!
peerpodConfig CR(사용자 정의 리소스)을 편집하여 노드당 피어 Pod 가상 머신(VM) 제한을 수정할 수 있습니다.
프로세스
다음 명령을 실행하여 현재 제한을 확인합니다.
$ oc get peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ -o jsonpath='{.spec.limit}{"\n"}'다음 명령을 실행하여
peerpodConfigCR의limit속성을 수정합니다.$ oc patch peerpodconfig peerpodconfig-openshift -n openshift-sandboxed-containers-operator \ --type merge --patch '{"spec":{"limit":"<value>"}}'1 - 1
- <value>를 정의할 제한으로 바꿉니다.
6.2.12. 워크로드 오브젝트 구성 링크 복사링크가 클립보드에 복사되었습니다!
kata-remote 를 다음 pod 템플릿 오브젝트의 런타임 클래스로 설정하여 OpenShift 샌드박스 컨테이너 워크로드 오브젝트를 구성해야 합니다.
-
Pod오브젝트 -
ReplicaSet오브젝트 -
ReplicationController오브젝트 -
StatefulSet오브젝트 -
Deployment오브젝트 -
DeploymentConfig오브젝트
Operator 네임스페이스에 워크로드를 배포하지 마십시오. 이러한 리소스에 대한 전용 네임스페이스를 생성합니다.
사전 요구 사항
-
KataConfigCR(사용자 정의 리소스)을 생성했습니다.
프로세스
다음 예와 같이
spec.runtimeClassName: kata-remote를 각 pod 템플릿 워크로드 오브젝트의 매니페스트에 추가합니다.apiVersion: v1 kind: <object> # ... spec: runtimeClassName: kata-remote # ...OpenShift Container Platform은 워크로드 오브젝트를 생성하고 스케줄링을 시작합니다.
검증
-
pod-templated 오브젝트의
spec.runtimeClassName필드를 검사합니다. 값이kata-remote이면 피어 Pod를 사용하여 OpenShift 샌드박스 컨테이너에서 워크로드가 실행됩니다.
7장. Azure에 기밀 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너를 배포한 후 Microsoft Azure 클라우드 컴퓨팅 서비스에 기밀 컨테이너를 배포할 수 있습니다.
Azure의 기밀 컨테이너는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
클러스터 요구 사항
- Pod VM 서브넷에 대한 아웃 바운드 연결을 구성했습니다.
- Confidential Compute attestation Operator를 설치하는 클러스터에 Red Hat OpenShift Container Platform 4.15 이상을 설치했습니다.
다음 단계를 수행하여 기밀 컨테이너를 배포합니다.
- Confidential Compute attestation Operator를 설치합니다.
- Trustee의 경로를 만듭니다.
- 기밀성 컨테이너 기능 게이트를 활성화합니다.
- initdata를 생성합니다.
- 피어 Pod 구성 맵을 업데이트합니다.
- 선택 사항: Kata 에이전트 정책을 사용자 지정합니다.
-
KataConfigCR(사용자 정의 리소스)을 삭제합니다. -
KataConfigCR을 다시 만듭니다. - Trustee 인증 시크릿을 생성합니다.
- Trustee 구성 맵을 생성합니다.
- Trustee 값, 정책 및 시크릿을 구성합니다.
-
KbsConfigCR을 생성합니다. - Trustee 구성을 확인합니다.
- 인증 프로세스를 확인합니다.
7.1. 기밀 컴퓨팅 인증 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
CLI를 사용하여 Azure에 Confidential Compute attestation Operator를 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
trustee-namespace.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Namespace metadata: name: trustee-operator-system다음 명령을 실행하여
trustee-operator-system네임스페이스를 생성합니다.$ oc apply -f trustee-namespace.yamltrustee-operatorgroup.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: trustee-operator-group namespace: trustee-operator-system spec: targetNamespaces: - trustee-operator-system다음 명령을 실행하여 operator 그룹을 생성합니다.
$ oc apply -f trustee-operatorgroup.yamltrustee-subscription.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: trustee-operator-system namespace: trustee-operator-system spec: channel: stable installPlanApproval: Automatic name: trustee-operator source: redhat-operators sourceNamespace: openshift-marketplace다음 명령을 실행하여 서브스크립션을 생성합니다.
$ oc apply -f trustee-subscription.yaml다음 명령을 실행하여 Operator가 올바르게 설치되었는지 확인합니다.
$ oc get csv -n trustee-operator-system이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.
다음 명령을 실행하여 프로세스를 확인합니다.
$ watch oc get csv -n trustee-operator-system출력 예
NAME DISPLAY PHASE trustee-operator.v0.3.0 Trustee Operator 0.3.0 Succeeded
7.2. 기밀성 컨테이너 기능 게이트 활성화 링크 복사링크가 클립보드에 복사되었습니다!
기밀 컨테이너 기능 게이트를 활성화해야 합니다.
사전 요구 사항
- OpenShift 샌드박스 컨테이너 Operator에 가입했습니다.
프로세스
cc-feature-gate.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: osc-feature-gates namespace: openshift-sandboxed-containers-operator data: confidential: "true"다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f cc-feature-gate.yaml
7.3. Trustee를 위한 경로 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee의 엣지 TLS 종료를 사용하여 보안 경로를 생성할 수 있습니다. 외부 수신 트래픽은 라우터 Pod에 HTTPS로 도달하고 Trustee Pod에 HTTP로 전달합니다.
사전 요구 사항
- Confidential Compute attestation Operator를 설치했습니다.
프로세스
다음 명령을 실행하여 엣지 경로를 만듭니다.
$ oc create route edge --service=kbs-service --port kbs-port \ -n trustee-operator-system참고참고: 현재 유효한 CA 서명 인증서가 있는 경로만 지원됩니다. 자체 서명된 인증서가 있는 경로를 사용할 수 없습니다.
다음 명령을 실행하여
TRUSTEE_HOST변수를 설정합니다.$ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \ -o jsonpath={.spec.host})다음 명령을 실행하여 경로를 확인합니다.
$ echo $TRUSTEE_HOST출력 예
kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io피어 Pod 구성 맵의 이 값을 기록합니다.
7.4. initdata 정보 링크 복사링크가 클립보드에 복사되었습니다!
initdata 사양을 사용하면 런타임 시 민감하거나 워크로드별 데이터로 피어 Pod를 유연하게 초기화할 수 있으므로 이러한 데이터를 VM(가상 머신) 이미지에 포함할 필요가 없습니다. 이를 통해 기밀 정보의 노출을 줄이고 사용자 정의 이미지 빌드를 제거하여 유연성을 개선합니다. 예를 들어 initdata에는 세 가지 구성 설정이 포함될 수 있습니다.
- 보안 통신을 위한 X.509 인증서입니다.
- 인증을 위한 암호화 키입니다.
-
기본 Kata Agent 정책을 덮어쓸 때 런타임 동작을 적용하는 선택적 Kata Agent
policy.rego파일입니다.
다음 방법 중 하나를 사용하여 initdata 구성을 적용할 수 있습니다.
- 피어 Pod 구성 맵에 전역적으로 포함하여 모든 Pod에 대해 클러스터 전체 기본값을 설정합니다.
Pod 워크로드 오브젝트를 구성할 때 특정 Pod의 경우 개별 워크로드에 맞게 사용자 지정할 수 있습니다.
Pod 워크로드 오브젝트를 구성할 때 지정하는
io.katacontainers.config.runtime.cc_init_data주석은 해당 특정 pod의 피어 Pod 구성 맵의 글로벌INITDATA설정을 재정의합니다. Kata 런타임은 Pod 생성 시 자동으로 이 우선 순위를 처리합니다.
initdata 콘텐츠는 다음 구성 요소를 구성합니다.
- 인증 에이전트(AA)는 인증을 위해 인증서를 전송하여 피어 Pod의 신뢰성을 확인합니다.
- 피어 Pod VM 내에서 시크릿 및 보안 데이터 액세스를 관리하는 CDH(비밀 데이터 허브)입니다.
- Kata 에이전트는 런타임 정책을 적용하고 Pod VM 내부의 컨테이너의 라이프사이클을 관리합니다.
7.5. initdata 생성 링크 복사링크가 클립보드에 복사되었습니다!
initdata를 사용하여 TOML 파일을 생성하고 Base64로 인코딩된 문자열로 변환합니다. 이 문자열을 사용하여 피어 Pod 구성 맵, 피어 Pod 매니페스트 또는 verification-pod.yaml 파일에서 값을 지정합니다.
Trustee 구성 맵에서 insecure_http = true 를 구성하는 경우 kbs_cert 설정을 삭제해야 합니다.
프로세스
initdata.toml구성 파일을 생성합니다.```toml algorithm = "sha384" version = "0.1.0" [data] "aa.toml" = ''' [token_configs] [token_configs.coco_as] url = '<url>:<port>'1 [token_configs.kbs] url = '<url>:<port>' cert = """ -----BEGIN CERTIFICATE----- <kbs_certificate>2 -----END CERTIFICATE----- """ ''' "cdh.toml" = ''' socket = 'unix:///run/confidential-containers/cdh.sock' credentials = [] [kbc] name = 'cc_kbc' url = '<url>:<port>' kbs_cert = """3 -----BEGIN CERTIFICATE----- <kbs_certificate>4 -----END CERTIFICATE----- """ ''' "policy.rego" = '''5 package agent_policy default AddARPNeighborsRequest := true default AddSwapRequest := true default CloseStdinRequest := true default CopyFileRequest := true default CreateContainerRequest := true default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true default GetMetricsRequest := true default GetOOMEventRequest := true default GuestDetailsRequest := true default ListInterfacesRequest := true default ListRoutesRequest := true default MemHotplugByProbeRequest := true default OnlineCPUMemRequest := true default PauseContainerRequest := true default PullImageRequest := true default ReadStreamRequest := true default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default ReseedRandomDevRequest := true default ResumeContainerRequest := true default SetGuestDateTimeRequest := true default SetPolicyRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StartTracingRequest := true default StatsContainerRequest := true default StopTracingRequest := true default TtyWinResizeRequest := true default UpdateContainerRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := true ''' ```- 1
- Trustee 인스턴스의 URL 및 포트를 지정합니다. 테스트 목적으로
insecure_http로 Trustee를 구성하는 경우 HTTP를 사용합니다. 그렇지 않으면 HTTPS를 사용합니다. 프로덕션 시스템의 경우 프록시와 같이 외부에서 TLS를 처리하도록 환경을 구성하지 않는 한insecure_http를 사용하지 마십시오. - 2
- 인증 에이전트의 Base64로 인코딩된 TLS 인증서를 지정합니다. 이는 테스트 목적에는 필요하지 않지만 프로덕션 시스템에는 권장됩니다.
- 3
- Trustee 구성 맵에서
insecure_http = true를 구성하는 경우kbs_cert설정을 삭제합니다. - 4
- Trustee 인스턴스의 Base64로 인코딩된 TLS 인증서를 지정합니다.
- 5
- 선택 사항: 사용자 지정 Kata 에이전트 정책을 지정할 수 있습니다.
다음 명령을 실행하여
initdata.toml파일을 텍스트 파일의 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 initdata.toml > initdata.txt
7.6. 피어 Pod 구성 맵 업데이트 링크 복사링크가 클립보드에 복사되었습니다!
기밀 컨테이너의 피어 Pod 구성 맵을 업데이트해야 합니다.
Secure Boot를 true 로 설정하여 기본적으로 활성화합니다. 기본값은 false 이며 보안 위험을 나타냅니다.
프로세스
Azure 인스턴스에서 다음 값을 가져옵니다.
Azure 리소스 그룹을 검색하고 기록합니다.
$ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}') && echo "AZURE_RESOURCE_GROUP: \"$AZURE_RESOURCE_GROUP\""Azure VNet 이름을 검색하고 기록합니다.
$ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)이 값은 Azure 서브넷 ID를 검색하는 데 사용됩니다.
Azure 서브넷 ID를 검색하고 기록합니다.
$ AZURE_SUBNET_ID=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name $AZURE_VNET_NAME --query "[].{Id:id} | [? contains(Id, 'worker')]" --output tsv) && echo "AZURE_SUBNET_ID: \"$AZURE_SUBNET_ID\""Azure NSS(Network Security Group) ID를 검색하고 기록합니다.
$ AZURE_NSG_ID=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Id:id}" --output tsv) && echo "AZURE_NSG_ID: \"$AZURE_NSG_ID\""Azure 리전을 검색하고 기록합니다.
$ AZURE_REGION=$(az group show --resource-group ${AZURE_RESOURCE_GROUP} --query "{Location:location}" --output tsv) && echo "AZURE_REGION: \"$AZURE_REGION\""
다음 예에 따라
peer-pods-cm.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "azure" VXLAN_PORT: "9000" AZURE_INSTANCE_SIZE: "Standard_DC2as_v5"1 AZURE_INSTANCE_SIZES: "Standard_DC2as_v5,Standard_DC4as_v5,Standard_DC8as_v5"2 AZURE_SUBNET_ID: "<azure_subnet_id>"3 AZURE_NSG_ID: "<azure_nsg_id>"4 PROXY_TIMEOUT: "5m" AZURE_IMAGE_ID: "<azure_image_id>"5 AZURE_REGION: "<azure_region>"6 AZURE_RESOURCE_GROUP: "<azure_resource_group>"7 PEERPODS_LIMIT_PER_NODE: "10"8 TAGS: "key1=value1,key2=value2"9 INITDATA: "<base64_encoded_initdata>"10 ENABLE_SECURE_BOOT: "true"11 DISABLECVM: "false"- 1
- 워크로드에 인스턴스 크기가 정의되지 않은 경우
"Standard_DC2as_v5"값이 기본값입니다. 인스턴스 유형이 신뢰할 수 있는 환경을 지원하는지 확인합니다. 기본"Standard_DC2as_v5"값은 AMD SEV-SNP용입니다. TEE가 Intel TDX인 경우Standard_EC4eds_v5를 지정합니다. - 2
- Pod 생성을 위해 공백 없이 인스턴스 크기를 지정합니다. 이를 통해 더 적은 메모리와 더 적은 CPU 또는 대규모 워크로드의 인스턴스 크기가 필요한 워크로드에 대해 더 작은 인스턴스 크기를 정의할 수 있습니다. Intel TDX의 경우
"Standard_EC4eds_v5,Standard_EC8eds_v5,Standard_EC16eds_v5"를 지정합니다. - 3
- 검색한
AZURE_SUBNET_ID값을 지정합니다. - 4
- 검색한
AZURE_NSG_ID값을 지정합니다. - 5
- 선택 사항: 기본적으로 클러스터 인증 정보를 기반으로 Azure 이미지 ID를 사용하여
KataConfigCR을 실행할 때 이 값이 채워집니다. 자체 Azure 이미지를 생성하는 경우 올바른 이미지 ID를 지정합니다. - 6
- 검색한
AZURE_REGION값을 지정합니다. - 7
- 검색한
AZURE_RESOURCE_GROUP값을 지정합니다. - 8
- 노드당 생성할 수 있는 최대 피어 Pod 수를 지정합니다. 기본값은
10입니다. - 9
- 사용자 정의 태그를 Pod VM 인스턴스의
키:값쌍으로 구성하여 피어 Pod 비용을 추적하거나 다른 클러스터에서 피어 Pod를 식별할 수 있습니다. - 10
initdata.txt파일에서 생성한 Base64 인코딩 문자열을 지정합니다.- 11
- 기본적으로 Secure Boot를 활성화하려면
true를 지정합니다.
다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f peer-pods-cm.yaml다음 명령을 실행하여
ds/osc-caa-ds데몬 세트를 다시 시작합니다.$ oc set env ds/osc-caa-ds \ -n openshift-sandboxed-containers-operator REBOOT="$(date)"
7.7. Kata 에이전트 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kata 에이전트 정책은 Kata 런타임으로 실행되는 Pod에 대한 에이전트 API 요청을 제어하는 보안 메커니즘입니다. Pod VM(가상 시스템) 내에서 Kata 에이전트가 Rego로 작성하고 강제 적용하는 이 정책은 허용 또는 거부되는 작업을 결정합니다.
기본적으로 Kata 에이전트 정책은 컨트롤 플레인을 통해 암호화되지 않은 데이터를 전송하거나 수신할 수 있으므로 exec 및 로그 API를 비활성화합니다. 이는 안전하지 않습니다.
보안이 중요하지 않은 개발 및 테스트와 같은 특정 사용 사례에 대해 사용자 지정 정책을 사용하여 기본 정책을 덮어쓸 수 있습니다. 예를 들어 컨트롤 플레인을 신뢰할 수 있는 환경에서 실행할 수 있습니다. 다음과 같은 다양한 방법으로 사용자 지정 정책을 적용할 수 있습니다.
- Pod VM 이미지에 포함
- 피어 Pod 구성 맵의 패치 적용.
- 워크로드 Pod YAML에 주석을 추가합니다.
프로덕션 시스템의 경우 기본 방법은 initdata를 사용하여 Kata 에이전트 정책을 재정의하는 것입니다. 다음 절차에서는 io.katacontainers.config.agent.policy 주석을 사용하는 개별 Pod에 사용자 지정 정책을 적용합니다. 정책은 Base64로 인코딩된 Rego 형식으로 제공됩니다. 이 방법은 Pod VM 이미지를 수정하지 않고 Pod 생성 시 기본 정책을 재정의합니다.
기밀 컨테이너 워크로드에서 exec 또는 로그 API를 활성화하면 중요한 정보가 노출될 수 있습니다. 프로덕션 환경에서는 이러한 API를 활성화하지 마십시오.
사용자 지정 정책은 기본 정책을 완전히 대체합니다. 특정 API만 수정하려면 전체 정책을 포함하고 관련 규칙을 조정합니다.
프로세스
사용자 지정 정책으로
policy.rego파일을 생성합니다. 다음 예제는 데모에exec및log가 활성화된 모든 구성 가능한 API를 보여줍니다.package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false이 정책은
exec(ExecProcessRequest) 및로그(ReadStreamRequest) API를 활성화합니다. 필요에 따라 정책을 추가로 사용자 지정하도록true또는false값을 조정합니다.다음 명령을 실행하여
policy.rego파일을 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 policy.regoyaml 파일에 사용할 출력을 저장합니다.
my-pod.yamlPod 사양 파일에 Base64로 인코딩된 정책을 추가합니다.apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy> spec: runtimeClassName: kata-remote containers: - name: <container_name> image: registry.access.redhat.com/ubi9/ubi:latest command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault다음 명령을 실행하여 Pod 매니페스트를 적용합니다.
$ oc apply -f my-pod.yaml
7.8. KataConfig 사용자 지정 리소스 삭제 링크 복사링크가 클립보드에 복사되었습니다!
명령줄을 사용하여 KataConfig CR(사용자 정의 리소스)을 삭제할 수 있습니다.
KataConfig CR을 삭제하면 클러스터에서 런타임 및 관련 리소스가 제거됩니다.
KataConfig CR을 삭제하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 명령을 실행하여
KataConfigCR을 삭제합니다.$ oc delete kataconfig example-kataconfigOpenShift 샌드박스된 컨테이너 Operator는 클러스터에서 런타임을 활성화하기 위해 처음 생성된 모든 리소스를 제거합니다.
중요KataConfigCR을 삭제하면 모든 작업자 노드가 재부팅될 때까지 CLI가 응답하지 않습니다. 확인을 수행하기 전에 삭제 프로세스가 완료될 때까지 기다려야 합니다.다음 명령을 실행하여 사용자 정의 리소스가 삭제되었는지 확인합니다.
$ oc get kataconfig example-kataconfig출력 예
No example-kataconfig instances exist
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
7.9. 사용자 정의 피어 Pod VM 이미지 선택 링크 복사링크가 클립보드에 복사되었습니다!
Pod 매니페스트에 주석을 추가하여 워크로드 요구 사항에 맞게 사용자 정의 피어 Pod 가상 머신(VM) 이미지를 선택할 수 있습니다. 사용자 정의 이미지는 피어 Pod 구성 맵에 지정된 기본 이미지를 덮어씁니다.
사전 요구 사항
- 클라우드 공급자 또는 하이퍼바이저와 호환되는 사용자 정의 Pod VM 이미지의 ID를 사용할 수 있습니다.
프로세스
io.katacontainers.config.hypervisor.image주석을 추가하여 Pod 매니페스트를 편집하여pod-manifest.yaml파일에 저장합니다.apiVersion: v1 kind: Pod metadata: name: pod-manifest annotations: io.katacontainers.config.hypervisor.image: "<custom_image_id>"1 spec: runtimeClassName: kata-remote2 containers: - name: <example_container>3 image: registry.access.redhat.com/ubi9/ubi:9.3 command: ["sleep", "36000"]다음 명령을 실행하여 Pod를 생성합니다.
$ oc apply -f pod-manifest.yaml
7.10. KataConfig 사용자 지정 리소스 다시 생성 링크 복사링크가 클립보드에 복사되었습니다!
기밀 컨테이너를 위해 KataConfig CR(사용자 정의 리소스)을 다시 생성해야 합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 예에 따라
example-kataconfig.yaml매니페스트 파일을 생성합니다.apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: enablePeerPods: true logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'1 - 1
- 선택 사항: 노드 레이블을 적용하여 특정 노드에
kata-remote를 설치한 경우 키와 값(예:cc: 'true')을 지정합니다.
다음 명령을 실행하여
KataConfigCR을 생성합니다.$ oc apply -f example-kataconfig.yaml새로운
KataConfigCR이 생성되고 작업자 노드에kata-remote가 런타임 클래스로 설치됩니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"kataNodes아래의 모든 작업자의 상태가설치되고이유를 지정하지 않고InProgress조건이False이면 클러스터에kata-remote가 설치됩니다.다음 명령을 실행하여 데몬 세트를 확인합니다.
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds다음 명령을 실행하여 런타임 클래스를 확인합니다.
$ oc get runtimeclass출력 예
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
7.11. Trustee 인증 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee에 대한 인증 시크릿을 생성해야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 명령을 실행하여 개인 키를 생성합니다.
$ openssl genpkey -algorithm ed25519 > privateKey다음 명령을 실행하여 공개 키를 생성합니다.
$ openssl pkey -in privateKey -pubout -out publicKey다음 명령을 실행하여 보안을 생성합니다.
$ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system다음 명령을 실행하여 시크릿을 확인합니다.
$ oc get secret -n trustee-operator-system
7.12. Trustee 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee 서버를 구성하려면 구성 맵을 생성해야 합니다.
다음 구성 예제에서는 보안 기능을 해제하여 기술 프리뷰 기능을 시연할 수 있습니다. 이는 프로덕션 환경을 위한 것이 아닙니다.
사전 요구 사항
- Trustee를 위한 경로를 생성했습니다.
프로세스
kbs-config-cm.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: kbs-config-cm namespace: trustee-operator-system data: kbs-config.toml: | [http_server] sockets = ["0.0.0.0:8080"] insecure_http = true [admin] insecure_api = true auth_public_key = "/etc/auth-secret/publicKey" [attestation_token] insecure_key = true attestation_token_type = "CoCo" [attestation_service] type = "coco_as_builtin" work_dir = "/opt/confidential-containers/attestation-service" policy_engine = "opa" [attestation_service.attestation_token_broker] type = "Ear" policy_dir = "/opt/confidential-containers/attestation-service/policies" [attestation_service.attestation_token_config] duration_min = 5 [attestation_service.rvps_config] type = "BuiltIn" [attestation_service.rvps_config.storage] type = "LocalJson" file_path = "/opt/confidential-containers/rvps/reference-values/reference-values.json" [[plugins]] name = "resource" type = "LocalFs" dir_path = "/opt/confidential-containers/kbs/repository" [policy_engine] policy_path = "/opt/confidential-containers/opa/policy.rego"다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f kbs-config-cm.yaml
7.13. Trustee 값, 정책 및 시크릿 구성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee에 대해 다음 값, 정책 및 시크릿을 구성할 수 있습니다.
- 선택 사항: 참조 값 공급자 서비스에 대한 참조 값입니다.
- 선택사항: 인증 정책입니다.
- Intel Trust Domain Extensions(TDX)용 인증서 캐싱 서비스 프로비저닝.
- 선택 사항: Trustee 클라이언트의 사용자 정의 키의 시크릿입니다.
- 선택사항: 컨테이너 이미지 서명 확인을 위한 시크릿입니다.
- 컨테이너 이미지 서명 확인 정책. 이 정책은 필수입니다. 컨테이너 이미지 서명 확인을 사용하지 않는 경우 서명을 확인하지 않는 정책을 생성해야 합니다.
- 리소스 액세스 정책.
7.13.1. 참조 값 구성 링크 복사링크가 클립보드에 복사되었습니다!
하드웨어 플랫폼의 신뢰할 수 있는 다이제스트를 지정하여 RVPS(Reference Value Provider Service)에 대한 참조 값을 구성할 수 있습니다.
클라이언트는 실행 중인 소프트웨어, TEE(신뢰할 수 있는 실행 환경) 하드웨어 및 펌웨어에서 측정을 수집하고 클레임과 함께 Attestation Server에 견적을 제출합니다. 이러한 측정은 Trustee에 등록된 신뢰할 수 있는 다이제스트와 일치해야 합니다. 이 프로세스에서는 기밀 VM(CVM)이 예상 소프트웨어 스택을 실행 중이고 변조되지 않도록 합니다.
프로세스
rvps-configmap.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: rvps-reference-values namespace: trustee-operator-system data: reference-values.json: | [1 ]- 1
- 필요한 경우 하드웨어 플랫폼에 대해 신뢰할 수 있는 다이제스트를 지정합니다. 그렇지 않으면 비워 둡니다.
다음 명령을 실행하여 RVPS 구성 맵을 생성합니다.
$ oc apply -f rvps-configmap.yaml
7.13.2. 인증 정책 생성 링크 복사링크가 클립보드에 복사되었습니다!
기본 테스트 정책을 재정의하는 인증 정책을 생성할 수 있습니다.
프로세스
다음 예에 따라
attestation-policy.yaml매니페스트 파일을 생성합니다.# attestation-policy.yaml apiVersion: v1 kind: ConfigMap metadata: name: attestation-policy namespace: trustee-operator-system data: default.rego: | package policy import rego.v1 # This policy validates multiple TEE platforms # The policy is meant to capture the TCB requirements # for confidential containers. # This policy is used to generate an EAR Appraisal. # More information can be found at # <https://datatracker.ietf.org/doc/draft-ietf-rats-ar4si/> default executables := 33 default hardware := 97 default configuration := 36 executables := 3 if { input.sample.launch_digest in data.reference.launch_digest } hardware := 2 if { input.sample.svn in data.reference.svn } executables := 3 if { input.snp.measurement in data.reference.snp_launch_measurement } hardware := 2 if { input.snp.reported_tcb_bootloader in data.reference.snp_bootloader input.snp.reported_tcb_microcode in data.reference.snp_microcode input.snp.reported_tcb_snp in data.reference.snp_snp_svn input.snp.reported_tcb_tee in data.reference.snp_tee_svn } configuration := 2 if { input.snp.policy_debug_allowed == "0" input.snp.policy_migrate_ma == "0" input.snp.platform_smt_enabled in data.reference.snp_smt_enabled input.snp.platform_tsme_enabled in data.reference.snp_tsme_enabled input.snp.policy_abi_major in data.reference.snp_guest_abi_major input.snp.policy_abi_minor in data.reference.snp_guest_abi_minor input.snp.policy_single_socket in data.reference.snp_single_socket input.snp.policy_smt_allowed in data.reference.snp_smt_allowed } else := 3 if { input.snp.policy_debug_allowed == "0" input.snp.policy_migrate_ma == "0" } executables := 3 if { input.tdx.quote.body.rtmr_1 in data.reference.rtmr_1 input.tdx.quote.body.rtmr_2 in data.reference.rtmr_2 } hardware := 2 if { # Check that this is a TDX quote signed by the Intel SGX Quoting Enclave. input.tdx.quote.header.tee_type == "81000000" input.tdx.quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" # Check TDX Module version and its hash. Also check OVMF code hash. input.tdx.quote.body.mr_seam in data.reference.mr_seam input.tdx.quote.body.tcb_svn in data.reference.tcb_svn input.tdx.quote.body.mr_td in data.reference.mr_td # Check TCB status # input.tdx.tcb_status == "OK" # Check collateral expiration status # input.tdx.collateral_expiration_status == "0" # Check against allowed advisory ids # allowed_advisory_ids := {"INTEL-SA-00837"} # attester_advisory_ids := {id | id := input.attester_advisory_ids[_]} # object.subset(allowed_advisory_ids, attester_advisory_ids) # Check against disallowed advisory ids # disallowed_advisory_ids := {"INTEL-SA-00837"} # attester_advisory_ids := {id | id := input.tdx.advisory_ids[_]} # convert array to set # intersection := attester_advisory_ids & disallowed_advisory_ids # count(intersection) == 0 } configuration := 2 if { input.tdx.td_attributes.debug == false input.tdx.quote.body.xfam in data.reference.xfam } executables := 3 if { input.azsnpvtpm.measurement in data.reference.measurement input.azsnpvtpm.tpm.pcr11 in data.reference.snp_pcr11 } hardware := 2 if { input.azsnpvtpm.reported_tcb_bootloader in data.reference.tcb_bootloader input.azsnpvtpm.reported_tcb_microcode in data.reference.tcb_microcode input.azsnpvtpm.reported_tcb_snp in data.reference.tcb_snp input.azsnpvtpm.reported_tcb_tee in data.reference.tcb_tee } configuration := 2 if { input.azsnpvtpm.platform_smt_enabled in data.reference.smt_enabled input.azsnpvtpm.platform_tsme_enabled in data.reference.tsme_enabled input.azsnpvtpm.policy_abi_major in data.reference.abi_major input.azsnpvtpm.policy_abi_minor in data.reference.abi_minor input.azsnpvtpm.policy_single_socket in data.reference.single_socket input.azsnpvtpm.policy_smt_allowed in data.reference.smt_allowed } ##### Azure vTPM TDX executables := 3 if { input.aztdxvtpm.tpm.pcr11 in data.reference.tdx_pcr11 } hardware := 2 if { # Check that the quote is a TDX quote signed by the Intel SGX Quoting Enclave. input.aztdxvtpm.quote.header.tee_type == "81000000" input.aztdxvtpm.quote.header.vendor_id == "939a7233f79c4ca9940a0db3957f0607" # Check TDX Module version and its hash. Also check OVMF code hash. input.aztdxvtpm.quote.body.mr_seam in data.reference.mr_seam input.aztdxvtpm.quote.body.tcb_svn in data.reference.tcb_svn input.aztdxvtpm.quote.body.mr_td in data.reference.mr_td } configuration := 2 if { input.aztdxvtpm.quote.body.xfam in data.reference.xfam }인증 정책은 Open Policy Agent 사양을 따릅니다. 이 예에서 attestation 정책은 테스트 보고서에 제공된 클레임을 RVPS 데이터베이스에 등록된 참조 값과 비교합니다. 인증 프로세스는 모든 값이 일치하는 경우에만 성공합니다.
다음 명령을 실행하여 인증 정책 구성 맵을 생성합니다.
$ oc apply -f attestation-policy.yaml
7.13.3. TDX용 PCCS 구성 링크 복사링크가 클립보드에 복사되었습니다!
Intel Trust Domain Extensions (TDX)를 사용하는 경우 PCCS(프로비저닝 인증서 캐싱 서비스)를 사용하도록 Trustee를 구성해야 합니다.
PCCS는 PCK(프로비저닝 인증 키) 인증서를 검색하고 로컬 데이터베이스에 캐시합니다.
공용 Intel PCCS 서비스를 사용하지 마십시오. 온프레미스 또는 퍼블릭 클라우드에서 로컬 캐싱 서비스를 사용합니다.
프로세스
다음 예에 따라
tdx-config.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: tdx-config namespace: trustee-operator-system data: sgx_default_qcnl.conf: | \ { "collateral_service": "https://api.trustedservices.intel.com/sgx/certification/v4/", "pccs_url": "<pccs_url>"1 }- 1
- PCCS URL을 지정합니다(예:
https://localhost:8081/sgx/certification/v4/).
다음 명령을 실행하여 TDX 구성 맵을 생성합니다.
$ oc apply -f tdx-config.yaml
7.13.4. 클라이언트의 사용자 지정 키를 사용하여 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee 클라이언트에 대한 사용자 지정 키가 하나 이상 포함된 보안을 생성할 수 있습니다.
이 예에서 kbsres1 시크릿에는 클라이언트가 검색하는 두 개의 항목(key1,key2)이 있습니다. 동일한 형식을 사용하여 요구 사항에 따라 보안을 추가할 수 있습니다.
사전 요구 사항
- 하나 이상의 사용자 지정 키를 생성했습니다.
프로세스
다음 예에 따라 사용자 정의 키에 대한 보안을 생성합니다.
$ oc apply secret generic kbsres1 \ --from-literal key1=<custom_key1> \1 --from-literal key2=<custom_key2> \ -n trustee-operator-system- 1
- 사용자 정의 키를 지정합니다.
kbsres1시크릿은KbsConfig사용자 지정 리소스의spec.kbsSecretResources키에 지정됩니다.
7.13.5. 컨테이너 이미지 서명 확인을 위한 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
컨테이너 이미지 서명 확인을 사용하는 경우 공개 컨테이너 이미지 서명 키가 포함된 보안을 생성해야 합니다.
Confidential compute attestation Operator는 시크릿을 사용하여 서명을 확인하여 인증된 컨테이너 이미지만 해당 환경에 배포되도록 합니다.
Red Hat Trusted Artifact Signer 또는 기타 툴을 사용하여 컨테이너 이미지에 서명할 수 있습니다.
프로세스
다음 명령을 실행하여 컨테이너 이미지 서명 확인에 대한 보안을 생성합니다.
$ oc apply secret generic <type> \1 --from-file=<tag>=./<public_key_file> \2 -n trustee-operator-system-
<
type>값을 기록합니다.KbsConfig사용자 지정 리소스를 생성할 때spec.kbsSecretResources키에 이 값을 추가해야 합니다.
7.13.6. 컨테이너 이미지 서명 확인 정책 생성 링크 복사링크가 클립보드에 복사되었습니다!
서명 확인이 항상 활성화되므로 컨테이너 이미지 서명 확인 정책을 생성합니다. 이 정책이 없으면 Pod가 시작되지 않습니다.
컨테이너 이미지 서명 확인을 사용하지 않는 경우 서명 확인 없이 정책을 생성합니다.
자세한 내용은 containers-policy.json 5 를 참조하십시오.
프로세스
다음 예에 따라
security-policy-config.json파일을 생성합니다.서명 확인 없이:
{ "default": [ { "type": "insecureAcceptAnything" }], "transports": {} }서명 확인으로 다음을 수행합니다.
{ "default": [ { "type": "insecureAcceptAnything" } ], "transports": { "<transport>": {1 "<registry>/<image>":2 [ { "type": "sigstoreSigned", "keyPath": "kbs:///default/<type>/<tag>"3 } ] } } }
다음 명령을 실행하여 보안 정책을 생성합니다.
$ oc apply secret generic security-policy \ --from-file=osc=./<security-policy-config.json> \ -n trustee-operator-system보안 유형,
security-policy또는 키osc를 변경하지 마십시오.security-policy시크릿은KbsConfig사용자 지정 리소스의spec.kbsSecretResources키에 지정됩니다.
7.13.7. 리소스 액세스 정책 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee 정책 엔진에 대한 리소스 액세스 정책을 구성합니다. 이 정책은 Trustee가 액세스할 수 있는 리소스를 결정합니다.
Trustee 정책 엔진은 TEE 증명의 유효성을 결정하는 Attestation Service 정책 엔진과 다릅니다.
프로세스
resourcepolicy-configmap.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: resource-policy namespace: trustee-operator-system data: policy.rego: package policy default allow = true allow { input["tee"] != "sample" }- policy.rego
-
리소스 정책의 이름
policy.rego는 Trustee 구성 맵에 정의된 리소스 정책과 일치해야 합니다. - 패키지 정책
- 리소스 정책은 Open Policy Agent 사양을 따릅니다.
다음 명령을 실행하여 리소스 정책 구성 맵을 생성합니다.
$ oc apply -f resourcepolicy-configmap.yaml
7.14. KbsConfig 사용자 정의 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KbsConfig CR(사용자 정의 리소스)을 생성하여 Trustee를 시작합니다.
그런 다음 Trustee pod 및 pod 로그를 확인하여 구성을 확인합니다.
프로세스
kbsconfig-cr.yaml매니페스트 파일을 생성합니다.apiVersion: confidentialcontainers.org/v1alpha1 kind: KbsConfig metadata: labels: app.kubernetes.io/name: kbsconfig app.kubernetes.io/instance: kbsconfig app.kubernetes.io/part-of: trustee-operator app.kubernetes.io/managed-by: kustomize app.kubernetes.io/created-by: trustee-operator name: kbsconfig namespace: trustee-operator-system spec: kbsConfigMapName: kbs-config-cm kbsAuthSecretName: kbs-auth-public-key kbsDeploymentType: AllInOneDeployment kbsRvpsRefValuesConfigMapName: rvps-reference-values kbsSecretResources: ["kbsres1", "security-policy", "<type>"]1 kbsResourcePolicyConfigMapName: resource-policy # tdxConfigSpec: # kbsTdxConfigMapName: tdx-config2 # kbsAttestationPolicyConfigMapName: attestation-policy3 # kbsServiceType: <service_type>4 - 1
- 선택 사항: 시크릿을 생성한 경우 컨테이너 이미지 서명 확인 보안의
유형값을 지정합니다(예:img-sig). 시크릿을 생성하지 않은 경우kbsSecretResources값을["kbsres1", "security-policy"]로 설정합니다. - 2
- Uncomment
tdxConfigSpec.kbsTdxConfigMapName: tdx-configfor Intel Trust Domain Extensions. - 3
- 사용자 지정 인증 정책을 생성하는 경우
kbsAttestationPolicyConfigMapName: attestation-policy의 주석을 제거합니다. - 4
- 기본
ClusterIP서비스 이외의서비스 유형을 생성하여 클러스터 외부 트래픽 내에 애플리케이션을 노출하는 경우 kbsServiceType: <service_type>의 주석을 제거합니다.NodePort,LoadBalancer또는ExternalName을 지정할 수 있습니다.
다음 명령을 실행하여
KbsConfigCR을 생성합니다.$ oc apply -f kbsconfig-cr.yaml
7.15. Trustee 구성 확인 링크 복사링크가 클립보드에 복사되었습니다!
Trustee Pod 및 로그를 확인하여 Trustee 구성을 확인합니다.
프로세스
다음 명령을 실행하여 기본 프로젝트를 설정합니다.
$ oc project trustee-operator-system다음 명령을 실행하여 Trustee Pod를 확인합니다.
$ oc get pods -n trustee-operator-system출력 예
NAME READY STATUS RESTARTS AGE trustee-deployment-8585f98449-9bbgl 1/1 Running 0 22m trustee-operator-controller-manager-5fbd44cd97-55dlh 2/2 Running 0 59m다음 명령을 실행하여
POD_NAME환경 변수를 설정합니다.$ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)다음 명령을 실행하여 Pod 로그를 확인합니다.
$ oc logs -n trustee-operator-system $POD_NAME출력 예
[2024-05-30T13:44:24Z INFO kbs] Using config file /etc/kbs-config/kbs-config.json [2024-05-30T13:44:24Z WARN attestation_service::rvps] No RVPS address provided and will launch a built-in rvps [2024-05-30T13:44:24Z INFO attestation_service::token::simple] No Token Signer key in config file, create an ephemeral key and without CA pubkey cert [2024-05-30T13:44:24Z INFO api_server] Starting HTTPS server at [0.0.0.0:8080] [2024-05-30T13:44:24Z INFO actix_server::builder] starting 12 workers [2024-05-30T13:44:24Z INFO actix_server::server] Tokio runtime found; starting in existing Tokio runtime
7.16. 인증 프로세스 확인 링크 복사링크가 클립보드에 복사되었습니다!
테스트 Pod를 생성하고 시크릿을 검색하여 인증 프로세스를 확인할 수 있습니다.
이 절차는 인증이 작동하는지 확인하는 예입니다. 메모리 덤프를 사용하여 데이터를 캡처할 수 있으므로 표준 I/O에 민감한 데이터를 작성하지 마십시오. 메모리에 기록된 데이터만 암호화됩니다.
기본적으로 Pod VM(가상 머신) 이미지에 포함된 Kata 에이전트 정책은 기밀 컨테이너 포드에 대한 exec 및 로그 API를 비활성화합니다. 이 정책을 사용하면 클러스터 관리자가 Pod 내에서 프로세스를 실행하여 중요한 데이터를 추출하는 동시에 중요한 데이터의 우발적인 쓰기를 표준 I/O로 차단하지 않습니다.
테스트 시나리오에서는 Pod에 정책 주석을 추가하여 런타임에 제한을 덮어쓸 수 있습니다. 기술 프리뷰의 경우 런타임 정책 주석은 원격 테스트에서 확인하지 않습니다.
사전 요구 사항
- Trustee 서버와 테스트 Pod가 동일한 클러스터에서 실행되지 않는 경우 경로를 생성했습니다.
프로세스
verification-pod.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: ocp-cc-pod labels: app: ocp-cc-pod annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy>1 io.katacontainers.config.runtime.cc_init_data: <base64_initdata>2 spec: runtimeClassName: kata-remote containers: - name: skr-openshift image: registry.access.redhat.com/ubi9/ubi:9.3 command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault에이전트 정책을 사용하여
io.katacontainers.config.agent.policy주석과io.katacontainers.config.runtime.cc_init_data주석을 모두 지정하면 initdata 주석이 에이전트 정책 주석보다 우선합니다.다음 명령을 실행하여 Pod를 생성합니다.
$ oc create -f verification-pod.yaml다음 명령을 실행하여
ocp-cc-pod의 Bash 쉘에 연결합니다.$ oc exec -it ocp-cc-pod -- bash다음 명령을 실행하여 Pod 시크릿을 가져옵니다.
$ curl http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1출력 예
res1val1Trustee 서버는 인증에 성공한 경우에만 시크릿을 반환합니다.
8장. IBM Z 및 IBM LinuxONE에 기밀 컨테이너 배포 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너를 배포한 후 IBM Z® 및 IBM® LinuxONE에 기밀 컨테이너를 배포할 수 있습니다.
IBM Z® 및 IBM® LinuxONE의 기밀 컨테이너는 기술 프리뷰 기능 전용입니다. 기술 프리뷰 기능은 Red Hat 프로덕션 서비스 수준 계약(SLA)에서 지원되지 않으며 기능적으로 완전하지 않을 수 있습니다. 따라서 프로덕션 환경에서 사용하는 것은 권장하지 않습니다. 이러한 기능을 사용하면 향후 제품 기능을 조기에 이용할 수 있어 개발 과정에서 고객이 기능을 테스트하고 피드백을 제공할 수 있습니다.
Red Hat 기술 프리뷰 기능의 지원 범위에 대한 자세한 내용은 기술 프리뷰 기능 지원 범위를 참조하십시오.
Red Hat OpenShift Container Platform의 IBM® HPCC(HPCC)가 프로덕션에 준비되어 있습니다. HPCC는 다중 계층 계약, 배포 인증 및 컨테이너 런타임 및 OCI 이미지 무결성의 유효성 검사를 제공하여 엔터프라이즈 규모에서 기밀 컴퓨팅 기술을 사용할 수 있습니다.
HPCC는 IBM Z17® 및 IBM® LinuxONE Emperor 5에서 지원하며 OpenShift 샌드박스 컨테이너 1.9 이상과 호환됩니다. 자세한 내용은 IBM HPCC 설명서 를 참조하십시오.
클러스터 요구 사항
- Confidential Compute attestation Operator를 설치하는 클러스터에 Red Hat OpenShift Container Platform 4.15 이상을 설치했습니다.
LPAR 요구 사항
- LinuxONE Emperor 4가 있습니다.
- IBM Secure Execution에 필요한 논리 파티션(LPAR)에서 Secure Unpack Facility를 활성화했습니다. 자세한 내용은 IBM Secure Execution 용 KVM 호스트 활성화를 참조하십시오.
다음 단계를 수행하여 기밀 컨테이너를 배포합니다.
- Confidential Compute attestation Operator를 설치합니다.
- Trustee의 경로를 만듭니다.
- 기밀성 컨테이너 기능 게이트를 활성화합니다.
- initdata를 생성합니다.
- 피어 Pod 구성 맵을 업데이트합니다.
- 선택 사항: Kata 에이전트 정책을 사용자 지정합니다.
-
KataConfigCR(사용자 정의 리소스)을 삭제합니다. - 피어 Pod 시크릿을 업데이트합니다.
- 선택 사항: 사용자 정의 피어 Pod VM 이미지를 선택합니다.
-
KataConfigCR을 다시 만듭니다. - Trustee 인증 시크릿을 생성합니다.
- Trustee 구성 맵을 생성합니다.
- IBM Secure Execution (SE) 헤더를 가져옵니다.
- SE 인증서 및 키를 구성합니다.
- 영구 스토리지 구성 요소를 생성합니다.
- Trustee 값, 정책 및 시크릿을 구성합니다.
-
KbsConfigCR을 생성합니다. - Trustee 구성을 확인합니다.
- 인증 프로세스를 확인합니다.
8.1. 기밀 컴퓨팅 인증 Operator 설치 링크 복사링크가 클립보드에 복사되었습니다!
CLI를 사용하여 IBM Z® 및 IBM® LinuxONE에 Confidential Compute attestation Operator를 설치할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
trustee-namespace.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Namespace metadata: name: trustee-operator-system다음 명령을 실행하여
trustee-operator-system네임스페이스를 생성합니다.$ oc apply -f trustee-namespace.yamltrustee-operatorgroup.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: trustee-operator-group namespace: trustee-operator-system spec: targetNamespaces: - trustee-operator-system다음 명령을 실행하여 operator 그룹을 생성합니다.
$ oc apply -f trustee-operatorgroup.yamltrustee-subscription.yaml매니페스트 파일을 생성합니다.apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: trustee-operator-system namespace: trustee-operator-system spec: channel: stable installPlanApproval: Automatic name: trustee-operator source: trustee-operator-catalog sourceNamespace: openshift-marketplace다음 명령을 실행하여 서브스크립션을 생성합니다.
$ oc apply -f trustee-subscription.yaml다음 명령을 실행하여 Operator가 올바르게 설치되었는지 확인합니다.
$ oc get csv -n trustee-operator-system이 명령을 완료하는 데 몇 분이 걸릴 수 있습니다.
다음 명령을 실행하여 프로세스를 확인합니다.
$ watch oc get csv -n trustee-operator-system출력 예
NAME DISPLAY PHASE trustee-operator.v0.3.0 Trustee Operator 0.3.0 Succeeded
8.2. 기밀성 컨테이너 기능 게이트 활성화 링크 복사링크가 클립보드에 복사되었습니다!
기밀 컨테이너 기능 게이트를 활성화해야 합니다.
사전 요구 사항
- OpenShift 샌드박스 컨테이너 Operator에 가입했습니다.
프로세스
cc-feature-gate.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: osc-feature-gates namespace: openshift-sandboxed-containers-operator data: confidential: "true"다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f cc-feature-gate.yaml
8.3. Trustee를 위한 경로 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee의 엣지 TLS 종료를 사용하여 보안 경로를 생성할 수 있습니다. 외부 수신 트래픽은 라우터 Pod에 HTTPS로 도달하고 Trustee Pod에 HTTP로 전달합니다.
사전 요구 사항
- Confidential Compute attestation Operator를 설치했습니다.
프로세스
다음 명령을 실행하여 엣지 경로를 만듭니다.
$ oc create route edge --service=kbs-service --port kbs-port \ -n trustee-operator-system참고참고: 현재 유효한 CA 서명 인증서가 있는 경로만 지원됩니다. 자체 서명된 인증서가 있는 경로를 사용할 수 없습니다.
다음 명령을 실행하여
TRUSTEE_HOST변수를 설정합니다.$ TRUSTEE_HOST=$(oc get route -n trustee-operator-system kbs-service \ -o jsonpath={.spec.host})다음 명령을 실행하여 경로를 확인합니다.
$ echo $TRUSTEE_HOST출력 예
kbs-service-trustee-operator-system.apps.memvjias.eastus.aroapp.io
8.4. initdata 정보 링크 복사링크가 클립보드에 복사되었습니다!
initdata 사양을 사용하면 런타임 시 민감하거나 워크로드별 데이터로 피어 Pod를 유연하게 초기화할 수 있으므로 이러한 데이터를 VM(가상 머신) 이미지에 포함할 필요가 없습니다. 이를 통해 기밀 정보의 노출을 줄이고 사용자 정의 이미지 빌드를 제거하여 유연성을 개선합니다. 예를 들어 initdata에는 세 가지 구성 설정이 포함될 수 있습니다.
- 보안 통신을 위한 X.509 인증서입니다.
- 인증을 위한 암호화 키입니다.
-
기본 Kata Agent 정책을 덮어쓸 때 런타임 동작을 적용하는 선택적 Kata Agent
policy.rego파일입니다.
다음 방법 중 하나를 사용하여 initdata 구성을 적용할 수 있습니다.
- 피어 Pod 구성 맵에 전역적으로 포함하여 모든 Pod에 대해 클러스터 전체 기본값을 설정합니다.
Pod 워크로드 오브젝트를 구성할 때 특정 Pod의 경우 개별 워크로드에 맞게 사용자 지정할 수 있습니다.
Pod 워크로드 오브젝트를 구성할 때 지정하는
io.katacontainers.config.runtime.cc_init_data주석은 해당 특정 pod의 피어 Pod 구성 맵의 글로벌INITDATA설정을 재정의합니다. Kata 런타임은 Pod 생성 시 자동으로 이 우선 순위를 처리합니다.
initdata 콘텐츠는 다음 구성 요소를 구성합니다.
- 인증 에이전트(AA)는 인증을 위해 인증서를 전송하여 피어 Pod의 신뢰성을 확인합니다.
- 피어 Pod VM 내에서 시크릿 및 보안 데이터 액세스를 관리하는 CDH(비밀 데이터 허브)입니다.
- Kata 에이전트는 런타임 정책을 적용하고 Pod VM 내부의 컨테이너의 라이프사이클을 관리합니다.
8.5. initdata 생성 링크 복사링크가 클립보드에 복사되었습니다!
initdata를 사용하여 TOML 파일을 생성하고 Base64로 인코딩된 문자열로 변환합니다. 이 문자열을 사용하여 피어 Pod 구성 맵, 피어 Pod 매니페스트 또는 busybox.yaml 파일의 값을 지정합니다.
Trustee 구성 맵에서 insecure_http = true 를 구성하는 경우 kbs_cert 설정을 삭제해야 합니다.
프로세스
다음 명령을 실행하여 Trustee IP 주소를 확보합니다.
$ oc get node $(oc get pod -n trustee-operator-system -o jsonpath='{.items[0].spec.nodeName}') -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}'출력 예
192.168.122.22다음 명령을 실행하여 Trustee 포트를 확보합니다.
$ oc get svc kbs-service -n trustee-operator-system출력 예
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbs-service NodePort 172.30.116.11 <none> 8080:32178/TCP 12dinitdata.toml구성 파일을 생성합니다.```toml algorithm = "sha384" version = "0.1.0" [data] "aa.toml" = ''' [token_configs] [token_configs.coco_as] url = 'https://<worker_node_ip>:<node_port>'1 [token_configs.kbs] url = 'https://<worker_node_ip>:<node_port>' cert = """ -----BEGIN CERTIFICATE----- <kbs_certificate>2 -----END CERTIFICATE----- """ ''' "cdh.toml" = ''' socket = 'unix:///run/confidential-containers/cdh.sock' credentials = [] [kbc] name = 'cc_kbc' url = 'https://<worker_node_ip>:<node_port>' kbs_cert = """3 -----BEGIN CERTIFICATE----- <kbs_certificate>4 -----END CERTIFICATE----- """ ''' "policy.rego" = '''5 package agent_policy default AddARPNeighborsRequest := true default AddSwapRequest := true default CloseStdinRequest := true default CopyFileRequest := true default CreateContainerRequest := true default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true default GetMetricsRequest := true default GetOOMEventRequest := true default GuestDetailsRequest := true default ListInterfacesRequest := true default ListRoutesRequest := true default MemHotplugByProbeRequest := true default OnlineCPUMemRequest := true default PauseContainerRequest := true default PullImageRequest := true default ReadStreamRequest := true default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default ReseedRandomDevRequest := true default ResumeContainerRequest := true default SetGuestDateTimeRequest := true default SetPolicyRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StartTracingRequest := true default StatsContainerRequest := true default StopTracingRequest := true default TtyWinResizeRequest := true default UpdateContainerRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := true ''' ```다음 명령을 실행하여
initdata.toml파일을 텍스트 파일의 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 initdata.toml > initdata.txt
8.6. 피어 Pod 구성 맵 업데이트 링크 복사링크가 클립보드에 복사되었습니다!
기밀 컨테이너의 피어 Pod 구성 맵을 업데이트해야 합니다.
Secure Boot를 true 로 설정하여 기본적으로 활성화합니다. 기본값은 false 이며 보안 위험을 나타냅니다.
프로세스
다음 예에 따라
peer-pods-cm.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: peer-pods-cm namespace: openshift-sandboxed-containers-operator data: CLOUD_PROVIDER: "libvirt" PEERPODS_LIMIT_PER_NODE: "10"1 LIBVIRT_POOL: "<libvirt_pool>"2 LIBVIRT_VOL_NAME: "<libvirt_volume>"3 LIBVIRT_DIR_NAME: "/var/lib/libvirt/images/<directory_name>"4 LIBVIRT_NET: "default"5 INITDATA: "<base64_encoded_initdata>"6 DISABLECVM: "false"- 1
- 노드당 생성할 수 있는 최대 피어 Pod 수를 지정합니다. 기본값은
10입니다. - 2
- libvirt 풀을 지정합니다. libvirt 풀을 수동으로 구성한 경우 KVM 호스트 구성과 동일한 이름을 사용합니다.
- 3
- libvirt 볼륨 이름을 지정합니다. libvirt 볼륨을 수동으로 구성한 경우 KVM 호스트 구성과 동일한 이름을 사용합니다.
- 4
- 가상 머신 디스크 이미지(예:
.qcow2또는.raw파일)를 저장할 libvirt 디렉터리를 지정합니다. libvirt에 읽기 및 쓰기 액세스 권한이 있는지 확인하려면 libvirt 스토리지 디렉터리의 하위 디렉터리를 사용합니다. 기본값은/var/lib/libvirt/images/입니다. - 5
- 선택 사항: 기본 네트워크를 사용하지 않으려면 libvirt 네트워크를 지정합니다.
- 6
initdata.txt파일에서 생성한 Base64 인코딩 문자열을 지정합니다.
다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f peer-pods-cm.yaml다음 명령을 실행하여
ds/osc-caa-ds데몬 세트를 다시 시작합니다.$ oc set env ds/osc-caa-ds \ -n openshift-sandboxed-containers-operator REBOOT="$(date)"
8.7. Kata 에이전트 정책 사용자 정의 링크 복사링크가 클립보드에 복사되었습니다!
Kata 에이전트 정책은 Kata 런타임으로 실행되는 Pod에 대한 에이전트 API 요청을 제어하는 보안 메커니즘입니다. Pod VM(가상 시스템) 내에서 Kata 에이전트가 Rego로 작성하고 강제 적용하는 이 정책은 허용 또는 거부되는 작업을 결정합니다.
기본적으로 Kata 에이전트 정책은 컨트롤 플레인을 통해 암호화되지 않은 데이터를 전송하거나 수신할 수 있으므로 exec 및 로그 API를 비활성화합니다. 이는 안전하지 않습니다.
보안이 중요하지 않은 개발 및 테스트와 같은 특정 사용 사례에 대해 사용자 지정 정책을 사용하여 기본 정책을 덮어쓸 수 있습니다. 예를 들어 컨트롤 플레인을 신뢰할 수 있는 환경에서 실행할 수 있습니다. 다음과 같은 다양한 방법으로 사용자 지정 정책을 적용할 수 있습니다.
- Pod VM 이미지에 포함
- 피어 Pod 구성 맵의 패치 적용.
- 워크로드 Pod YAML에 주석을 추가합니다.
프로덕션 시스템의 경우 기본 방법은 initdata를 사용하여 Kata 에이전트 정책을 재정의하는 것입니다. 다음 절차에서는 io.katacontainers.config.agent.policy 주석을 사용하는 개별 Pod에 사용자 지정 정책을 적용합니다. 정책은 Base64로 인코딩된 Rego 형식으로 제공됩니다. 이 방법은 Pod VM 이미지를 수정하지 않고 Pod 생성 시 기본 정책을 재정의합니다.
기밀 컨테이너 워크로드에서 exec 또는 로그 API를 활성화하면 중요한 정보가 노출될 수 있습니다. 프로덕션 환경에서는 이러한 API를 활성화하지 마십시오.
사용자 지정 정책은 기본 정책을 완전히 대체합니다. 특정 API만 수정하려면 전체 정책을 포함하고 관련 규칙을 조정합니다.
프로세스
사용자 지정 정책으로
policy.rego파일을 생성합니다. 다음 예제는 데모에exec및log가 활성화된 모든 구성 가능한 API를 보여줍니다.package agent_policy import future.keywords.in import input default CopyFileRequest := false default CreateContainerRequest := false default CreateSandboxRequest := true default DestroySandboxRequest := true default ExecProcessRequest := true # Enabled to allow exec API default GetOOMEventRequest := true default GuestDetailsRequest := true default OnlineCPUMemRequest := true default PullImageRequest := true default ReadStreamRequest := true # Enabled to allow log API default RemoveContainerRequest := true default RemoveStaleVirtiofsShareMountsRequest := true default SignalProcessRequest := true default StartContainerRequest := true default StatsContainerRequest := true default TtyWinResizeRequest := true default UpdateEphemeralMountsRequest := true default UpdateInterfaceRequest := true default UpdateRoutesRequest := true default WaitProcessRequest := true default WriteStreamRequest := false이 정책은
exec(ExecProcessRequest) 및로그(ReadStreamRequest) API를 활성화합니다. 필요에 따라 정책을 추가로 사용자 지정하도록true또는false값을 조정합니다.다음 명령을 실행하여
policy.rego파일을 Base64 인코딩 문자열로 변환합니다.$ base64 -w0 policy.regoyaml 파일에 사용할 출력을 저장합니다.
my-pod.yamlPod 사양 파일에 Base64로 인코딩된 정책을 추가합니다.apiVersion: v1 kind: Pod metadata: name: <pod_name> annotations: io.katacontainers.config.agent.policy: <base64_encoded_policy> spec: runtimeClassName: kata-remote containers: - name: <container_name> image: registry.access.redhat.com/ubi9/ubi:latest command: - sleep - "36000" securityContext: privileged: false seccompProfile: type: RuntimeDefault다음 명령을 실행하여 Pod 매니페스트를 적용합니다.
$ oc apply -f my-pod.yaml
8.8. KataConfig 사용자 지정 리소스 삭제 링크 복사링크가 클립보드에 복사되었습니다!
명령줄을 사용하여 KataConfig CR(사용자 정의 리소스)을 삭제할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 명령을 실행하여
KataConfigCR을 삭제합니다.$ oc delete kataconfig example-kataconfig다음 명령을 실행하여 사용자 정의 리소스가 삭제되었는지 확인합니다.
$ oc get kataconfig example-kataconfig출력 예
No example-kataconfig instances exist
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
8.9. 피어 Pod 시크릿 업데이트 링크 복사링크가 클립보드에 복사되었습니다!
피어 Pod 시크릿을 업데이트해야 합니다.
시크릿은 Pod VM(가상 머신) 이미지 및 피어 Pod 인스턴스를 생성하기 위한 인증 정보를 저장합니다.
기본적으로 OpenShift 샌드박스 컨테이너 Operator는 클러스터를 생성하는 데 사용되는 인증 정보를 기반으로 보안을 생성합니다. 그러나 다른 인증 정보를 사용하는 보안을 수동으로 생성할 수 있습니다.
사전 요구 사항
-
REDHAT_OFFLINE_TOKEN. Red Hat API 토큰에서 RHEL 이미지를 다운로드하기 위해 이 토큰 을 생성했습니다. -
HOST_KEY_CERTS. HKD(Host Key Document) 인증서를 사용하면 IBM Z®에서 보안 실행을 수행할 수 있습니다. 자세한 내용은 IBM 문서의 리소스 링크에서 호스트 키 문서 가져오기 를 참조하십시오.
프로세스
다음 예에 따라
peer-pods-secret.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Secret metadata: name: peer-pods-secret namespace: openshift-sandboxed-containers-operator type: Opaque stringData: CLOUD_PROVIDER: "libvirt" LIBVIRT_URI: "<libvirt_gateway_uri>"1 REDHAT_OFFLINE_TOKEN: "<rh_offline_token>"2 HOST_KEY_CERTS: "<host_key_crt_value>"3 다음 명령을 실행하여 시크릿을 생성합니다.
$ oc apply -f peer-pods-secret.yaml
8.10. 사용자 정의 피어 Pod VM 이미지 선택 링크 복사링크가 클립보드에 복사되었습니다!
Pod 매니페스트에 주석을 추가하여 워크로드 요구 사항에 맞게 사용자 정의 피어 Pod 가상 머신(VM) 이미지를 선택할 수 있습니다. 사용자 정의 이미지는 피어 Pod 구성 맵에 지정된 기본 이미지를 덮어씁니다. libvirt 풀에 새 libvirt 볼륨을 생성하고 사용자 지정 피어 포드 VM 이미지를 새 볼륨에 업로드합니다. 그런 다음 사용자 정의 피어 Pod VM 이미지를 사용하도록 Pod 매니페스트를 업데이트합니다.
사전 요구 사항
- 클라우드 공급자 또는 하이퍼바이저와 호환되는 사용자 정의 Pod VM 이미지의 ID를 사용할 수 있습니다.
프로세스
다음 명령을 실행하여 libvirt 풀의 이름을 설정합니다.
$ export LIBVIRT_POOL=<libvirt_pool>1 - 1
- 기존 libvirt 풀 이름을 지정합니다.
다음 명령을 실행하여 새 libvirt 볼륨의 이름을 설정합니다.
$ export LIBVIRT_VOL_NAME=<new_libvirt_volume>다음 명령을 실행하여 풀에 대한 libvirt 볼륨을 만듭니다.
$ virsh -c qemu:///system \ vol-create-as --pool $LIBVIRT_POOL \ --name $LIBVIRT_VOL_NAME \ --capacity 20G \ --allocation 2G \ --prealloc-metadata \ --format qcow2사용자 정의 피어 Pod VM 이미지를 libvirt 볼륨에 업로드합니다.
$ virsh -c qemu:///system vol-upload \ --vol $LIBVIRT_VOL_NAME <custom_podvm_image.qcow2> \1 --pool $LIBVIRT_POOL --sparse- 1
- 사용자 정의 피어 Pod VM 이미지 이름을 지정합니다.
다음 예에 따라
pod-manifest.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: pod-manifest annotations: io.katacontainers.config.hypervisor.image: "<new_libvirt_volume>"1 spec: runtimeClassName: kata-remote2 containers: - name: <example_container>3 image: registry.access.redhat.com/ubi9/ubi:9.3 command: ["sleep", "36000"]다음 명령을 실행하여 Pod를 생성합니다.
$ oc apply -f pod-manifest.yaml
8.11. KataConfig 사용자 지정 리소스 다시 생성 링크 복사링크가 클립보드에 복사되었습니다!
기밀 컨테이너를 위해 KataConfig CR(사용자 정의 리소스)을 다시 생성해야 합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 예에 따라
example-kataconfig.yaml매니페스트 파일을 생성합니다.apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: enablePeerPods: true logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'1 - 1
- 선택 사항: 노드 레이블을 적용하여 특정 노드에
kata-remote를 설치한 경우 키와 값(예:cc: 'true')을 지정합니다.
다음 명령을 실행하여
KataConfigCR을 생성합니다.$ oc apply -f example-kataconfig.yaml새로운
KataConfigCR이 생성되고 작업자 노드에kata-remote가 런타임 클래스로 설치됩니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"kataNodes아래의 모든 작업자의 상태가설치되고이유를 지정하지 않고InProgress조건이False이면 클러스터에kata-remote가 설치됩니다.다음 명령을 실행하여 피어 Pod 이미지를 빌드하고 libvirt 볼륨에 업로드했는지 확인합니다.
$ oc describe configmap peer-pods-cm -n openshift-sandboxed-containers-operator출력 예
Name: peer-pods-cm Namespace: openshift-sandboxed-containers-operator Labels: <none> Annotations: <none> Data ==== CLOUD_PROVIDER: libvirt DISABLECVM: false1 LIBVIRT_IMAGE_ID: fa-pp-vol2 BinaryData ==== Events: <none>다음 명령을 실행하여
UPDATEDMACHINECOUNT가MACHINECOUNT와 같은 경우UPDATEDMACHINECOUNT가 UPDATED 상태에 있는지 확인하려면kata-oc머신 구성 풀 진행 상황을 모니터링합니다.$ watch oc get mcp/kata-oc다음 명령을 실행하여 데몬 세트를 확인합니다.
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds다음 명령을 실행하여 런타임 클래스를 확인합니다.
$ oc get runtimeclass출력 예
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
8.12. Trustee 인증 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee에 대한 인증 시크릿을 생성해야 합니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 명령을 실행하여 개인 키를 생성합니다.
$ openssl genpkey -algorithm ed25519 > privateKey다음 명령을 실행하여 공개 키를 생성합니다.
$ openssl pkey -in privateKey -pubout -out publicKey다음 명령을 실행하여 보안을 생성합니다.
$ oc create secret generic kbs-auth-public-key --from-file=publicKey -n trustee-operator-system다음 명령을 실행하여 시크릿을 확인합니다.
$ oc get secret -n trustee-operator-system
8.13. Trustee 구성 맵 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee 서버를 구성하려면 구성 맵을 생성해야 합니다.
다음 구성 예제에서는 보안 기능을 해제하여 기술 프리뷰 기능을 시연할 수 있습니다. 이는 프로덕션 환경을 위한 것이 아닙니다.
사전 요구 사항
- Trustee를 위한 경로를 생성했습니다.
프로세스
kbs-config-cm.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: kbs-config-cm namespace: trustee-operator-system data: kbs-config.toml: | [http_server] sockets = ["0.0.0.0:8080"] insecure_http = false private_key = "/etc/https-key/https.key" certificate = "/etc/https-cert/https.crt" [admin] insecure_api = false auth_public_key = "/etc/auth-secret/publicKey" [attestation_token] insecure_key = true attestation_token_type = "CoCo" [attestation_service] type = "coco_as_builtin" work_dir = "/opt/confidential-containers/attestation-service" policy_engine = "opa" [attestation_service.attestation_token_broker] type = "Simple" policy_dir = "/opt/confidential-containers/attestation-service/policies" [attestation_service.attestation_token_config] duration_min = 5 [attestation_service.rvps_config] type = "BuiltIn" [attestation_service.rvps_config.storage] type = "LocalJson" file_path = "/opt/confidential-containers/rvps/reference-values/reference-values.json" [[plugins]] name = "resource" type = "LocalFs" dir_path = "/opt/confidential-containers/kbs/repository" [policy_engine] policy_path = "/opt/confidential-containers/opa/policy.rego"다음 명령을 실행하여 구성 맵을 생성합니다.
$ oc apply -f kbs-config-cm.yaml
8.14. IBM Secure Execution 인증서 및 키 구성 링크 복사링크가 클립보드에 복사되었습니다!
작업자 노드에 대한 IBM Secure Execution (SE) 인증서 및 키를 구성해야 합니다.
사전 요구 사항
- bastion 노드의 IP 주소가 있습니다.
- 작업자 노드의 내부 IP 주소가 있습니다.
프로세스
다음 단계를 수행하여 KBS(Key Broker Service) 인증서 및 키를 생성합니다.
다음 예에 따라
kbs.conf구성 파일을 생성합니다.[req] default_bits = 2048 default_keyfile = localhost.key distinguished_name = req_distinguished_name req_extensions = req_ext x509_extensions = v3_ca [req_distinguished_name] countryName = Country Name (2-letter code) countryName_default = <country_name> stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = <state_name> localityName = Locality Name (eg, city) localityName_default = <locality_name> organizationName = Organization Name (eg, company) organizationName_default = Red Hat organizationalUnitName = organizationalunit organizationalUnitName_default = Development commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = kbs-service commonName_max = 64 [req_ext] subjectAltName = @alt_names [v3_ca] subjectAltName = @alt_names [alt_names] IP.1 = <trustee_ip> DNS.1 = localhost DNS.2 = 127.0.0.1다음 명령을 실행하여 KBS 키 및 자체 서명 인증서를 생성합니다.
openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 \ -keyout kbs.key \ -out kbs.crt \ -config kbs.conf \ -passin pass:다음 명령을 실행하여 KBS 키를
ibmse디렉터리에 복사합니다.$ cp kbs.key /tmp/ibmse/kbs.key다음 명령을 실행하여 KBS 인증서를
ibmse디렉터리에 복사합니다.$ cp kbs.crt /tmp/ibmse/kbs.crt
다음 단계를 수행하여 인증 정책 필드를 가져옵니다.
다음 명령을 실행하여
GetRvps.sh스크립트를 다운로드할 디렉터리를 만듭니다.$ mkdir -p Rvps-Extraction/다음 명령을 실행하여 스크립트를 다운로드합니다.
$ wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/GetRvps.sh -O $PWD/GetRvps.sh다음 명령을 실행하여 하위 디렉터리를 생성합니다.
$ mkdir -p Rvps-Extraction/static-files다음 명령을 실행하여
static-files디렉터리로 이동합니다.$ cd Rvps-Extraction/static-files다음 명령을 실행하여
pvextract-hdr툴을 다운로드합니다.$ wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/static-files/pvextract-hdr -O $PWD/pvextract-hdr다음 명령을 실행하여 툴을 실행 가능하게 만듭니다.
$ chmod +x pvextract-hdr다음 명령을 실행하여
se_parse_hdr.py스크립트를 다운로드합니다.$ wget https://github.com/openshift/sandboxed-containers-operator/raw/devel/scripts/rvps-extraction/static-files/se_parse_hdr.py -O $PWD/se_parse_hdr.py다음 명령을 실행하여 HKD(Host Key Document) 인증서를
static-files디렉터리에 복사합니다.$ cp ~/path/to/<hkd_cert.crt> .static-files디렉터리에는 다음 파일이 포함되어 있습니다.-
HKD.crt -
pvextract-hdr -
se_parse_hdr.py
-
다음 명령을 실행하여
Rvps-Extraction디렉터리로 이동합니다.$ cd ..다음 명령을 실행하여
GetRvps.sh스크립트를 실행 가능하게 만듭니다.$ chmod +x GetRvps.sh스크립트를 실행합니다.
$ ./GetRvps.sh출력 예
***Installing necessary packages for RVPS values extraction *** Updating Subscription Management repositories. Last metadata expiration check: 0:37:12 ago on Mon Nov 18 09:20:29 2024. Package python3-3.9.19-8.el9_5.1.s390x is already installed. Package python3-cryptography-36.0.1-4.el9.s390x is already installed. Package kmod-28-10.el9.s390x is already installed. Dependencies resolved. Nothing to do. Complete! ***Installation Finished *** 1) Generate the RVPS From Local Image from User pc 2) Generate RVPS from Volume 3) Quit Please enter your choice:2를 입력하여 볼륨에서 참조 값 공급자 서비스를 생성합니다.Please enter your choice: 2libvirt 풀 이름에
fa-pp를 입력합니다.Enter the Libvirt Pool Name: fa-pplibvirt 게이트웨이 URI를 입력합니다.
Enter the Libvirt URI Name: <libvirt-uri>1 - 1
- 피어 Pod 시크릿 을 생성하는 데 사용한
LIBVIRT_URI값을 지정합니다.
libvirt 볼륨 이름에
fa-pp-vol을 입력합니다.Enter the Libvirt Volume Name: fa-pp-vol출력 예
Downloading from PODVM Volume... mount: /mnt/myvm: special device /dev/nbd3p1 does not exist. Error: Failed to mount the image. Retrying... Mounting on second attempt passed /dev/nbd3 disconnected SE header found at offset 0x014000 SE header written to '/root/Rvps-Extraction/output-files/hdr.bin' (640 bytes) se.tag: 42f3fe61e8a7e859cab3bb033fd11c61 se.image_phkh: 92d0aff6eb86719b6b1ea0cb98d2c99ff2ec693df3efff2158f54112f6961508 provenance = ewogICAgInNlLmF0dGVzdGF0aW9uX3Boa2giOiBbCiAgICAgICAgIjkyZDBhZmY2ZWI4NjcxOWI2YjFlYTBjYjk4ZDJjOTlmZjJlYzY5M2RmM2VmZmYyMTU4ZjU0MTEyZjY5NjE1MDgiCiAgICBdLAogICAgInNlLnRhZyI6IFsKICAgICAgICAiNDJmM2ZlNjFlOGE3ZTg1OWNhYjNiYjAzM2ZkMTFjNjEiCiAgICBdLAogICAgInNlLmltYWdlX3Boa2giOiBbCiAgICAgICAgIjkyZDBhZmY2ZWI4NjcxOWI2YjFlYTBjYjk4ZDJjOTlmZjJlYzY5M2RmM2VmZmYyMTU4ZjU0MTEyZjY5NjE1MDgiCiAgICBdLAogICAgInNlLnVzZXJfZGF0YSI6IFsKICAgICAgICAiMDAiCiAgICBdLAogICAgInNlLnZlcnNpb24iOiBbCiAgICAgICAgIjI1NiIKICAgIF0KfQo= -rw-r--r--. 1 root root 640 Dec 16 10:57 /root/Rvps-Extraction/output-files/hdr.bin -rw-r--r--. 1 root root 446 Dec 16 10:57 /root/Rvps-Extraction/output-files/ibmse-policy.rego -rw-r--r--. 1 root root 561 Dec 16 10:57 /root/Rvps-Extraction/output-files/se-message
다음 단계를 수행하여 인증서 및 CRL(인증서 취소 목록)을 가져옵니다.
다음 명령을 실행하여 인증서에 대한 임시 디렉터리를 생성합니다.
$ mkdir /tmp/ibmse/certs다음 명령을 실행하여
ibm-z-host-key-signing-gen2.crt인증서를 다운로드합니다.$ wget https://www.ibm.com/support/resourcelink/api/content/public/ibm-z-host-key-signing-gen2.crt -O /tmp/ibmse/certs/ibm-z-host-key-signing-gen2.crt다음 명령을 실행하여 CryostatCert
CA.crt인증서를 다운로드합니다.$ wget https://www.ibm.com/support/resourcelink/api/content/public/DigiCertCA.crt -O /tmp/ibmse/certs/DigiCertCA.crt다음 명령을 실행하여 CRL의 임시 디렉터리를 생성합니다.
$ mkdir /tmp/ibmse/crls다음 명령을 실행하여
ibm-z-host-key-gen2.crl파일을 다운로드합니다.$ wget https://www.ibm.com/support/resourcelink/api/content/public/ibm-z-host-key-gen2.crl -O /tmp/ibmse/crls/ibm-z-host-key-gen2.crl다음 명령을 실행하여 MellanoxCert
TrustedRootG4.crl파일을 다운로드합니다.$ wget http://crl3.digicert.com/DigiCertTrustedRootG4.crl -O /tmp/ibmse/crls/DigiCertTrustedRootG4.crl다음 명령을 실행하여 clevisCert
TrustedG4CodeSigningRSA4096SHA3842021CA1.crl파일을 다운로드합니다.$ wget http://crl3.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl -O /tmp/ibmse/crls/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl다음 명령을 실행하여
hdr.bin파일의 임시 디렉토리를 만듭니다.$ mkdir -p /tmp/ibmse/hdr/다음 명령을 실행하여
hdr.bin파일을hdr디렉토리에 복사합니다.$ cp /root/Rvps-Extraction/output-files/hdr.bin /tmp/ibmse/hdr/다음 명령을 실행하여 HKD(Host Key Document) 인증서에 대한 임시 디렉토리를 만듭니다.
$ mkdir -p /tmp/ibmse/hkds다음 명령을 실행하여 HKD 인증서를
hkds디렉토리에 복사합니다.$ cp ~/path/to/<hkd_cert.crt> /tmp/ibmse/hkds/
RSA 키를 생성합니다.
다음 명령을 실행하여 RSA 키 쌍을 생성합니다.
$ openssl genrsa -aes256 -passout pass:<password> -out /tmp/encrypt_key-psw.pem 40961 - 1
- RSA 키 암호를 지정합니다.
다음 명령을 실행하여 RSA 키에 대한 임시 디렉터리를 생성합니다.
$ mkdir -p /tmp/ibmse/rsa다음 명령을 실행하여
encrypt_key.pub키를 만듭니다.$ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -pubout -out /tmp/ibmse/rsa/encrypt_key.pub다음 명령을 실행하여
encrypt_key.pem키를 생성합니다.$ openssl rsa -in /tmp/encrypt_key-psw.pem -passin pass:<password> -out /tmp/ibmse/rsa/encrypt_key.pem
다음 명령을 실행하여
/tmp/ibmse디렉터리의 구조를 확인합니다.$ tree /tmp/ibmse출력 예
/tmp/ibmse ├──kbs.key ├──kbs.crt | ├── certs │ ├── ibm-z-host-key-signing-gen2.crt | └── DigiCertCA.crt ├── crls │ └── ibm-z-host-key-gen2.crl │ └── DigiCertTrustedRootG4.crl │ └── DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl ├── hdr │ └── hdr.bin ├── hkds │ └── <hkd_cert.crt> └── rsa ├── encrypt_key.pem └── encrypt_key.pub다음 단계를 수행하여 이러한 파일을 OpenShift Container Platform 작업자 노드에 복사합니다.
다음 명령을 실행하여
/tmp/ibmse디렉토리에서 압축 파일을 생성합니다.$ tar -czf ibmse.tar.gz -C /tmp/ ibmse다음 명령을 실행하여
.tar.gz파일을 클러스터의 bastion 노드에 복사합니다.$ scp /tmp/ibmse.tar.gz root@<ocp_bastion_ip>:/tmp1 - 1
- bastion 노드의 IP 주소를 지정합니다.
다음 명령을 실행하여 SSH를 통해 bastion 노드에 연결합니다.
$ ssh root@<ocp_bastion_ip>다음 명령을 실행하여
.tar.gz파일을 각 작업자 노드에 복사합니다.$ scp /tmp/ibmse.tar.gz core@<worker_node_ip>:/tmp1 - 1
- 작업자 노드의 IP 주소를 지정합니다.
다음 명령을 실행하여 각 작업자 노드에서
.tar.gz를 추출합니다.$ ssh core@<worker_node_ip> 'sudo mkdir -p /opt/confidential-containers/ && sudo tar -xzf /tmp/ibmse.tar.gz -C /opt/confidential-containers/'다음 명령을 실행하여
ibmse폴더 권한을 업데이트합니다.$ ssh core@<worker_node_ip> 'sudo chmod -R 755 /opt/confidential-containers/ibmse/'
다음 단계를 수행하여 KBS 키 및 인증서를 사용하여 클러스터에 보안을 생성합니다.
다음 예에 따라
kbs-https-certificate.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Secret metadata: name: kbs-https-certificate namespace: trustee-operator-system data: https.crt: $(cat /tmp/ibmse/kbs.crt | base64 -w 0)다음 명령을 실행하여 KBS 인증서로 보안을 생성합니다.
$ oc apply -f kbs-https-certificate.yaml다음 예에 따라
kbs-https-key.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Secret metadata: name: kbs-https-key namespace: trustee-operator-system data: https.key: $(cat /tmp/ibmse/kbs.key | base64 -w 0)다음 명령을 실행하여 KBS 키로 보안을 생성합니다.
$ oc apply -f kbs-https-key.yaml
8.15. 영구 스토리지 구성 요소 생성 링크 복사링크가 클립보드에 복사되었습니다!
ibmse 폴더를 Trustee Pod에 마운트하려면 영구 스토리지 구성 요소, PV(영구 볼륨) 및 PVC(영구 볼륨 클레임)를 생성해야 합니다.
프로세스
persistent-volume.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: PersistentVolume metadata: name: ibmse-pv namespace: trustee-operator-system spec: capacity: storage: 100Mi accessModes: - ReadOnlyMany storageClassName: "" local: path: /opt/confidential-containers/ibmse nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/worker operator: Exists다음 명령을 실행하여 영구 볼륨을 생성합니다.
$ oc apply -f persistent-volume.yamlpersistent-volume-claim.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: PersistentVolumeClaim metadata: name: ibmse-pvc namespace: trustee-operator-system spec: accessModes: - ReadOnlyMany storageClassName: "" resources: requests: storage: 100Mi다음 명령을 실행하여 영구 볼륨 클레임을 생성합니다.
$ oc apply -f persistent-volume-claim.yaml
8.16. Trustee 값, 정책 및 시크릿 구성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee에 대해 다음 값, 정책 및 시크릿을 구성할 수 있습니다.
- 참조 값 공급자 서비스에 대한 참조 값입니다.
- IBM Secure Execution에 대한 인증 정책입니다.
- Trustee 클라이언트의 사용자 정의 키의 시크릿입니다.
- 컨테이너 이미지 서명 확인을 위한 시크릿입니다.
- 컨테이너 이미지 서명 확인 정책. 이 정책은 필수입니다. 컨테이너 이미지 서명 확인을 사용하지 않는 경우 서명을 확인하지 않는 정책을 생성해야 합니다.
- 리소스 액세스 정책.
8.16.1. 참조 값 구성 링크 복사링크가 클립보드에 복사되었습니다!
하드웨어 플랫폼의 신뢰할 수 있는 다이제스트를 지정하여 RVPS(Reference Value Provider Service)에 대한 참조 값을 구성할 수 있습니다.
클라이언트는 실행 중인 소프트웨어, TEE(신뢰할 수 있는 실행 환경) 하드웨어 및 펌웨어에서 측정을 수집하고 클레임과 함께 Attestation Server에 견적을 제출합니다. 이러한 측정은 Trustee에 등록된 신뢰할 수 있는 다이제스트와 일치해야 합니다. 이 프로세스에서는 기밀 VM(CVM)이 예상 소프트웨어 스택을 실행 중이고 변조되지 않도록 합니다.
프로세스
rvps-configmap.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: rvps-reference-values namespace: trustee-operator-system data: reference-values.json: | [1 ]- 1
- 이 값을 비워 둡니다.
다음 명령을 실행하여 RVPS 구성 맵을 생성합니다.
$ oc apply -f rvps-configmap.yaml
8.16.2. IBM Secure Execution에 대한 인증 정책 생성 링크 복사링크가 클립보드에 복사되었습니다!
IBM Secure Execution에 대한 인증 정책을 생성해야 합니다.
프로세스
attestation-policy.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: attestation-policy namespace: trustee-operator-system data: default.rego: | package policy import rego.v1 default allow = false converted_version := sprintf("%v", [input["se.version"]]) allow if { input["se.attestation_phkh"] == "<se.attestation_phkh>" input["se.image_phkh"] == "<se.image_phkh>" input["se.tag"] == "<se.tag>" converted_version == "256" }- default.rego
- 정책 이름을 수정하지 마십시오.
- <se.attestation_phkh>
-
이를
se_parse_hdr.py스크립트를 실행하여 얻은 attestation 정책 필드로 바꿉니다.
다음 명령을 실행하여 인증 정책 구성 맵을 생성합니다.
$ oc apply -f attestation-policy.yaml
8.16.3. 클라이언트의 사용자 지정 키를 사용하여 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee 클라이언트에 대한 사용자 지정 키가 하나 이상 포함된 보안을 생성할 수 있습니다.
이 예에서 kbsres1 시크릿에는 클라이언트가 검색하는 두 개의 항목(key1,key2)이 있습니다. 동일한 형식을 사용하여 요구 사항에 따라 보안을 추가할 수 있습니다.
사전 요구 사항
- 하나 이상의 사용자 지정 키를 생성했습니다.
프로세스
다음 예에 따라 사용자 정의 키에 대한 보안을 생성합니다.
$ oc apply secret generic kbsres1 \ --from-literal key1=<custom_key1> \1 --from-literal key2=<custom_key2> \ -n trustee-operator-system- 1
- 사용자 정의 키를 지정합니다.
kbsres1시크릿은KbsConfig사용자 지정 리소스의spec.kbsSecretResources키에 지정됩니다.
8.16.4. 컨테이너 이미지 서명 확인을 위한 보안 생성 링크 복사링크가 클립보드에 복사되었습니다!
컨테이너 이미지 서명 확인을 사용하는 경우 공개 컨테이너 이미지 서명 키가 포함된 보안을 생성해야 합니다.
Confidential compute attestation Operator는 시크릿을 사용하여 서명을 확인하여 인증된 컨테이너 이미지만 해당 환경에 배포되도록 합니다.
Red Hat Trusted Artifact Signer 또는 기타 툴을 사용하여 컨테이너 이미지에 서명할 수 있습니다.
프로세스
다음 명령을 실행하여 컨테이너 이미지 서명 확인에 대한 보안을 생성합니다.
$ oc apply secret generic <type> \1 --from-file=<tag>=./<public_key_file> \2 -n trustee-operator-system-
<
type>값을 기록합니다.KbsConfig사용자 지정 리소스를 생성할 때spec.kbsSecretResources키에 이 값을 추가해야 합니다.
8.16.5. 컨테이너 이미지 서명 확인 정책 생성 링크 복사링크가 클립보드에 복사되었습니다!
서명 확인이 항상 활성화되므로 컨테이너 이미지 서명 확인 정책을 생성합니다. 이 정책이 없으면 Pod가 시작되지 않습니다.
컨테이너 이미지 서명 확인을 사용하지 않는 경우 서명 확인 없이 정책을 생성합니다.
자세한 내용은 containers-policy.json 5 를 참조하십시오.
프로세스
다음 예에 따라
security-policy-config.json파일을 생성합니다.서명 확인 없이:
{ "default": [ { "type": "insecureAcceptAnything" }], "transports": {} }서명 확인으로 다음을 수행합니다.
{ "default": [ ], "transports": { "docker": { "<container_registry_url>/<username>/busybox:latest":1 [ { "type": "sigstoreSigned", "keyPath": "kbs:///default/img-sig/pub-key"2 } ] } } }
다음 명령을 실행하여 보안 정책을 생성합니다.
$ oc apply secret generic security-policy \ --from-file=osc=./<security-policy-config.json> \ -n trustee-operator-system보안 유형,
security-policy또는 키osc를 변경하지 마십시오.security-policy시크릿은KbsConfig사용자 지정 리소스의spec.kbsSecretResources키에 지정됩니다.
8.16.6. 리소스 액세스 정책 생성 링크 복사링크가 클립보드에 복사되었습니다!
Trustee 정책 엔진에 대한 리소스 액세스 정책을 구성합니다. 이 정책은 Trustee가 액세스할 수 있는 리소스를 결정합니다.
Trustee 정책 엔진은 TEE 증명의 유효성을 결정하는 Attestation Service 정책 엔진과 다릅니다.
프로세스
resourcepolicy-configmap.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: ConfigMap metadata: name: resource-policy namespace: trustee-operator-system data: policy.rego: package policy default allow = true allow { input["tee"] == "se" }- policy.rego
-
리소스 정책의 이름
policy.rego는 Trustee 구성 맵에 정의된 리소스 정책과 일치해야 합니다. - 패키지 정책
- 리소스 정책은 Open Policy Agent 사양을 따릅니다.
다음 명령을 실행하여 리소스 정책 구성 맵을 생성합니다.
$ oc apply -f resourcepolicy-configmap.yaml
8.17. KbsConfig 사용자 정의 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KbsConfig CR(사용자 정의 리소스)을 생성하여 Trustee를 시작합니다.
그런 다음 Trustee pod 및 pod 로그를 확인하여 구성을 확인합니다.
프로세스
kbsconfig-cr.yaml매니페스트 파일을 생성합니다.apiVersion: confidentialcontainers.org/v1alpha1 kind: KbsConfig metadata: labels: app.kubernetes.io/name: kbsconfig app.kubernetes.io/instance: kbsconfig app.kubernetes.io/part-of: trustee-operator app.kubernetes.io/managed-by: kustomize app.kubernetes.io/created-by: trustee-operator name: kbsconfig namespace: trustee-operator-system spec: kbsConfigMapName: kbs-config-cm kbsAuthSecretName: kbs-auth-public-key kbsDeploymentType: AllInOneDeployment kbsRvpsRefValuesConfigMapName: rvps-reference-values kbsSecretResources: ["kbsres1", "security-policy", "<type>"]1 kbsResourcePolicyConfigMapName: resource-policy kbsAttestationPolicyConfigMapName: attestation-policy kbsHttpsKeySecretName: kbs-https-key kbsHttpsCertSecretName: kbs-https-certificate kbsServiceType: NodePort ibmSEConfigSpec: certStorePvc: ibmse-pvc KbsEnvVars: SE_SKIP_CERTS_VERIFICATION: "false"2 다음 명령을 실행하여
KbsConfigCR을 생성합니다.$ oc apply -f kbsconfig-cr.yaml
8.18. Trustee 구성 확인 링크 복사링크가 클립보드에 복사되었습니다!
Trustee Pod 및 로그를 확인하여 Trustee 구성을 확인합니다.
프로세스
다음 명령을 실행하여 기본 프로젝트를 설정합니다.
$ oc project trustee-operator-system다음 명령을 실행하여 Trustee Pod를 확인합니다.
$ oc get pods -n trustee-operator-system출력 예
NAME READY STATUS RESTARTS AGE trustee-deployment-8585f98449-9bbgl 1/1 Running 0 22m trustee-operator-controller-manager-5fbd44cd97-55dlh 2/2 Running 0 59m다음 명령을 실행하여
POD_NAME환경 변수를 설정합니다.$ POD_NAME=$(oc get pods -l app=kbs -o jsonpath='{.items[0].metadata.name}' -n trustee-operator-system)다음 명령을 실행하여 Pod 로그를 확인합니다.
$ oc logs -n trustee-operator-system $POD_NAME출력 예
[2024-05-30T13:44:24Z INFO kbs] Using config file /etc/kbs-config/kbs-config.json [2024-05-30T13:44:24Z WARN attestation_service::rvps] No RVPS address provided and will launch a built-in rvps [2024-05-30T13:44:24Z INFO attestation_service::token::simple] No Token Signer key in config file, create an ephemeral key and without CA pubkey cert [2024-05-30T13:44:24Z INFO api_server] Starting HTTPS server at [0.0.0.0:8080] [2024-05-30T13:44:24Z INFO actix_server::builder] starting 12 workers [2024-05-30T13:44:24Z INFO actix_server::server] Tokio runtime found; starting in existing Tokio runtime다음 명령을 실행하여
kbs-service가 노드 포트에 노출되었는지 확인합니다.$ oc get svc kbs-service -n trustee-operator-system출력 예
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kbs-service NodePort 198.51.100.54 <none> 8080:31862/TCP 23h다음 명령을 실행하여 Trustee 배포 Pod 이름을 가져옵니다.
$ oc get pods -n trustee-operator-system | grep -i trustee-deployment출력 예
NAME READY STATUS RESTARTS AGE trustee-deployment-d746679cd-plq82 1/1 Running 0 2m32s
8.19. 인증 프로세스 확인 링크 복사링크가 클립보드에 복사되었습니다!
BusyBox Pod를 생성하여 인증 프로세스를 확인할 수 있습니다. Pod 이미지는 키를 검색할 수 있는 기밀 워크로드를 배포합니다.
이 절차는 인증이 작동하는지 확인하는 예입니다. 메모리 덤프를 사용하여 데이터를 캡처할 수 있으므로 표준 I/O에 민감한 데이터를 작성하지 마십시오. 메모리에 기록된 데이터만 암호화됩니다.
프로세스
busybox.yaml매니페스트 파일을 생성합니다.apiVersion: v1 kind: Pod metadata: name: busybox namespace: default labels: run: busybox spec: runtimeClassName: kata-remote restartPolicy: Never containers: - name: busybox image: quay.io/prometheus/busybox:latest imagePullPolicy: Always command: - "sleep" - "3600"다음 명령을 실행하여 Pod를 생성합니다.
$ oc create -f busybox.yaml다음 명령을 실행하여 Pod에 로그인합니다.
$ oc exec -it busybox -n default -- /bin/sh다음 명령을 실행하여 시크릿 키를 가져옵니다.
$ wget http://127.0.0.1:8006/cdh/resource/default/kbsres1/key1출력 예
Connecting to 127.0.0.1:8006 (127.0.0.1:8006) saving to 'key1' key1 100% |*******************************************| 8 0:00:00 ETA 'key1' saved다음 명령을 실행하여
key1값을 표시합니다.$ cat key1출력 예
res1val1/ #
9장. 모니터링 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 샌드박스된 워크로드 및 노드의 상태와 관련된 메트릭을 모니터링할 수 있습니다.
OpenShift 샌드박스 컨테이너에는 OpenShift Container Platform 웹 콘솔에서 사전 구성된 대시보드가 있습니다. 관리자는 Prometheus를 통해 원시 지표에 액세스하고 쿼리할 수도 있습니다.
9.1. 메트릭 정보 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너 메트릭을 사용하면 관리자가 샌드박스 컨테이너를 실행하는 방법을 모니터링할 수 있습니다. OpenShift Container Platform 웹 콘솔에서 Metrics UI에서 이러한 메트릭을 쿼리할 수 있습니다.
OpenShift 샌드박스 컨테이너 지표는 다음 카테고리에 대해 수집됩니다.
- Kata 에이전트 메트릭
-
Kata 에이전트 메트릭은 샌드박스 컨테이너에 포함된 VM에서 실행되는 kata 에이전트 프로세스에 대한 정보를 표시합니다. 이러한 메트릭에는
/proc/<pid>/[io, stat, status]의 데이터가 포함됩니다. - Kata 게스트 운영 체제 메트릭
-
Kata 게스트 운영 체제 메트릭은 샌드박스 컨테이너에서 실행되는 게스트 운영 체제의 데이터를 표시합니다. 이러한 메트릭에는
/proc/[stats, diskstats, meminfo, vmstats]및/proc/net/dev의 데이터가 포함됩니다. - 하이퍼바이저 지표
-
하이퍼바이저 지표는 샌드박스 컨테이너에 포함된 VM을 실행하는 하이퍼바이저와 관련된 데이터를 표시합니다. 이러한 메트릭에는 주로
/proc/<pid>/[io, stat, status]의 데이터가 포함됩니다. - Kata 모니터 메트릭
- Kata 모니터는 지표 데이터를 수집하여 Prometheus에서 사용할 수 있도록 하는 프로세스입니다. kata 모니터 메트릭에는 kata-monitor 프로세스 자체의 리소스 사용량에 대한 자세한 정보가 표시됩니다. 이러한 메트릭에는 Prometheus 데이터 수집의 카운터도 포함됩니다.
- Kata containerd shim v2 메트릭
-
Kata containerd shim v2 메트릭에는 kata shim 프로세스에 대한 자세한 정보가 표시됩니다. 이러한 메트릭에는
/proc/<pid>/[io, stat, status]및 세부 리소스 사용량 메트릭의 데이터가 포함됩니다.
9.2. 메트릭 보기 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔의 Metrics 페이지에서 OpenShift 샌드박스 컨테이너의 메트릭에 액세스할 수 있습니다.
사전 요구 사항
-
cluster-admin역할 또는 모든 프로젝트에 대한 보기 권한이 있는 사용자로 클러스터에 액세스할 수 있습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 모니터링 → 메트릭 으로 이동합니다.
입력 필드에 모니터링할 지표 쿼리를 입력합니다.
모든 카타 관련 메트릭은 카타 로 시작합니다. kata 를 입력하면 사용 가능한 모든 카타 메트릭 목록이 표시됩니다.
쿼리의 메트릭은 페이지에 시각화됩니다.
10장. 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너를 설치 제거하고 기밀 컨테이너 환경을 제거할 수 있습니다.
10.1. OpenShift 샌드박스 컨테이너 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔 또는 명령줄을 사용하여 OpenShift 샌드박스 컨테이너를 설치 제거할 수 있습니다.
다음 작업을 수행하여 OpenShift 샌드박스 컨테이너를 설치 제거합니다.
- 워크로드 Pod를 삭제합니다.
-
KataConfigCR(사용자 정의 리소스)을 삭제합니다. - OpenShift 샌드박스 컨테이너 Operator를 설치 제거합니다.
-
KataConfigCRD(사용자 정의 리소스 정의)를 삭제합니다.
KataConfig CR을 삭제하기 전에 워크로드 Pod를 삭제해야 합니다. 제공된 경우 포드 이름에 일반적으로 접두사 podvm 및 사용자 지정 태그가 있습니다. 클라우드 공급자에 OpenShift 샌드박스 컨테이너 또는 기밀 컨테이너를 배포하고 다음 절차를 수행한 후에도 리소스가 남아 있으면 클라우드 공급자의 해당 리소스에 대한 예기치 않은 요금이 발생할 수 있습니다. 클라우드 공급자의 OpenShift 샌드박스 컨테이너 제거를 완료한 후 클라우드 공급자 콘솔을 확인하여 프로시저가 모든 리소스가 삭제되었는지 확인합니다.
10.1.1. 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너를 설치 제거할 수 있습니다.
10.1.1.1. 워크로드 Pod 삭제 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 워크로드 Pod를 삭제할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - OpenShift 샌드박스 컨테이너 런타임 클래스를 사용하는 Pod 목록이 있습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 워크로드 → Pod 로 이동합니다.
- 이름으로 검색 필드에 삭제할 Pod의 이름을 입력합니다.
- 포드 이름을 클릭하여 엽니다.
-
세부 정보 페이지에서 런타임 클래스에 대해
kata또는kata-remote가 표시되는지 확인합니다. -
옵션 메뉴
를 클릭하고 Pod 삭제 를 선택합니다.
- 삭제를 클릭합니다.
각 pod에 대해 이 절차를 반복합니다.
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
10.1.1.2. KataConfig 사용자 지정 리소스 삭제 링크 복사링크가 클립보드에 복사되었습니다!
웹 콘솔을 사용하여 KataConfig CR(사용자 정의 리소스)을 삭제할 수 있습니다.
KataConfig CR을 삭제하면 클러스터에서 kata 또는 kata-remote 런타임 및 관련 리소스가 제거되고 제거됩니다.
KataConfig CR을 삭제하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
kata또는kata-remote를runtimeClass로 사용하는 모든 Pod를 삭제했습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
-
이름으로 검색 필드에
OpenShift 샌드박스 컨테이너 Operator를입력합니다. - Operator를 클릭하여 엽니다. 그런 다음 KataConfig 탭을 클릭합니다.
-
옵션 메뉴
를 클릭하고 KataConfig삭제 를 선택합니다. - 확인 창에서 삭제를 클릭합니다.
kata 또는 kata-remote 런타임과 리소스가 제거될 때까지 기다린 후 작업자 노드가 재부팅될 때까지 기다린 후 다음 단계를 진행합니다.
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
10.1.1.3. OpenShift 샌드박스 컨테이너 Operator 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치 제거할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
kata또는kata-remote를runtimeClass로 사용하는 모든 Pod를 삭제했습니다. -
KataConfig사용자 지정 리소스를 삭제했습니다.
프로세스
- Operators → 설치된 Operator로 이동합니다.
-
이름으로 검색 필드에
OpenShift 샌드박스 컨테이너 Operator를입력합니다. Operator 세부 정보 페이지 오른쪽에 있는 작업 목록에서 Operator 제거를 선택합니다.
Operator를 설치 제거하시겠습니까? 대화 상자가 표시됩니다.
- 설치 제거를 클릭하여 Operator, Operator 배포 및 Pod를 제거합니다.
- 관리 → 네임스페이스로 이동합니다.
-
이름으로 검색 필드에
openshift-sandboxed-containers-operator를 입력합니다. -
옵션 메뉴
를 클릭하고 네임스페이스 삭제 를 선택합니다.
-
확인 대화 상자에서
openshift-sandboxed-containers-operator를 입력하고 삭제 를 클릭합니다.
10.1.1.4. KataConfig CRD 삭제 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 KataConfig CRD(사용자 정의 리소스 정의)를 삭제할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
kata또는kata-remote를runtimeClass로 사용하는 모든 Pod를 삭제했습니다. -
KataConfig사용자 지정 리소스를 삭제했습니다. - OpenShift 샌드박스 컨테이너 Operator를 설치 제거했습니다.
프로세스
- 웹 콘솔에서 Administration → CustomResourceDefinitions 로 이동합니다.
-
이름으로 검색 필드에
KataConfig이름을 입력합니다. - 옵션 메뉴를 클릭하고 Delete CustomResourceDefinition 을 선택합니다.
- 확인 창에서 삭제를 클릭합니다.
10.1.2. CLI를 사용하여 OpenShift 샌드박스 컨테이너 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
CLI(명령줄 인터페이스)를 사용하여 OpenShift 샌드박스 컨테이너를 설치 제거할 수 있습니다.
10.1.2.1. 워크로드 Pod 삭제 링크 복사링크가 클립보드에 복사되었습니다!
CLI를 사용하여 OpenShift 샌드박스 컨테이너 워크로드 Pod를 삭제할 수 있습니다.
사전 요구 사항
-
JSON 프로세서(
jq) 유틸리티가 설치되어 있습니다.
프로세스
다음 명령을 실행하여 Pod를 검색합니다.
$ oc get pods -A -o json | jq -r '.items[] | \ select(.spec.runtimeClassName == "<runtime>").metadata.name'1 - 1
- 베어 메탈 배포의 경우 <
runtime>을kata로 또는 AWS, Azure, IBM Z® 및 IBM® LinuxONE 배포의 경우kata-remote로 바꿉니다.
다음 명령을 실행하여 각 Pod를 삭제합니다.
$ oc delete pod <pod>
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
10.1.2.2. KataConfig 사용자 지정 리소스 삭제 링크 복사링크가 클립보드에 복사되었습니다!
명령줄을 사용하여 KataConfig CR(사용자 정의 리소스)을 삭제할 수 있습니다.
KataConfig CR을 삭제하면 클러스터에서 런타임 및 관련 리소스가 제거됩니다.
KataConfig CR을 삭제하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
kata또는kata-remote를runtimeClass로 사용하는 모든 Pod를 삭제했습니다.
프로세스
다음 명령을 실행하여
KataConfigCR을 삭제합니다.$ oc delete kataconfig example-kataconfigOpenShift 샌드박스된 컨테이너 Operator는 클러스터에서 런타임을 활성화하기 위해 처음 생성된 모든 리소스를 제거합니다.
중요KataConfigCR을 삭제하면 모든 작업자 노드가 재부팅될 때까지 CLI가 응답하지 않습니다. 확인을 수행하기 전에 삭제 프로세스가 완료될 때까지 기다려야 합니다.다음 명령을 실행하여 사용자 정의 리소스가 삭제되었는지 확인합니다.
$ oc get kataconfig example-kataconfig출력 예
No example-kataconfig instances exist
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
10.1.2.3. OpenShift 샌드박스 컨테이너 Operator 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
명령줄을 사용하여 OpenShift 샌드박스 컨테이너 Operator를 설치 제거할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
kata또는kata-remote를runtimeClass로 사용하는 모든 Pod를 삭제했습니다. -
KataConfig사용자 지정 리소스를 삭제했습니다.
프로세스
다음 명령을 실행하여 서브스크립션을 삭제합니다.
$ oc delete subscription sandboxed-containers-operator -n openshift-sandboxed-containers-operator다음 명령을 실행하여 네임스페이스를 삭제합니다.
$ oc delete namespace openshift-sandboxed-containers-operator
10.1.2.4. KataConfig CRD 삭제 링크 복사링크가 클립보드에 복사되었습니다!
명령줄을 사용하여 KataConfig CRD(사용자 정의 리소스 정의)를 삭제할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
kata또는kata-remote를runtimeClass로 사용하는 모든 Pod를 삭제했습니다. -
KataConfig사용자 지정 리소스를 삭제했습니다. - OpenShift 샌드박스 컨테이너 Operator를 설치 제거했습니다.
프로세스
다음 명령을 실행하여
KataConfigCRD를 삭제합니다.$ oc delete crd kataconfigs.kataconfiguration.openshift.io다음 명령을 실행하여 CRD가 삭제되었는지 확인합니다.
$ oc get crd kataconfigs.kataconfiguration.openshift.io출력 예
Unknown CRD kataconfigs.kataconfiguration.openshift.io
10.2. 기밀 컨테이너 환경 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔 또는 명령줄을 사용하여 기밀 컨테이너 환경을 제거할 수 있습니다.
다음 작업을 수행하여 기밀성 컨테이너 환경을 제거합니다.
-
KbsConfig사용자 지정 리소스를 삭제합니다. - Confidential Compute attestation Operator를 설치 제거합니다.
-
KbsConfig사용자 지정 리소스 정의를 삭제합니다.
10.2.1. 웹 콘솔을 사용하여 기밀 컨테이너 환경 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 기밀 컨테이너 환경을 제거할 수 있습니다.
10.2.1.1. KbsConfig 사용자 정의 리소스 삭제 링크 복사링크가 클립보드에 복사되었습니다!
웹 콘솔을 사용하여 KbsConfig CR(사용자 정의 리소스)을 삭제할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - OpenShift 샌드박스 컨테이너를 설치 제거했습니다.
프로세스
- OpenShift Container Platform 웹 콘솔에서 Operator → 설치된 Operator로 이동합니다.
-
이름으로 검색 필드에
Confidential compute attestation을 입력합니다. - Operator를 클릭하여 연 다음 KbsConfig 탭을 클릭합니다.
-
옵션 메뉴
를 클릭하고 KbsConfig삭제 를 선택합니다. - 확인 창에서 삭제를 클릭합니다.
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
10.2.1.2. Confidential Compute attestation Operator 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 기밀 컴퓨팅 인증 Operator를 설치 제거할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
kata또는kata-remote를runtimeClass로 사용하는 모든 Pod를 삭제했습니다. -
KbsConfig사용자 정의 리소스를 삭제했습니다.
프로세스
- Operators → 설치된 Operator로 이동합니다.
-
이름으로 검색 필드에
Confidential compute attestation을 입력합니다. Operator 세부 정보 페이지 오른쪽에 있는 작업 목록에서 Operator 제거를 선택합니다.
Operator를 설치 제거하시겠습니까? 대화 상자가 표시됩니다.
- 설치 제거를 클릭하여 Operator, Operator 배포 및 Pod를 제거합니다.
- 관리 → 네임스페이스로 이동합니다.
-
이름으로 검색 필드에
trustee-operator-system을 입력합니다. -
옵션 메뉴
를 클릭하고 네임스페이스 삭제 를 선택합니다.
-
확인 대화 상자에서
trustee-operator-system을 입력하고 삭제 를 클릭합니다.
10.2.1.3. KbsConfig CRD 삭제 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift Container Platform 웹 콘솔을 사용하여 KbsConfig CRD(사용자 정의 리소스 정의)를 삭제할 수 있습니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
kata또는kata-remote를runtimeClass로 사용하는 모든 Pod를 삭제했습니다. -
KbsConfig사용자 정의 리소스를 삭제했습니다. - Confidential Compute attestation Operator를 설치 제거했습니다.
프로세스
- 웹 콘솔에서 Administration → CustomResourceDefinitions 로 이동합니다.
-
이름으로 검색 필드에
KbsConfig이름을 입력합니다. - 옵션 메뉴를 클릭하고 Delete CustomResourceDefinition 을 선택합니다.
- 확인 창에서 삭제를 클릭합니다.
10.2.2. CLI를 사용하여 기밀 컨테이너 환경 제거 링크 복사링크가 클립보드에 복사되었습니다!
CLI(명령줄 인터페이스)를 사용하여 기밀 컨테이너 환경을 제거할 수 있습니다.
10.2.2.1. KbsConfig 사용자 정의 리소스 삭제 링크 복사링크가 클립보드에 복사되었습니다!
명령줄을 사용하여 KbsConfig CR(사용자 정의 리소스)을 삭제할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - OpenShift 샌드박스 컨테이너를 설치 제거했습니다.
프로세스
다음 명령을 실행하여
KbsConfigCR을 삭제합니다.$ oc delete kbsconfig kbsconfig다음 명령을 실행하여 사용자 정의 리소스가 삭제되었는지 확인합니다.
$ oc get kbsconfig kbsconfig출력 예
No kbsconfig instances exist
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
10.2.2.2. Confidential Compute attestation Operator 설치 제거 링크 복사링크가 클립보드에 복사되었습니다!
명령줄을 사용하여 Confidential Compute attestation Operator를 설치 제거할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
KbsConfig사용자 정의 리소스를 삭제했습니다.
프로세스
다음 명령을 실행하여 서브스크립션을 삭제합니다.
$ oc delete subscription trustee-operator -n trustee-operator-system다음 명령을 실행하여 네임스페이스를 삭제합니다.
$ oc delete namespace trustee-operator-system
10.2.2.3. KbsConfig CRD 삭제 링크 복사링크가 클립보드에 복사되었습니다!
명령줄을 사용하여 KbsConfig CRD(사용자 정의 리소스 정의)를 삭제할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. -
kata또는kata-remote를runtimeClass로 사용하는 모든 Pod를 삭제했습니다. -
KbsConfig사용자 정의 리소스를 삭제했습니다. - Confidential Compute attestation Operator를 설치 제거했습니다.
프로세스
다음 명령을 실행하여
KbsConfigCRD를 삭제합니다.$ oc delete crd kbsconfigs.confidentialcontainers.org다음 명령을 실행하여 CRD가 삭제되었는지 확인합니다.
$ oc get crd kbsconfigs.confidentialcontainers.org출력 예
Unknown CRD kbsconfigs.confidentialcontainers.org
11장. 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너 구성 요소의 업그레이드는 다음 단계로 구성됩니다.
-
OpenShift Container Platform을 업그레이드하여
Kata런타임 및 해당 종속 항목을 업데이트합니다. - OpenShift 샌드박스 컨테이너 Operator를 업그레이드하여 Operator 서브스크립션을 업데이트합니다.
아래에 언급된 한 가지 예외를 제외하고 OpenShift 샌드박스 컨테이너 Operator 업그레이드 전이나 후에 OpenShift Container Platform을 업그레이드할 수 있습니다. OpenShift 샌드박스 컨테이너 Operator를 업그레이드한 직후 KataConfig 패치를 항상 적용합니다.
11.1. 리소스 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
RHCOS(Red Hat Enterprise Linux CoreOS) 확장 기능은 OpenShift 샌드박스 컨테이너 리소스를 클러스터에 배포합니다.
RHCOS 확장 샌드박스 컨테이너에 는 Kata 컨테이너 런타임, 하이퍼바이저 QEMU 및 기타 종속 항목과 같은 OpenShift 샌드박스 컨테이너를 실행하는 데 필요한 구성 요소가 포함되어 있습니다. 클러스터를 새 OpenShift Container Platform 릴리스로 업그레이드하여 확장을 업그레이드합니다.
OpenShift Container Platform 업그레이드에 대한 자세한 내용은 클러스터 업데이트를 참조하십시오.
11.2. Operator 업그레이드 링크 복사링크가 클립보드에 복사되었습니다!
OLM(Operator Lifecycle Manager)을 사용하여 OpenShift 샌드박스 컨테이너 Operator를 수동 또는 자동으로 업그레이드합니다. 초기 배포 중에 수동 또는 자동 업그레이드 중 하나를 선택하면 향후 업그레이드 모드가 결정됩니다. 수동 업그레이드의 경우 OpenShift Container Platform 웹 콘솔에는 클러스터 관리자가 설치할 수 있는 사용 가능한 업데이트가 표시됩니다.
OLM(Operator Lifecycle Manager)에서 OpenShift 샌드박스 컨테이너 Operator를 업그레이드하는 방법에 대한 자세한 내용은 설치된 Operator 업데이트를 참조하십시오.
11.3. Pod VM 이미지 업데이트 링크 복사링크가 클립보드에 복사되었습니다!
AWS, Azure 및 IBM 배포의 경우 Pod VM 이미지를 업데이트해야 합니다. enablePeerpods: paramter가 true 인 경우 OpenShift 샌드박스 컨테이너 Operator를 업그레이드하면 기존 Pod VM 이미지가 자동으로 업데이트되지 않습니다. 업그레이드 후 Pod VM 이미지를 업데이트하려면 KataConfig CR을 삭제하고 다시 생성해야 합니다.
AWS 및 Azure 배포의 피어 Pod 구성 맵을 확인하여 KataConfig CR을 다시 생성하기 전에 이미지 ID가 비어 있는지 확인할 수도 있습니다.
11.3.1. KataConfig 사용자 지정 리소스 삭제 링크 복사링크가 클립보드에 복사되었습니다!
명령줄을 사용하여 KataConfig CR(사용자 정의 리소스)을 삭제할 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 명령을 실행하여
KataConfigCR을 삭제합니다.$ oc delete kataconfig example-kataconfig다음 명령을 실행하여 사용자 정의 리소스가 삭제되었는지 확인합니다.
$ oc get kataconfig example-kataconfig출력 예
No example-kataconfig instances exist
클라우드 공급자를 사용하여 배포된 OpenShift 샌드박스 컨테이너를 제거하는 경우 모든 Pod를 삭제해야 합니다. 나머지 Pod 리소스로 인해 클라우드 공급자의 예기치 않은 요금이 발생할 수 있습니다.
11.3.2. 피어 Pod CM 이미지 ID가 비어 있는지 확인 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR을 삭제할 때 피어 Pod CM 이미지 ID를 삭제해야 합니다. AWS 및 Azure 배포의 경우 피어 Pod CM 이미지 ID가 비어 있는지 확인합니다.
프로세스
피어 Pod에 대해 생성한 구성 맵을 가져옵니다.
$ oc get cm -n openshift-sandboxed-containers-operator peer-pods-cm -o jsonpath="{.data.AZURE_IMAGE_ID}"AWS에
PODVM_AMI_ID를 사용합니다. Azure에AZURE_IMAGE_ID를 사용합니다.- YAML 파일의 상태 스탠자를 확인합니다.
-
AWS의
PODVM_AMI_ID매개변수 또는 Azure의AZURE_IMAGE_ID매개변수에 값이 포함된 경우 값을 ""로 설정합니다. 값을 ""로 설정한 경우 피어 Pod 구성 맵을 패치합니다.
$ oc patch configmap peer-pods-cm -n openshift-sandboxed-containers-operator -p '{"data":{"AZURE_IMAGE_ID":""}}'AWS에
PODVM_AMI_ID를 사용합니다. Azure에AZURE_IMAGE_ID를 사용합니다.
11.3.3. KataConfig 사용자 지정 리소스 생성 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR(사용자 정의 리소스)을 생성하여 작업자 노드에 kata-remote 를 런타임 클래스로 설치해야 합니다.
KataConfig CR을 생성하면 OpenShift 샌드박스 컨테이너 Operator가 다음을 수행합니다.
-
기본 구성을 사용하여
kata-remote라는RuntimeClassCR을 생성합니다. 이를 통해 사용자는RuntimeClassName필드에서 CR을 참조하여kata-remote를 런타임으로 사용하도록 워크로드를 구성할 수 있습니다. 이 CR은 런타임의 리소스 오버헤드도 지정합니다.
OpenShift 샌드박스 컨테이너는 kata-remote 를 기본 런타임이 아닌 클러스터의 선택적 런타임으로 설치합니다.
KataConfig CR을 생성하면 작업자 노드가 자동으로 재부팅됩니다. 재부팅에는 10분에서 60분 이상 걸릴 수 있습니다. 재부팅 시간을 방해하는 요소는 다음과 같습니다.
- 더 많은 작업자 노드가 있는 대규모 OpenShift Container Platform 배포
- BIOS 및 Cryostat 유틸리티 활성화.
- SSD가 아닌 하드 디스크 드라이브에 배포합니다.
- 가상 노드가 아닌 베어 메탈과 같은 물리적 노드에 배포됩니다.
- 느린 CPU 및 네트워크입니다.
사전 요구 사항
-
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
다음 예에 따라
example-kataconfig.yaml매니페스트 파일을 생성합니다.apiVersion: kataconfiguration.openshift.io/v1 kind: KataConfig metadata: name: example-kataconfig spec: enablePeerPods: true logLevel: info # kataConfigPoolSelector: # matchLabels: # <label_key>: '<label_value>'1 다음 명령을 실행하여
KataConfigCR을 생성합니다.$ oc apply -f example-kataconfig.yaml새로운
KataConfigCR이 생성되고 작업자 노드에kata-remote가 런타임 클래스로 설치됩니다.설치를 확인하기 전에
kata-remote설치가 완료되고 작업자 노드가 재부팅될 때까지 기다립니다.다음 명령을 실행하여 설치 진행 상황을 모니터링합니다.
$ watch "oc describe kataconfig | sed -n /^Status:/,/^Events/p"kataNodes아래의 모든 작업자의 상태가설치되고이유를 지정하지 않고InProgress조건이False이면 클러스터에kata-remote가 설치됩니다.다음 명령을 실행하여 데몬 세트를 확인합니다.
$ oc get -n openshift-sandboxed-containers-operator ds/osc-caa-ds다음 명령을 실행하여 런타임 클래스를 확인합니다.
$ oc get runtimeclass출력 예
NAME HANDLER AGE kata kata 152m kata-remote kata-remote 152m
12장. 문제 해결 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너의 문제를 해결할 때 지원 케이스를 열고 must-gather 툴을 사용하여 디버깅 정보를 제공할 수 있습니다.
클러스터 관리자인 경우 로그를 직접 검토하여 더 자세한 로그 수준을 활성화할 수도 있습니다.
12.1. Red Hat 지원을 위한 데이터 수집 링크 복사링크가 클립보드에 복사되었습니다!
지원 사례를 여는 경우 클러스터에 대한 디버깅 정보를 Red Hat 지원에 제공하면 도움이 됩니다.
must-gather 툴을 사용하면 가상 머신 및 OpenShift 샌드박스 컨테이너와 관련된 기타 데이터를 포함하여 OpenShift Container Platform 클러스터에 대한 진단 정보를 수집할 수 있습니다.
즉각 지원을 받을 수 있도록 OpenShift Container Platform 및 OpenShift 샌드박스 컨테이너 둘 다에 대한 진단 정보를 제공하십시오.
must-gather 툴 사용
oc adm must-gather CLI 명령은 다음을 포함하여 문제를 디버깅하는 데 필요할 가능성이 높은 클러스터에서 정보를 수집합니다.
- 리소스 정의
- 서비스 로그
기본적으로 oc adm must-gather 명령은 기본 플러그인 이미지를 사용하고 ./must-gather.local 에 씁니다.
또는 다음 섹션에 설명된 대로 적절한 인수로 명령을 실행하여 특정 정보를 수집할 수 있습니다.
하나 이상의 특정 기능과 관련된 데이터를 수집하려면 다음 섹션에 나열된 대로 이미지와 함께
--image인수를 사용합니다.예를 들면 다음과 같습니다.
$ oc adm must-gather --image=registry.redhat.io/openshift-sandboxed-containers/osc-must-gather-rhel9:1.9.0감사 로그를 수집하려면 다음 섹션에 설명된 대로
-- /usr/bin/gather_audit_logs인수를 사용하십시오.예를 들면 다음과 같습니다.
$ oc adm must-gather -- /usr/bin/gather_audit_logs참고감사 로그는 파일 크기를 줄이기 위해 기본 정보 세트의 일부로 수집되지 않습니다.
oc adm must-gather 를 실행하면 클러스터의 새 프로젝트에 임의의 이름이 있는 새 Pod가 생성됩니다. 해당 Pod에 대한 데이터가 수집되어 must-gather.local로 시작하는 새 디렉터리에 저장됩니다. 이 디렉터리는 현재 작업 중인 디렉터리에 생성되어 있습니다.
예를 들면 다음과 같습니다.
NAMESPACE NAME READY STATUS RESTARTS AGE
...
openshift-must-gather-5drcj must-gather-bklx4 2/2 Running 0 72s
openshift-must-gather-5drcj must-gather-s8sdh 2/2 Running 0 72s
...
필요한 경우 --run-namespace 옵션을 사용하여 특정 네임스페이스에서 oc adm must-gather 명령을 실행할 수 있습니다.
예를 들면 다음과 같습니다.
$ oc adm must-gather --run-namespace <namespace> --image=registry.redhat.io/openshift-sandboxed-containers/osc-must-gather-rhel9:1.9.0
12.2. 로그 데이터 수집 링크 복사링크가 클립보드에 복사되었습니다!
OpenShift 샌드박스 컨테이너와 관련된 기능 및 오브젝트는 다음과 같습니다.
- OpenShift 샌드박스 컨테이너 리소스에 속하는 모든 네임스페이스 및 해당 하위 오브젝트
- 모든 OpenShift 샌드박스 컨테이너 CRD(사용자 정의 리소스 정의)
kata 런타임으로 실행되는 각 Pod에 대해 다음 구성 요소 로그를 수집할 수 있습니다.
- Kata 에이전트 로그
- Kata 런타임 로그
- QEMU 로그
- 감사 로그
- CRI-O 로그
12.2.1. CRI-O 런타임의 디버그 로그 활성화 링크 복사링크가 클립보드에 복사되었습니다!
KataConfig CR에서 logLevel 필드를 업데이트하여 디버그 로그를 활성화할 수 있습니다. 이렇게 하면 OpenShift 샌드박스 컨테이너를 실행하는 작업자 노드의 CRI-O 런타임의 로그 수준이 변경됩니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
기존
KataConfigCR의logLevel필드를debug로 변경합니다.$ oc patch kataconfig <kataconfig> --type merge --patch '{"spec":{"logLevel":"debug"}}'UPDATED의 값이True가 될 때까지kata-oc머신 구성 풀을 모니터링하여 모든 작업자 노드가 업데이트됨을 나타냅니다.$ oc get mcp kata-oc출력 예
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE kata-oc rendered-kata-oc-169 False True False 3 1 1 0 9h
검증
머신 구성 풀에서 노드로 디버그 세션을 시작합니다.
$ oc debug node/<node_name>root 디렉토리를
/host로 변경합니다.# chroot /hostcrio.conf파일의 변경 사항을 확인합니다.# crio config | egrep 'log_level출력 예
log_level = "debug"
12.2.2. 구성 요소의 디버그 로그 보기 링크 복사링크가 클립보드에 복사되었습니다!
클러스터 관리자는 디버그 로그를 사용하여 문제를 해결할 수 있습니다. 각 노드의 로그는 노드 저널에 출력됩니다.
다음 OpenShift 샌드박스 컨테이너 구성 요소의 로그를 검토할 수 있습니다.
- Kata 에이전트
-
Kata 런타임 (
containerd-shim-kata-v2) -
virtiofsd
QEMU는 경고 및 오류 로그만 생성합니다. 이러한 경고 및 오류는 추가 qemuPid 필드를 사용하여 Kata 런타임 로그와 CRI-O 로그 모두에서 노드 저널에 출력됩니다.
QEMU 로그 예
Mar 11 11:57:28 openshift-worker-0 kata[2241647]: time="2023-03-11T11:57:28.587116986Z" level=info msg="Start logging QEMU (qemuPid=2241693)" name=containerd-shim-v2 pid=2241647 sandbox=d1d4d68efc35e5ccb4331af73da459c13f46269b512774aa6bde7da34db48987 source=virtcontainers/hypervisor subsystem=qemu
Mar 11 11:57:28 openshift-worker-0 kata[2241647]: time="2023-03-11T11:57:28.607339014Z" level=error msg="qemu-kvm: -machine q35,accel=kvm,kernel_irqchip=split,foo: Expected '=' after parameter 'foo'" name=containerd-shim-v2 pid=2241647 qemuPid=2241693 sandbox=d1d4d68efc35e5ccb4331af73da459c13f46269b512774aa6bde7da34db48987 source=virtcontainers/hypervisor subsystem=qemu
Mar 11 11:57:28 openshift-worker-0 kata[2241647]: time="2023-03-11T11:57:28.60890737Z" level=info msg="Stop logging QEMU (qemuPid=2241693)" name=containerd-shim-v2 pid=2241647 sandbox=d1d4d68efc35e5ccb4331af73da459c13f46269b512774aa6bde7da34db48987 source=virtcontainers/hypervisor subsystem=qemu
Kata 런타임은 QEMU가 시작될 때 로깅 QEMU 시작 및 QEMU가 중지되면 로깅 QEMU 를 중지합니다. 이러한 두 로그 메시지 사이에 qemuPid 필드가 있는 오류가 표시됩니다. QEMU의 실제 오류 메시지가 빨간색으로 표시됩니다.
QEMU 게스트의 콘솔도 노드 저널에 출력됩니다. Kata 에이전트 로그와 함께 게스트 콘솔 로그를 볼 수 있습니다.
사전 요구 사항
-
OpenShift CLI(
oc)가 설치되어 있습니다. -
cluster-admin역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
프로세스
Kata 에이전트 로그 및 게스트 콘솔 로그를 검토하려면 다음 명령을 실행합니다.
$ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t kata -g “reading guest console”Kata 런타임 로그를 검토하려면 다음 명령을 실행합니다.
$ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t katavirtiofsd로그를 검토하려면 다음 명령을 실행합니다.$ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t virtiofsdQEMU 로그를 검토하려면 다음 명령을 실행합니다.
$ oc debug node/<nodename> -- journalctl -D /host/var/log/journal -t kata -g "qemuPid=\d+"
추가 리소스
- OpenShift Container Platform 문서에서 클러스터에 대한 데이터 수집
부록 A. KataConfig 상태 메시지 링크 복사링크가 클립보드에 복사되었습니다!
다음 표에는 두 개의 작업자 노드가 있는 클러스터의 KataConfig CR(사용자 정의 리소스)의 상태 메시지가 표시됩니다.
| 상태 | 설명 |
|---|---|
| 초기 설치
|
|
| 설치 몇 초 내에 상태가 변경됩니다. |
|
| 설치 (Worker-1 설치 시작)
잠시 동안 하나의 노드가 |
|
| 설치 (Worker-1 설치, worker-0 설치 시작)
잠시 후 |
|
| 설치됨
설치하는 경우 두 작업자 모두 설치된 것으로 나열되고 |
|
| 상태 | 설명 |
|---|---|
| 초기 설치 제거
|
|
| 설치 제거 몇 초 후에 작업자 중 하나가 제거를 시작합니다. |
|
| 설치 제거 worker-1이 완료되고 worker-0이 제거를 시작합니다. |
|
reason 필드는 다음 원인도 보고할 수 있습니다.
-
Failed: 노드가 전환을 완료할 수 없는 경우 보고됩니다.상태는True이고메시지는Node <node_name> Degraded: <error_message_from_the_node>입니다. -
BlockedByExistingKataPods: kata-remote를 제거하는 동안런타임을 사용하는 클러스터에서 실행 중인 Pod가 있는 경우 보고됩니다.kata-remotestatus필드는False이고메시지는kata-remote" RuntimeClass를 사용하는 기존 Pod입니다. KataConfig 삭제의 경우 Pod를 수동으로 삭제하여 다음을 진행합니다.. 클러스터 컨트롤 플레인과의 통신에 실패하는 경우Failed to list kata pods: <error_message>와 같은 기술 오류 메시지가 표시될 수도 있습니다.