K8S-集群管理

news2024/10/6 18:30:26

目录

一、pod资源限制(resources)

二、重启策略(restartPolicy)

三、扩容缩容

1.手动扩容

2.自动扩容

2.1、数据采集组件

2.1.1、部署

2.2、HPA

2.2.1、案例

2.2.1.1、HPA基于cpu自动扩缩容

2.2.1.2、HPA基于内存自动扩缩容

2.3、cluster-autoscaler

二、使用步骤

1.引入库

2.读入数据

总结



一、pod资源限制(resources)

        当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。最常见的可设定资源是 CPU 和 内存大小 ,以及其他类型的资源。

        当为 Pod 中的容器指定了 request 资源时,调度器就使用该信息来决定将 Pod 调度到哪个节点上。当还为容器指定了 limit 资源时,kubelet 就会确保运行的容器不会使用超出所设的 limit 资源量。kubelet 还会为容器预留所设的 request 资源量,供该容器使用。

        如果 Pod 运行所在的节点具有足够的可用资源,容器可以使用超出所设置的 request 资源量。不过,容器不可以使用超出所设置的 limit 资源量。

        如果给容器设置了内存的 limit 值,但未设置内存的 request 值,Kubernetes 会自动为其设置与内存 limit 相匹配的 request 值。类似的,如果给容器设置了 CPU 的 limit 值但未设置 CPU 的 request 值,则 Kubernetes 自动为其设置 CPU 的 request 值 并使之与 CPU 的 limit 值匹配。

        官网示例:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/

  • Pod 和 容器 的资源请求和限制
spec.containers[].resources.requests.cpu		//定义创建容器时预分配的CPU资源
spec.containers[].resources.requests.memory		//定义创建容器时预分配的内存资源
spec.containers[].resources.limits.cpu			//定义cpu的资源上限 
spec.containers[].resources.limits.memory		//定义内存的资源上限
  •  案例
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

—CPU 资源单位:Kubernetes 中的一个 cpu 相当于1个 vCPU(1个超线程)。Kubernetes 也支持带小数 CPU 的请求。spec.containers[].resources.requests.cpu 为 0.5 的容器能够获得一个 cpu 的一半 CPU 资源(类似于Cgroup对CPU资源的时间分片)。表达式 0.1 等价于表达式 100m(毫核),表示每 1000 毫秒内容器可以使用的 CPU 时间总量为 0.1*1000 毫秒。

—内存资源单位:内存以字节为单位。可以以整数表示,或者以10为底数的指数的单位(E、P、T、G、M、K)来表示, 或者以2为底数的指数的单位(Ei、Pi、Ti、Gi、Mi、Ki)来表示。
 

二、重启策略(restartPolicy)

重启策略:Pod在遇到故障之后重启的动作

spec.Always:当容器终止退出后,总是重启容器,默认策略
spec.OnFailure:当容器异常退出(退出状态码非0)时,重启容器;正常退出则不重启容器
spec.Never:当容器终止退出,从不重启容器。

三、扩容缩容

1.手动扩容

        在生产环境下,在面临服务需要扩容的场景时,可以使用Deployment/RC的Scale机制来实现。

        slace扩容或缩容 Deployment、ReplicaSet、Replication Controller或 Job 中Pod数量。

Kubernetes支持对Pod的手动扩容和自动扩容。replicas决定了集群pod的数量。

  • 创建一个单节点的web容器
kubectl apply -f apache.yaml
  • 在集群运行的过程中我们可以动态调整集群pod的数量
  • 修改服务配置,即时生效:
kubectl edit deployments.apps apache
  • scale命令,控制pod的数量
kubectl scale deployments.appse apache --replicas=3

2.自动扩容

2.1、数据采集组件

        metrics-server 是一个集群范围内的资源数据集和工具,同样的,metrics-server 也只是显示数据,并不提供数据存储服务,主要关注的是资源度量 API 的实现,比如 CPU、文件描述符、内存、请求延时等指标,metric-server 收集数据给 k8s 集群内使用,如 kubectl,hpa,scheduler 等。不同k8s版本根据官网安装对应版本的metrics-server。

  •  github地址:https://github.com/kubernetes-sigs/metrics-server/

2.1.1、部署

  • 镜像下载
wget registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.6.4
  • 导入镜像
docker load -i metrics-server-0.6.4.tar.gz
  • 修改apiserver配置

注意:会中断业务,生产环境谨慎操作!这个是 k8s 在 1.17 的新特性,如果是 1.16 版本的可以不用添加,1.17 以后要添加。这个参数的作用是 Aggregation 允许在不修改 Kubernetes 核心代码的同时扩展 Kubernetes API。

vim /etc/kubernetes/manifests/kube-apiserver.yaml
22     - --enable-aggregator-routing=true               # 增加
  • 重启kubelet
systemctl restart kubelet
  • 部署metrics-server 服务

用到的yaml文件到github下载,地址:https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.6.1/components.yam

kubectl apply -f components.yaml
  • 验证
kubectl get pods -n kube-system | grep metrics

2.2、HPA

        kubernetes HPA(Horizontal Pod Autoscaling):根据监控指标(cpu 使用率、磁盘、自定义的等)自动扩容或缩容服务中的pod数量,当业务需求增加时,系统将无缝地自动增加适量 pod 容器,提高系统稳定性。hap监控容器资源的利用率。

        kubernetes KPA(Knative Pod Autoscaler):基于请求数对 Pod 自动扩缩容,KPA 的主要限制在于它不支持基于 CPU 的自动扩缩容。

        kubernetes VPA(Vertical Pod Autoscaler):基于 Pod 的资源使用情况自动设置 pod 的 CPU 和内存的 requests,从而让集群将 Pod 调度到有足够资源的最佳节点上。

  • HPA运作方式

        整体逻辑:K8s 的 HPA controller 已经实现了一套简单的自动扩缩容逻辑,默认情况下,每 15s 检测一次指标,只要检测到了配置 HPA 的目标值,则会计算出预期的工作负载的副本数,再进行扩缩容操作。同时,为了避免过于频繁的扩缩容,默认在 5min 内没有重新扩缩容的情况下,才会触发扩缩容。

  • 缺陷:

        HPA 本身的算法相对比较保守,可能并不适用于很多场景。例如,一个快速的流量突发场景,如果正处在 5min 内的 HPA 稳定期,这个时候根据 HPA 的策略,会导致无法扩容。

  • pod数量计算方式

        通过现有 pods 的 CPU 使用率的平均值(计算方式是最近的 pod 使用量(最近一分钟的平均值,从 metrics-server 中获得)除以设定的每个 Pod 的 CPU 使用率限额)跟目标使用率进行比较,并且在扩容时,还要遵循预先设定的副本数限制:MinReplicas <= Replicas <= MaxReplicas。
        计算扩容后 Pod 的个数:sum(最近一分钟内某个 Pod 的 CPU 使用率的平均值)/CPU 使用上限的整数+1

HPA官网:  Pod 水平自动扩缩 | Kubernetes

2.2.1、案例

  • 输出nginx服务yaml文件
kubectl -n jy-test create deployment nginx-web --image=harbortest.szjs.gov.cn/zjj-public/nginx:1.22.1-arm --dry-run=client -o yaml > nginx-web.yaml

        为了平常使用yaml时,由于手抖,造成的格式错误,建议尽量使用–dry-run参数来生成一个基础的yaml,再修改。

  • 通过yaml文件创建deployment
kubectl apply -f nginx-web.yaml
  • 对外暴露端口号
kubectl -n jy-test expose deployment nginx-web --port=80 --type=NodePort --target-port=80 --name=svc-nginx-web -o yaml >> nginx-web.yaml
  • 通过yaml文件创建service
kubectl apply -f nginx-web.yaml

配置资源限制

kubectl -n jy-test edit deploy nginx-web

    spec:
      containers:
      - image: harbortest.szjs.gov.cn/zjj-public/nginx:1.22.1-arm
        imagePullPolicy: IfNotPresent
        name: nginx
        resources:           # 注意:nginx 的 pod 里需要有如下字段,否则 hpa 会采集不到内存指标
          limits:
            cpu: 500m
            memory: 256Mi
          requests:
            cpu: 200m
            memory: 256Mi
2.2.1.1、HPA基于cpu自动扩缩容

        nginx-web 服务正在运行,使用 kubectl autoscale 创建自动缩放器,实现对 nginx-web 这个deployment 创建的 pod 自动扩缩容,下面的命令将会创建一个 HPA,HPA 将会根据 CPU资源指标增加或减少副本数,创建一个可以实现如下目的的 hpa:
(1)让副本数维持在 1-10 个之间(这里副本数指的是通过 deployment 部署的 pod 的副本数)
(2)将所有 Pod 的平均 CPU 使用率维持在 50%(通过 kubectl run 运行的每个 pod 如果是 200毫核,这意味着平均 CPU 利用率为 100 毫核)

  • 创建HPA基于cpu自动扩缩容
kubectl -n jy-test autoscale deployment nginx-web --cpu-percent=50 --min=1 --max=10 --name=nginx-web
  • 查看
 kubectl -n jy-test get hpa
  • 验证:重新打开一个master节点的终端,进行如下操作 
kubectl -n jy-test exec -it nginx-web-f646c4b44-nlxjq bash
/# for i in {1..500000}; do curl http://www.test.com/my_service &  done

        当容器的cpu占用超过 50% 的时候,自动扩展一个POD,依次扩展,一直到最大值,如果cpu访问不足 50% 的时候,每 300s 缩减一个 POD 节点,直到最小值时停止。

  • 查看  
kubectl -n jy-test get hpa
  • 可以看到cpu目标及当前状态,最大、最小、当前副本数。 

kubectl -n jy-test get pod

 

2.2.1.2、HPA基于内存自动扩缩容

        nginx 服务正在运行,使用 kubectl autoscale 创建自动缩放器,实现对 nginx 这个deployment 创建的 pod 自动扩缩容,下面的命令将会创建一个 HPA,HPA 将会根据内存资源指标增加或减少副本数,创建一个可以实现如下目的的 hpa:
(1)让副本数维持在 1-10 个之间(这里副本数指的是通过 deployment 部署的 pod 的副本数)
(2)将所有 Pod 的平均内存使用率维持在 60%

  •  创建HPA基于内存自动扩缩容,yaml文件如下

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-web-hpa2               # hpa的名称
  namespace: jy-test
spec:
  maxReplicas: 10
  metrics:
  - resource:
      name: memory
      target:
        averageUtilization: 60
        type: Utilization
    type: Resource
  minReplicas: 1
  scaleTargetRef:                   # 定义监视控制器,需要扩容缩谷时需要通知的控制器
    apiVersion: apps/v1          
    kind: Deployment
    name: nginx-web                 # 控制器的名称
  • 创建
kubectl create -f hpa.yaml
  • 查看
kubectl -n jy-test get hpa
  • 可以看到当前内存使用率、目标内存使用率,最大、最小、当前副本数 

2.3、cluster-autoscaler

        Cluster Autoscaler (CA)是一个独立程序,是用来弹性伸缩 kubernetes 集群的。它可以自动根据部署应用所请求的资源量来动态的伸缩集群。当集群容量不足时,它会自动去 Cloud Provider (支持GCE、GKE 和 AWS)创建新的 Node,而在 Node 长时间资源利用率很低时自动将其删除以节省开支。
项目地址:GitHub - kubernetes/autoscaler: Autoscaling components for Kubernetes

  • 在以下情况下,集群自动扩容或者缩放:

扩容:由于资源不足,某些 Pod 无法在任何当前节点上进行调度。
缩容: Node 节点资源利用率较低时,且此 node 节点上存在的 pod 都能被重新调度到其他 node节点上运行。

  • 在以下情况下,集群节点不会被 CA 删除

1、节点上有 pod 被 PodDisruptionBudget 控制器限制。
2、节点上有命名空间是 kube-system 的 pods。
3、节点上的 pod 不是被控制器创建,例如不是被 deployment, replica set, job, stateful set 创建。
4、节点上有 pod 使用了本地存储。
5、节点上 pod 驱逐后无处可去,即没有其他 node 能调度这个 pod。
6、节点有注解:“cluster-autoscaler.kubernetes.io/scale-down-disabled”: “true”(在 CA 1.0.3 或更高版本中受支持)。

  • 命令
 kubectl annotate node <nodename> cluster-autoscaler.kubernetes.io/scale-down-disabled=true
  • HPA 如何与 Cluster Autoscaler 一起使用?

        Horizontal Pod Autoscaler 会根据当前 CPU 负载更改部署或副本集的副本数。如果负载增加,则 HPA 将创建新的副本,集群中可能有足够的空间,也可能没有足够的空间。如果没有足够的资源,CA将尝试启动一些节点,以便 HPA 创建的 Pod 可以运行。如果负载减少,则 HPA 将停止某些副本。结果,某些节点可能变得利用率过低或完全为空,然后 CA 将终止这些不需要的节点。

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/946344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

透过源码理解Flutter InheritedWidget

InheritedWidget的核心是保存值和保存使用这个值的widget&#xff0c;通过对比值的变化&#xff0c;来决定是否要通知那些使用了这个值的widget更新自身。 1 updateShouldNotify和notifyClients InheritedWidget通过updateShouldNotify函数控制依赖其的子组件是否在Inherited…

[Android AIDL] --- AIDL工程搭建

0 AIDL概念 AIDL&#xff08;Android Interface Definition Language&#xff09;是一种 IDL 语言&#xff0c;用于生成可以在 Android 设备上两个进程之间进行进程间通信&#xff08;IPC&#xff09;的代码。 通过 AIDL&#xff0c;可以在一个进程中获取另一个进程的数据和调…

视频汇聚/视频云存储/视频监控管理平台EasyCVR接入海康SDK协议后无法播放该如何解决?

开源EasyDarwin视频监控/安防监控/视频汇聚EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多路视频流&#…

idea自定义提示关键词 switch

idea中希望提示Switch case的快捷键&#xff0c; 比如我想自定义一个输入【mmm】就提示main方法&#xff0c;该怎么做&#xff1f; 1.File - Settings&#xff0c;点击。 2.找Live Templates &#xff0c;可以在搜索里面搜live&#xff0c;找到后点击。 3.先点击号&#xff…

系统架构设计师-计算机系统基础知识(2)

目录 一、存储管理 1、页式存储 2、段式存储 3、段页式存储 二、磁盘管理 1、先来先服务FCFS 2、最短寻道时间优先SSTF 三、文件系统 1、文件基本概念 2、文件的类型&#xff1a; 3、索引文件结构 4、位示图 一、存储管理 1、页式存储 将程序与内存划分为同样大小的块&…

算法面试-深度学习面试题整理(2024.8.29开始,每天下午持续更新....)

一、无监督相关&#xff08;聚类、异常检测&#xff09; 1、常见的距离度量方法有哪些&#xff1f;写一下距离计算公式。 1&#xff09;连续数据的距离计算&#xff1a; 闵可夫斯基距离家族&#xff1a; 当p 1时&#xff0c;为曼哈顿距离&#xff1b;p 2时&#xff0c;为欧…

C++中的 class和struct区别

C 中保留了C语言的 struct 关键字&#xff0c;并且加以扩充。在C语言中&#xff0c;struct 只能包含成员变量&#xff0c;不能包含成员函数。而在C中&#xff0c;struct 类似于 class&#xff0c;既可以包含成员变量&#xff0c;又可以包含成员函数。 C中的 struct 和 class 基…

领英采用 Protobuf 进行微服务开发,网络延迟降低60%

领英采用 Protobuf&#xff0c;以实现其各类平台中更为高效的微服务间数据传递&#xff0c;并将其与开源框架 Rest.li 相集成。在全公司范围的推广完成后&#xff0c;领英将延迟降低了 60%的同时&#xff0c;也提高了资源的利用率。 领英平台所采用的是微服务架构&#xff0c;…

InnoDB表空间

一、页面类型 1.1 页面通用部分 File Header &#xff1a;记录页面的一些通用信息 File Trailer &#xff1a;校验页是否完整&#xff0c;保证从内存到磁盘刷新时内容的一致性。 File Header结构&#xff1a; 二、独立表空间结构 2.1 区 对于16KB的页来说&#xff0c;连续的…

android logcat问题 怎么换成旧版

参考 如果想切换回旧版LOGCAT&#xff0c;按照下方步骤设置即可 File->Settings->Expermental->Logcat->Enable new Logcat tool window&#xff1a;取消勾选 设置好后上方会有一个Toast&#xff0c;询问你是否使用新版logcat&#xff0c;关掉即可 最新测试版移…

如何能使mp3的音量变大?

如何能使mp3的音量变大&#xff1f;我们经常在日常生活中使用的一种音频格式是MP3。许多朋友在下载音乐后&#xff0c;都会选择MP3格式进行播放。然而&#xff0c;在我们的日常生活中&#xff0c;我们有时会遇到音量太小的问题。这时候&#xff0c;我们听歌可能会感到很不舒服。…

分段三次hermit插值

保形三次hermit插值 一、算法实现 一、插值函数建立 设函数 y F ( x ) yF(x) yF(x)在区间 [ a , b ] [a,b] [a,b]上有定义&#xff0c;且已知在离散点 a x 0 < x 1 < . . . < x n b ax_0<x_1<...<x_n b ax0​<x1​<...<xn​b上的值 y 0 , y…

关于Maxwell与Kafka和数据库的监控

1.Maxwell的配置 其实就是配置两端的配置信息,都要能连接上,然后才能去传输数据 config.properties #Maxwell数据发送目的地&#xff0c;可选配置有stdout|file|kafka|kinesis|pubsub|sqs|rabbitmq|redis producerkafka # 目标Kafka集群地址 kafka.bootstrap.servershadoop102…

立创EDA专业版的原理图上器件有一个虚线框

立创EDA专业版的原理图上器件有一个虚线框解决方法 问题分析&#xff1a; 在使用立创EDA专业版 设计电路原理图时&#xff0c;中途莫名其妙就给我的元件添加了下面图片所示的虚线外框。看着就很别扭的样子&#xff0c;而且工程大了和器件稍微布局比较密的时候就导致整体很难看…

Python+selenium等待某个元素消失(如加载中)再继续执行代码

&#x1f338; 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0c;解放您的双手 &#x1f3f3;️‍&#x1f308; 博客主页&#xff1a;一晌小贪欢的博客主页 &#x1f44d; 该系列文章专栏&#xff1a;Python办公自动化专栏 文章作者技术和水平有限&#xff0c…

【ASP.NET】LIS实验室信息管理系统源码

LIS系统&#xff0c;即实验室信息管理系统&#xff0c;是一种基于互联网技术的医疗行业管理软件&#xff0c;它可以帮助实验室进行样本管理、检测流程管理、结果报告等一系列工作&#xff0c; 提高实验室工作效率和质量。 一、LIS系统的功能 1. 样本管理 LIS系统可以帮助实验…

用反射实现自定义Java对象转化为json工具类

传入一个object类型的对象获取该对象的class类getFields方法获取该类的所有属性对属性进行遍历&#xff0c;并且拼接成Json格式的字符串&#xff0c;注意&#xff1a;通过属性名来推断方法名获取Method实例通过invoke方法调用 public static String objectToJsonUtil(Object o…

轻松搭建微信小程序商城的详细指南

微信小程序商城是目前非常流行的一种电商模式&#xff0c;它能够为用户提供便捷的购物体验&#xff0c;同时也成为了很多企业开展电商业务的首选方式。那么&#xff0c;如何快速、简单地搭建一个微信小程序商城呢&#xff1f;下面就为大家介绍一下详细的步骤。 首先&#xff0c…

分布式系统,你了解多少呢

本期只是简单了解&#xff0c;想要深入学习&#xff0c;还需要看看其他资源~ 目录 一、单机架构 二、数据库和应用分离 三、负载均衡——应用服务器 四、读写分离——数据库主从结构 五、引入缓存——冷热数据分离 六、分库分表——数据库扩展空间 七、微服务——进一步…

性能测试常见的测试指标

一、什么是性能测试 先看下百度百科对它的定义 性能测试是通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试。我们可以认为性能测试是&#xff1a;通过在测试环境下对系统或构件的性能进行探测&#xff0c;用以验证在生产环境下系统性能…