4.3. 재해 복구


재해 복구 문서에서는 관리자에게 OpenShift Container Platform 클러스터에서 발생할 수있는 여러 재해 상황을 복구하는 방법에 대한 정보를 제공합니다. 관리자는 클러스터를 작동 상태로 복원하려면 다음 절차 중 하나 이상을 수행해야합니다.

중요

재해 복구를 위해서는 최소한 하나의 정상적인 제어 평면 호스트가 필요합니다.

4.3.1. 정족수 회복

쿼럼 손실로 인해 오프라인이 된 클러스터에서 etcd 쿼럼을 복원하려면 quorum-restore.sh 스크립트를 사용할 수 있습니다. 쿼럼이 손실되면 OpenShift Container Platform API는 읽기 전용이 됩니다. 쿼럼이 복구되면 OpenShift Container Platform API는 읽기/쓰기 모드로 돌아갑니다.

4.3.1.1. 고가용성 클러스터를 위한 etcd 쿼럼 복원

쿼럼 손실로 인해 오프라인이 된 클러스터에서 etcd 쿼럼을 복원하려면 quorum-restore.sh 스크립트를 사용할 수 있습니다. 쿼럼이 손실되면 OpenShift Container Platform API는 읽기 전용이 됩니다. 쿼럼이 복구되면 OpenShift Container Platform API는 읽기/쓰기 모드로 돌아갑니다.

quorum-restore.sh 스크립트는 로컬 데이터 디렉토리를 기반으로 새로운 단일 멤버 etcd 클러스터를 즉시 다시 가져오고 이전 클러스터 식별자를 폐기하여 다른 모든 멤버를 유효하지 않은 것으로 표시합니다. 제어 평면을 복원하는 데 사전 백업이 필요하지 않습니다.

HA(고가용성) 클러스터의 경우 3 노드 HA 클러스터를 종료하여 클러스터 분할을 방지하기 위해 두 호스트에서 etcd를 종료해야 합니다. 4-node 및 5-노드 HA 클러스터에서 호스트 3개를 종료해야 합니다. 쿼럼에는 노드의 단순 과반수가 필요합니다. 3-노드 HA 클러스터에서 쿼럼에 필요한 최소 노드 수는 2개입니다. 4-node 및 5-노드 HA 클러스터에서 쿼럼에 필요한 최소 노드 수는 3개입니다. 복구 호스트에서 백업을 통해 새 클러스터를 시작하면 다른 etcd 멤버가 여전히 쿼럼을 형성하고 서비스를 계속할 수 있습니다.

주의

복원을 실행하는 호스트에 모든 데이터가 복제되지 않은 경우 데이터 손실이 발생할 수 있습니다.

중요

쿼럼 복원은 복원 프로세스 외부에서 노드 수를 줄이는 데 사용되어서는 안 됩니다. 노드 수를 줄이면 지원되지 않는 클러스터 구성이 발생합니다.

사전 요구 사항

  • 쿼럼을 복원하는 데 사용된 노드에 SSH 액세스 권한이 있습니다.

프로세스

  1. 복구 호스트로 사용할 컨트롤 플레인 호스트를 선택합니다. 이 호스트에서 복원 작업을 실행합니다.

    1. 다음 명령을 실행하여 실행 중인 etcd 포드를 나열합니다.

      $ oc get pods -n openshift-etcd -l app=etcd --field-selector="status.phase==Running"
      Copy to Clipboard Toggle word wrap
    2. 포드를 선택하고 다음 명령을 실행하여 IP 주소를 얻습니다.

      $ oc exec -n openshift-etcd <etcd-pod> -c etcdctl -- etcdctl endpoint status -w table
      Copy to Clipboard Toggle word wrap

      학습자가 아니고 Raft 인덱스가 가장 높은 회원의 IP 주소를 기록해 보세요.

    3. 다음 명령을 실행하고 선택한 etcd 멤버의 IP 주소에 해당하는 노드 이름을 기록해 둡니다.

      $ oc get nodes -o jsonpath='{range .items[*]}[{.metadata.name},{.status.addresses[?(@.type=="InternalIP")].address}]{end}'
      Copy to Clipboard Toggle word wrap
  2. SSH를 사용하여 선택한 복구 노드에 연결하고 다음 명령을 실행하여 etcd 쿼럼을 복원합니다.

    $ sudo -E /usr/local/bin/quorum-restore.sh
    Copy to Clipboard Toggle word wrap

    몇 분 후, 다운된 노드는 복구 스크립트가 실행된 노드와 자동으로 동기화됩니다. 남아 있는 온라인 노드는 quorum-restore.sh 스크립트에서 생성된 새 etcd 클러스터에 자동으로 다시 가입합니다. 이 과정은 몇 분 정도 걸립니다.

  3. SSH 세션을 종료합니다.
  4. 노드가 오프라인인 경우 3-노드 구성으로 돌아갑니다. 오프라인인 각 노드에 대해 다음 단계를 반복하여 삭제하고 다시 생성합니다. 머신이 다시 생성된 후 새로운 개정판이 강제로 적용되고 etcd가 자동으로 확장됩니다.

    • 사용자 제공 베어 메탈 설치를 사용하는 경우 원래 생성에 사용한 것과 동일한 방법을 사용하여 제어 평면 머신을 다시 생성할 수 있습니다. 자세한 내용은 "베어메탈에 사용자 프로비저닝 클러스터 설치"를 참조하세요.

      주의

      복구 호스트의 머신을 삭제했다가 다시 생성하지 마세요.

    • 설치 프로그램에서 제공하는 인프라를 실행 중이거나 Machine API를 사용하여 머신을 만든 경우 다음 단계를 따르세요.

      주의

      복구 호스트의 머신을 삭제했다가 다시 생성하지 마세요.

      설치 프로그램이 제공하는 인프라에서 베어 메탈을 설치하는 경우 제어 플레인 머신은 다시 생성되지 않습니다. 자세한 내용은 "베어 메탈 제어 평면 노드 교체"를 참조하세요.

      1. 오프라인 노드 중 하나에 대한 머신을 얻습니다.

        클러스터에 액세스할 수 있는 터미널에서 cluster-admin 사용자로 다음 명령을 실행합니다.

        $ oc get machines -n openshift-machine-api -o wide
        Copy to Clipboard Toggle word wrap

        출력 예

        NAME                                        PHASE     TYPE        REGION      ZONE         AGE     NODE                           PROVIDERID                              STATE
        clustername-8qw5l-master-0                  Running   m4.xlarge   us-east-1   us-east-1a   3h37m   ip-10-0-131-183.ec2.internal   aws:///us-east-1a/i-0ec2782f8287dfb7e   stopped 
        1
        
        clustername-8qw5l-master-1                  Running   m4.xlarge   us-east-1   us-east-1b   3h37m   ip-10-0-143-125.ec2.internal   aws:///us-east-1b/i-096c349b700a19631   running
        clustername-8qw5l-master-2                  Running   m4.xlarge   us-east-1   us-east-1c   3h37m   ip-10-0-154-194.ec2.internal    aws:///us-east-1c/i-02626f1dba9ed5bba  running
        clustername-8qw5l-worker-us-east-1a-wbtgd   Running   m4.large    us-east-1   us-east-1a   3h28m   ip-10-0-129-226.ec2.internal   aws:///us-east-1a/i-010ef6279b4662ced   running
        clustername-8qw5l-worker-us-east-1b-lrdxb   Running   m4.large    us-east-1   us-east-1b   3h28m   ip-10-0-144-248.ec2.internal   aws:///us-east-1b/i-0cb45ac45a166173b   running
        clustername-8qw5l-worker-us-east-1c-pkg26   Running   m4.large    us-east-1   us-east-1c   3h28m   ip-10-0-170-181.ec2.internal   aws:///us-east-1c/i-06861c00007751b0a   running
        Copy to Clipboard Toggle word wrap

        1
        이는 오프라인 노드 ip-10-0-131-183.ec2.internal 의 제어 플레인 머신입니다.
      2. 다음을 실행하여 오프라인 노드의 머신을 삭제합니다.

        $ oc delete machine -n openshift-machine-api clustername-8qw5l-master-0 
        1
        Copy to Clipboard Toggle word wrap
        1
        오프라인 노드에 대한 제어 플레인 머신의 이름을 지정합니다.

        오프라인 노드의 머신을 삭제하면 자동으로 새로운 머신이 프로비저닝됩니다.

  5. 다음을 실행하여 새 머신이 생성되었는지 확인하세요.

    $ oc get machines -n openshift-machine-api -o wide
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME                                        PHASE          TYPE        REGION      ZONE         AGE     NODE                           PROVIDERID                              STATE
    clustername-8qw5l-master-1                  Running        m4.xlarge   us-east-1   us-east-1b   3h37m   ip-10-0-143-125.ec2.internal   aws:///us-east-1b/i-096c349b700a19631   running
    clustername-8qw5l-master-2                  Running        m4.xlarge   us-east-1   us-east-1c   3h37m   ip-10-0-154-194.ec2.internal    aws:///us-east-1c/i-02626f1dba9ed5bba  running
    clustername-8qw5l-master-3                  Provisioning   m4.xlarge   us-east-1   us-east-1a   85s     ip-10-0-173-171.ec2.internal    aws:///us-east-1a/i-015b0888fe17bc2c8  running 
    1
    
    clustername-8qw5l-worker-us-east-1a-wbtgd   Running        m4.large    us-east-1   us-east-1a   3h28m   ip-10-0-129-226.ec2.internal   aws:///us-east-1a/i-010ef6279b4662ced   running
    clustername-8qw5l-worker-us-east-1b-lrdxb   Running        m4.large    us-east-1   us-east-1b   3h28m   ip-10-0-144-248.ec2.internal   aws:///us-east-1b/i-0cb45ac45a166173b   running
    clustername-8qw5l-worker-us-east-1c-pkg26   Running        m4.large    us-east-1   us-east-1c   3h28m   ip-10-0-170-181.ec2.internal   aws:///us-east-1c/i-06861c00007751b0a   running
    Copy to Clipboard Toggle word wrap

    1
    새로운 머신인 clustername-8qw5l-master-3이 생성되고 있으며 단계가 Provisioning 에서 Running 으로 변경된 후 준비되었습니다.

    새 시스템을 만드는 데 몇 분이 소요될 수 있습니다. etcd 클러스터 운영자는 머신이나 노드가 정상 상태로 돌아오면 자동으로 동기화합니다.

    1. 오프라인 상태인 각 노드에 대해 이 단계를 반복합니다.
  6. 다음 명령을 실행하여 제어 평면이 복구될 때까지 기다리세요.

    $ oc adm wait-for-stable-cluster
    Copy to Clipboard Toggle word wrap
    참고

    제어 평면이 복구되는 데 최대 15분이 걸릴 수 있습니다.

문제 해결

  • etcd 정적 포드 롤아웃에 진행 상황이 보이지 않으면 다음 명령을 실행하여 etcd 클러스터 운영자에서 강제로 재배포할 수 있습니다.

    $ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$(date --rfc-3339=ns )"'"}}' --type=merge
    Copy to Clipboard Toggle word wrap
참고

제어 평면 노드의 대부분이 여전히 사용 가능하고 etcd 쿼럼이 있는 경우, 비정상 상태인 단일 etcd 멤버를 교체합니다 .

4.3.2. 이전 클러스터 상태로 복원

클러스터를 이전 상태로 복원하려면 스냅샷을 만들어 etcd 데이터를 미리 백업해야 합니다. 이 스냅샷을 사용하여 클러스터 상태를 복구합니다. 자세한 내용은 "etcd 데이터 백업"을 참조하세요.

해당되는 경우 만료된 제어 평면 인증서에서 복구 해야 할 수도 있습니다.

주의

이전 클러스터 상태로 복원하는 것은 실행 중인 클러스터에서 수행하기에 위험하고 불안정한 작업입니다. 이 절차는 마지막 수단으로만 사용해야 합니다.

복원을 수행하기 전에 "이전 클러스터 상태로 복원하는 방법"을 참조하여 클러스터에 미치는 영향에 대한 자세한 내용을 확인하세요.

4.3.2.1. 이전 클러스터 상태로의 복원 정보

클러스터를 이전 상태로 복원하려면 스냅샷을 만들어 etcd 데이터를 미리 백업해야 합니다. 이 스냅샷을 사용하여 클러스터 상태를 복구합니다. 자세한 내용은 "etcd 데이터 백업"을 참조하세요.

etcd 백업을 사용하여 클러스터를 이전 상태로 복원할 수 있습니다. 이를 사용하여 다음과 같은 상황에서 복구할 수 있습니다.

  • 클러스터에서 대부분의 컨트롤 플레인 호스트가 손실되었습니다(쿼럼 손실).
  • 관리자가 중요한 것을 삭제했으며 클러스터를 복구하려면 복원해야 합니다.
주의

이전 클러스터 상태로 복원하는 것은 실행 중인 클러스터에서 수행하기에 위험하고 불안정한 작업입니다. 이는 마지막 수단으로만 사용해야 합니다.

Kubernetes API 서버를 사용하여 데이터를 검색할 수 있는 경우 etcd를 사용할 수 있으며 etcd 백업을 사용하여 복원할 수 없습니다.

etcd를 복원하려면 클러스터를 효율적으로 복원하는 데 시간이 걸리며 모든 클라이언트가 충돌하는 병렬 기록이 발생합니다. 이는 네트워크 운영자를 포함하여 kubelet, Kubernetes 컨트롤러 관리자, 영구 볼륨 컨트롤러, OpenShift Container Platform 운영자와 같은 구성 요소를 감시하는 동작에 영향을 미칠 수 있습니다.

이로 인해 etcd의 콘텐츠가 디스크의 실제 콘텐츠와 일치하지 않을 때 Operator가 문제가 발생하여 디스크의 파일이 etcd의 콘텐츠와 충돌할 때 Kubernetes API 서버, Kubernetes 컨트롤러 관리자, Kubernetes 스케줄러 및 etcd의 Operator가 중단될 수 있습니다. 여기에는 문제를 해결하기 위해 수동 작업이 필요할 수 있습니다.

극단적인 경우 클러스터에서 영구 볼륨 추적을 손실하고, 더 이상 존재하지 않는 중요한 워크로드를 삭제하고, 시스템을 다시 이미지화하고, 만료된 인증서로 CA 번들을 다시 작성할 수 있습니다.

4.3.2.2. 단일 노드에 대한 이전 클러스터 상태로 복원

저장된 etcd 백업을 사용하여 단일 노드에서 이전 클러스터 상태를 복원할 수 있습니다.

중요

클러스터를 복원할 때 동일한 z-stream 릴리스에서 가져온 etcd 백업을 사용해야 합니다. 예를 들어, OpenShift Container Platform 4.19.2 클러스터는 4.19.2에서 가져온 etcd 백업을 사용해야 합니다.

사전 요구 사항

  • 설치 중에 사용된 것과 같은 인증서 기반 kubeconfig 파일을 통해 cluster-admin 역할이 있는 사용자로 클러스터에 액세스합니다.
  • 제어 평면 호스트에 SSH 액세스 권한이 있습니다.
  • 동일한 백업에서 가져온 etcd 스냅샷과 정적 pod 리소스가 모두 포함된 백업 디렉토리입니다. 디렉토리의 파일 이름은 snapshot_<datetimestamp>.dbstatic_kuberesources_<datetimestamp>.tar.gz 형식이어야합니다.

프로세스

  1. SSH를 사용하여 단일 노드에 연결하고 다음 명령을 실행하여 etcd 백업을 /home/core 디렉터리에 복사합니다.

    $ cp <etcd_backup_directory> /home/core
    Copy to Clipboard Toggle word wrap
  2. 이전 백업에서 클러스터를 복원하려면 단일 노드에서 다음 명령을 실행하세요.

    $ sudo -E /usr/local/bin/cluster-restore.sh /home/core/<etcd_backup_directory>
    Copy to Clipboard Toggle word wrap
  3. SSH 세션을 종료합니다.
  4. 다음 명령을 실행하여 제어 평면의 복구 진행 상황을 모니터링합니다.

    $ oc adm wait-for-stable-cluster
    Copy to Clipboard Toggle word wrap
    참고

    제어 평면이 복구되는 데 최대 15분이 걸릴 수 있습니다.

4.3.2.3. 두 개 이상의 노드에 대해 이전 클러스터 상태로 복원

저장된 etcd 백업을 사용하여 이전 클러스터 상태를 복원하거나 대부분의 제어 평면 호스트를 손실한 클러스터를 복원할 수 있습니다.

HA(고가용성) 클러스터의 경우 3 노드 HA 클러스터를 종료하여 클러스터 분할을 방지하기 위해 두 호스트에서 etcd를 종료해야 합니다. 4-node 및 5-노드 HA 클러스터에서 호스트 3개를 종료해야 합니다. 쿼럼에는 노드의 단순 과반수가 필요합니다. 3-노드 HA 클러스터에서 쿼럼에 필요한 최소 노드 수는 2개입니다. 4-node 및 5-노드 HA 클러스터에서 쿼럼에 필요한 최소 노드 수는 3개입니다. 복구 호스트에서 백업을 통해 새 클러스터를 시작하면 다른 etcd 멤버가 여전히 쿼럼을 형성하고 서비스를 계속할 수 있습니다.

참고

클러스터가 컨트롤 플레인 머신 세트를 사용하는 경우 etcd 복구 절차에 대한 "컨트롤 플레인 머신 세트 문제 해결"의 "성능이 저하된 etcd Operator 복구"를 참조하세요. 단일 노드의 OpenShift Container Platform의 경우 "단일 노드의 이전 클러스터 상태로 복원"을 참조하세요.

중요

클러스터를 복원할 때 동일한 z-stream 릴리스에서 가져온 etcd 백업을 사용해야 합니다. 예를 들어, OpenShift Container Platform 4.19.2 클러스터는 4.19.2에서 가져온 etcd 백업을 사용해야 합니다.

사전 요구 사항

  • 설치 중에 사용된 것과 같은 인증서 기반 kubeconfig 파일을 통해 cluster-admin 역할이 있는 사용자로 클러스터에 액세스합니다.
  • 복구 호스트로 사용할 정상적인 컨트롤 플레인 호스트가 있어야 합니다.
  • 제어 평면 호스트에 SSH 액세스 권한이 있습니다.
  • 동일한 백업에서 가져온 etcd 스냅샷과 정적 pod의 리소스가 모두 포함된 백업 디렉토리입니다. 디렉토리의 파일 이름은 snapshot_<datetimestamp>.dbstatic_kuberesources_<datetimestamp>.tar.gz 형식이어야합니다.
  • 노드는 접근 가능하거나 부팅 가능해야 합니다.
중요

복구가 불가능한 제어 평면 노드의 경우 SSH 연결을 설정하거나 정적 포드를 중지할 필요가 없습니다. 다른 비복구 제어 평면 머신을 하나씩 삭제하고 다시 생성할 수 있습니다.

프로세스

  1. 복구 호스트로 사용할 컨트롤 플레인 호스트를 선택합니다. 이는 복원 작업을 실행하는 호스트입니다.
  2. 복구 호스트를 포함하여 각 컨트롤 플레인 노드에 SSH 연결을 설정합니다.

    복구 프로세스가 시작된 후에는 kube-apiserver 에 액세스할 수 없게 되어 제어 평면 노드에 액세스할 수 없습니다. 따라서 다른 터미널에서 각 컨트롤 플레인 호스트에 대한 SSH 연결을 설정하는 것이 좋습니다.

    중요

    이 단계를 완료하지 않으면 컨트롤 플레인 호스트에 액세스하여 복구 프로세스를 완료할 수 없으며 이 상태에서 클러스터를 복구할 수 없습니다.

  3. SSH를 사용하여 각 제어 평면 노드에 연결하고 다음 명령을 실행하여 etcd를 비활성화합니다.

    $ sudo -E /usr/local/bin/disable-etcd.sh
    Copy to Clipboard Toggle word wrap
  4. etcd 백업 디렉토리를 복구 컨트롤 플레인 호스트에 복사합니다.

    이 단계에서는 etcd 스냅샷 및 정적 pod의 리소스가 포함된 backup 디렉터리를 복구 컨트롤 플레인 호스트의 /home/core/ 디렉터리에 복사하는 것을 전제로하고 있습니다.

  5. SSH를 사용하여 복구 호스트에 연결하고 다음 명령을 실행하여 이전 백업에서 클러스터를 복원합니다.

    $ sudo -E /usr/local/bin/cluster-restore.sh /home/core/<etcd-backup-directory>
    Copy to Clipboard Toggle word wrap
  6. SSH 세션을 종료합니다.
  7. API가 응답하는 경우 다음 명령을 실행하여 etcd Operator 쿼럼 가드를 끕니다.

    $ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": {"useUnsupportedUnsafeNonHANonProductionUnstableEtcd": true}}}'
    Copy to Clipboard Toggle word wrap
  8. 다음 명령을 실행하여 컨트롤 플레인의 복구 진행 상황을 모니터링합니다.

    $ oc adm wait-for-stable-cluster
    Copy to Clipboard Toggle word wrap
    참고

    컨트롤 플레인을 복구하는 데 최대 15분이 걸릴 수 있습니다.

  9. 복구되면 다음 명령을 실행하여 쿼럼 가드를 활성화합니다.

    $ oc patch etcd/cluster --type=merge -p '{"spec": {"unsupportedConfigOverrides": null}}'
    Copy to Clipboard Toggle word wrap

문제 해결

etcd 정적 pod를 롤아웃하는 진행 상황이 표시되지 않으면 다음 명령을 실행하여 cluster-etcd-operator 에서 강제로 재배포할 수 있습니다.

$ oc patch etcd cluster -p='{"spec": {"forceRedeploymentReason": "recovery-'"$(date --rfc-3339=ns )"'"}}' --type=merge
Copy to Clipboard Toggle word wrap

4.3.2.4. etcd 백업에서 수동으로 클러스터 복원

"이전 클러스터 상태로 복원" 섹션에 설명된 복원 절차:

  • UPI 설치 시 컨트롤 플레인 노드에 대한 Machine 또는 ControlPlaneMachineset 을 생성하지 않으므로 UPI 설치 방법을 사용하여 설치된 클러스터에 대한 2개의 컨트롤 플레인 노드를 완전히 다시 생성해야 합니다.
  • 새 단일 멤버 etcd 클러스터를 시작한 /usr/local/bin/cluster-restore.sh 스크립트를 사용하여 세 멤버로 확장합니다.

이와 반대로 이 절차는 다음과 같습니다.

  • 컨트롤 플레인 노드를 다시 생성할 필요가 없습니다.
  • 3개의 멤버 etcd 클러스터를 직접 시작합니다.

클러스터에서 컨트롤 플레인에 MachineSet 을 사용하는 경우 etcd 복구 절차를 위해 "Restoring to a previous cluster state"를 사용하는 것이 좋습니다.

클러스터를 복원할 때 동일한 z-stream 릴리스에서 가져온 etcd 백업을 사용해야 합니다. 예를 들어 OpenShift Container Platform 4.7.2 클러스터는 4.7.2에서 가져온 etcd 백업을 사용해야 합니다.

사전 요구 사항

  • cluster-admin 역할(예: kubeadmin 사용자)을 사용하여 사용자로 클러스터에 액세스합니다.
  • 호스트 사용자를 사용하여 모든 컨트롤 플레인 호스트에 대한 SSH 액세스 ( 예: 기본 코어 호스트 사용자)
  • 이전 etcd 스냅샷과 동일한 백업의 정적 pod 리소스가 모두 포함된 백업 디렉터리입니다. 디렉토리의 파일 이름은 snapshot_<datetimestamp>.dbstatic_kuberesources_<datetimestamp>.tar.gz 형식이어야합니다.

프로세스

  1. SSH를 사용하여 각 제어 평면 노드에 연결합니다.

    복구 프로세스가 시작된 후에는 Kubernetes API 서버에 액세스할 수 없으므로 컨트롤 플레인 노드에 액세스할 수 없습니다. 이러한 이유로 액세스하는 각 제어 평면 호스트에 대해 별도의 터미널에서 SSH 연결을 사용하는 것이 좋습니다.

    중요

    이 단계를 완료하지 않으면 컨트롤 플레인 호스트에 액세스하여 복구 프로세스를 완료할 수 없으며 이 상태에서 클러스터를 복구할 수 없습니다.

  2. etcd 백업 디렉터리를 각 컨트롤 플레인 호스트에 복사합니다.

    이 절차에서는 etcd 스냅샷과 정적 포드에 대한 리소스가 포함된 백업 디렉토리를 각 제어 평면 호스트의 /home/core/assets 디렉토리에 복사했다고 가정합니다. 해당 자산 폴더가 아직 없다면 만들어야 할 수도 있습니다.

  3. 모든 제어 평면 노드에서 정적 포드를 한 번에 한 호스트씩 중지합니다.

    1. 기존 Kubernetes API 서버 정적 Pod 매니페스트를 kubelet 매니페스트 디렉토리 밖으로 옮깁니다.

      $ mkdir -p /root/manifests-backup
      $ mv /etc/kubernetes/manifests/kube-apiserver-pod.yaml /root/manifests-backup/
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 사용하여 Kubernetes API 서버 컨테이너가 중지되었는지 확인하세요.

      $ crictl ps | grep kube-apiserver | grep -E -v "operator|guard"
      Copy to Clipboard Toggle word wrap

      이 명령의 출력은 비어 있어야합니다. 비어 있지 않은 경우 몇 분 기다렸다가 다시 확인하십시오.

    3. Kubernetes API 서버 컨테이너가 계속 실행 중이면 다음 명령을 사용하여 수동으로 종료합니다.

      $ crictl stop <container_id>
      Copy to Clipboard Toggle word wrap
    4. kube-controller-manager-pod.yaml , kube-scheduler-pod.yaml , 마지막으로 etcd-pod.yaml 에 대해 동일한 단계를 반복합니다.

      1. 다음 명령을 사용하여 kube-controller-manager 포드를 중지합니다.

        $ mv /etc/kubernetes/manifests/kube-controller-manager-pod.yaml /root/manifests-backup/
        Copy to Clipboard Toggle word wrap
      2. 다음 명령을 사용하여 컨테이너가 중지되었는지 확인하세요.

        $ crictl ps | grep kube-controller-manager | grep -E -v "operator|guard"
        Copy to Clipboard Toggle word wrap
      3. 다음 명령을 사용하여 kube-scheduler pod를 중지합니다.

        $ mv /etc/kubernetes/manifests/kube-scheduler-pod.yaml /root/manifests-backup/
        Copy to Clipboard Toggle word wrap
      4. 다음 명령을 사용하여 컨테이너가 중지되었는지 확인하세요.

        $ crictl ps | grep kube-scheduler | grep -E -v "operator|guard"
        Copy to Clipboard Toggle word wrap
      5. 다음 명령을 사용하여 etcd Pod를 중지합니다.

        $ mv /etc/kubernetes/manifests/etcd-pod.yaml /root/manifests-backup/
        Copy to Clipboard Toggle word wrap
      6. 다음 명령을 사용하여 컨테이너가 중지되었는지 확인하세요.

        $ crictl ps | grep etcd | grep -E -v "operator|guard"
        Copy to Clipboard Toggle word wrap
  4. 각 제어 평면 호스트에서 현재 etcd 데이터를 백업 폴더로 이동하여 저장합니다.

    $ mkdir /home/core/assets/old-member-data
    $ mv /var/lib/etcd/member /home/core/assets/old-member-data
    Copy to Clipboard Toggle word wrap

    이 데이터는 etcd 백업 복원이 작동하지 않고 etcd 클러스터를 현재 상태로 복원해야 하는 경우에 유용합니다.

  5. 각 제어 평면 호스트에 대한 올바른 etcd 매개변수를 찾습니다.

    1. <ETCD_NAME> 의 값은 각 제어 평면 호스트마다 고유하며, 특정 제어 평면 호스트의 매니페스트 /etc/kubernetes/static-pod-resources/etcd-certs/configmaps/restore-etcd-pod/pod.yaml 파일에 있는 ETCD_NAME 변수의 값과 같습니다. 다음 명령을 사용하여 찾을 수 있습니다.

      RESTORE_ETCD_POD_YAML="/etc/kubernetes/static-pod-resources/etcd-certs/configmaps/restore-etcd-pod/pod.yaml"
      cat $RESTORE_ETCD_POD_YAML | \
        grep -A 1 $(cat $RESTORE_ETCD_POD_YAML | grep 'export ETCD_NAME' | grep -Eo 'NODE_.+_ETCD_NAME') | \
        grep -Po '(?<=value: ").+(?=")'
      Copy to Clipboard Toggle word wrap
    2. <UUID> 값은 다음 명령을 사용하여 제어 평면 호스트에서 생성할 수 있습니다.

      $ uuidgen
      Copy to Clipboard Toggle word wrap
      참고

      <UUID> 값은 한 번만 생성되어야 합니다. 한 제어 평면 호스트에서 UUID를 생성한 후 다른 제어 평면 호스트에서 다시 생성하지 마세요. 다음 단계에서는 모든 제어 평면 호스트에서 동일한 UUID가 사용됩니다.

    3. ETCD_NODE_PEER_URL 의 값은 다음 예와 같이 설정해야 합니다.

      https://<IP_CURRENT_HOST>:2380
      Copy to Clipboard Toggle word wrap

      다음 명령을 사용하여 특정 제어 평면 호스트의 <ETCD_NAME> 에서 올바른 IP를 찾을 수 있습니다.

      $ echo <ETCD_NAME> | \
        sed -E 's/[.-]/_/g' | \
        xargs -I {} grep {} /etc/kubernetes/static-pod-resources/etcd-certs/configmaps/etcd-scripts/etcd.env | \
        grep "IP" | grep -Po '(?<=").+(?=")'
      Copy to Clipboard Toggle word wrap
    4. <ETCD_INITIAL_CLUSTER> 의 값은 다음과 같이 설정해야 합니다. 여기서 <ETCD_NAME_n> 은 각 제어 평면 호스트의 <ETCD_NAME> 입니다.

      참고

      사용되는 포트는 2379가 아닌 2380이어야 합니다. 포트 2379는 etcd 데이터베이스 관리에 사용되며 컨테이너의 etcd 시작 명령에서 직접 구성됩니다.

      출력 예

      <ETCD_NAME_0>=<ETCD_NODE_PEER_URL_0>,<ETCD_NAME_1>=<ETCD_NODE_PEER_URL_1>,<ETCD_NAME_2>=<ETCD_NODE_PEER_URL_2> 
      1
      Copy to Clipboard Toggle word wrap

      1
      각 제어 평면 호스트에서 ETCD_NODE_PEER_URL 값을 지정합니다.

      <ETCD_INITIAL_CLUSTER> 값은 모든 제어 평면 호스트에서 동일하게 유지됩니다. 다음 단계에서는 모든 제어 평면 호스트에 동일한 값이 필요합니다.

  6. 백업에서 etcd 데이터베이스를 다시 생성합니다.

    이러한 작업은 각 제어 평면 호스트에서 실행되어야 합니다.

    1. 다음 명령을 사용하여 etcd 백업을 /var/lib/etcd 디렉토리에 복사합니다.

      $ cp /home/core/assets/backup/<snapshot_yyyy-mm-dd_hhmmss>.db /var/lib/etcd
      Copy to Clipboard Toggle word wrap
    2. 계속하기 전에 올바른 etcdctl 이미지를 식별합니다. 다음 명령을 사용하여 Pod 매니페스트 백업에서 이미지를 검색합니다.

      $ jq -r '.spec.containers[]|select(.name=="etcdctl")|.image' /root/manifests-backup/etcd-pod.yaml
      Copy to Clipboard Toggle word wrap
      $ podman run --rm -it --entrypoint="/bin/bash" -v /var/lib/etcd:/var/lib/etcd:z <image-hash>
      Copy to Clipboard Toggle word wrap
    3. etcdctl 도구의 버전이 백업이 생성된 etcd 서버의 버전인지 확인하세요.

      $ etcdctl version
      Copy to Clipboard Toggle word wrap
    4. 현재 호스트에 맞는 올바른 값을 사용하여 etcd 데이터베이스를 다시 생성하려면 다음 명령을 실행하세요.

      $ ETCDCTL_API=3 /usr/bin/etcdctl snapshot restore /var/lib/etcd/<snapshot_yyyy-mm-dd_hhmmss>.db \
        --name "<ETCD_NAME>" \
        --initial-cluster="<ETCD_INITIAL_CLUSTER>" \
        --initial-cluster-token "openshift-etcd-<UUID>" \
        --initial-advertise-peer-urls "<ETCD_NODE_PEER_URL>" \
        --data-dir="/var/lib/etcd/restore-<UUID>" \
        --skip-hash-check=true
      Copy to Clipboard Toggle word wrap
      참고

      etcd 데이터베이스를 다시 생성할 때는 따옴표가 필수입니다.

  7. 추가된 멤버 로그에 인쇄된 값을 기록하세요. 예:

    출력 예

    2022-06-28T19:52:43Z    info    membership/cluster.go:421   added member    {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "56cd73b614699e7", "added-peer-peer-urls": ["https://10.0.91.5:2380"], "added-peer-is-learner": false}
    2022-06-28T19:52:43Z    info    membership/cluster.go:421   added member    {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "1f63d01b31bb9a9e", "added-peer-peer-urls": ["https://10.0.90.221:2380"], "added-peer-is-learner": false}
    2022-06-28T19:52:43Z    info    membership/cluster.go:421   added member    {"cluster-id": "c5996b7c11c30d6b", "local-member-id": "0", "added-peer-id": "fdc2725b3b70127c", "added-peer-peer-urls": ["https://10.0.94.214:2380"], "added-peer-is-learner": false}
    Copy to Clipboard Toggle word wrap

    1. 컨테이너에서 나오세요.
    2. 다른 제어 평면 호스트에서도 이 단계를 반복하여 추가된 멤버 로그에 인쇄된 값이 모든 제어 평면 호스트에서 동일한지 확인합니다.
  8. 재생성된 etcd 데이터베이스를 기본 위치로 이동합니다.

    이러한 작업은 각 제어 평면 호스트에서 실행되어야 합니다.

    1. 재생성된 데이터베이스(이전 etcdctl 스냅샷 복원 명령으로 생성된 멤버 폴더)를 기본 etcd 위치 /var/lib/etcd 로 이동합니다.

      $ mv /var/lib/etcd/restore-<UUID>/member /var/lib/etcd
      Copy to Clipboard Toggle word wrap
    2. /var/lib/ etcd 디렉토리의 /var/lib/etcd /member 폴더에 대한 SELinux 컨텍스트를 복원합니다.

      $ restorecon -vR /var/lib/etcd/
      Copy to Clipboard Toggle word wrap
    3. 남아 있는 파일과 디렉토리를 제거합니다.

      $ rm -rf /var/lib/etcd/restore-<UUID>
      Copy to Clipboard Toggle word wrap
      $ rm /var/lib/etcd/<snapshot_yyyy-mm-dd_hhmmss>.db
      Copy to Clipboard Toggle word wrap
      중요

      작업이 끝나면 /var/lib/etcd 디렉토리에는 member 폴더만 포함되어야 합니다.

    4. 다른 컨트롤 플레인 호스트에서 이 단계를 반복합니다.
  9. etcd 클러스터를 다시 시작합니다.

    1. 다음 단계는 모든 제어 평면 호스트에서 실행해야 하지만 한 번에 하나의 호스트에서만 실행해야 합니다.
    2. kubelet이 관련 컨테이너를 시작하도록 하기 위해 etcd 정적 포드 매니페스트를 kubelet 매니페스트 디렉토리로 다시 이동합니다.

      $ mv /tmp/etcd-pod.yaml /etc/kubernetes/manifests
      Copy to Clipboard Toggle word wrap
    3. 모든 etcd 컨테이너가 시작되었는지 확인하세요.

      $ crictl ps | grep etcd | grep -v operator
      Copy to Clipboard Toggle word wrap

      출력 예

      38c814767ad983       f79db5a8799fd2c08960ad9ee22f784b9fbe23babe008e8a3bf68323f004c840                                                         28 seconds ago       Running             etcd-health-monitor                   2                   fe4b9c3d6483c
      e1646b15207c6       9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06                                                         About a minute ago   Running             etcd-metrics                          0                   fe4b9c3d6483c
      08ba29b1f58a7       9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06                                                         About a minute ago   Running             etcd                                  0                   fe4b9c3d6483c
      2ddc9eda16f53       9d28c15860870e85c91d0e36b45f7a6edd3da757b113ec4abb4507df88b17f06                                                         About a minute ago   Running             etcdctl
      Copy to Clipboard Toggle word wrap

      이 명령의 출력이 비어 있으면 몇 분간 기다렸다가 다시 확인하세요.

  10. etcd 클러스터의 상태를 확인합니다.

    1. 모든 제어 평면 호스트에서 다음 명령을 사용하여 etcd 클러스터의 상태를 확인하세요.

      $ crictl exec -it $(crictl ps | grep etcdctl | awk '{print $1}') etcdctl endpoint status -w table
      Copy to Clipboard Toggle word wrap

      출력 예

      +--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
      |         ENDPOINT         |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
      +--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
      | https://10.0.89.133:2379 | 682e4a83a0cec6c0 |   3.5.0 |   67 MB |      true |      false |         2 |        218 |                218 |        |
      |  https://10.0.92.74:2379 | 450bcf6999538512 |   3.5.0 |   67 MB |     false |      false |         2 |        218 |                218 |        |
      | https://10.0.93.129:2379 | 358efa9c1d91c3d6 |   3.5.0 |   67 MB |     false |      false |         2 |        218 |                218 |        |
      +--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
      Copy to Clipboard Toggle word wrap

  11. 다른 정적 포드를 다시 시작합니다.

    한 번에 하나의 호스트이지만 모든 컨트롤 플레인 호스트에서 다음 단계를 실행해야 합니다.

    1. 다음 명령을 사용하여 kubelet이 관련 컨테이너를 시작하도록 하려면 Kubernetes API Server 정적 포드 매니페스트를 kubelet 매니페스트 디렉토리로 다시 이동합니다.

      $ mv /root/manifests-backup/kube-apiserver-pod.yaml /etc/kubernetes/manifests
      Copy to Clipboard Toggle word wrap
    2. 모든 Kubernetes API 서버 컨테이너가 시작되었는지 확인하세요.

      $ crictl ps | grep kube-apiserver | grep -v operator
      Copy to Clipboard Toggle word wrap
      참고

      다음 명령의 출력이 비어 있으면 몇 분 기다렸다가 다시 확인합니다.

    3. kube-controller-manager-pod.yamlkube-scheduler-pod.yaml 파일에 대해서도 동일한 단계를 반복합니다.

      1. 다음 명령을 사용하여 모든 노드에서 kubelet을 다시 시작합니다.

        $ systemctl restart kubelet
        Copy to Clipboard Toggle word wrap
      2. 다음 명령을 사용하여 나머지 제어 평면 포드를 시작합니다.

        $ mv /root/manifests-backup/kube-* /etc/kubernetes/manifests/
        Copy to Clipboard Toggle word wrap
      3. kube-apiserver , kube-schedulerkube-controller-manager 포드가 올바르게 시작되는지 확인하세요.

        $ crictl ps | grep -E 'kube-(apiserver|scheduler|controller-manager)' | grep -v -E 'operator|guard'
        Copy to Clipboard Toggle word wrap
      4. 다음 명령을 사용하여 OVN 데이터베이스를 지웁니다.

        for NODE in  $(oc get node -o name | sed 's:node/::g')
        do
          oc debug node/${NODE} -- chroot /host /bin/bash -c  'rm -f /var/lib/ovn-ic/etc/ovn*.db && systemctl restart ovs-vswitchd ovsdb-server'
          oc -n openshift-ovn-kubernetes delete pod -l app=ovnkube-node --field-selector=spec.nodeName=${NODE} --wait
          oc -n openshift-ovn-kubernetes wait pod -l app=ovnkube-node --field-selector=spec.nodeName=${NODE} --for condition=ContainersReady --timeout=600s
        done
        Copy to Clipboard Toggle word wrap

4.3.2.5. 영구 스토리지 상태 복원을 위한 문제 및 해결 방법

OpenShift Container Platform 클러스터에서 모든 형식의 영구저장장치를 사용하는 경우 일반적으로 클러스터의 상태가 etcd 외부에 저장됩니다. StatefulSet 오브젝트에서 실행 중인 Pod 또는 데이터베이스에서 실행 중인 Elasticsearch 클러스터일 수 있습니다. etcd 백업에서 복원하면 OpenShift Container Platform의 워크로드 상태도 복원됩니다. 그러나 etcd 스냅샷이 오래된 경우 상태가 유효하지 않거나 오래되었을 수 있습니다.

중요

PV(영구 볼륨)의 내용은 etcd 스냅샷의 일부가 아닙니다. etcd 스냅샷에서 OpenShift Container Platform 클러스터를 복원할 때 중요하지 않은 워크로드가 중요한 데이터에 액세스할 수 있으며 그 반대의 경우로도 할 수 있습니다.

다음은 사용되지 않는 상태를 생성하는 몇 가지 예제 시나리오입니다.

  • MySQL 데이터베이스는 PV 오브젝트에서 지원하는 pod에서 실행됩니다. etcd 스냅샷에서 OpenShift Container Platform을 복원해도 스토리지 공급자의 볼륨을 다시 가져오지 않으며 pod를 반복적으로 시작하려고 하지만 실행 중인 MySQL pod는 생성되지 않습니다. 스토리지 공급자에서 볼륨을 복원한 다음 새 볼륨을 가리키도록 PV를 편집하여 이 Pod를 수동으로 복원해야 합니다.
  • Pod P1에서는 노드 X에 연결된 볼륨 A를 사용합니다. 다른 pod가 노드 Y에서 동일한 볼륨을 사용하는 동안 etcd 스냅샷을 가져오는 경우 etcd 복원이 수행되면 해당 볼륨이 여전히 Y 노드에 연결되어 있으므로 Pod P1이 제대로 시작되지 않을 수 있습니다. OpenShift Container Platform은 연결을 인식하지 못하고 자동으로 연결을 분리하지 않습니다. 이 경우 볼륨이 노드 X에 연결된 다음 Pod P1이 시작될 수 있도록 노드 Y에서 볼륨을 수동으로 분리해야 합니다.
  • etcd 스냅샷을 만든 후 클라우드 공급자 또는 스토리지 공급자 인증 정보가 업데이트되었습니다. 이로 인해 해당 인증 정보를 사용하는 CSI 드라이버 또는 Operator가 작동하지 않습니다. 해당 드라이버 또는 Operator에 필요한 인증 정보를 수동으로 업데이트해야 할 수 있습니다.
  • etcd 스냅샷을 만든 후 OpenShift Container Platform 노드에서 장치가 제거되거나 이름이 변경됩니다. Local Storage Operator는 /dev/disk/by-id 또는 /dev 디렉터리에서 관리하는 각 PV에 대한 심볼릭 링크를 생성합니다. 이 경우 로컬 PV가 더 이상 존재하지 않는 장치를 참조할 수 있습니다.

    이 문제를 해결하려면 관리자가 다음을 수행해야 합니다.

    1. 잘못된 장치가 있는 PV를 수동으로 제거합니다.
    2. 각 노드에서 심볼릭 링크를 제거합니다.
    3. LocalVolume 또는 LocalVolumeSet 오브젝트를 삭제합니다 (스토리지 영구 스토리지 구성 로컬 볼륨을 사용하는 영구 스토리지 Local Storage Operator 리소스 삭제참조).

4.3.3. 만료된 컨트롤 플레인 인증서 복구

클러스터는 만료된 컨트롤 플레인 인증서에서 자동으로 복구될 수 있습니다.

그러나 kubelet 인증서를 복구하려면 대기 중인 node-bootstrapper 인증서 서명 요청(CSR)을 수동으로 승인해야 합니다. 사용자 프로비저닝 설치의 경우 보류 중인 kubelet 서비스 CSR을 승인해야 할 수도 있습니다.

보류중인 CSR을 승인하려면 다음 단계를 수행합니다.

프로세스

  1. 현재 CSR의 목록을 가져옵니다.

    $ oc get csr
    Copy to Clipboard Toggle word wrap

    출력 예

    NAME        AGE    SIGNERNAME                                    REQUESTOR                                                                   CONDITION
    csr-2s94x   8m3s   kubernetes.io/kubelet-serving                 system:node:<node_name>                                                     Pending 
    1
    
    csr-4bd6t   8m3s   kubernetes.io/kubelet-serving                 system:node:<node_name>                                                     Pending
    csr-4hl85   13m    kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   Pending 
    2
    
    csr-zhhhp   3m8s   kubernetes.io/kube-apiserver-client-kubelet   system:serviceaccount:openshift-machine-config-operator:node-bootstrapper   Pending
    ...
    Copy to Clipboard Toggle word wrap

    1
    보류 중인 kubelet 서비스 CSR(사용자 프로비저닝 설치용)입니다.
    2
    보류 중인 node-bootstrapper CSR입니다.
  2. CSR의 세부 사항을 검토하여 CSR이 유효한지 확인합니다.

    $ oc describe csr <csr_name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    <csr_name>은 현재 CSR 목록에 있는 CSR의 이름입니다.
  3. 각각의 유효한 node-bootstrapper CSR을 승인합니다.

    $ oc adm certificate approve <csr_name>
    Copy to Clipboard Toggle word wrap
  4. 사용자 프로비저닝 설치의 경우 CSR을 제공하는 각 유효한 kubelet을 승인합니다.

    $ oc adm certificate approve <csr_name>
    Copy to Clipboard Toggle word wrap

4.3.4. 복구 절차 테스트

복구 절차를 테스트하는 것은 자동화와 워크로드가 새로운 클러스터 상태를 원활하게 처리하는지 확인하는 데 중요합니다. etcd 쿼럼의 복잡한 특성과 etcd 운영자가 자동으로 복구를 시도하는 탓에 클러스터를 복구할 수 있을 만큼 손상된 상태로 올바르게 되돌리는 게 어려운 경우가 많습니다.

주의

클러스터에 SSH 액세스 권한이 있어야 합니다 . SSH 접근이 없으면 클러스터가 완전히 손실될 수 있습니다.

사전 요구 사항

  • 제어 평면 호스트에 SSH 액세스 권한이 있습니다.
  • OpenShift CLI(oc)가 설치되어 있습니다.

프로세스

  1. SSH를 사용하여 각 비복구 노드에 연결하고 다음 명령을 실행하여 etcd와 kubelet 서비스를 비활성화합니다.

    1. 다음 명령을 실행하여 etcd를 비활성화합니다.

      $ sudo /usr/local/bin/disable-etcd.sh
      Copy to Clipboard Toggle word wrap
    2. 다음 명령을 실행하여 etcd의 변수 데이터를 삭제합니다.

      $ sudo rm -rf /var/lib/etcd
      Copy to Clipboard Toggle word wrap
    3. 다음 명령을 실행하여 kubelet 서비스를 비활성화합니다.

      $ sudo systemctl disable kubelet.service
      Copy to Clipboard Toggle word wrap
  2. 모든 SSH 세션을 종료합니다.
  3. 다음 명령을 실행하여 복구되지 않은 노드가 준비되지 않음 상태인지 확인하세요.

    $ oc get nodes
    Copy to Clipboard Toggle word wrap
  4. 클러스터를 복원하려면 "이전 클러스터 상태로 복원"의 단계를 따르세요.
  5. 클러스터를 복구하고 API가 응답하면 SSH를 사용하여 복구되지 않은 각 노드에 연결하고 kubelet 서비스를 활성화합니다.

    $ sudo systemctl enable kubelet.service
    Copy to Clipboard Toggle word wrap
  6. 모든 SSH 세션을 종료합니다.
  7. 다음 명령을 실행하여 노드가 READY 상태로 돌아오는 것을 관찰하세요.

    $ oc get nodes
    Copy to Clipboard Toggle word wrap
  8. etcd를 사용할 수 있는지 확인하려면 다음 명령을 실행하세요.

    $ oc get pods -n openshift-etcd
    Copy to Clipboard Toggle word wrap
맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

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

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

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

Red Hat 소개

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

Theme

© 2025 Red Hat