$ oc patch -n clusters hostedclusters/<hosted_cluster_name> -p '{"spec":{"pausedUntil":"true"}}' --type=merge
您可以备份和恢复 Amazon Web Services (AWS) 上托管集群上的 etcd 以修复故障。
要备份托管集群的 etcd,必须拍摄 etcd 的快照。稍后,您可以使用该快照恢复 etcd。
此过程需要 API 停机。 |
通过输入以下命令暂停托管集群的协调
$ oc patch -n clusters hostedclusters/<hosted_cluster_name> -p '{"spec":{"pausedUntil":"true"}}' --type=merge
通过输入以下命令停止所有 etcd-writer 部署
$ oc scale deployment -n <hosted_cluster_namespace> --replicas=0 kube-apiserver openshift-apiserver openshift-oauth-apiserver
要拍摄 etcd 快照,请在每个 etcd 容器中使用 `exec` 命令,并输入以下命令
$ oc exec -it <etcd_pod_name> -n <hosted_cluster_namespace> -- env ETCDCTL_API=3 /usr/bin/etcdctl --cacert /etc/etcd/tls/etcd-ca/ca.crt --cert /etc/etcd/tls/client/etcd-client.crt --key /etc/etcd/tls/client/etcd-client.key --endpoints=localhost:2379 snapshot save /var/lib/data/snapshot.db
要检查快照状态,请在每个 etcd 容器中使用 `exec` 命令,并运行以下命令
$ oc exec -it <etcd_pod_name> -n <hosted_cluster_namespace> -- env ETCDCTL_API=3 /usr/bin/etcdctl -w table snapshot status /var/lib/data/snapshot.db
将快照数据复制到您可以稍后检索到的位置,例如 S3 存储桶。请参阅以下示例。
以下示例使用签名版本 2。如果您所在的区域支持签名版本 4(例如 `us-east-2` 区域),请使用签名版本 4。否则,将快照复制到 S3 存储桶时,上传将失败。 |
BUCKET_NAME=somebucket
CLUSTER_NAME=cluster_name
FILEPATH="/${BUCKET_NAME}/${CLUSTER_NAME}-snapshot.db"
CONTENT_TYPE="application/x-compressed-tar"
DATE_VALUE=`date -R`
SIGNATURE_STRING="PUT\n\n${CONTENT_TYPE}\n${DATE_VALUE}\n${FILEPATH}"
ACCESS_KEY=accesskey
SECRET_KEY=secret
SIGNATURE_HASH=`echo -en ${SIGNATURE_STRING} | openssl sha1 -hmac ${SECRET_KEY} -binary | base64`
HOSTED_CLUSTER_NAMESPACE=hosted_cluster_namespace
oc exec -it etcd-0 -n ${HOSTED_CLUSTER_NAMESPACE} -- curl -X PUT -T "/var/lib/data/snapshot.db" \
-H "Host: ${BUCKET_NAME}.s3.amazonaws.com" \
-H "Date: ${DATE_VALUE}" \
-H "Content-Type: ${CONTENT_TYPE}" \
-H "Authorization: AWS ${ACCESS_KEY}:${SIGNATURE_HASH}" \
https://${BUCKET_NAME}.s3.amazonaws.com/${CLUSTER_NAME}-snapshot.db
要稍后在新集群上恢复快照,请保存托管集群引用的加密密钥。
通过输入以下命令获取密钥加密密钥
$ oc get hostedcluster <hosted_cluster_name> -o=jsonpath='{.spec.secretEncryption.aescbc}'
{"activeKey":{"name":"<hosted_cluster_name>-etcd-encryption-key"}}
通过输入以下命令保存密钥加密密钥
$ oc get secret <hosted_cluster_name>-etcd-encryption-key -o=jsonpath='{.data.key}'
您可以在新集群上恢复快照时解密此密钥。
通过输入以下命令重新启动所有 etcd-writer 部署
$ oc scale deployment -n <control_plane_namespace> --replicas=3 kube-apiserver openshift-apiserver openshift-oauth-apiserver
通过输入以下命令恢复托管集群的协调
$ oc patch -n <hosted_cluster_namespace> -p '[\{"op": "remove", "path": "/spec/pausedUntil"}]' --type=json
恢复 etcd 快照。
如果您有托管集群的 etcd 快照,则可以恢复它。目前,您只能在集群创建期间恢复 etcd 快照。
要恢复 etcd 快照,请修改 `create cluster --render` 命令的输出,并在 `HostedCluster` 规范的 etcd 部分中定义 `restoreSnapshotURL` 值。
`hcp create` 命令中的 `--render` 标志不会呈现密钥。要呈现密钥,必须在 `hcp create` 命令中同时使用 `--render` 和 `--render-sensitive` 标志。 |
您已在托管集群上拍摄了 etcd 快照。
在 `aws` 命令行界面 (CLI) 上,创建一个预签名 URL,以便您可以从 S3 下载 etcd 快照,而无需将凭据传递给 etcd 部署
ETCD_SNAPSHOT=${ETCD_SNAPSHOT:-"s3://${BUCKET_NAME}/${CLUSTER_NAME}-snapshot.db"}
ETCD_SNAPSHOT_URL=$(aws s3 presign ${ETCD_SNAPSHOT})
修改 `HostedCluster` 规范以引用该 URL
spec:
etcd:
managed:
storage:
persistentVolume:
size: 4Gi
type: PersistentVolume
restoreSnapshotURL:
- "${ETCD_SNAPSHOT_URL}"
managementType: Managed
确保您从 `spec.secretEncryption.aescbc` 值引用的密钥包含您在上一步中保存的相同 AES 密钥。