首页 > 编程语言 >k8s里node 宕机后如何提高pod迁移速度

k8s里node 宕机后如何提高pod迁移速度

时间:2024-06-07 15:34:53浏览次数:33  
标签:node kubernetes 宕机 -- etc client pod pki

大概的配置参数:

 

 

node故障后,pod会迁移到 正常的node上, 迁移时间大概8分钟左右, 如果是微服务,注册到nacos,服务不受影响,但是对于其他的服务,
请求中会有大量失败。

 

需要几个流程:

kubelet 自身会定期更新状态到 apiserver,通过kubelet的参数 node-status-update-frequency 配置上报频率,默认 10s 上报一次。

kube-controller-manager定期去探测kubelet的运行状态,默认5s问kubelet,使用--node-monitor-grace-period参数

kube-controller-manager询问kubelet,如果5分钟没有回复,认为kubelet有问题,node-monitor-grace-period,是kubelet参数node-status-update-frequency的整数倍

如果有问题,故障node节点被设置成污点

  • node.kubernetes.io/unreachable:NoExecute
  • node.kubernetes.io/unreachable:NoSchedule

节点被设置了污点,pod节点上还是running,apiserver的参数--default-unreachable-toleration-seconds是驱逐掉时间。

 

vim /var/lib/kubelet/config.yaml

memorySwap: {}
#修改kubelet向apiserver 汇报时间,由10秒变成4秒 node-status-update-frequency: 4s nodeStatusReportFrequency: 0s nodeStatusUpdateFrequency: 0s rotateCertificates: true runtimeRequestTimeout: 0s shutdownGracePeriod: 0s shutdownGracePeriodCriticalPods: 0s staticPodPath: /etc/kubernetes/manifests streamingConnectionIdleTimeout: 0s syncFrequency: 0s volumeStatsAggPeriod: 0s

 

 vim /etc/kubernetes/manifests/kube-apiserver.yaml

spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=192.168.148.131
    - --allow-privileged=true
    - --authorization-mode=Node,RBAC
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --enable-admission-plugins=NodeRestriction
    - --enable-bootstrap-token-auth=true
    - --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
    - --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
    - --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key
    - --etcd-servers=https://127.0.0.1:2379
    - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
    - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
    - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
    - --requestheader-allowed-names=front-proxy-client
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --requestheader-extra-headers-prefix=X-Remote-Extra-
    - --requestheader-group-headers=X-Remote-Group
    - --requestheader-username-headers=X-Remote-User
    - --secure-port=6443
    - --service-account-issuer=https://kubernetes.default.svc.cluster.local
    - --service-account-key-file=/etc/kubernetes/pki/sa.pub
    - --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
    - --service-cluster-ip-range=10.96.0.0/12
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
#当node节点为notready或者 unreachable时,5秒钟驱逐掉,默认300秒 - --default-unreachable-toleration-seconds=5 - --default-not-ready-toleration-seconds=5

 

vim /etc/kubernetes/manifests/kube-controller-manager.yaml

spec:
  containers:
  - command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
    - --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf
    - --bind-address=127.0.0.1
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --cluster-cidr=10.244.0.0/16
    - --cluster-name=kubernetes
    - --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
    - --service-cluster-ip-range=10.96.0.0/12
    - --use-service-account-credentials=true
    - --v=5
# kube-controller-manager 修改成2秒主动探测,默认值5秒 - --node-monitor-period=2s
# 将一个node标记为不健康之前允许其无响应的上线 - --node-monitor-grace-period=12s

 

验证脚本,中间关闭node, 查看pod漂移时间

while true; do echo `date +%F-%T`; kubectl get node ;echo "####################################################################"; kubectl describe nodes node2 | grep -A5 Taint;echo "";echo "##############################################################"; kubectl get pod -o wide; sleep 5; done

 

注意:以前的pod需要重建。

标签:node,kubernetes,宕机,--,etc,client,pod,pki
From: https://www.cnblogs.com/fengjian2016/p/18237254

相关文章

  • k8s——pod控制器
    一、pod控制器定义  Pod控制器,又称之为工作负载(workload),是用于实现管理pod的中间层,确保pod资源符合预期的状态,pod的资源出现故障时,会尝试进行重启,当根据重启策略无效,则会重新新建pod的资源。二、pod控制器类型ReplicaSet:代用户创建指定数量的pod副本,确保pod副本数量符......
  • 修改k8s pod的hosts文件
    当我们服务需要使用自定义的域名解析时,就需要修改pod内hosts文件。而如果我们在pod内部修改后,下次重启依然会丢,所有下面用两种方式实现持久化修改: 1.当集群内所有或者大部分服务都需要修改hosts文件时,我们可以修改CoreDNS的configmap文件 kubectleditcm-nkube-systemco......
  • k8s-pod参数详解
    目录概述创建Pod编写一个简单的Pod添加常用参数为Pod的容器分配资源网络相关Pod健康检查启动探针存活探针就绪探针作用整个Pod参数配置创建docker-registry卷挂载结束概述  k8s中的pod参数详解。官方文档  版本k8s1.27.x、busybox:stable-musl、nginx:sta......
  • Azure 函数(Node.js):如何从代码中读取上传到 Azure 证书刀片的公钥(.cer)?
    我在Node.js上运行了AzureFunctions。(另外,请注意,通过应用程序服务计划运行的底层操作系统是Windows)让我先绕道而行。一直以来,我都是从Node.js代码访问AzureKeyVault,因此我知道如何从Node.js代码访问KeyVault,这样看起来就像这样:co......
  • node基于自签名证书搭建https服务
    原文链接:https://www.cnblogs.com/yalong/p/18232314描述基于node.js搭建一个https静态资源服务,由于只是本地用,所以使用自签名的ssl证书就行了我用的mac系统,系统自带有openssl的,其他系统如果没有请先安装使用Openssl生成CA证书生成root密钥:opensslgenrsa-outroot......
  • k8s配置节点亲和性yaml示例:根据节点名称来配置节点亲和性(node affinity)
    在Kubernetes中,根据节点名称来配置节点亲和性(nodeaffinity)通常不是直接通过节点名称实现的,而是通过为节点添加特定的标签,然后在Pod的亲和性规则中匹配这些标签。不过,有一种特殊情况是使用NodeAffinity的nodeSelectorTerms中的matchExpressions,通过设置operator为In并使用......
  • node.js + mysql实现基本的增删改查功能(保姆级教程---1)
    node.js+mysql实现基本的增删改查(保姆级教程---1)工具:sqlyog可视化工具,vscode,nodejs环境(我的node.js版本号是18.16.0)前提条件:电脑上要有node.js、npm、mysql服务器、可视化工具(navicat或sqlyog都行)步骤:新建文件夹node-mysql-cruid(根目录),终端打开该目录初始化项目:npm......
  • node.js + mysql实现基本的增删改查功能(保姆级教程---2优化版)
    node.js+mysql实现基本的增删改查(保姆级教程---2优化版)上一个实现对增删改查功能都写在同一个文件里,代码过于冗余,我认为可以优化,分开写在不同文件里面,使得更加直观。废话不多说,直接进入主题:对之前的代码进行抽离:db.js文件(用于数据库的连接,并导出连接供其他模块使用):......
  • yarn 命令如何查看node_modules中的某个依赖包是被package.json中的哪个包所使用的?
    Yarn本身并没有直接提供一个命令来查看node_modules中的某个依赖包是由package.json中的哪个包直接或间接引入的。但是,你可以通过一些间接的方式来获取这些信息:手动检查:打开node_modules中你想查询的依赖包的package.json文件,查看它的name字段确认包名。然后回到你的项目根......
  • 计算机毕业设计项目推荐,28259校园信息交流平台的设计与实现(开题答辩+程序定制+全套文
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,校园信息交流平台被用户普遍使用,为方便用户能够可以随时进行校园信息交流平台的数据信息管理,特开发了基于校园信息交流......