Red Hat Blog를 보다가 관심 가는 글이 보여서 AI번역+약간 교정해 보았습니다.
출처: https://developers.redhat.com/articles/2025/06/03/automate-vm-golden-image-management-openshift
Red Hat OpenShift 클러스터 전반에 걸쳐 가상 머신의 골든 이미지를 생성하고 배포하는 것은 환경을 표준화하고 운영 효율성을 최적화하려는 플랫폼 엔지니어에게 매우 중요합니다. 이 문서에서는 Red Hat OpenShift Virtualization , Red Hat OpenShift Pipelines , Red Hat OpenShift GitOps를 사용하여 이 프로세스를 자동화하는 방법을 보여줍니다 .
OpenShift Pipelines는 쿠버네티스 네이티브 CI/CD 기능을 제공합니다. 파이프라인, 작업 및 파이프라인 실행은 쿠버네티스 커스텀 리소스로 관리되어 완전한 선언적 워크플로를 구현할 수 있습니다. OpenShift Virtualization은 이러한 개념을 가상 머신(VM)으로 확장하여 이를 최고급 쿠버네티스 객체로 처리합니다.
OpenShift Pipelines과 OpenShift 가상화를 결합하면 다음과 같은 이점이 있습니다.
- 디스크 이미지 빌드를 자동화합니다.
- 버전이 관리되고 감사 가능한 GitOps 워크플로를 위해 Git에서 관리합니다.
- OpenShift GitOps를 사용하여 클러스터 전반에 원활하게 분산하세요.
이 문서는 Tekton과 Secrets를 사용하여 VM 이미지 빌드 에 설명된 워크플로를 기반으로 , 컨테이너 레지스트리에 디스크 이미지를 자동으로 업로드하고 여러 OpenShift 클러스터로 가져오는 기능을 자동화하여 워크플로를 개선합니다. 이 문서에 사용된 YAML 매니페스트는 kubevirt-golden-images GitHub 저장소에서 확인할 수 있습니다.
필수 조건
이 가이드를 따라가려면 다음이 필요합니다.
- Red Hat OpenShift 4.17 이상
- Red Hat OpenShift Virtualization 4.17 이상
- Red Hat OpenShift Pipelines
- Red Hat OpenShift GitOps
OpenShift Pipelines를 사용하여 새로운 사용자 정의 골든 이미지를 빌드하고 업로드합니다.
이 사용자 지정 골든 이미지 파이프라인은 Red Hat 레지스트리에서 Red Hat Enterprise Linux (RHEL) 이미지를 가져오고, virt-customize를 사용하여 Git 패키지를 설치하고, 수정된 이미지 사본을 생성한 후 컨테이너 레지스트리에 업로드합니다. 그림 1은 이를 보여줍니다.

이 프로세스에는 두 개의 스크릿이 필요합니다. 하나는 컨테이너 레지스트리 자격 증명을 저장하는 것이고 다른 하나는 Red Hat 계정 자격 증명을 저장하는 것입니다.
컨테이너 레지스트리 자격 증명
이러한 자격 증명은 디스크 이미지가 포함될 컨테이너 레지스트리에 컨테이너 디스크를 푸시할 때 디스크 업로더 도구에서 사용됩니다 .
oc apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: disk-uploader-credentials type: Opaque stringData: accessKeyId: "<ACCESS_KEY_ID>" # <QUAY_USERNAME> secretKey: "<SECRET_KEY>" # <QUAY_PASSWORD> EOF
메모: Red Hat Quay를 사용하는 경우 , 고유한 자격 증명 및 권한을 가진 Red Hat 계정과 연결된 로봇 계정을 생성하는 것이 좋습니다. 자세한 내용은 Quay 설명서를 참조하세요.
워크스페이스 자격 증명
워크스페이스 증명은 Red Hat의 패키지 설치 구독을 획득하는 데 사용되는 Red Hat 계정 비밀번호를 저장합니다.
oc apply -f - <<EOF apiVersion: v1 kind: Secret metadata: name: disk-virt-customize-workspace-credentials type: Opaque stringData: password: "<RH_ACCOUNT_PASSWORD>" EOF
파이프라인 예시
그림 1에 설명된 워크플로를 자동화하는 사용자 정의 골든 이미지 파이프라인의 예는 다음과 같습니다.
oc apply -f - <<EOF
apiVersion: tekton.dev/v1
kind: Pipeline
metadata:
name: disk-uploader-pipeline
spec:
workspaces:
- name: data01
params:
- name: REDHAT_USERNAME
description: "Red Hat username to be used in RHEL subscription"
type: string
- name: IMAGE_DESTINATION
description: "Destination of the image in container registry"
type: string
- name: SECRET_NAME
description: "Name of the secret which holds credential for container registry"
type: string
tasks:
# Step 1: Imports base RHEL image into a PresistentVolumeClaim (PVC)
- name: import-rhel-image
taskRef:
resolver: hub
params:
- name: catalog
value: redhat-tekton-tasks
- name: kind
value: task
- name: name
value: modify-data-object
- name: version
value: ">=4.18.0"
params:
- name: manifest
value: |-
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
generateName: rhel-9-5-guest-dv-
annotations:
cdi.kubevirt.io/storage.bind.immediate.requested: "true"
spec:
source:
registry:
pullMethod: node
url: "docker://registry.redhat.io/rhel9/rhel-guest-image:9.5-1734523887"
storage:
volumeMode: Filesystem
resources:
requests:
storage: 10Gi
- name: waitForSuccess
value: true
- name: allowReplace
value: true
- name: setOwnerReference
value: true
# Step 2: Customizes image (e.g. install git, register with Red Hat)
- name: disk-virt-customize
taskRef:
resolver: hub
params:
- name: catalog
value: redhat-tekton-tasks
- name: kind
value: task
- name: name
value: disk-virt-customize
- name: version
value: ">=4.18.0"
runAfter:
- import-rhel-image
workspaces:
- name: data01
workspace: data01
params:
- name: pvc
value: "$(tasks.import-rhel-image.results.name)"
- name: virtCommands
value: |-
sm-credentials $(params.REDHAT_USERNAME):file:/data01/password
sm-register
sm-attach auto
install git
sm-unregister
# Step 3: Copies the customized disk to a new PresistentVolumeClaim (PVC)
- name: copy-rhel-image
taskRef:
resolver: hub
params:
- name: catalog
value: redhat-tekton-tasks
- name: kind
value: task
- name: name
value: modify-data-object
- name: version
value: ">=4.18.0"
runAfter:
- disk-virt-customize
params:
- name: manifest
value: |-
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
generateName: rhel-9-5-copied-guest-dv-
annotations:
cdi.kubevirt.io/storage.bind.immediate.requested: "true"
spec:
source:
pvc:
name: "$(tasks.import-rhel-image.results.name)"
namespace: "$(tasks.import-rhel-image.results.namespace)"
storage: {}
- name: waitForSuccess
value: true
- name: allowReplace
value: true
- name: setOwnerReference
value: true
# Step 4: Uploads the image to a container registry
- name: disk-uploader
taskRef:
resolver: hub
params:
- name: catalog
value: redhat-tekton-tasks
- name: kind
value: task
- name: name
value: disk-uploader
- name: version
value: ">=4.18.0"
runAfter:
- copy-rhel-image
params:
- name: EXPORT_SOURCE_KIND
value: "pvc"
- name: EXPORT_SOURCE_NAME
value: "$(tasks.copy-rhel-image.results.name)"
- name: VOLUME_NAME
value: "$(tasks.copy-rhel-image.results.name)"
- name: IMAGE_DESTINATION
value: "$(params.IMAGE_DESTINATION)"
- name: SECRET_NAME
value: "$(params.SECRET_NAME)"
EOF다음으로, 위의 예제 파이프라인을 실행합니다.
oc create -f - <<EOF
apiVersion: tekton.dev/v1
kind: PipelineRun
metadata:
generateName: disk-uploader-pipeline-run-
spec:
pipelineRef:
name: disk-uploader-pipeline
workspaces:
- name: data01
secret:
secretName: disk-virt-customize-workspace-credentials
params:
- name: REDHAT_USERNAME
value: <VALUE>
- name: IMAGE_DESTINATION
value: <VALUE> # e.g. quay.io/rhel9/rhel-guest-custom:9.5
- name: SECRET_NAME
value: disk-uploader-credentials
# This resolves an error due to guestfish lacking permission access to the disk img file
taskRunSpecs:
- pipelineTaskName: disk-virt-customize
podTemplate:
securityContext:
fsGroup: 107
runAsUser: 107
EOFOpenShift GitOps를 사용하여 사용자 정의 골든 이미지 배포
OpenShift GitOps(Argo CD)는 그림 2에 표시된 대로 중앙 집중식 GitHub 저장소에서 동기화하여 OpenShift 클러스터 전체에서 HyperConverged 구성을 관리하고 업데이트합니다.

HyperConverged 사용자 지정 리소스(CR)는 DataImportCron 객체를 배포하여 골든 이미지를 관리합니다. 이 기능은 컨테이너 레지스트리에서 클러스터로 골든 이미지를 주기적으로 가져오며, InstanceTypes에서 새 가상 머신을 프로비저닝할 때 골든 이미지를 선택할 수 있습니다.
Argo CD 라벨링
네임스페이스 openshift-cnv에 새 레이블을 추가하면 Argo CD 애플리케이션이 기존 HyperConverged 구성을 업데이트할 수 있습니다.
oc label namespace openshift-cnv argocd.argoproj.io/managed-by=openshift-gitops
Argo CD 애플리케이션
다음은 내부 및 외부 클러스터의 기존 HyperConverged 구성을 업데이트하는 새로운 Argo CD 애플리케이션입니다.
oc apply -f - <<EOF
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: argocd-sample
namespace: openshift-gitops
spec:
generators:
- list:
elements:
- name: in-cluster
namespace: openshift-cnv
server: https://kubernetes.default.svc
- name: external-cluster
namespace: openshift-cnv
server: https://1.2.3.4:6443 # Example external API server
template:
metadata:
name: argocd-sample-{{name}}
spec:
project: default
source:
repoURL: https://github.com/codingben/kubevirt-golden-images
targetRevision: HEAD
path: argocd-manifests
destination:
server: "{{server}}"
namespace: "{{namespace}}"
syncPolicy:
automated:
prune: true
selfHeal: false
EOF다음으로, Argo CD 애플리케이션의 상태를 확인하세요.
oc get applications.argoproj.io -n openshift-gitops
그런 다음 상태가 Synced인지 확인하세요 .
NAME SYNC STATUS HEALTH STATUS argocd-sample Synced Healthy
클러스터에서 골든 이미지의 존재 여부를 확인하려면 해당 이미지를 참조하는 DataSource가 있는지 확인하세요.
oc get datasource rhel-guest-custom
골든 이미지 사용 예시
클러스터에 배포된 사용자 지정 골든 이미지(rhel-guest-custom)를 사용하여 새 가상 머신을 만듭니다 .
oc apply -f - <<EOF
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
name: rhel-9-beige
namespace: sample-app
spec:
dataVolumeTemplates:
- metadata:
name: rhel-9-beige
spec:
sourceRef:
kind: DataSource
name: rhel-guest-custom
namespace: sample-app
storage:
resources: {}
instancetype:
name: u1.medium
preference:
name: rhel.9
runStrategy: Always
template:
spec:
domain:
devices: {}
volumes:
- dataVolume:
name: rhel-9-beige
name: rootdisk
- cloudInitNoCloud:
userData: |
#cloud-config
chpasswd:
expire: false
password: idvv-ykvl-1x6j
user: rhel
name: cloudinitdisk
EOF결론
OpenShift 파이프라인, OpenShift 가상화, OpenShift GitOps를 결합하면 OpenShift 클러스터 전반에서 골든 이미지의 수명 주기 관리를 완전히 자동화할 수 있습니다. 이 접근 방식은 표준화되고 일관된 VM 환경, Git 기반 감사 가능 워크플로, 그리고 클러스터 간 원활한 이미지 배포를 제공합니다.