@@ -53,6 +53,32 @@ function restore_static_pods() {
5353 tar -xvf " ${BACKUP_FILE} " --strip-components=2 -C " ${MANIFEST_DIR} " / " ${BACKUP_POD_PATH} "
5454 done
5555}
56+ function replace_node_specific_parameters() {
57+ pod_file=" $1 "
58+ # shellcheck disable=SC2016
59+ declare -A SUBS_MAP
60+ SUBS_MAP[' export ETCD_NAME=.*$' ]=' export ETCD_NAME=${NODE_NODE_ENVVAR_NAME_ETCD_NAME}'
61+ SUBS_MAP[' export ETCD_INITIAL_CLUSTER=.*$' ]=' export ETCD_INITIAL_CLUSTER="${ETCD_NAME}=https://${NODE_NODE_ENVVAR_NAME_ETCD_URL_HOST}:2380"'
62+ SUBS_MAP[' export ETCD_NODE_PEER_URL=.*$' ]=' export ETCD_NODE_PEER_URL=https://${NODE_NODE_ENVVAR_NAME_ETCD_URL_HOST}:2380'
63+ SUBS_MAP[' --initial-advertise-peer-urls .*$' ]=' --initial-advertise-peer-urls $ETCD_NODE_PEER_URL \\'
64+ SUBS_MAP[' --initial-advertise-peer-urls=.*$' ]=' --initial-advertise-peer-urls=https://${NODE_NODE_ENVVAR_NAME_IP}:2380 \\'
65+ SUBS_MAP[' --cert-file=.*$' ]=' --cert-file=/etc/kubernetes/static-pod-certs/secrets/etcd-all-serving/etcd-serving-NODE_NAME.crt \\'
66+ SUBS_MAP[' --key-file=.*$' ]=' --key-file=/etc/kubernetes/static-pod-certs/secrets/etcd-all-serving/etcd-serving-NODE_NAME.key \\'
67+ SUBS_MAP[' --peer-cert-file=.*$' ]=' --peer-cert-file=/etc/kubernetes/static-pod-certs/secrets/etcd-all-peer/etcd-peer-NODE_NAME.crt \\'
68+ SUBS_MAP[' --peer-key-file=.*$' ]=' --peer-key-file=/etc/kubernetes/static-pod-certs/secrets/etcd-all-peer/etcd-peer-NODE_NAME.key \\'
69+ SUBS_MAP[' --advertise-client-urls=.*$' ]=' --advertise-client-urls=https://${NODE_NODE_ENVVAR_NAME_IP}:2379 \\'
70+
71+ for pattern in " ${! SUBS_MAP[@]} " ; do
72+ # check if the pattern exists, and return with error if it doesn't
73+ if ! grep -- " $pattern " " $pod_file " > /dev/null 2>&1 ; then
74+ echo " Warning: restore pod extraction failed: expected pattern \" $pattern \" not found."
75+ return 1
76+ fi
77+ # replace the pattern
78+ sed -i " s,$pattern ,${SUBS_MAP[$pattern]} ,g" " $pod_file "
79+ done
80+ }
81+
5682
5783function extract_and_start_restore_etcd_pod() {
5884 POD_FILE_NAME=" restore-etcd-pod/pod.yaml"
@@ -64,6 +90,13 @@ function extract_and_start_restore_etcd_pod() {
6490
6591 echo " starting restored etcd-pod.yaml"
6692 tar -O -xvf " ${BACKUP_FILE} " -C " ${MANIFEST_DIR} " / " ${BACKUP_POD_PATH} " > " ${MANIFEST_DIR} " /etcd-pod.yaml
93+
94+ # Since the backup could have been taken on any node, we need to replace the node specific values in the restore pod.
95+ echo " replacing node specific parameters in restore etcd-pod.yaml"
96+ if ! replace_node_specific_parameters " ${MANIFEST_DIR} " /etcd-pod.yaml; then
97+ return 1
98+ fi
99+
67100 return 0
68101}
69102
@@ -132,6 +165,7 @@ cp -p "${SNAPSHOT_FILE}" "${ETCD_DATA_DIR_BACKUP}"/snapshot.db
132165# Extract and start restore-etcd pod.yaml
133166if ! extract_and_start_restore_etcd_pod; then
134167 # If backup doesn't have restore-pod.yaml, copy it from local disk
168+ echo " Warning: could not extract restore pod. Using the restore pod manifest on the disk."
135169 cp -p ${RESTORE_ETCD_POD_YAML} ${MANIFEST_DIR} /etcd-pod.yaml
136170fi
137171
0 commit comments