mirror of https://github.com/k3s-io/k3s
Merge pull request #55466 from x13n/addon-manager
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. Use results of kube-controller-manager leader election in addon manager **What this PR does / why we need it**: This adds leader election-like mechanism to addon manager. Currently, in a multi-master setup, upgrading one master will trigger a fight between addon managers on different masters, each forcing its own versions of addons. This leads to pod unavailability until all masters are upgraded to new version. To avoid implementing leader election in bash, results of leader election in kube-controller-manager are used. Long term, addon manager probably should be rewritten in a real prgramming language (probably Go), and then, real leader election should be implemented there. **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: I don't think there was an issue for this specifically, but this PR is related to https://github.com/kubernetes/kubernetes/issues/473 **Special notes for your reviewer**: **Release note**: ```release-note Addon manager supports HA masters. ```pull/6/head
commit
95b4312899
|
@ -15,7 +15,7 @@
|
|||
IMAGE=gcr.io/google-containers/kube-addon-manager
|
||||
ARCH?=amd64
|
||||
TEMP_DIR:=$(shell mktemp -d)
|
||||
VERSION=v6.4-beta.2
|
||||
VERSION=v6.5
|
||||
KUBECTL_VERSION?=v1.6.4
|
||||
|
||||
ifeq ($(ARCH),amd64)
|
||||
|
|
|
@ -44,6 +44,11 @@ ADDON_MANAGER_LABEL="addonmanager.kubernetes.io/mode"
|
|||
# will be reconciled for now.
|
||||
CLUSTER_SERVICE_LABEL="kubernetes.io/cluster-service"
|
||||
|
||||
# Whether only one addon manager should be running in a multi-master setup.
|
||||
# Disabling this flag will force all addon managers to assume they are the
|
||||
# leaders.
|
||||
ADDON_MANAGER_LEADER_ELECTION=${ADDON_MANAGER_LEADER_ELECTION:-true}
|
||||
|
||||
# Remember that you can't log from functions that print some output (because
|
||||
# logs are also printed on stdout).
|
||||
# $1 level
|
||||
|
@ -140,6 +145,25 @@ function ensure_addons() {
|
|||
log INFO "== Kubernetes addon ensure completed at $(date -Is) =="
|
||||
}
|
||||
|
||||
function is_leader() {
|
||||
# In multi-master setup, only one addon manager should be running. We use
|
||||
# existing leader election in kube-controller-manager instead of implementing
|
||||
# a separate mechanism here.
|
||||
if ! $ADDON_MANAGER_LEADER_ELECTION; then
|
||||
log INFO "Leader election disabled."
|
||||
return 0;
|
||||
fi
|
||||
KUBE_CONTROLLER_MANAGER_LEADER=`${KUBECTL} -n kube-system get ep kube-controller-manager \
|
||||
-o go-template=$'{{index .metadata.annotations "control-plane.alpha.kubernetes.io/leader"}}' \
|
||||
| sed 's/^.*"holderIdentity":"\([^"]*\)".*/\1/'`
|
||||
# If there was any problem with getting the leader election results, var will
|
||||
# be empty. Since it's better to have multiple addon managers than no addon
|
||||
# managers at all, we're going to assume that we're the leader in such case.
|
||||
log INFO "Leader is $KUBE_CONTROLLER_MANAGER_LEADER"
|
||||
[[ "$KUBE_CONTROLLER_MANAGER_LEADER" == "" ||
|
||||
"$HOSTNAME" == "$KUBE_CONTROLLER_MANAGER_LEADER" ]]
|
||||
}
|
||||
|
||||
# The business logic for whether a given object should be created
|
||||
# was already enforced by salt, and /etc/kubernetes/addons is the
|
||||
# managed result is of that. Start everything below that directory.
|
||||
|
@ -175,8 +199,12 @@ done
|
|||
log INFO "== Entering periodical apply loop at $(date -Is) =="
|
||||
while true; do
|
||||
start_sec=$(date +"%s")
|
||||
ensure_addons
|
||||
reconcile_addons
|
||||
if is_leader; then
|
||||
ensure_addons
|
||||
reconcile_addons
|
||||
else
|
||||
log INFO "Not elected leader, going back to sleep."
|
||||
fi
|
||||
end_sec=$(date +"%s")
|
||||
len_sec=$((${end_sec}-${start_sec}))
|
||||
# subtract the time passed from the sleep time
|
||||
|
|
|
@ -882,6 +882,11 @@ EOF
|
|||
if [[ "${NODE_ACCELERATORS:-}" == *"type=nvidia"* ]]; then
|
||||
cat >>$file <<EOF
|
||||
ENABLE_NVIDIA_GPU_DEVICE_PLUGIN: $(yaml-quote "true")
|
||||
EOF
|
||||
fi
|
||||
if [ -n "${ADDON_MANAGER_LEADER_ELECTION:-}" ]; then
|
||||
cat >>$file <<EOF
|
||||
ADDON_MANAGER_LEADER_ELECTION: $(yaml-quote ${ADDON_MANAGER_LEADER_ELECTION})
|
||||
EOF
|
||||
fi
|
||||
|
||||
|
|
Loading…
Reference in New Issue