Red Hat Training

A Red Hat training course is available for OpenShift Container Platform

3.6.2. 새 etcd 호스트 수동 추가

마스터 노드에서 etcd를 정적 포드로 실행하지 않으면 다른 etcd 호스트를 추가해야 할 수도 있습니다.

프로시저
현재 etcd 클러스터 수정

etcd 인증서를 생성하려면 값을 사용자 환경의 값으로 교체하여 openssl 명령을 실행하십시오.

  1. 다음과 같이 일부 환경 변수를 생성하십시오.

    export NEW_ETCD_HOSTNAME="*etcd0.example.com*"
    export NEW_ETCD_IP="192.168.55.21"
    
    export CN=$NEW_ETCD_HOSTNAME
    export SAN="IP:${NEW_ETCD_IP}, DNS:${NEW_ETCD_HOSTNAME}"
    export PREFIX="/etc/etcd/generated_certs/etcd-$CN/"
    export OPENSSLCFG="/etc/etcd/ca/openssl.cnf"
    참고

    etcd_v3_ca_*로 사용되는 사용자 정의 openssl 확장에는 $SAN 환경 변수가 subjectAltName으로 포함됩니다. 자세한 내용은 /etc/etcd/ca/openssl.cnf를 참조하십시오.

  2. 구성 및 인증서를 저장할 디렉터리를 생성하십시오.

    # mkdir -p ${PREFIX}
  3. 서버 인증서 요청을 생성하고 서명하십시오(server.csrserver.crt).

    # openssl req -new -config ${OPENSSLCFG} \
        -keyout ${PREFIX}server.key  \
        -out ${PREFIX}server.csr \
        -reqexts etcd_v3_req -batch -nodes \
        -subj /CN=$CN
    
    # openssl ca -name etcd_ca -config ${OPENSSLCFG} \
        -out ${PREFIX}server.crt \
        -in ${PREFIX}server.csr \
        -extensions etcd_v3_ca_server -batch
  4. 피어 인증서 요청을 생성하고 서명하십시오(peer.csrpeer.crt).

    # openssl req -new -config ${OPENSSLCFG} \
        -keyout ${PREFIX}peer.key \
        -out ${PREFIX}peer.csr \
        -reqexts etcd_v3_req -batch -nodes \
        -subj /CN=$CN
    
    # openssl ca -name etcd_ca -config ${OPENSSLCFG} \
      -out ${PREFIX}peer.crt \
      -in ${PREFIX}peer.csr \
      -extensions etcd_v3_ca_peer -batch
  5. 나중에 수정하기 위해 현재 노드의 현재 etcd 구성 및 ca.crt 파일을 예제로 복사하십시오.

    # cp /etc/etcd/etcd.conf ${PREFIX}
    # cp /etc/etcd/ca.crt ${PREFIX}
  6. 아직 남아 있는 etcd 호스트에서 새 호스트를 클러스터에 추가하십시오. 클러스터에 etcd 멤버를 추가하려면 먼저 첫 번째 멤버의 peerURLs 값에서 기본 localhost 피어를 조정해야 합니다.

    1. member list 명령을 사용하여 첫 번째 멤버의 멤버 ID를 가져오십시오.

      # etcdctl --cert-file=/etc/etcd/peer.crt \
          --key-file=/etc/etcd/peer.key \
          --ca-file=/etc/etcd/ca.crt \
          --peers="https://172.18.1.18:2379,https://172.18.9.202:2379,https://172.18.0.75:2379" \ 1
          member list
      1
      --peers 매개변수 값에 활성 etcd 멤버의 URL만 지정하십시오.
    2. etcd가 클러스터 피어를 청취하는 IP 주소를 확보하십시오.

      $ ss -l4n | grep 2380
    3. 멤버 ID와 이전 단계에서 얻은 IP 주소를 전달하여 etcdctl member update 명령으로 peerURLs의 값을 업데이트하십시오.

      # etcdctl --cert-file=/etc/etcd/peer.crt \
          --key-file=/etc/etcd/peer.key \
          --ca-file=/etc/etcd/ca.crt \
          --peers="https://172.18.1.18:2379,https://172.18.9.202:2379,https://172.18.0.75:2379" \
          member update 511b7fb6cc0001 https://172.18.1.18:2380
    4. member list 명령을 다시 실행하고 피어 URL에 더 이상 localhost가 포함되지 않도록 하십시오.
  7. 새 호스트를 etcd 클러스터에 추가하십시오. 새 호스트는 아직 구성되지 않았으므로 새 호스트를 구성할 때까지 상태는 unstarted로 남아 있습니다.

    주의

    각 멤버를 추가하고 한 번에 하나씩 온라인 상태로 만들어야 합니다. 각 멤버를 클러스터에 추가할 때 현재 피어의 peerURL 목록을 조정해야 합니다. peerURL 목록은 각 멤버가 추가될 때마다 하나씩 늘어납니다. etcdctl member add 명령은 다음 지침에 설명된 대로 각 멤버를 추가할 때 etcd.conf 파일에 설정해야 하는 값을 출력합니다.

    # etcdctl -C https://${CURRENT_ETCD_HOST}:2379 \
      --ca-file=/etc/etcd/ca.crt     \
      --cert-file=/etc/etcd/peer.crt     \
      --key-file=/etc/etcd/peer.key member add ${NEW_ETCD_HOSTNAME} https://${NEW_ETCD_IP}:2380 1
    
    Added member named 10.3.9.222 with ID 4e1db163a21d7651 to cluster
    
    ETCD_NAME="<NEW_ETCD_HOSTNAME>"
    ETCD_INITIAL_CLUSTER="<NEW_ETCD_HOSTNAME>=https://<NEW_HOST_IP>:2380,<CLUSTERMEMBER1_NAME>=https:/<CLUSTERMEMBER2_IP>:2380,<CLUSTERMEMBER2_NAME>=https:/<CLUSTERMEMBER2_IP>:2380,<CLUSTERMEMBER3_NAME>=https:/<CLUSTERMEMBER3_IP>:2380"
    ETCD_INITIAL_CLUSTER_STATE="existing"
    1
    이 라인에서 10.3.9.222는 etcd 멤버의 레이블입니다. 호스트 이름, IP 주소 또는 간단한 이름을 지정할 수 있습니다.
  8. 샘플 ${PREFIX}/etcd.conf 파일을 업데이트하십시오.

    1. 다음 값을 이전 단계에서 생성된 값으로 교체하십시오.

      • ETCD_NAME
      • ETCD_INITIAL_CLUSTER
      • ETCD_INITIAL_CLUSTER_STATE
    2. 이전 단계의 출력에서 얻은 새 호스트 IP로 다음 변수를 수정하십시오. ${NEW_ETCD_IP}를 값으로 사용할 수 있습니다.

      ETCD_LISTEN_PEER_URLS
      ETCD_LISTEN_CLIENT_URLS
      ETCD_INITIAL_ADVERTISE_PEER_URLS
      ETCD_ADVERTISE_CLIENT_URLS
    3. 이전에 멤버 시스템을 etcd 노드로 사용한 경우 /etc/etcd/etcd.conf 파일에서 현재 값을 덮어써야 합니다.
    4. 구문 오류 또는 누락된 IP 주소가 있는지 파일을 확인하십시오. 그렇지 않으면 etcd 서비스가 실패할 수 있습니다.

      # vi ${PREFIX}/etcd.conf
  9. 설치 파일을 호스팅하는 노드에서 /etc/ansible/hosts 인벤토리 파일의 [etcd] 호스트 그룹을 업데이트하십시오. 이전 etcd 호스트를 제거하고 새 호스트를 추가하십시오.
  10. 인증서, 샘플 구성 파일 및 ca가 포함된 tgz 파일을 생성하여 새 호스트에 복사하십시오.

    # tar -czvf /etc/etcd/generated_certs/${CN}.tgz -C ${PREFIX} .
    # scp /etc/etcd/generated_certs/${CN}.tgz ${CN}:/tmp/
새 etcd 호스트 수정
  1. iptables-services를 설치하여 etcd의 필수 포트를 여는 iptables 유틸리티를 제공하십시오.

    # yum install -y iptables-services
  2. etcd가 통신할 수 있도록 OS_FIREWALL_ALLOW 방화벽 규칙을 생성하십시오.

    • 클라이언트용 2379/tcp 포트
    • 피어 통신용 2380/tcp 포트

      # systemctl enable iptables.service --now
      # iptables -N OS_FIREWALL_ALLOW
      # iptables -t filter -I INPUT -j OS_FIREWALL_ALLOW
      # iptables -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 2379 -j ACCEPT
      # iptables -A OS_FIREWALL_ALLOW -p tcp -m state --state NEW -m tcp --dport 2380 -j ACCEPT
      # iptables-save | tee /etc/sysconfig/iptables
      참고

      이 예에서는 새 체인 OS_FIREWALL_ALLOW가 생성되는데, 이는 OpenShift Container Platform 설치 프로그램이 방화벽 규칙에 사용하는 표준 이름입니다.

      주의

      IaaS 환경에서 사용자 환경을 호스팅하는 경우 해당 포트로 들어오는 트래픽도 허용하도록 인스턴스의 보안 그룹을 수정하십시오.

  3. etcd를 설치하십시오.

    # yum install -y etcd

    버전 etcd-2.3.7-4.el7.x86_64 이상이 설치되어 있는지 확인하십시오.

  4. etcd 포드 정의를 제거하여 etcd 서비스가 실행 중이지 않은지 확인하십시오.

    # mkdir -p /etc/origin/node/pods-stopped
    # mv /etc/origin/node/pods/* /etc/origin/node/pods-stopped/
  5. etcd 구성 및 데이터를 제거하십시오.

    # rm -Rf /etc/etcd/*
    # rm -Rf /var/lib/etcd/*
  6. 인증서 및 구성 파일을 추출하십시오.

    # tar xzvf /tmp/etcd0.example.com.tgz -C /etc/etcd/
  7. 새 호스트에서 etcd를 시작하십시오.

    # systemctl enable etcd --now
  8. 호스트가 클러스터의 일부인지 확인하고 현재 클러스터 상태를 점검하십시오.

    • v2 etcd API를 사용하는 경우 다음 명령을 실행하십시오.

      # etcdctl --cert-file=/etc/etcd/peer.crt \
                --key-file=/etc/etcd/peer.key \
                --ca-file=/etc/etcd/ca.crt \
                --peers="https://*master-0.example.com*:2379,\
                https://*master-1.example.com*:2379,\
                https://*master-2.example.com*:2379,\
                https://*etcd0.example.com*:2379"\
                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 8b8904727bf526a5 is healthy: got healthy result from https://192.168.55.21:2379
      member ed4f0efd277d7599 is healthy: got healthy result from https://192.168.55.13:2379
      cluster is healthy
    • v3 etcd API를 사용하는 경우 다음 명령을 실행하십시오.

      # ETCDCTL_API=3 etcdctl --cert="/etc/etcd/peer.crt" \
                --key=/etc/etcd/peer.key \
                --cacert="/etc/etcd/ca.crt" \
                --endpoints="https://*master-0.example.com*:2379,\
                  https://*master-1.example.com*:2379,\
                  https://*master-2.example.com*:2379,\
                  https://*etcd0.example.com*:2379"\
                  endpoint health
      https://master-0.example.com:2379 is healthy: successfully committed proposal: took = 5.011358ms
      https://master-1.example.com:2379 is healthy: successfully committed proposal: took = 1.305173ms
      https://master-2.example.com:2379 is healthy: successfully committed proposal: took = 1.388772ms
      https://etcd0.example.com:2379 is healthy: successfully committed proposal: took = 1.498829ms
각 OpenShift Container Platform 마스터 수정
  1. 모든 마스터에서 /etc/origin/master/master-config.yaml 파일의 etcClientInfo 섹션에서 마스터 구성을 수정하십시오. OpenShift Container Platform에서 데이터를 저장하는 데 사용하는 etcd 서버 목록에 새 etcd 호스트를 추가하고 실패한 etcd 호스트를 제거하십시오.

    etcdClientInfo:
      ca: master.etcd-ca.crt
      certFile: master.etcd-client.crt
      keyFile: master.etcd-client.key
      urls:
        - https://master-0.example.com:2379
        - https://master-1.example.com:2379
        - https://master-2.example.com:2379
        - https://etcd0.example.com:2379
  2. 마스터 API 서비스를 다시 시작하십시오.

    • 모든 마스터에서 다음을 수행하십시오.

      # master-restart api
      # master-restart controllers
      주의

      etcd 노드의 수는 홀수여야 하므로 2개 이상의 호스트를 추가해야 합니다.

  3. Flannel을 사용하는 경우 새 etcd 호스트를 포함하도록 모든 OpenShift Container Platform 호스트에서 /etc/sysconfig/flanneld에 있는 flanneld 서비스 구성을 수정하십시오.

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

    # systemctl restart flanneld.service