当前位置: 首页 > 知识库问答 >
问题:

如何解决Pod阻塞缩小,因为它是GKE中的非守护进程集

阎祖鹤
2023-03-14

我在 GKS Pod 中遇到了这个问题,因为它是一个非守护程序集、非镜像、非 pdb 分配的 kube 系统 pod

我已经阅读了这个文档:- https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-to-set-pdbs-to-enable-ca-to-move-kube-system-pods

但仍然无法理解我需要在每个pod或每个节点中添加这行代码。如果我需要添加pods。

在默认名称空间中,我正在运行我的应用程序,其中正在运行pod、svc和deploy。所以我需要在默认名称空间下添加pods或kube系统名称空间pods

" cluster-auto scaler . kubernetes . io/scale-down-disabled ":" true "即使我添加了3个这样的节点

kubectl注释节点gke-test-default-pool-a44dbf1c-05h1cluster-autoscaler.kubernetes.io/scale-down-disabled=truekubectl注释节点gke-test-default-pool-a44dbf1c-3j6jcluster-autoscaler.kubernetes.io/scale-down-disabled=truekubectl注释节点gke-test-default-pool-a44dbf1c-hmrfcluster-autoscaler.kubernetes.io/scale-down-disabled=true

但错误仍然显示在GKE上

请告诉我如何解决GKS中的错误/问题,从3天开始,我无法理解和解决它,即使我谷歌它并准备了这么多网站,但没有解决它。

部署之后

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

共有2个答案

曹伟泽
2023-03-14

在你分享的链接中写着:

默认情况下,kube系统pods阻止CA删除运行它们的节点。用户可以手动为kube系统podhtml" target="_blank">添加PDB,可以在其他地方安全地重新安排:

kubectl create poddisruptionbudget <pdb name> --namespace=kube-system --selector app=<app name> --max-unavailable 1

PDB限制因自愿中断而同时减少的复制应用程序的Pod数量。例如,基于仲裁的应用程序希望确保运行的副本数量永远不会低于仲裁所需的数量

您可以在此处找到有关中断的更多信息。

在此为您的应用程序指定中断预算。

还有一个关于 Pod 中断预算的完整教程,用于帮助手动升级 GKE 集群。

哪些类型的pod可以防止CA删除节点?

具有限制性pod中断预算的pod。

Kube系统pods:

  • 默认不在节点上运行,*
  • 没有设置pod中断预算,或者它们的PDB限制太多(从CA 0.6开始)。
  • 不受控制器对象支持的Pods(因此不是由部署、副本集、作业、有状态集等创建的)。*
  • 具有本地存储的Pods。*
  • 由于各种限制(缺乏资源、不匹配的节点选择器或亲和力、匹配的反亲和力等)而无法移动到其他地方的Pods

具有以下注释集的窗格:

  • “cluster-autoscaler.kubernetes.io/safe-to-evict”:“假”
  • *除非 Pod 具有以下注释(在 CA 1.0.3 或更高版本中受支持):
  • “cluster-autoscaler.kubernetes.io/safe-to-evict”:“真”

或者您已经用一个相关标志重写了此行为。有关这些标志的更多信息,请参见下文。

您可以使用自动缩放器事件来查看您的pod,并查看哪一个导致CA的阻塞缩小。

除此之外,你可以在另一个问题中找到这个答案,以解决你可能有的更多疑问。

和魁
2023-03-14

我已经阅读了这个文档:- https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/FAQ.md#how-to-set-pdbs-to-enable-ca-to-move-kube-system-pods

但仍然无法理解我需要在每个pod或每个节点中添加这行代码。如果我需要添加pods。

您不需要添加到pod或节点,您需要在kube-system中为pod创建PDB,以便CA知道从应该删除的节点中删除这样的pod是安全的。核心域名示例:

kubectl创建pod追随预算

 类似资料:
  • 本文向大家介绍python实现守护进程、守护线程、守护非守护并行,包括了python实现守护进程、守护线程、守护非守护并行的使用技巧和注意事项,需要的朋友参考一下 守护进程 1、守护子进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allow

  • 我完全混淆了,,。 哪个是阻塞,哪个不是? 我的意思是如果我使用父进程是否等待子进程返回/才继续执行。 如何影响这些调用?

  • 维基百科中守护进程的解释 守护进程是一个运行后台进程, 非交互式用户直接控制的在计算机程序 Gradle 守护进程是一个后台进程, 它运行着繁重的构建, 然后在构建等待下一次构建的之间保持自身存在. 这使得数据和代码在下一次构建前已经准备好,并存入内存中. 这显著的提高了后续构建的性能. 启用Gradle守护进程是一种节约构建时间的廉价方式. 强烈建议在所有开发机器上启用Gradle的守护进程.但

  • 本文向大家介绍【java 多线程】守护线程与非守护线程的详解,包括了【java 多线程】守护线程与非守护线程的详解的使用技巧和注意事项,需要的朋友参考一下 Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程) 用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需

  • 守护(Daemon)进程 我们可以认为守护进程就是后台服务进程,因为它会有一个很长的生命周期提供服务,关闭终端不会影响服务,也就是说可以忽略某些信号。 实现守护进程 首先要保证进程在后台运行,可以在启动程序后面加&,当然更原始的方法是进程自己fork然后结束父进程。 if (pid=fork()) { exit(0); // Parent process } 然后是与终端、进程组、会话(Ses

  • Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。 Daemonset可以确保全部(或者某些)节点上运行一个Pod的副本。当有节点加入集群时,也会为他们新增一个Pod。当有节点从集群移除时,这些Pod也会被回收。删除DaemonSet将会删除它创建的所有Pod。 Daemonset典型用法如下: 在每个节点上运行集群存守护进程 在每个节点上运行日志收集守护进程 在每个节点上运行

  • 建议使用 systemd 管理我们的服务进程。 可以参考swoole官方文档 使用方法 请确保cabal.php配置文件中的swoole.daemonize配置为关闭状态(0或false)! 'swoole' => [ // ... 'daemonize' => 0, // ... ], 在 /etc/systemd/system/目录中,创建一个 cabal.

  • 命令模式 守护进程方式启动:bin/imi server/start -d 重定向标准输入输出:bin/imi server/start -d 文件名.log 此方法只可让服务在后台运行,退出 ssh 后不被终止。 无法在服务崩溃后重新拉起,建议使用 systemd Systemd Systemd 一般都已经集成在了现代 Linux 发行版中,使用它可以实现开机自启动和守护进程等功能。 但 Sys