OpenShift를 사용하여 VM 골든 이미지 관리 자동화

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은 이를 보여줍니다.

맞춤형 골든 이미지 파이프라인
그림 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
EOF

OpenShift GitOps를 사용하여 사용자 정의 골든 이미지 배포

OpenShift GitOps(Argo CD)는 그림 2에 표시된 대로 중앙 집중식 GitHub 저장소에서 동기화하여 OpenShift 클러스터 전체에서 HyperConverged 구성을 관리하고 업데이트합니다.

맞춤형 골든 이미지 배포
그림 2: 사용자 정의 골든 이미지 배포.

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 기반 감사 가능 워크플로, 그리고 클러스터 간 원활한 이미지 배포를 제공합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like