如何解决为DaemonSet中的每个节点分配唯一令牌
我有一些令牌需要分配给DaemonSet中的每个吊舱。令牌不能在运行时生成,而是提前生成的。
使用StatefulSets可以很容易地进行这种分配-可以通过volumeClaimTemplate来完成,但是我目前使用的机制是将所有令牌存储在一个秘密中,然后从pod中获取后缀选择要读取的令牌的名称。
但是,StatefulSet会触发群集自动缩放器。如果我使用反亲和性来确保每个节点只有一个Pod,然后将副本数设置为群集中最大的节点数,则将导致群集自动缩放器扩展到最大节点数并保持不变在那里。
DaemonSet是我尝试做的更好的模型(每个节点一个pod),这就是为什么我用我的方式来表达这个问题,但是也可以接受使用StatefulSets或其他任何方法的解决方案。
解决方法
kubectl annotate secret foo --resource-version=X --overwrite
可用作锁定机制。阅读注释,确定它是否可用,然后注释它是否可用。如果注释成功,则具有锁。如果不尝试使用其他秘密。
这是我编写的脚本。
#!/usr/bin/env bash
set -e -u -o pipefail
shopt -s inherit_errexit
#set -x
## START CONFIGURATION
KUBECTL="kubectl --context green -n foo"
ANNOTATION=foo
VALUE=node/$HOSTNAME
# returns in OBJECTS and VALID_VALUES constants
function readValues() {
# this order is important. The reverse will have a race condition
OBJECTS=$($KUBECTL get secrets -l locktest=1 -o json | jq -r ".items[] | @base64")
# read -p "Press enter to give chance to fake a race condition"
VALID_VALUES=$($KUBECTL get nodes -o name)
}
## END CONFIGURATION
# returns via stdout kind/name of locked object
# returns via $?: 0 found,1 not found
function isLockedAlready() {
for obj in $OBJECTS; do
json=$(echo "$obj" | base64 -d)
value=$(echo $json | jq -r ".metadata.annotations.${ANNOTATION}")
if [[ $value == $VALUE ]] ; then
# echo $name is already locked
name=$(echo "$json" | jq -r ".metadata.name")
kind=$(echo "$json" | jq -r ".kind")
echo $kind/$name
return 0
fi
done
return 1
}
# returns via stdout the base64 json of an object that's not in listValidValues
# returns via $?: 0 found,1 not found
function findCandidate() {
for obj in $OBJECTS; do
json=$(echo "$obj" | base64 -d)
value=$(echo $json | jq -r ".metadata.annotations.${ANNOTATION}")
name=$(echo $json | jq -r ".metadata.name")
valid=0
for v in $VALID_VALUES ; do
if [[ $value == $v ]] ; then
# echo $name has valid value $v
valid=1
# else # echo $name value $value is not $v
fi
done
if [[ $valid == 0 ]]; then
# echo $name is available
echo $obj
return 0
# else # echo $name is not available
fi
done
return 1
}
# $1: the object to lock (as base64 json)
# return in $?: 0==success
function lock() {
name=$(echo "$1" | base64 -d | jq -r ".metadata.name")
kind=$(echo "$1" | base64 -d | jq -r ".kind")
resource_version=$(echo "$1" | base64 -d | jq -r ".metadata.resourceVersion")
if $KUBECTL annotate $kind $name $ANNOTATION=$VALUE --resource-version=$resource_version --overwrite > /dev/null; then
echo $kind/$name
return 0
else
# echo "ANNOTATION FAILED! RETRY"
return 1
fi
}
for retry in 1 2 3 ; do
readValues
if isLockedAlready ; then
exit 0
elif obj=$(findCandidate) ; then
if lock "$obj" ; then
exit 0
fi
fi
sleep 20
# echo retry
done
exit 1
,
如果您没有自动缩放器,请使用StatefulSet和反亲和力设置每个节点获取一个Pod,这是迄今为止更容易的解决方案。只需使用volumeClaimTemplates,然后将令牌放入后续卷中即可。
或者如果令牌是秘密的,那么您可以将所有秘密安装在每个吊舱中,然后从smooth
末尾获取数字以知道实际使用的秘密。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。