首页 > 编程语言 >k8s-node节点平滑维护

k8s-node节点平滑维护

时间:2024-07-25 10:40:05浏览次数:15  
标签:node drain 调度 节点 Pod k8s pod

目录

Kubernetes 节点管理:cordondraindelete 命令

在 Kubernetes 集群中,管理节点时常涉及到将节点从调度中排除以便进行维护。常用的操作包括 cordondraindelete。这三个命令的主要作用是停止新 Pod 的调度到特定节点上,但其实施的方式和影响程度各不相同。

1. cordon 命令

cordon 命令将节点标记为不可调度状态 (SchedulingDisabled)。执行该命令后,新创建的 Pod 不会被调度到该节点,但现有的 Pod 继续运行,不受影响。这是影响最小的操作,适用于需要短时间隔离节点的情况。
命令使用:

  • 禁止调度:kubectl cordon <node-name>
  • 恢复调度:kubectl uncordon <node-name> (恢复到K8S集群中,变回可调度状态)

2. drain 命令

drain 命令比 cordon 更进一步,不仅将节点标记为不可调度,还会逐步将节点上的 Pod 迁移到其他节点。在迁移过程中,drain 会优雅地终止 Pod,遵循 PodDisruptionBudgets (PDB) 的设置,确保应用不中断。

  • drain方式是安全驱逐pod,会等到pod容器应用程序优雅停止后再删除该pod。
  • drain驱逐流程:先在Node节点删除pod,然后再在其他Node节点创建该pod。所以为了确保drain驱逐pod过程中不中断服务(即做到"无感知"地平滑驱逐),必须保证要驱逐的pod副本数大于1,并且采用了"反亲和策略"将这些pod调度到不同的Node节点上了!也就是说,在"多个pod副本+反亲和策略"的场景下,drain驱逐过程对容器服务是没有影响的。

命令使用:

  • 驱逐并禁止调度:kubectl drain <node-name> --force --ignore-daemonsets --delete-local-data
  • 恢复调度:kubectl uncordon <node-name>

注意事项:

  • drain 命令会忽略 DaemonSet 管理的 Pod,需要加 --ignore-daemonsets 参数。
  • 对于使用本地存储的 Pod,可能需要加 --delete-local-data 以强制删除。

drain 是一种安全的驱逐方式,适用于节点维护前的操作,如内核升级或硬件更换。在实施 drain 之前,确保 Pod 副本数大于 1 并且配置了反亲和策略,以避免服务中断。

在生产环境中,通常会为 Kubernetes 集群中的 Pod 配置 PodDisruptionBudget (PDB),以确保在 Pod 被驱逐时服务的可用性。理想情况下,PDB 的配置通常是 maxUnavailable 设置为 0,maxSurge 设置为 1。这意味着在驱逐过程中,Pod 的总数不会减少,从而确保服务的连续性和稳定性。

replicas: 2
 strategy:
 type: RollingUpdate
   rollingUpdate:
     maxSurge: 1          
     maxUnavailable: 0

3. delete 命令

delete 命令是最具破坏性的操作,会直接从集群中删除节点及其上的所有 Pod。此操作类似于强制删除,会忽略 PDB 和 Pod 的优雅终止设置。使用 delete 命令后,如果需要重新将节点加入集群,需要手动重新启动 kubelet 并处理证书签发。
命令使用:

  • 删除节点:kubectl delete node <node-name >

恢复调度(即重新加入到K8S集群中)

  • delete删除后,后续如果需重新加入K8S集群。则需要重启node节点的kubelet服务,重启后,基于node的自注册功能,该节点才能重新加入到K8S集群,并且恢复使用(即恢复可调度的身份)。
  • 另外:如果kubelet服务重启后,node节点系统时间跟其他节点不一致,则导致该节点证书会失效!kubelet注册后,还需要手动approve签发TLS认证操作了。如下示例:
node02节点重启后,系统时间变了,跟其他node节点系统时间不一致,导致该节点的集群证书失效!
[root@k8s-master01 ingress]# kubectl exec -ti test-finhub-app-56df548879-ghlb2 -n wiseco -- /bin/bash
Error from server: error dialing backend: x509: certificate is valid for k8s-master01, not k8s-node02
 
[root@k8s-master01 ingress]# kubectl get csr
NAME        AGE     REQUESTOR                CONDITION
csr-7zt2w   50m     system:node:k8s-node02  节点重启后   Pending
csr-8sw6k   36m     system:node:k8s-node02  节点重启后   Pending
csr-9jv7z   21m     system:node:k8s-node02  节点重启后   Pending
 
需要手动approve签发TLS认证
[root@k8s-master01 ingress]# kubectl certificate approve csr-7zt2w
[root@k8s-master01 ingress]# kubectl certificate approve csr-8sw6k
[root@k8s-master01 ingress]# kubectl certificate approve csr-9jv7z

4.节点平滑维护的推荐步骤

通常情况下,如果要对K8S集群中的一台Node节点进行平滑维护,如升级或调整配置。正确的操作:

  • cordon临时从K8S集群隔离出来,标识为SchedulingDisabled不可调度状态。
  • drain排干该节点上的pod资源到其他node节点上。
  • 对该节点展开平滑维护操作,如升级或调整配置。
  • uncordon恢复,重新回到K8S集群,变回可调度状态。

同时注意:为了确保drain驱逐pod的时候,容器应用服务不中断,必须满足:

  • 要驱逐的pod副本数量必须大于1
  • 要配置"反亲和策略",确保被驱逐的pod被调度到不同的Node节点上
  • deployment采用滚动更新,设置maxUnavailable为0,maxSurge为1

标签:node,drain,调度,节点,Pod,k8s,pod
From: https://www.cnblogs.com/Unstoppable9527/p/18322490

相关文章

  • 如何使用 Django 在 neo4j 中创建节点
    我正在开发一个网络应用程序。对于后端,我选择了Django,作为数据库,我想使用图形数据库,所以我选择了neo4j。有一个Python库neomodel用于使用neo4j和一个特定的库django_neomodel要合并|||使用Django。neomodel我可以使用Django和neo4j从......
  • 在K8S中,容器提供一个服务,外部访问慢,到底是容器网络问题?还是容器服务问题?这种怎么排查?
    在K8S(Kubernetes)中,当容器提供的服务外部访问慢时,可能是由容器网络问题或容器服务问题中的一个或多个因素导致的。为了有效排查这个问题,可以按照以下步骤进行:一、初步排查检查外部访问方式:确认外部是通过哪种方式访问服务的,如LoadBalancer、NodePort、Ingress等。检查相应的......
  • 在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么
    在K8S中,当用户反映Pod连接数非常多时,为了查看这些连接的具体信息和状态,并考虑到容器内没有集成bash环境和网络工具的情况,可以采取以下步骤进行排查:一、确认问题并收集信息查看Pod状态:使用kubectlgetpods命令查看Pod列表,确认哪个Pod的连接数异常。使用kubectldescribepod......
  • 在K8S中,calico和cilium这两种cni有什么区别?cailico的ipip模型和ciliume的vxlan模型,两
    在Kubernetes(K8S)中,Calico和Cilium是两种流行的容器网络接口(CNI)插件,它们各自具有独特的特点和优势。下面将详细比较这两种CNI插件,并探讨Calico的IPIP模型和Cilium的VXLAN模型在数据处理上的差异。1.Calico与Cilium的区别CalicoCilium基础架构基于BGP的纯三层网络方案......
  • 在K8S中,外部访问容器服务,比如说提供了一个域名,链路怎么走?数据经过哪些组件?
    在K8S(Kubernetes)中,外部访问容器服务并涉及到一个域名时,整个访问链路会经过多个组件,确保请求能够正确地被路由到目标服务。以下是详细的链路流程和涉及的组件:1.链路流程域名解析:当用户在浏览器或客户端输入域名时,首先会进行DNS解析。DNS服务器会将域名解析为对应的IP地址。......
  • 在K8S中,cailico的ipip模型和ciliume的vxlan模型除了在具体的实现不同,在原理上有何区别
    在Kubernetes中,Calico的IP-in-IP(IPoverIP)模型和Cilium的VXLAN(VirtualeXtensibleLocalAreaNetwork)模型都旨在解决跨主机通信的问题,但它们在原理上有着本质的区别,这些差异主要体现在数据包的封装、网络层级、性能影响以及网络策略的实施上。1.Calico的IPIP模型原理:IPIP(IP......
  • Canvas+bpmn.js 流程节点鼠标悬浮显示信息 (全网首发)
    customBpmn.jsimportinheritsfrom"inherits";importViewerfrom"bpmn-js/lib/Viewer";importZoomScrollModulefrom"diagram-js/lib/navigation/zoomscroll";importMoveCanvasModulefrom"diagram-js/lib/navigation/moveca......
  • k8s配置文件之deployment配置
    deployment使用并管理rs,算是更高一层的概念,这是现在比较常用的部署app的方式。deployment为pod和rs提供声明式更新(而非命令式)。支持滚动更新(rollingUpdate),支持回滚操作资源配置主要分五类来定义内容 一:apiVersion【string】 APIVersion定义对象表示的版本,此处为:apps/......
  • Substance designer常用节点介绍
    RGBASplitRGBAMerge——分离四通道,合并四通道Distance——SDF,扩大图片像素HistogramScan——类似于smoothstep,硬化或模糊边缘Bevel——Distance只能扩大,但是这个可以缩小和扩大InvertGrayscale—— 反转Transformation2D—— 开放手动调整缩放之类的参数EdgeDe......
  • Windows使用NVM管理node.js
    NVM(NodeVersionManager)是一个开源的命令行工具,用于管理多个版本的Node.js在同一台计算机上。NVM允许开发者轻松地安装、切换和管理不同版本的Node.js,这对于在多个项目上工作或测试Node.js的不同特性时非常有用。在macOS或Linux上,通常通过curl或wget下载安......