报告错误时,请使用此模板,并提供尽可能多的信息。 不这样做可能会导致您的错误无法及时得到解决。 谢谢! 如果此事与安全性有关,请通过https://kubernetes.io/security/私下披露
发生的事情:我修改了主节点上kube-controller-manager的pod-eviction-timeout
设置(以减少在节点发生故障时k8s重新创建Pod之前的时间)。 默认值为5分钟,我配置为30秒。 使用sudo docker ps --no-trunc | grep "kube-controller-manager"
命令,我检查修改是否成功应用:
kubeadmin<strong i="10">@nodetest21</strong>:~$ sudo docker ps --no-trunc | grep "kube-controller-manager"
387261c61ee9cebce50de2540e90b89e2bc710b4126a0c066ef41f0a1fb7cf38 sha256:0482f640093306a4de7073fde478cf3ca877b6fcc2c4957624dddb2d304daef5 "kube-controller-manager --address=127.0.0.1 --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --client-ca-file=/etc/kubernetes/pki/ca.crt --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt --cluster-signing-key-file=/etc/kubernetes/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=true --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt --root-ca-file=/etc/kubernetes/pki/ca.crt --service-account-private-key-file=/etc/kubernetes/pki/sa.key --use-service-account-credentials=true --pod-eviction-timeout=30s"
我应用了具有两个副本的基本部署:
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
在第一个工作程序节点上创建的第一个容器,在第二个工作程序节点上创建的第二个容器:
NAME STATUS ROLES AGE VERSION
nodetest21 Ready master 34m v1.13.3
nodetest22 Ready <none> 31m v1.13.3
nodetest23 Ready <none> 30m v1.13.3
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default busybox-74b487c57b-5s6g7 1/1 Running 0 13s 10.44.0.2 nodetest22 <none> <none>
default busybox-74b487c57b-6zdvv 1/1 Running 0 13s 10.36.0.1 nodetest23 <none> <none>
kube-system coredns-86c58d9df4-gmcjd 1/1 Running 0 34m 10.32.0.2 nodetest21 <none> <none>
kube-system coredns-86c58d9df4-wpffr 1/1 Running 0 34m 10.32.0.3 nodetest21 <none> <none>
kube-system etcd-nodetest21 1/1 Running 0 33m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-apiserver-nodetest21 1/1 Running 0 33m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-controller-manager-nodetest21 1/1 Running 0 20m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-proxy-6mcn8 1/1 Running 1 31m 10.0.1.5 nodetest22 <none> <none>
kube-system kube-proxy-dhdqj 1/1 Running 0 30m 10.0.1.6 nodetest23 <none> <none>
kube-system kube-proxy-vqjg8 1/1 Running 0 34m 10.0.1.4 nodetest21 <none> <none>
kube-system kube-scheduler-nodetest21 1/1 Running 1 33m 10.0.1.4 nodetest21 <none> <none>
kube-system weave-net-9qls7 2/2 Running 3 31m 10.0.1.5 nodetest22 <none> <none>
kube-system weave-net-h2cb6 2/2 Running 0 33m 10.0.1.4 nodetest21 <none> <none>
kube-system weave-net-vkb62 2/2 Running 0 30m 10.0.1.6 nodetest23 <none> <none>
为了测试正确的Pod逐出,我关闭了第一个工作程序节点。 大约1分钟后,第一个工作程序节点的状态更改为“ NotReady”,然后
我必须等待+5分钟(这是默认的Pod逐出超时),才能在已关闭的节点上的Pod在另一个节点上重新创建。
您预期会发生什么:
节点状态报告“ NotReady”后,应在30秒后在另一个节点上重新创建Pod,而不是默认5分钟!
如何复制它(尽可能少且精确) :
创建三个节点。 在第一个节点( sudo kubeadm init
)上初始化Kubernetes,应用网络插件( kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
),然后加入其他两个节点(例如: kubeadm join 10.0.1.4:6443 --token xdx9y1.z7jc0j7c8g8lpjog --discovery-token-ca-cert-hash sha256:04ae8388f607755c14eed702a23fd47802d5512e092b08add57040a2ae0736ac
)。
将pod-eviction-timeout参数添加到主节点上的Kube Controller Manager: sudo vi /etc/kubernetes/manifests/kube-controller-manager.yaml
:
apiVersion: v1
kind: Pod
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
creationTimestamp: null
labels:
component: kube-controller-manager
tier: control-plane
name: kube-controller-manager
namespace: kube-system
spec:
containers:
- command:
- kube-controller-manager
- --address=127.0.0.1
- --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
- --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-cert-file=/etc/kubernetes/pki/ca.crt
- --cluster-signing-key-file=/etc/kubernetes/pki/ca.key
- --controllers=*,bootstrapsigner,tokencleaner
- --kubeconfig=/etc/kubernetes/controller-manager.conf
- --leader-elect=true
- --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
- --root-ca-file=/etc/kubernetes/pki/ca.crt
- --service-account-private-key-file=/etc/kubernetes/pki/sa.key
- --use-service-account-credentials=true
- --pod-eviction-timeout=30s
(yaml被截断,此处仅显示相关的第一部分)。
检查设置是否已应用:
sudo docker ps --no-trunc | grep "kube-controller-manager"
应用具有两个副本的部署,检查是否在第一个工作程序节点上创建了一个Pod,并在第二个工作程序节点上创建了第二个Pod。
关闭节点之一,并检查事件报告节点“ NotReady”和重新创建Pod之间的时间间隔。
我们还需要知道什么吗? :
我在多主机环境中也遇到相同的问题。
环境:
kubectl version
):v1.13.3cat /etc/os-release
):NAME =“ Ubuntu” VERSION =“ 16.04.5 LTS(Xenial Xerus)”uname -a
):Linux nodetest21 4.15.0-1037-azure#39〜16.04.1-Ubuntu SMP Tue Jan 15 17:20:47 UTC 2019 x86_64 x86_64 x86_64 GNU / Linux@ kubernetes /信号节点错误
@ kubernetes / sig-apps-bugs
@danielloczi :重申提及以触发通知:
@ kubernetes / sig-node-bugs,@ kubernetes / sig-apps-bugs
针对此:
@ kubernetes / sig-node-bugs
@ kubernetes / sig-apps-bugs
可在此处获得使用PR注释与我互动的说明。 如果您对我的行为有任何疑问或建议,请针对kubernetes / test-infra存储库提出问题。
在测试中将驱逐超时设置得较低时,我也遇到了这个问题。 经过一段时间的摸索,我发现原因是新的TaintBasedEvictions。
在版本1.13中,TaintBasedEvictions功能已升级为Beta,并在默认情况下启用,因此,NodeController(或kubelet)会自动添加污点,并且将禁用基于Ready NodeCondition从节点驱逐Pod的常规逻辑。
将此功能标志设置为false会导致吊舱像预期的那样被逐出。 我没有花时间在基于污点的驱逐代码中进行搜索,但我想我们没有在其中使用该驱逐超时标志。
寻找更多。 将TaintBasedEvictions设置为true时,您可以在容差下的其规范内设置吊舱驱逐时间:
https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/#taint-based-evictions
这些的默认值由准入控制器设置: https :
可以通过kube-apiserver设置这两个标志,并且应该达到相同的效果。
// Controller will not proactively sync node health, but will monitor node
// health signal updated from kubelet. There are 2 kinds of node healthiness
// signals: NodeStatus and NodeLease. NodeLease signal is generated only when
// NodeLease feature is enabled. If it doesn't receive update for this amount
// of time, it will start posting "NodeReady==ConditionUnknown". The amount of
// time before which Controller start evicting pods is controlled via flag
// 'pod-eviction-timeout'.
// Note: be cautious when changing the constant, it must work with
// nodeStatusUpdateFrequency in kubelet and renewInterval in NodeLease
// controller. The node health signal update frequency is the minimal of the
// two.
// There are several constraints:
// 1. nodeMonitorGracePeriod must be N times more than the node health signal
// update frequency, where N means number of retries allowed for kubelet to
// post node status/lease. It is pointless to make nodeMonitorGracePeriod
// be less than the node health signal update frequency, since there will
// only be fresh values from Kubelet at an interval of node health signal
// update frequency. The constant must be less than podEvictionTimeout.
// 2. nodeMonitorGracePeriod can't be too large for user experience - larger
// value takes longer for user to see up-to-date node health.
感谢您的反馈ChiefAlexander!
您就是这样写的。 我检查了吊舱,并确保为吊舱分配了默认值以进行容忍:
kubectl describe pod busybox-74b487c57b-95b6n | grep -i toleration -A 2
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
因此,我只是将自己的值添加到部署中:
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: busybox
template:
metadata:
labels:
app: busybox
spec:
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 2
- key: "node.kubernetes.io/not-ready"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 2
containers:
- image: busybox
command:
- sleep
- "3600"
imagePullPolicy: IfNotPresent
name: busybox
restartPolicy: Always
在发生节点故障的情况下应用部署后,节点状态将更改为“ NotReady”,然后在2秒后重新创建Pod。
因此,我们不再需要处理pod-eviction-timeout,可以在Pod的基础上设置超时! 凉!
再次感谢你的帮助!
@danielloczi嗨danielloczi,您如何解决此问题? 我也遇到这个问题
@ 323929我认为@danielloczi并不关心kube-controller-manager中的pod-eviction-timeout
参数,但是通过使用Taint based Evictions
来解决它,我使用Taint based Evictions
进行了测试,它可以正常工作为了我。
没错:我只是开始使用Taint based Eviction
。
是否有可能使其全球化? 我不想为每个pod配置启用该功能,尤其是我使用了很多准备好的东西
+1,表示可以为每个群集配置它。 按Pod或按部署进行调整很少有用:在大多数情况下,合理的全局值更加方便,并且在许多情况下,当前默认值5m相当长。
请重新打开此问题。
我正面临着同样的问题,是否有办法禁用基于Taint的逐出,并且pod-逐出超时在全局模式下有效?
我正面临着同样的问题,是否有办法禁用基于Taint的逐出,并且pod-逐出超时在全局模式下有效?
我认为您可以通过apiserver配置全局pod驱逐: https ://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/
我没有尝试过,但是可以看到有一些选项:--default-not-ready-toleration-seconds和--default-unreachable-toleration-seconds。
为什么将此错误标记为已关闭? 看起来原始问题并未解决,而只能解决。
我不清楚为什么pod-eviction-timeout标志不起作用
同一期
最有用的评论
感谢您的反馈ChiefAlexander!
您就是这样写的。 我检查了吊舱,并确保为吊舱分配了默认值以进行容忍:
因此,我只是将自己的值添加到部署中:
在发生节点故障的情况下应用部署后,节点状态将更改为“ NotReady”,然后在2秒后重新创建Pod。
因此,我们不再需要处理pod-eviction-timeout,可以在Pod的基础上设置超时! 凉!
再次感谢你的帮助!