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
디렉터리를 백업하십시오.
프로시저
각 마스터 노드에서 다음 단계를 수행해야 합니다.
- 여기에 있는 포드 정의의 백업을 생성하십시오.
마스터 호스트 구성 파일의 백업을 생성하십시오.
$ 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 노드 확장 작업에 필요하며, 원래 마스터를 영구적으로 사용할 수 없게 되는 경우 다른 마스터 노드에 복원해야 합니다. 이러한 디렉터리는 기본적으로 여기에 설명된 백업 프로시저에 포함됩니다.백업을 계획할 때 고려해야 할 다른 중요한 파일은 다음과 같습니다.
파일
설명
/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/
패키지가 실수로 제거되었거나
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
이전 단계를 수행했다면 백업 디렉터리에 다음 파일이 있습니다.
$ 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 데이터 저장소를 백업하십시오.
정적 포드 매니페스트에서 etcd 끝점 IP 주소를 확보하십시오.
$ export ETCD_POD_MANIFEST="/etc/origin/node/pods/etcd.yaml"
$ export ETCD_EP=$(grep https ${ETCD_POD_MANIFEST} | cut -d '/' -f3)
관리자로 로그인합니다.
$ oc login -u system:admin
etcd 포드 이름을 확보하십시오.
$ export ETCD_POD=$(oc get pods -n kube-system | grep -o -m 1 '^master-etcd\S*')
kube-system
프로젝트로 변경합니다.$ oc project kube-system
포드에서 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
어플라이언스를 사용하는 경우 해당하는 제품 문서를 참조하여 마스터가 순환 사용되지 않게 제거하십시오.
프로시저
/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
그런 다음
haproxy
서비스를 다시 시작하십시오.$ sudo systemctl restart haproxy
마스터가 로드 밸런서에서 제거되면 정적 포드 디렉터리 /etc/origin/node/pods에서 정의 파일을 이동하여 API와 컨트롤러 서비스를 비활성화하십시오.
# mkdir -p /etc/origin/node/pods/disabled # mv /etc/origin/node/pods/controller.yaml /etc/origin/node/pods/disabled/: +
- 마스터 호스트는 스케줄링 가능한 OpenShift 컨테이너 플랫폼 노드이므로 노드 호스트 사용 중단 섹션의 단계를 따르십시오.
/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 호스트 마스터를 사용 중단하는 경우 다른 마스터 노드에 복원해야 합니다.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 호스트에 장애가 발생하면 클러스터에서 제거하십시오.
모든 마스터 호스트에서 수행할 단계
프로시저
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>
모든 마스터에서 마스터 API 서비스를 다시 시작하십시오.
# master-restart api restart-master controller
현재 etcd 클러스터에서 수행할 단계
프로시저
클러스터에서 실패한 호스트를 제거하십시오.
# 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가 필요합니다.
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 서비스를 다시 시작할 필요가 없습니다.클러스터의 현재 상태를 반영하고 플레이북을 다시 실행할 때 문제가 발생하지 않도록 Ansible 인벤토리 파일을 수정하십시오.
[OSEv3:children] masters nodes etcd ... [OUTPUT ABBREVIATED] ... [etcd] master-0.example.com master-1.example.com
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
flanneld
서비스를 다시 시작하십시오.# systemctl restart flanneld.service