我在 GKS 中遇到了这个问题 Pod 阻止缩小规模,因为它是非守护程序集、非镜像、非 pdb 分配的 kube-system pod
但仍然无法理解我需要在每个 Pod 或每个节点中添加这一行。如果我需要添加 pod。
在默认命名空间中,我正在运行我的应用程序,其中正在运行 pod、svc、deploy。所以我需要在 pod 的默认命名空间或 kube-system 命名空间下添加 pod
“cluster-autoscaler.kubernetes.io/scale-down-disabled”:“true” 即使我添加了 3 个这样的节点
kubectl 注释节点 gke-test-default-pool-a44dbf1c-05h1 cluster-autoscaler.kubernetes.io/scale-down-disabled=true kubectl 注释节点 gke-test-default-pool-a44dbf1c-3j6j cluster-autoscaler.kubernetes.io/scale-down-disabled=true kubectl 注释节点 gke-test-default-pool-a44dbf1c-hmrf cluster-autoscaler.kubernetes.io/scale-down-disabled=true
但 GKE 上仍然显示错误
请告诉我如何解决 GKS 中的错误/问题,从 3 天开始,我无法理解并解决它,即使我用 google 搜索它并准备了这么多网站,但没有解决它。
部署后
kubectl create poddisruptionbudget pdb --namespace=kube-system --selector k8s-app=kube-dns --max-unavailable 1
Warning: policy/v1beta1 PodDisruptionBudget is deprecated in v1.21+, unavailable in v1.25+; use policy/v1 PodDisruptionBudget
poddisruptionbudget.policy/pdb created
以前我有 3 个节点,但现在只有 2 个节点,因为我编辑了一个节点,删除了这一行 "cluster-autoscaler.kubernetes.io/scale-down-disabled": "true" 我在其中添加了这一行之后我没有检查我的节点是 3 还是 2。
后来我检查发现只有2个节点在运行。
在 GKE 或 AKS 中编辑节点有好有坏
kubectl get pdb -A
NAMESPACE NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
kube-system kube-dns-bbc N/A 1 1 69m
这是 yaml 文件
kubectl get pdb kube-dns-bbc -o yaml -n kube-system
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"policy/v1","kind":"PodDisruptionBudget","metadata":{"annotations":{},"labels":{"k8s-app":"kube-dns"},"name":"kube-dns-bbc","namespace":"kube-system"},"spec":{"maxUnavailable":1,"selector":{"matchLabels":{"k8s-app":"kube-dns"}}}}
creationTimestamp: "2022-02-18T17:07:53Z"
generation: 1
labels:
k8s-app: kube-dns
name: kube-dns-bbc
namespace: kube-system
resourceVersion: "230860"
uid: 7131c64d-6779-4b23-8c53-10ffcc242144
spec:
maxUnavailable: 1
selector:
matchLabels:
k8s-app: kube-dns
status:
conditions:
- lastTransitionTime: "2022-02-18T17:38:13Z"
message: ""
observedGeneration: 1
reason: SufficientPods
status: "True"
type: DisruptionAllowed
currentHealthy: 2
desiredHealthy: 1
disruptionsAllowed: 1
expectedPods: 2
observedGeneration: 1
但仍然无法理解我需要在哪里添加这一行 每个 Pod 或每个节点。如果我需要添加 pod。
您不需要添加到 pod 或节点,您需要在 kube-system 中为 pod 创建 PDB,以便 CA 知道从要删除的节点中驱逐此类 pod 是安全的。 coreDNS 示例:
kubectl create poddisruptionbudget <name> --namespace=kube-system --selector k8s-app=kube-dns --max-unavailable 1
在您分享的链接中注明:
默认情况下,kube-system pod 会阻止 CA 删除运行它们的节点。用户可以手动为 kube-system pod 添加 PDB,这些 PDB 可以安全地重新安排到其他地方:
kubectl create poddisruptionbudget <pdb name> --namespace=kube-system --selector app=<app name> --max-unavailable 1
PDB 限制复制应用程序的 Pod 数量 同时因自愿中断而下降。例如,一个 基于仲裁的应用程序希望确保 运行的副本永远不会低于法定人数所需的数量
您可以在此处找到有关中断的更多信息。
还有关于Pod 中断预算的完整教程,用于帮助手动升级 GKE 集群。
具有限制性 PodDisruptionBudget 的 Pod。您可以使用Kube 系统 pod:
默认不在节点上运行,*
设置了以下注释的 Pod:- 没有设置 pod 中断预算,或者他们的 PDB 限制太多(自 CA 0.6 起)。
- 不受控制器对象支持的 Pod(因此不是由部署、副本集、作业、有状态集等创建的)。 *
- 具有本地存储的 Pod。 *
- 由于各种限制(缺乏资源、不匹配的节点选择器或关联性、 匹配反亲和力等)
“cluster-autoscaler.kubernetes.io/safe-to-evict”:“false”
或者您已使用相关标志之一覆盖此行为。 请参阅下文了解- *除非 pod 有以下注解(CA 1.0.3 或更高版本支持):
- “cluster-autoscaler.kubernetes.io/safe-to-evict”:“true”
有关这些标志的更多信息。
Autoscaler events 检查您的 pod,并查看哪个 pod 导致 CA 阻塞缩小。
除此之外,您可以在另一个问题中找到这个答案,以解决您可能有的更多疑问。