Red Hat Training

A Red Hat training course is available for Red Hat OpenStack Platform

12장. Controller 노드 교체

특정 상황에서 고가용성 클러스터의 컨트롤러 노드에 장애가 발생할 수 있습니다. 이러한 경우 클러스터에서 해당 노드를 제거하고 새 컨트롤러 노드로 교체해야 합니다.

컨트롤러 노드를 교체하려면 이 섹션에 있는 단계를 완료하십시오. 컨트롤러 노드 교체 프로세스에는 컨트롤러 노드 교체 요청으로 오버클라우드를 업데이트하는 openstack overcloud deploy 명령 실행 과정이 포함됩니다.

중요

다음 절차는 고가용성 환경에만 적용됩니다. 컨트롤러 노드를 하나만 사용하는 경우 이 절차를 사용하지 마십시오.

12.1. 컨트롤러 교체 준비

오버클라우드 Controller 노드를 교체하기 전에 Red Hat OpenStack Platform 환경의 현재 상태를 확인하는 것이 중요합니다. 현재 상태를 확인하면 Controller 교체 프로세스 중에 복잡한 문제가 발생하는 것을 방지할 수 있습니다. 다음 사전 점검 목록을 사용하여 Controller 노드 교체를 수행하는 것이 안전한지 확인합니다. 언더클라우드에서 검사 명령을 모두 실행합니다.

절차

  1. 언더클라우드에서 overcloud 스택의 현재 상태를 확인합니다.

    $ source stackrc
    (undercloud) $ openstack stack list --nested

    overcloud 스택 및 해당 하위 스택에 CREATE_COMPLETE 또는 UPDATE_COMPLETE가 있어야 합니다.

  2. 데이터베이스 클라이언트 툴을 설치합니다.

    (undercloud) $ sudo yum -y install mariadb
  3. 데이터베이스에 root 사용자 액세스를 구성합니다.

    (undercloud) $ sudo cp /var/lib/config-data/puppet-generated/mysql/root/.my.cnf /root/.
  4. 언더클라우드 데이터베이스 백업을 수행합니다.

    (undercloud) $ mkdir /home/stack/backup
    (undercloud) $ sudo mysqldump --all-databases --quick --single-transaction | gzip > /home/stack/backup/dump_db_undercloud.sql.gz
  5. 새 노드를 프로비저닝할 때 언더클라우드에 이미지 캐싱 및 변환을 수행하는 데 필요한 10GB의 사용 가능한 스토리지가 있는지 확인합니다.
  6. 실행 중인 Controller 노드에서 Pacemaker의 상태를 확인합니다. 예를 들어 192.168.0.47이 실행 중인 Controller 노드의 IP 주소인 경우 다음 명령을 사용하여 Pacemaker 상태 정보를 가져옵니다.

    (undercloud) $ ssh heat-admin@192.168.0.47 'sudo pcs status'

    출력에 기존 노드에서 실행 중인 서비스와 실패한 노드에서 중지된 모든 서비스가 표시됩니다.

  7. 오버클라우드의 MariaDB 클러스터에 있는 각 노드에서 다음 매개 변수를 확인합니다.

    • wsrep_local_state_comment: Synced
    • wsrep_cluster_size: 2

      다음 명령을 사용하여 실행 중인 각 컨트롤러 노드에서 해당 매개 변수를 확인합니다. 이 예에서 컨트롤러 노드 IP 주소는 192.168.0.47 및 192.168.0.46입니다.

      (undercloud) $ for i in 192.168.0.47 192.168.0.46 ; do echo "*** $i ***" ; ssh heat-admin@$i "sudo mysql -p\$(sudo hiera -c /etc/puppet/hiera.yaml mysql::server::root_password) --execute=\"SHOW STATUS LIKE 'wsrep_local_state_comment'; SHOW STATUS LIKE 'wsrep_cluster_size';\""; done
  8. RabbitMQ 상태를 확인합니다. 예를 들어 192.168.0.47이 실행 중인 컨트롤러 노드의 IP 주소이면 다음 명령을 사용하여 상태 정보를 가져옵니다.

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo docker exec \$(sudo docker ps -f name=rabbitmq-bundle -q) rabbitmqctl cluster_status"

    running_nodes 키는 사용 가능한 두 개의 노드만 표시하고, 실패한 노드는 표시하지 않습니다.

  9. 펜싱이 활성화된 경우 비활성화합니다. 예를 들어 192.168.0.47이 실행 중인 Controller 노드의 IP 주소이면 다음 명령을 사용하여 펜싱을 비활성화합니다.

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs property set stonith-enabled=false"

    다음 명령을 사용하여 펜싱 상태를 확인합니다.

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs property show stonith-enabled"
  10. Compute 서비스가 director 노드에서 활성 상태인지 확인합니다.

    (undercloud) $ openstack hypervisor list

    출력에 모든 유지보수 이외의 모드 노드가 up으로 표시됩니다.

  11. 모든 언더클라우드 컨테이너가 실행 중인지 확인합니다.

    (undercloud) $ sudo docker ps

12.2. Ceph Monitor 데몬 제거

스토리지 클러스터에서 ceph-mon 데몬을 제거하려면 이 절차를 따르십시오. 컨트롤러 노드가 Ceph monitor 서비스를 실행하는 경우 다음 단계를 따라 ceph-mon 데몬을 제거합니다. 이 절차에서는 컨트롤러에 도달할 수 있다고 가정합니다.

참고

클러스터에 새 Controller를 추가하면 새 Ceph Monitor 데몬도 자동으로 추가됩니다.

절차

  1. 교체하여 root로 만들 Controller에 연결합니다.

    # ssh heat-admin@192.168.0.47
    # sudo su -
    참고

    컨트롤러가 도달하지 못하는 경우 1단계와 2단계를 건너뛰고 모든 작업 컨트롤러 노드에 있는 3단계로 이동합니다.

  2. root로 monitor를 중단합니다.

    # systemctl stop ceph-mon@<monitor_hostname>

    예:

    # systemctl stop ceph-mon@overcloud-controller-1
  3. 교체할 Controller의 연결을 해제합니다.
  4. 기존 Controller 중 하나에 연결합니다.

    # ssh heat-admin@192.168.0.46
    # sudo su -
  5. 클러스터에서 monitor를 삭제합니다.

    # ceph mon remove <mon_id>
  6. 모든 컨트롤러 노드에서 /etc/ceph/ceph.conf의 monitor 항목을 제거합니다. 예를 들어 controller-1을 제거하면 controller-1에 대한 IP와 호스트 이름이 제거됩니다.

    편집 전:

    mon host = 172.18.0.21,172.18.0.22,172.18.0.24
    mon initial members = overcloud-controller-2,overcloud-controller-1,overcloud-controller-0

    편집 후:

    mon host = 172.18.0.22,172.18.0.24
    mon initial members = overcloud-controller-2,overcloud-controller-0
    참고

    대체 컨트롤러 노드를 추가하면 director가 ceph.conf 파일을 관련 오버클라우드 노드에서 업데이트합니다. 일반적으로 이 구성 파일은 director에서만 관리하며 수동으로 편집해서는 안 됩니다. 그러나 새 노드를 추가하기 전에 다른 노드를 재시작한 경우에는 파일을 직접 편집하여 일관성을 보장할 수 있습니다.

  7. 옵션으로 모니터 데이터를 압축하여 다른 서버에 저장할 수 있습니다.

    # mv /var/lib/ceph/mon/<cluster>-<daemon_id> /var/lib/ceph/mon/removed-<cluster>-<daemon_id>

12.3. 컨트롤러 교체를 위한 클러스터 준비

기존 노드를 교체하기 전에 Pacemaker가 더 이상 실행되지 않는지 확인한 후 Pacemaker 클러스터에서 해당 노드를 제거해야 합니다.

절차

  1. 컨트롤러 노드의 IP 주소 목록을 가져옵니다.

    (undercloud) $ openstack server list -c Name -c Networks
    +------------------------+-----------------------+
    | Name                   | Networks              |
    +------------------------+-----------------------+
    | overcloud-compute-0    | ctlplane=192.168.0.44 |
    | overcloud-controller-0 | ctlplane=192.168.0.47 |
    | overcloud-controller-1 | ctlplane=192.168.0.45 |
    | overcloud-controller-2 | ctlplane=192.168.0.46 |
    +------------------------+-----------------------+
  2. 기존 노드에 계속 연결할 수 있는 경우 나머지 노드 중 하나에 로그인하여 기존 노드에서 Pacemaker를 중지합니다. 이 예에서는 overcloud-controller-1에서 Pacemaker를 중지합니다.

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs status | grep -w Online | grep -w overcloud-controller-1"
    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs cluster stop overcloud-controller-1"
    참고

    기존 노드를 실제로 사용할 수 없거나 중지된 경우에는 해당 노드에서 Pacemaker가 이미 중지되었으므로 위 작업을 수행하지 않아도 됩니다.

  3. 기존 노드에서 Pacemaker를 중지한 후 각 노드의 Corosync 구성에서 기존 노드를 삭제하고 Corosync를 다시 시작합니다. 기존 노드에서 Pacemaker의 상태를 확인하려면 pcs status 명령을 실행하고 상태가 Stopped인지 확인하십시오.

    다음 예의 명령은 overcloud-controller-0overcloud-controller-2에 로그인하여 overcloud-controller-1을 제거합니다.

    (undercloud) $ for NAME in overcloud-controller-0 overcloud-controller-2; do IP=$(openstack server list -c Networks -f value --name $NAME | cut -d "=" -f 2) ; ssh heat-admin@$IP "sudo pcs cluster localnode remove overcloud-controller-1; sudo pcs cluster reload corosync"; done
  4. 나머지 노드 중 하나에 로그인하고 crm_node 명령을 사용하여 클러스터에서 노드를 삭제합니다.

    (undercloud) $ ssh heat-admin@192.168.0.47
    [heat-admin@overcloud-controller-0 ~]$ sudo crm_node -R overcloud-controller-1 --force
  5. 오버클라우드 데이터베이스는 교체 절차 중 계속 실행되고 있어야 합니다. 이 절차 중에 Pacemaker에서 Galera를 중지하지 않도록 하려면 실행 중인 컨트롤러 노드를 선택하고, 언더클라우드에서 컨트롤러 노드의 IP 주소를 사용하여 다음 명령을 실행합니다.

    (undercloud) $ ssh heat-admin@192.168.0.47 "sudo pcs resource unmanage galera-bundle"

12.4. 컨트롤러 노드 교체

컨트롤러 노드를 교체하려면, 교체할 노드의 인덱스를 확인하십시오.

  • 노드가 가상 노드인 경우 오류가 발생한 디스크를 포함하는 노드를 확인하고 백업에서 디스크를 복원합니다. 오류가 발생한 서버에서 PXE 부팅에 사용되는 NIC의 MAC 주소가 디스크 교체 후에도 동일하게 유지되는지 확인합니다.
  • 노드가 Bare Metal 노드인 경우 디스크를 교체하고, 오버클라우드 구성을 사용하여 새 디스크를 준비한 후 새 하드웨어에서 노드 인트로스펙션을 수행합니다.

다음 명령을 수행하여 overcloud-controller-1 노드를 overcloud-controller-3 노드로 교체합니다. overcloud-controller-3 노드의 ID는 75b25e9a-948d-424a-9b3b-f0ef70a6eacf입니다.

중요

노드를 기존 ironic 노드로 교체하려면 director가 노드를 자동으로 프로비저닝하지 않도록 발신 노드에서 유지보수 모드를 활성화하십시오.

절차

  1. stackrc 파일을 소싱합니다.

    $ source ~/stackrc
  2. overcloud-controller-1 노드의 인덱스를 확인합니다.

    $ INSTANCE=$(openstack server list --name overcloud-controller-1 -f value -c ID)
  3. 인스턴스와 연결된 Bare Metal 노드를 확인합니다.

    $ NODE=$(openstack baremetal node list -f csv --quote minimal | grep $INSTANCE | cut -f1 -d,)
  4. 노드를 유지보수 모드로 설정합니다.

    $ openstack baremetal node maintenance set $NODE
  5. 컨트롤러 노드가 가상 노드인 경우 컨트롤러 호스트에서 다음 명령을 실행하여 백업에 있는 가상 디스크를 교체합니다.

    $ cp <VIRTUAL_DISK_BACKUP> /var/lib/libvirt/images/<VIRTUAL_DISK>

    <VIRTUAL_DISK_BACKUP>을 오류가 발생한 가상 디스크의 백업 경로로 교체하고, <VIRTUAL_DISK>를 교체할 가상 디스크 이름으로 교체합니다.

    발신 노드 백업이 없는 경우 가상화된 노드를 사용해야 합니다.

    컨트롤러 노드가 Bare Metal 노드인 경우 다음 단계를 수행하여 디스크를 새 Bare Metal 디스크로 교체합니다.

    1. 물리 하드 드라이브 또는 솔리드 스테이트 드라이브를 교체합니다.
    2. 오류가 발생한 노드와 동일한 구성으로 노드를 준비합니다.
  6. 연결되지 않은 노드를 나열하고 새 노드의 ID를 확인합니다.

    $ openstack baremetal node list --unassociated
  7. 새 노드를 control 프로필로 태그 지정합니다.

    (undercloud) $ openstack baremetal node set --property capabilities='profile:control,boot_option:local' 75b25e9a-948d-424a-9b3b-f0ef70a6eacf

12.5. 컨트롤러 노드 교체 트리거

컨트롤러 노드를 제거하고 새 컨트롤러 노드로 교체하려면 다음 단계를 수행합니다.

절차

  1. 제거할 노드 인덱스를 정의하는 환경 파일(~/templates/remove-controller.yaml)을 생성합니다.

    parameters:
      ControllerRemovalPolicies:
        [{'resource_list': ['1']}]
  2. remove-controller.yaml 환경 파일과 함께 해당 환경과 관련된 기타 환경 파일을 포함하여 오버클라우드 배포 명령을 실행합니다.

    (undercloud) $ openstack overcloud deploy --templates \
        -e /home/stack/templates/remove-controller.yaml \
        -e /home/stack/templates/node-info.yaml \
        [OTHER OPTIONS]
    참고

    배포 명령의 이 인스턴스에만 -e ~/templates/remove-controller.yaml을 포함합니다. 이어지는 배포 작업에서는 이 환경 파일을 제거합니다.

  3. director에서 기존 노드를 제거하고, 새 노드를 생성한 후 오버클라우드 스택을 업데이트합니다. 다음 명령을 사용하여 오버클라우드 스택의 상태를 확인할 수 있습니다.

    (undercloud) $ openstack stack list --nested
  4. 배포 명령을 완료하면 director에 새 노드로 교체된 기존 노드가 표시됩니다.

    (undercloud) $ openstack server list -c Name -c Networks
    +------------------------+-----------------------+
    | Name                   | Networks              |
    +------------------------+-----------------------+
    | overcloud-compute-0    | ctlplane=192.168.0.44 |
    | overcloud-controller-0 | ctlplane=192.168.0.47 |
    | overcloud-controller-2 | ctlplane=192.168.0.46 |
    | overcloud-controller-3 | ctlplane=192.168.0.48 |
    +------------------------+-----------------------+

    이제 새 노드에서 컨트롤 플레인 서비스를 실행합니다.

12.6. 컨트롤러 노드 교체 후 정리

노드 교체를 완료한 후에는 다음 단계를 수행하여 컨트롤러 클러스터를 종료합니다.

절차

  1. 새 컨트롤러 노드에 로그인합니다.
  2. Galera 클러스터의 Pacemaker 관리를 활성화하고 새 노드에서 Galera를 시작합니다.

    [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource refresh galera-bundle
    [heat-admin@overcloud-controller-0 ~]$ sudo pcs resource manage galera-bundle
  3. 최종 상태 검사를 수행하여 서비스가 올바르게 실행 중인지 확인합니다.

    [heat-admin@overcloud-controller-0 ~]$ sudo pcs status
    참고

    서비스가 실패한 경우 pcs resource refresh 명령을 사용하여 문제를 해결한 후 실패한 서비스를 다시 시작합니다.

  4. director를 종료합니다.

    [heat-admin@overcloud-controller-0 ~]$ exit
  5. 오버클라우드와 상호 작용할 수 있도록 source 명령으로 overcloudrc 파일을 로드합니다.

    $ source ~/overcloudrc
  6. 오버클라우드 환경의 네트워크 에이전트를 확인합니다.

    (overcloud) $ openstack network agent list
  7. 기존 노드의 에이전트가 표시되는 경우 이를 제거합니다.

    (overcloud) $ for AGENT in $(openstack network agent list --host overcloud-controller-1.localdomain -c ID -f value) ; do openstack network agent delete $AGENT ; done
  8. 필요한 경우 새 노드의 L3 에이전트에 호스팅 라우터를 추가합니다. 다음 예제 명령과 UUID 2d1c1dc1-d9d4-4fa9-b2c8-f29cd1a649d4를 사용하여 호스팅 라우터 r1을 L3 에이전트에 추가합니다.

    (overcloud) $ openstack network agent add router --l3 2d1c1dc1-d9d4-4fa9-b2c8-f29cd1a649d4 r1
  9. 제거된 노드의 Compute 서비스가 여전히 오버클라우드에 있으므로 제거해야 합니다. Compute 서비스에서 제거된 노드가 있는지 확인합니다.

    [stack@director ~]$ source ~/overcloudrc
    (overcloud) $ openstack compute service list --host overcloud-controller-1.localdomain
  10. 삭제된 노드의 Compute 서비스를 제거합니다.

    (overcloud) $ for SERVICE in $(openstack compute service list --host overcloud-controller-1.localdomain -c ID -f value ) ; do openstack compute service delete $SERVICE ; done