3.4. 애플리케이션 마이그레이션

MTC(Migration Toolkit for Containers) 웹 콘솔을 사용하거나 명령줄에서 애플리케이션을 마이그레이션할 수 있습니다.

3.4.1. 사전 요구 사항

MTC(Migration Toolkit for Containers)에는 다음과 같은 사전 요구 사항이 있습니다.

  • 모든 클러스터에서 cluster-admin 권한이 있는 사용자로 로그인합니다.
  • MTC 버전은 모든 클러스터에서 동일해야 합니다.
  • 클러스터:

    • 소스 클러스터를 최신 MTC z-stream 릴리스로 업그레이드해야 합니다.
    • migration-controller pod가 실행 중인 클러스터는 다른 클러스터에 대한 무제한 액세스 권한이 있어야 합니다.
    • 클러스터에는 무제한 네트워크 액세스 권한이 있어야 합니다.
    • 클러스터에 복제 리포지토리에 대한 무제한 네트워크 액세스 권한이 있어야 합니다.
    • 클러스터는 포트 443에서 OpenShift 경로를 사용하여 통신할 수 있어야 합니다.
    • 클러스터에 중요한 조건이 없어야 합니다.
    • 클러스터가 ready 상태여야 합니다.
  • 볼륨 마이그레이션:

    • PV(영구 볼륨)가 유효해야 합니다.
    • PV를 영구 볼륨 클레임에 바인딩해야 합니다.
    • move 방법을 사용하여 PV를 복사하는 경우 클러스터에 원격 볼륨에 대한 무제한 네트워크 액세스 권한이 있어야 합니다.
    • 스냅샷 복사 방법을 사용하여 PV를 복사하는 경우 다음과 같은 사전 요구 사항이 적용됩니다.

      • 클라우드 공급자는 스냅샷을 지원해야 합니다.
      • 볼륨에는 동일한 클라우드 프로바이더가 있어야 합니다.
      • 볼륨은 동일한 지리적 지역에 있어야 합니다.
      • 볼륨에는 동일한 스토리지 클래스가 있어야 합니다.
  • 프록시 환경에서 직접 볼륨 마이그레이션을 수행하는 경우 Stunnel TCP 프록시를 구성해야 합니다.
  • 직접 이미지 마이그레이션을 수행하는 경우 소스 클러스터의 내부 레지스트리를 외부 트래픽에 노출해야 합니다.

3.4.1.1. CA 인증서 번들 파일 생성

자체 서명 인증서를 사용하여 MTC(Migration Toolkit for Containers)의 클러스터 또는 복제 리포지토리를 보호하는 경우 다음 오류 메시지와 함께 인증서 확인에 실패할 수 있습니다. 알 수 없는 기관에서 서명한 인증서.

사용자 정의 CA 인증서 번들 파일을 생성하고 클러스터 또는 복제 리포지토리를 추가할 때 MTC 웹 콘솔에 업로드할 수 있습니다.

프로세스

원격 끝점에서 CA 인증서를 다운로드하여 CA 번들 파일로 저장합니다.

$ echo -n | openssl s_client -connect <host_FQDN>:<port> \ 1
  | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <ca_bundle.cert> 2
1
끝점의 호스트 FQDN 및 포트를 지정합니다(예: api.my-cluster.example.com:6443).
2
CA 번들 파일의 이름을 지정합니다.

3.4.1.2. 직접 볼륨 마이그레이션을 위한 프록시 구성

프록시 뒤에서 소스 클러스터에서 직접 볼륨 마이그레이션을 수행하는 경우 MigrationController 사용자 정의 리소스(CR)에서 Stunnel 프록시를 구성해야 합니다. Stunnel은 인증서를 변경하지 않고 TCP 연결을 위해 소스 클러스터와 대상 클러스터 간에 투명 터널을 생성합니다.

참고

직접 볼륨 마이그레이션은 하나의 프록시만 지원합니다. 대상 클러스터가 프록시 뒤에 있는 경우 소스 클러스터는 대상 클러스터의 경로에 액세스할 수 없습니다.

사전 요구 사항

  • 모든 클러스터에서 cluster-admin 권한이 있는 사용자로 로그인합니다.

절차

  1. MigrationController Pod가 실행되는 클러스터에 로그인합니다.
  2. MigrationController CR 매니페스트를 가져옵니다.

    $ oc get migrationcontroller <migration_controller> -n openshift-migration
  3. stunnel_tcp_proxy 매개변수를 추가합니다.

    apiVersion: migration.openshift.io/v1alpha1
    kind: MigrationController
    metadata:
      name: migration-controller
      namespace: openshift-migration
    ...
    spec:
      stunnel_tcp_proxy: <stunnel_proxy> 1
    1
    Stunnel 프록시를 지정합니다. http://<user_name>:<password>@<ip_address>:<port>
  4. 매니페스트를 migration-controller.yaml로 저장합니다.
  5. 업데이트된 매니페스트를 적용합니다.

    $ oc replace -f migration-controller.yaml -n openshift-migration

3.4.1.3. 마이그레이션 후크의 Ansible 플레이북 작성

마이그레이션 후크로 사용할 Ansible 플레이북을 작성할 수 있습니다. MTC 웹 콘솔을 사용하거나 MigPlan 사용자 정의 리소스(CR) 매니페스트에서 spec.hooks 매개변수의 값을 지정하여 후크가 마이그레이션 계획에 추가됩니다.

Ansible 플레이북은 후크 컨테이너에 구성 맵으로 마운트됩니다. 후크 컨테이너는 MigPlan CR에 지정된 클러스터, 서비스 계정 및 네임스페이스를 사용하여 작업으로 실행됩니다. 후크 컨테이너는 클러스터에서 실행되기 전에 작업에 인증이 필요하지 않도록 지정된 서비스 계정 토큰을 사용합니다.

3.4.1.3.1. Ansible 모듈

Ansible shell 모듈을 사용하여 oc 명령을 실행할 수 있습니다.

shell 모듈 예

- hosts: localhost
  gather_facts: false
  tasks:
  - name: get pod name
    shell: oc get po --all-namespaces

k8s_info와 같은 kubernetes.core 모듈을 사용하여 Kubernetes 리소스와 상호 작용할 수 있습니다.

k8s_facts 모듈 예

- hosts: localhost
  gather_facts: false
  tasks:
  - name: Get pod
    k8s_info:
      kind: pods
      api: v1
      namespace: openshift-migration
      name: "{{ lookup( 'env', 'HOSTNAME') }}"
    register: pods

  - name: Print pod name
    debug:
      msg: "{{ pods.resources[0].metadata.name }}"

fail 모듈을 사용하여 0이 아닌 종료 상태가 정상적으로 생성되지 않는 경우 후크의 성공 또는 실패 여부를 확인할 수 있습니다. 후크는 작업으로 실행되며 후크의 성공 또는 실패 상태는 작업 컨테이너의 종료 상태를 기반으로 합니다.

fail 모듈 예

- hosts: localhost
  gather_facts: false
  tasks:
  - name: Set a boolean
    set_fact:
      do_fail: true

  - name: "fail"
    fail:
      msg: "Cause a failure"
    when: do_fail

3.4.1.3.2. 환경 변수

MigPlan CR 이름과 마이그레이션 네임스페이스는 환경 변수로 후크 컨테이너에 전달됩니다. 이러한 변수는 lookup 플러그인을 사용하여 액세스할 수 있습니다.

환경 변수 예

- hosts: localhost
  gather_facts: false
  tasks:
  - set_fact:
      namespaces: "{{ (lookup( 'env', 'migration_namespaces')).split(',') }}"

  - debug:
      msg: "{{ item }}"
    with_items: "{{ namespaces }}"

  - debug:
      msg: "{{ lookup( 'env', 'migplan_name') }}"

3.4.1.4. 추가 리소스