5.2. 마스터 호스트 작업


5.2.1. 마스터 호스트 사용 중단

마스터 호스트를 사용 중단하면 OpenShift Container Platform 환경에서 마스터 호스트가 제거됩니다.

마스터 호스트를 사용 중단 또는 축소하는 이유는 기본 인프라의 하드웨어 크기를 조정하거나 교체하기 위해서입니다.

고가용성 OpenShift Container Platform 환경에는 최소 3개의 마스터 호스트와 3개의 etcd 노드가 필요합니다. 일반적으로 마스터 호스트는 etcd 서비스와 함께 배치됩니다. 마스터 호스트를 사용 중단하면 해당 호스트에서 etcd 정적 포드도 제거됩니다.

중요

해당 서비스에서 수행되는 투표 메커니즘 때문에 마스터 및 etcd 서비스가 항상 홀수로 배포되게 해야 합니다.

5.2.1.1. 마스터 호스트 백업 생성

시스템 업데이트, 업그레이드 또는 기타 중요한 수정 등 OpenShift Container Platform 인프라를 변경하기 전에 이 백업 프로세스를 수행하십시오. 장애가 발생할 경우 최신 데이터를 사용할 수 있도록 데이터를 정기적으로 백업하십시오.

OpenShift Container Platform 파일

마스터 인스턴스는 API, 컨트롤러와 같은 중요한 서비스를 실행합니다. /etc/origin/master 디렉터리에서는 다음과 같은 여러 중요한 파일을 저장합니다.

  • 구성, API, 컨트롤러, 서비스 등
  • 설치를 통해 생성된 인증서
  • 모든 클라우드 공급자 관련 구성
  • 키 및 기타 인증 파일(예: htpasswd를 사용하는 경우 htpasswd)
  • 기타 등등

로그 레벨 증가 또는 프록시 사용과 같은 OpenShift Container Platform 서비스를 사용자 정의할 수 있습니다. 구성 파일은 /etc/sysconfig 디렉터리에 저장됩니다.

마스터도 노드이므로 전체 /etc/origin 디렉터리를 백업하십시오.

프로시저
중요

각 마스터 노드에서 다음 단계를 수행해야 합니다.

  1. 여기에 있는 포드 정의의 백업을 생성하십시오.
  2. 마스터 호스트 구성 파일의 백업을 생성하십시오.

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo mkdir -p ${MYBACKUPDIR}/etc/sysconfig
    $ sudo cp -aR /etc/origin ${MYBACKUPDIR}/etc
    $ sudo cp -aR /etc/sysconfig/ ${MYBACKUPDIR}/etc/sysconfig/
    참고

    마스터 구성 파일은 /etc/origin/master/master-config.yaml입니다.

    주의

    /etc/origin/master/ca.serial.txt 파일은 Ansible 호스트 인벤토리에 나열된 첫 번째 마스터에서만 생성됩니다. 첫 번째 마스터 호스트를 더 이상 사용하지 않는 경우 프로세스 전에 /etc/origin/master/ca.serial.txt 파일을 나머지 마스터 호스트에 복사하십시오.

    중요

    여러 마스터를 실행하는 OpenShift Container Platform 3.11 클러스터에서는 마스터 노드 중 하나의 /etc/origin/master, /etc/etcd/ca/etc/etcd/generated_certs에 추가 CA 인증서가 들어 있습니다. 이러한 인증서는 애플리케이션 노드와 etcd 노드 확장 작업에 필요하며, 원래 마스터를 영구적으로 사용할 수 없게 되는 경우 다른 마스터 노드에 복원해야 합니다. 이러한 디렉터리는 기본적으로 여기에 설명된 백업 프로시저에 포함됩니다.

  3. 백업을 계획할 때 고려해야 할 다른 중요한 파일은 다음과 같습니다.

    파일

    설명

    /etc/cni/*

    컨테이너 네트워크 인터페이스 구성(사용된 경우)

    /etc/sysconfig/iptables

    iptables 규칙의 저장 위치

    /etc/sysconfig/docker-storage-setup

    container-storage-setup 명령의 입력 파일

    /etc/sysconfig/docker

    docker 구성 파일

    /etc/sysconfig/docker-network

    docker 네트워킹 구성(예: MTU)

    /etc/sysconfig/docker-storage

    docker 스토리지 구성(container-storage-setup으로 생성)

    /etc/dnsmasq.conf

    dnsmasq의 기본 구성 파일

    /etc/dnsmasq.d/*

    다른 dnsmasq 구성 파일

    /etc/sysconfig/flanneld

    flannel 구성 파일(사용된 경우)

    /etc/pki/ca-trust/source/anchors/

    시스템에 추가된 인증서(예: 외부 레지스트리용)

    다음 파일의 백업을 생성하십시오.

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo mkdir -p ${MYBACKUPDIR}/etc/sysconfig
    $ sudo mkdir -p ${MYBACKUPDIR}/etc/pki/ca-trust/source/anchors
    $ sudo cp -aR /etc/sysconfig/{iptables,docker-*,flanneld} \
        ${MYBACKUPDIR}/etc/sysconfig/
    $ sudo cp -aR /etc/dnsmasq* /etc/cni ${MYBACKUPDIR}/etc/
    $ sudo cp -aR /etc/pki/ca-trust/source/anchors/* \
        ${MYBACKUPDIR}/etc/pki/ca-trust/source/anchors/
  4. 패키지가 실수로 제거되었거나 rpm 패키지에 포함된 파일을 복원해야 하는 경우 시스템에 rhel 패키지 목록이 설치되어 있으면 유용할 수 있습니다.

    참고

    콘텐츠 뷰 또는 사실 저장소와 같은 Red Hat Satellite 기능을 사용하는 경우 누락된 패키지 및 시스템에 설치된 패키지의 히스토리 데이터를 다시 설치하는 적절한 메커니즘을 제공하십시오.

    시스템에 설치된 현재 rhel 패키지 목록을 작성하려면 다음을 수행하십시오.

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo mkdir -p ${MYBACKUPDIR}
    $ rpm -qa | sort | sudo tee $MYBACKUPDIR/packages.txt
  5. 이전 단계를 수행했다면 백업 디렉터리에 다음 파일이 있습니다.

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo find ${MYBACKUPDIR} -mindepth 1 -type f -printf '%P\n'
    etc/sysconfig/flanneld
    etc/sysconfig/iptables
    etc/sysconfig/docker-network
    etc/sysconfig/docker-storage
    etc/sysconfig/docker-storage-setup
    etc/sysconfig/docker-storage-setup.rpmnew
    etc/origin/master/ca.crt
    etc/origin/master/ca.key
    etc/origin/master/ca.serial.txt
    etc/origin/master/ca-bundle.crt
    etc/origin/master/master.proxy-client.crt
    etc/origin/master/master.proxy-client.key
    etc/origin/master/service-signer.crt
    etc/origin/master/service-signer.key
    etc/origin/master/serviceaccounts.private.key
    etc/origin/master/serviceaccounts.public.key
    etc/origin/master/openshift-master.crt
    etc/origin/master/openshift-master.key
    etc/origin/master/openshift-master.kubeconfig
    etc/origin/master/master.server.crt
    etc/origin/master/master.server.key
    etc/origin/master/master.kubelet-client.crt
    etc/origin/master/master.kubelet-client.key
    etc/origin/master/admin.crt
    etc/origin/master/admin.key
    etc/origin/master/admin.kubeconfig
    etc/origin/master/etcd.server.crt
    etc/origin/master/etcd.server.key
    etc/origin/master/master.etcd-client.key
    etc/origin/master/master.etcd-client.csr
    etc/origin/master/master.etcd-client.crt
    etc/origin/master/master.etcd-ca.crt
    etc/origin/master/policy.json
    etc/origin/master/scheduler.json
    etc/origin/master/htpasswd
    etc/origin/master/session-secrets.yaml
    etc/origin/master/openshift-router.crt
    etc/origin/master/openshift-router.key
    etc/origin/master/registry.crt
    etc/origin/master/registry.key
    etc/origin/master/master-config.yaml
    etc/origin/generated-configs/master-master-1.example.com/master.server.crt
    ...[OUTPUT OMITTED]...
    etc/origin/cloudprovider/openstack.conf
    etc/origin/node/system:node:master-0.example.com.crt
    etc/origin/node/system:node:master-0.example.com.key
    etc/origin/node/ca.crt
    etc/origin/node/system:node:master-0.example.com.kubeconfig
    etc/origin/node/server.crt
    etc/origin/node/server.key
    etc/origin/node/node-dnsmasq.conf
    etc/origin/node/resolv.conf
    etc/origin/node/node-config.yaml
    etc/origin/node/flannel.etcd-client.key
    etc/origin/node/flannel.etcd-client.csr
    etc/origin/node/flannel.etcd-client.crt
    etc/origin/node/flannel.etcd-ca.crt
    etc/pki/ca-trust/source/anchors/openshift-ca.crt
    etc/pki/ca-trust/source/anchors/registry-ca.crt
    etc/dnsmasq.conf
    etc/dnsmasq.d/origin-dns.conf
    etc/dnsmasq.d/origin-upstream-dns.conf
    etc/dnsmasq.d/node-dnsmasq.conf
    packages.txt

    필요한 경우 파일을 압축하여 공간을 절약할 수 있습니다.

    $ MYBACKUPDIR=/backup/$(hostname)/$(date +%Y%m%d)
    $ sudo tar -zcvf /backup/$(hostname)-$(date +%Y%m%d).tar.gz $MYBACKUPDIR
    $ sudo rm -Rf ${MYBACKUPDIR}

이러한 파일을 처음부터 새로 생성할 수 있도록 openshift-ansible-contrib 리포지토리에는 이전 단계를 수행하는 backup_master_node.sh 스크립트가 포함되어 있습니다. 이 스크립트는 스크립트를 실행하는 호스트에 디렉터리를 생성하고 앞서 언급된 모든 파일을 복사합니다.

참고

Openshift-ansible-contrib 스크립트는 Red Hat에서 지원되지 않지만, 코드가 정의된 대로 작동하고 안전한지 참조 아키텍처 팀에서 테스트합니다.

다음을 사용하여 모든 마스터 호스트에서 이 스크립트를 실행할 수 있습니다.

$ mkdir ~/git
$ cd ~/git
$ git clone https://github.com/openshift/openshift-ansible-contrib.git
$ cd openshift-ansible-contrib/reference-architecture/day2ops/scripts
$ ./backup_master_node.sh -h

5.2.1.2. etcd 백업

etcd를 백업할 때 etcd 구성 파일과 etcd 데이터를 둘 다 백업해야 합니다.

5.2.1.2.1. etcd 구성 파일 백업

보존할 etcd 구성 파일은 모두 etcd가 실행 중인 인스턴스의 /etc/etcd 디렉터리에 저장됩니다. 여기에는 etcd 구성 파일(/etc/etcd/etcd.conf)과 클러스터 통신에 필요한 인증서가 포함됩니다. 이러한 모든 파일은 Ansible 설치 프로그램에서 설치 시 생성됩니다.

프로시저

클러스터의 etcd 멤버마다 etcd 구성을 백업하십시오.

$ ssh master-0 1
# mkdir -p /backup/etcd-config-$(date +%Y%m%d)/
# cp -R /etc/etcd/ /backup/etcd-config-$(date +%Y%m%d)/
1
master-0 을 etcd 멤버의 이름으로 바꿉니다.
참고

각 etcd 클러스터 멤버의 인증서 및 구성 파일은 고유합니다.

5.2.1.2.2. etcd 데이터 백업
전제 조건
참고

OpenShift Container Platform 설치 프로그램에서는 별칭을 생성하여 etcd v2 작업의 경우 etcdctl2라는 모든 플래그, etcd v3 작업의 경우 etcdctl3이라는 모든 플래그를 입력하지 않아도 되게 합니다.

그러나 etcdctl3 별칭에서는 etcdctl 명령에 전체 끝점 목록을 제공하지 않으므로, --endpoints 옵션을 지정하고 모든 끝점을 나열해야 합니다.

etcd를 백업하기 전에 다음을 수행하십시오.

  • etcdctl 바이너리가 사용 가능해야 합니다. 컨테이너화된 설치에서는 rhel7/etcd 컨테이너를 사용할 수 있어야 합니다.
  • OpenShift Container Platform API 서비스가 실행 중인지 확인하십시오.
  • etcd 클러스터(2379/tcp 포트)와의 연결을 확인하십시오.
  • etcd 클러스터에 연결하기 위한 적절한 인증서를 확인하십시오.
절차
참고

백업을 수행할 때 etcdctl backup 명령을 사용하지만 etcd v3에는 백업이라는 개념이 없습니다. 대신 etcdctl snapshot save 명령으로 활성 멤버에서 스냅샷을 작성하거나 etcd 데이터 디렉터리에서 member/snap/db 파일을 복사합니다.

etcdctl backup 명령을 실행하면 백업에 포함된 일부 메타데이터, 특히 노드 ID 및 클러스터 ID가 다시 작성됩니다. 즉, 백업에서 노드의 이전 ID가 손실됩니다. 백업에서 클러스터를 다시 생성하려면 새로운 단일 노드 클러스터를 생성한 후 나머지 노드를 클러스터에 추가하십시오. 새 노드가 기존 클러스터에 조인하지 못하도록 메타데이터가 다시 작성됩니다.

etcd 데이터를 백업하십시오.

중요

이전 버전의 OpenShift Container Platform에서 업그레이드된 클러스터에는 v2 데이터 저장소가 포함될 수 있습니다. 모든 etcd 데이터 저장소를 백업하십시오.

  1. 정적 포드 매니페스트에서 etcd 끝점 IP 주소를 확보하십시오.

    $ export ETCD_POD_MANIFEST="/etc/origin/node/pods/etcd.yaml"
    $ export ETCD_EP=$(grep https ${ETCD_POD_MANIFEST} | cut -d '/' -f3)
  2. 관리자로 로그인합니다.

    $ oc login -u system:admin
  3. etcd 포드 이름을 확보하십시오.

    $ export ETCD_POD=$(oc get pods -n kube-system | grep -o -m 1 '^master-etcd\S*')
  4. kube-system 프로젝트로 변경합니다.

    $ oc project kube-system
  5. 포드에서 etcd 데이터의 스냅샷을 작성하여 로컬에 저장하십시오.

    $ oc exec ${ETCD_POD} -c etcd -- /bin/bash -c "ETCDCTL_API=3 etcdctl \
        --cert /etc/etcd/peer.crt \
        --key /etc/etcd/peer.key \
        --cacert /etc/etcd/ca.crt \
        --endpoints $ETCD_EP \
        snapshot save /var/lib/etcd/snapshot.db" 1
    1
    /var/lib/etcd/의 디렉터리에 스냅샷을 써야 합니다.

5.2.1.3. 마스터 호스트 사용 중단

마스터 호스트에서는 OpenShift Container Platform API 및 컨트롤러 서비스와 같은 중요한 서비스를 실행합니다. 마스터 호스트를 사용 중단하려면 이러한 서비스를 중지해야 합니다.

OpenShift Container Platform API 서비스는 활성/활성 서비스이므로, 요청을 별도의 마스터 서버로 보내는 한 서비스를 중지해도 환경에 영향을 미치지 않습니다. 그러나 OpenShift Container Platform 컨트롤러 서비스는 활성/수동 서비스이며, 이 경우 서비스에서 etcd를 사용하여 활성 마스터를 결정합니다.

다중 마스터 아키텍처에서 마스터 호스트를 사용 중단하려면 새로운 연결에서 해당 마스터를 사용하려고 시도하지 않도록 로드 밸런서 풀에서 마스터를 제거해야 합니다. 이 프로세스는 사용 중인 로드 밸런서에 따라 크게 달라집니다. 아래 단계에서는 haproxy에서 마스터를 제거하는 방법을 자세히 보여줍니다. OpenShift Container Platform이 클라우드 공급자에서 실행 중이거나 F5 어플라이언스를 사용하는 경우 해당하는 제품 문서를 참조하여 마스터가 순환 사용되지 않게 제거하십시오.

프로시저
  1. /etc/haproxy/haproxy.cfg 구성 파일에서 backend 섹션을 제거하십시오. 예를 들어 haproxy를 사용하여 master-0.example.com이라는 마스터를 사용 중단하는 경우 호스트 이름이 다음에서 제거되었는지 확인하십시오.

    backend mgmt8443
        balance source
        mode tcp
        # MASTERS 8443
        server master-1.example.com 192.168.55.12:8443 check
        server master-2.example.com 192.168.55.13:8443 check
  2. 그런 다음 haproxy 서비스를 다시 시작하십시오.

    $ sudo systemctl restart haproxy
  3. 마스터가 로드 밸런서에서 제거되면 정적 포드 디렉터리 /etc/origin/node/pods에서 정의 파일을 이동하여 API와 컨트롤러 서비스를 비활성화하십시오.

    # mkdir -p /etc/origin/node/pods/disabled
    # mv /etc/origin/node/pods/controller.yaml /etc/origin/node/pods/disabled/:
    +
  4. 마스터 호스트는 스케줄링 가능한 OpenShift 컨테이너 플랫폼 노드이므로 노드 호스트 사용 중단 섹션의 단계를 따르십시오.
  5. /etc/ansible/hosts Ansible 인벤토리 파일의 [masters][nodes] 그룹에서 마스터 호스트를 제거하여 해당 인벤토리 파일로 Ansible 작업을 실행할 때 문제가 발생하지 않도록 하십시오.

    주의

    Ansible 인벤토리 파일에 나열된 첫 번째 마스터 호스트를 사용 중단하려면 추가 예방 조치가 필요합니다.

    /etc/origin/master/ca.serial.txt 파일은 Ansible 호스트 인벤토리에 나열된 첫 번째 마스터에서만 생성됩니다. 첫 번째 마스터 호스트를 더 이상 사용하지 않는 경우 프로세스 전에 /etc/origin/master/ca.serial.txt 파일을 나머지 마스터 호스트에 복사하십시오.

    중요

    여러 마스터를 실행하는 OpenShift Container Platform 3.11 클러스터에서는 마스터 노드 중 하나의 /etc/origin/master, /etc/etcd/ca/etc/etcd/generated_certs에 추가 CA 인증서가 들어 있습니다. 이 인증서는 애플리케이션 노드 및 etcd 노드 확장 작업에 필요하며, CA 호스트 마스터를 사용 중단하는 경우 다른 마스터 노드에 복원해야 합니다.

  6. kubernetes 서비스에는 마스터 호스트 IP가 끝점으로 포함되어 있습니다. 마스터가 올바르게 사용 중단되었는지 확인하려면 kubernetes 서비스 출력을 검토하여 사용 중단된 마스터가 제거되었는지 확인하십시오.

    $ oc describe svc kubernetes -n default
    Name:			kubernetes
    Namespace:		default
    Labels:			component=apiserver
    			provider=kubernetes
    Annotations:		<none>
    Selector:		<none>
    Type:			ClusterIP
    IP:			10.111.0.1
    Port:			https	443/TCP
    Endpoints:		192.168.55.12:8443,192.168.55.13:8443
    Port:			dns	53/UDP
    Endpoints:		192.168.55.12:8053,192.168.55.13:8053
    Port:			dns-tcp	53/TCP
    Endpoints:		192.168.55.12:8053,192.168.55.13:8053
    Session Affinity:	ClientIP
    Events:			<none>

    마스터가 사용 중단되면 이전에 그 마스터를 실행하던 호스트를 안전하게 삭제할 수 있습니다.

5.2.1.4. etcd 호스트 제거

복원 후 etcd 호스트에 장애가 발생하면 클러스터에서 제거하십시오.

모든 마스터 호스트에서 수행할 단계

프로시저
  1. etcd 클러스터에서 서로 다른 etcd 호스트를 제거하십시오. 각 etcd 노드에 대해 다음 명령을 실행하십시오.

    # etcdctl3 --endpoints=https://<surviving host IP>:2379
      --cacert=/etc/etcd/ca.crt
      --cert=/etc/etcd/peer.crt
      --key=/etc/etcd/peer.key member remove <failed member ID>
  2. 모든 마스터에서 마스터 API 서비스를 다시 시작하십시오.

    # master-restart api restart-master controller

현재 etcd 클러스터에서 수행할 단계

프로시저
  1. 클러스터에서 실패한 호스트를 제거하십시오.

    # etcdctl2 cluster-health
    member 5ee217d19001 is healthy: got healthy result from https://192.168.55.12:2379
    member 2a529ba1840722c0 is healthy: got healthy result from https://192.168.55.8:2379
    failed to check the health of member 8372784203e11288 on https://192.168.55.21:2379: Get https://192.168.55.21:2379/health: dial tcp 192.168.55.21:2379: getsockopt: connection refused
    member 8372784203e11288 is unreachable: [https://192.168.55.21:2379] are all unreachable
    member ed4f0efd277d7599 is healthy: got healthy result from https://192.168.55.13:2379
    cluster is healthy
    
    # etcdctl2 member remove 8372784203e11288 1
    Removed member 8372784203e11288 from cluster
    
    # etcdctl2 cluster-health
    member 5ee217d19001 is healthy: got healthy result from https://192.168.55.12:2379
    member 2a529ba1840722c0 is healthy: got healthy result from https://192.168.55.8:2379
    member ed4f0efd277d7599 is healthy: got healthy result from https://192.168.55.13:2379
    cluster is healthy
    1
    remove 명령에는 호스트 이름이 아니라 etcd ID가 필요합니다.
  2. etcd 서비스를 다시 시작할 때 etcd 구성이 실패한 호스트를 사용하지 않게 하려면 나머지 모든 etcd 호스트에서 /etc/etcd/etcd.conf 파일을 수정하고 ETCD_INITIAL_CLUSTER 변수의 값에서 실패한 호스트를 제거하십시오.

    # vi /etc/etcd/etcd.conf

    예를 들면 다음과 같습니다.

    ETCD_INITIAL_CLUSTER=master-0.example.com=https://192.168.55.8:2380,master-1.example.com=https://192.168.55.12:2380,master-2.example.com=https://192.168.55.13:2380

    이는 다음이 됩니다.

    ETCD_INITIAL_CLUSTER=master-0.example.com=https://192.168.55.8:2380,master-1.example.com=https://192.168.55.12:2380
    참고

    실패한 호스트는 etcdctl을 사용하여 제거되므로 etcd 서비스를 다시 시작할 필요가 없습니다.

  3. 클러스터의 현재 상태를 반영하고 플레이북을 다시 실행할 때 문제가 발생하지 않도록 Ansible 인벤토리 파일을 수정하십시오.

    [OSEv3:children]
    masters
    nodes
    etcd
    
    ... [OUTPUT ABBREVIATED] ...
    
    [etcd]
    master-0.example.com
    master-1.example.com
  4. Flannel을 사용하는 경우 모든 호스트에서 /etc/sysconfig/flanneld에 있는 flanneld 서비스 구성을 수정하고 etcd 호스트를 제거하십시오.

    FLANNEL_ETCD_ENDPOINTS=https://master-0.example.com:2379,https://master-1.example.com:2379,https://master-2.example.com:2379
  5. flanneld 서비스를 다시 시작하십시오.

    # systemctl restart flanneld.service
Red Hat logoGithubRedditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

© 2024 Red Hat, Inc.