34.2. 삭제된 Kafka 클러스터 복구
다음 절차에서는 원래 PVC( PersistentVolumeClaim ) 리소스를 다시 생성하여 PV(영구 볼륨)에서 삭제된 Kafka 클러스터를 복구하는 방법을 설명합니다.
Topic Operator 및 User Operator가 배포된 경우 KafkaTopic 및 KafkaUser 리소스를 다시 생성하여 복구할 수 있습니다. 동일한 구성으로 KafkaTopic 리소스를 재생성하거나 Topic Operator가 Kafka에서 업데이트를 시도하는 것이 중요합니다. 다음 절차에서는 두 리소스를 모두 다시 생성하는 방법을 보여줍니다.
User Operator가 활성화되어 있고 Kafka 사용자가 다시 생성되지 않으면 복구 후 즉시 Kafka 클러스터에서 삭제됩니다.
사전 준비 사항
이 절차에서는 데이터 손상을 방지하려면 PV를 올바른 PVC에 마운트해야 합니다. volumeName 은 PVC에 지정되어 있으며 PV의 이름과 일치해야 합니다.
자세한 내용은 10.4절. “Kafka 스토리지 구성”의 내용을 참조하십시오.
프로세스
클러스터의 PV에 대한 정보를 확인합니다.
oc get pv데이터가 있는 PV에 대한 정보가 제공됩니다.
PV 출력 예
NAME RECLAIMPOLICY CLAIM pvc-5e9c5c7f-3317-11ea-a650-06e1eadd9a4c ... Retain ... myproject/data-0-my-cluster-broker-0 pvc-5e9cc72d-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-0-my-cluster-broker-1 pvc-5ead43d1-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-0-my-cluster-broker-2 pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4c ... Retain ... myproject/data-0-my-cluster-controller-3 pvc-7e21042e-3317-11ea-9786-02deaf9aa87e ... Retain ... myproject/data-0-my-cluster-controller-4 pvc-7e226978-3317-11ea-97b0-0aef8816c7ea ... Retain ... myproject/data-0-my-cluster-controller-5-
NAME은 각 PV의 이름입니다. -
RECLAIMPOLICY는 PV가 유지되므로 PVC가 삭제될 때 PV가 자동으로 삭제되지 않습니다. -
CLAIM은 원래 PVC에 대한 링크를 보여줍니다.
-
원래 네임스페이스를 다시 생성합니다.
oc create namespace myproject여기에서
myproject네임스페이스를 다시 생성합니다.원래 PVC 리소스 사양을 다시 생성하여 PVC를 적절한 PV에 연결합니다.
PVC 리소스 사양의 예
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: data-0-my-cluster-broker-0 spec: accessModes: - ReadWriteOnce resources: requests: storage: 100Gi storageClassName: gp2-retain volumeMode: Filesystem volumeName: pvc-7e1f67f9-3317-11ea-a650-06e1eadd9a4cPV 사양을 편집하여 원래 PVC를 바인딩된
claimRef속성을 삭제합니다.PV 사양의 예
apiVersion: v1 kind: PersistentVolume metadata: annotations: kubernetes.io/createdby: aws-ebs-dynamic-provisioner pv.kubernetes.io/bound-by-controller: "yes" pv.kubernetes.io/provisioned-by: kubernetes.io/aws-ebs creationTimestamp: "<date>" finalizers: - kubernetes.io/pv-protection labels: failure-domain.beta.kubernetes.io/region: eu-west-1 failure-domain.beta.kubernetes.io/zone: eu-west-1c name: pvc-5ead43d1-3317-11ea-97b0-0aef8816c7ea resourceVersion: "39431" selfLink: /api/v1/persistentvolumes/pvc-7e226978-3317-11ea-97b0-0aef8816c7ea uid: 7efe6b0d-3317-11ea-a650-06e1eadd9a4c spec: accessModes: - ReadWriteOnce awsElasticBlockStore: fsType: xfs volumeID: aws://eu-west-1c/vol-09db3141656d1c258 capacity: storage: 100Gi claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: data-0-my-cluster-kafka-2 namespace: myproject resourceVersion: "39113" uid: 54be1c60-3319-11ea-97b0-0aef8816c7ea nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: failure-domain.beta.kubernetes.io/zone operator: In values: - eu-west-1c - key: failure-domain.beta.kubernetes.io/region operator: In values: - eu-west-1 persistentVolumeReclaimPolicy: Retain storageClassName: gp2-retain volumeMode: Filesystem이 예제에서는 다음 속성이 삭제됩니다.
claimRef: apiVersion: v1 kind: PersistentVolumeClaim name: data-0-my-cluster-broker-2 namespace: myproject resourceVersion: "39113" uid: 54be1c60-3319-11ea-97b0-0aef8816c7eaCluster Operator를 배포합니다.
oc create -f install/cluster-operator -n myprojectKafkaTopic리소스 구성을 적용하여 모든KafkaTopic리소스를 다시 생성합니다.oc apply -f <topic_configuration_file> -n myproject모든
KafkaUser리소스를 다시 생성합니다.사용자 암호 및 인증서를 유지해야 하는 경우
KafkaUser리소스를 다시 생성하기 전에 사용자 시크릿을 다시 생성합니다.보안이 다시 생성되지 않으면 User Operator에서 새 인증 정보를 자동으로 생성합니다. 다시 생성한 보안의 이름, 레이블 및 필드가 원래 보안과 정확히 같은지 확인합니다.
KafkaUser리소스 구성을 적용합니다.oc apply -f <user_configuration_file> -n myproject
Kafka 리소스의 원래 구성을 사용하여
Kafka클러스터를 배포합니다.Kafka리소스의 원래 구성에strimzi.io/pause-reconciliation="true"주석을 추가한 다음 업데이트된 구성을 사용하여 Kafka 클러스터를 배포합니다.oc apply -f <kafka_resource_configuration>.yaml -n myprojectKafka사용자 정의 리소스의 로그 또는 사본에서 원래clusterId를 복구합니다. 그렇지 않으면 임시 Pod를 구동하여 볼륨 중 하나에서 검색할 수 있습니다.PVC_NAME="data-0-my-cluster-kafka-0" COMMAND="grep cluster.id /disk/kafka-log*/meta.properties | awk -F'=' '{print \$2}'" oc run tmp -itq --rm --restart "Never" --image "foo" --overrides "{\"spec\": {\"containers\":[{\"name\":\"busybox\",\"image\":\"busybox\",\"command\":[\"/bin/sh\", \"-c\",\"$COMMAND\"],\"volumeMounts\":[{\"name\":\"disk\",\"mountPath\":\"/disk\"}]}], \"volumes\":[{\"name\":\"disk\",\"persistentVolumeClaim\":{\"claimName\": \"$PVC_NAME\"}}]}}" -n myprojectKafka리소스를 편집하여 복구된 값으로.status.clusterId를 설정합니다.oc edit kafka <cluster-name> --subresource status -n myprojectKafka리소스 조정 일시 중지를 해제합니다.oc annotate kafka my-cluster strimzi.io/pause-reconciliation=false \ --overwrite -n myprojectKafkaTopic리소스의 복구를 확인합니다.oc get kafkatopics -o wide -w -n myprojectKafka 주제 상태
NAME CLUSTER PARTITIONS REPLICATION FACTOR READY my-topic-1 my-cluster 10 3 True my-topic-2 my-cluster 10 3 True my-topic-3 my-cluster 10 3 TrueREADY출력에True가 표시되면KafkaTopic사용자 정의 리소스 생성이 성공적으로 수행됩니다.KafkaUser리소스의 복구를 확인합니다.oc get kafkausers -o wide -w -n myprojectKafka 사용자 상태
NAME CLUSTER AUTHENTICATION AUTHORIZATION READY my-user-1 my-cluster tls simple True my-user-2 my-cluster tls simple True my-user-3 my-cluster tls simple TrueREADY출력에True가 표시되면KafkaUser사용자 정의 리소스 생성이 성공적으로 생성됩니다.