我正在考虑将我的Kubernetes集群划分为专用节点区域,以供专用用户集专用,如here所述。我想知道污染节点将如何影响DaemonSets
,包括那些对集群操作至关重要的节点(例如kube-proxy
,kube-flannel-ds-amd64
)?
documentation说,守护程序吊舱尊重污点和容忍度。但是如果是这样,系统如何安排例如当Pod(不受我控制但由Kubernetes自己的kubectl taint nodes node-x zone=zone-y:NoSchedule
拥有)的结节没有相应的容忍度时,结点为DaemonSet kube-proxy
的节点上的kube-proxy Pod。
到目前为止,我凭经验发现,Kubernetes 1.14重新计划了一个kube-proxy pod,无论如何(在受污染的node-x
上删除它之后),这似乎与文档相矛盾。另一方面,我自己的DaemonSet
似乎并非如此。当我在node-x
上杀死其吊舱时,只有在删除节点的异味之后(或者大概是在DaemonSet
内的吊舱规格中添加了公差之后),才重新安排其时间。
因此DaemonSet
和容忍度如何进行详细的互操作。某些DaemonSet
(例如kube-proxy
,kube-flannel-ds-amd64
)是否受到特殊对待?
答案 0 :(得分:2)
您的kube-proxy
和绒布守护进程将在其清单中定义许多容忍度,这意味着即使在受污染的节点上也将对其进行调度。
这是我的运河守护进程中的一对:
tolerations:
- effect: NoSchedule
operator: Exists
- key: CriticalAddonsOnly
operator: Exists
- effect: NoExecute
operator: Exists
这是我的主节点之一的污点:
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/controlplane
value: "true"
- effect: NoExecute
key: node-role.kubernetes.io/etcd
value: "true"
即使大多数工作负载由于其NoSchedule
和NoExectue
污点而不会在主服务器上调度,但由于该守护程序可以容忍这些操作,所以仍会在该主服务器上运行运河吊舱专门污染。
答案 1 :(得分:0)
我有同样的问题。我的守护程序有必要在每个节点上运行其Pod(关键Pod定义)。我有这个daemonset公差定义:
int findMaxSum(int[] array)
{
if (array.Length == 0) return 0;
Array.Sort(array);
Array.Reverse(array);
int k = 0;
int maxSum = 0;
int currentSum = array[0];
for (int i = 0; i < array.Length; i++)
{
// find the longest subarray starting from i
while (i + k + 1 < array.Length)
{
if (k > 0 && array[i] > array[i + k] + array[i + k + 1])
{
// condition not satisfied, so we've found the longest subarray
k = k - 1;
break;
}
// grow the subarray and increase the current sum
k = k + 1;
currentSum = currentSum + array[i + k];
}
// check if the sum of the longest subarray starting from i is larger than the largest sum found so far
maxSum = Math.Max(maxSum, currentSum);
// subtract the first element to consider subarrays starting from i + 1
currentSum = currentSum - array[i];
}
return maxSum;
}
它正在唯一没有污染定义的节点上运行...
我已经检查了我的kube-proxy,只是另一行不同:
spec:
template:
spec:
tolerations:
- key: CriticalAddonsOnly
operator: Exists
因此,我在守护程序定义中添加了“-运算符:存在”行(我不太了解它的作用和方式),现在可以正常使用了。我的守护程序在集群的每个节点上启动了pod ...