k8s如何使用 HPA 实现自动扩展

使用Horizontal Pod Autoscaler (HPA)

实验目标:
学习如何使用 HPA 实现自动扩展。

实验步骤:

  • 创建一个 Deployment,并设置 CPU 或内存的资源请求。
  • 创建一个 HPA,设置扩展策略。
  • 生成负载,观察 HPA 如何自动扩展 Pod 数量。

今天继续我们k8s未做完的实验:如何使用 HPA 实现自动扩展

创建

1、创建namespace

kubectl create namespace nginx-hpa

2、创建deployment

# /kubeapi/data/project5/nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-hpa
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-hpa
  template:
    metadata:
      labels:
        app: nginx-hpa
    spec:
      containers:
      - name: nginx-hpa
        image: nginx:1.18
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: "10m"
          limits:
            cpu: "20m"

应用此Deployment

kubectl apply -f nginx-hpa.yaml

顺带创建一下service

kubectl create service nodeport nginx-hpa --tcp=80:80 -n nginx-hpa

3、创建HPA

# /kubeapi/data/project5/nginx-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
  namespace: nginx-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 1

应用此HPA:

kubectl apply -f nginx-hpa.yaml

在这里插入图片描述

4、生成负载以观察自动扩展效果

从上边的图片我们可以看到,hpa实际并没有获取到资源的使用率
这里我们先安装一下 Metrics Server

curl -LO https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

编辑 components.yaml ,建议直接复制,替换掉之前的文件内容。需要修改的地方我都有标注

需要替换的原因就是:Metrics Server 遇到的主要问题是无法验证节点证书的 x509 错误,因为节点的证书中不包含任何 IP SANs(Subject Alternative Names)。这是一个常见的问题,尤其是在使用自签名证书的 Kubernetes 集群中。为了解决这个问题,可以调整 Metrics Server 的配置,使其忽略证书验证

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
- apiGroups:
  - metrics.k8s.io
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
- apiGroups:
  - ""
  resources:
  - nodes/metrics
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - pods
  - nodes
  verbs:
  - get
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
- kind: ServiceAccount
  name: metrics-server
  namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
  - name: https
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
      - args:
        - --cert-dir=/tmp
        - --secure-port=10250
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        - --metric-resolution=15s
        - --kubelet-insecure-tls  # 添加此行
        image: registry.k8s.io/metrics-server/metrics-server:v0.7.1
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 10250
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          initialDelaySeconds: 20
          periodSeconds: 10
        resources:
          requests:
            cpu: 100m
            memory: 200Mi
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
          seccompProfile:
            type: RuntimeDefault
        volumeMounts:
        - mountPath: /tmp
          name: tmp-dir
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
      - emptyDir: {}
        name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true  # 确保这一行存在
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100

使用命令应用配置文件

kubectl apply -f components.yaml

检查 Metrics Server 部署状态

kubectl get deployment metrics-server -n kube-system
kubectl get pods -n kube-system | grep metrics-server

在这里插入图片描述
这里部署成功后等待一会,我们在检查hpa的状态

kubectl get hpa -n nginx-hpa

发现可以看到负载的数据了
在这里插入图片描述

使用 kubectl run 命令创建一个 Pod 来生成负载:

kubectl run -i --tty load-generator --image=busybox /bin/sh

在 Pod 内运行以下命令生成 CPU 负载:

while true; do wget -q -O- http://10.0.0.5:31047; done

如果中途退出过容器就删掉重新生成

kubectl delete pod load-generator

验证

在生成负载之后,再次检查 HPA 和 nginx 部署的状态
检查hpa,发现负载已经超过了我们限定的值

kubectl get hpa -n nginx-hpa

在这里插入图片描述
检查nginx容器数量,发现自动增加了9个副本。总数是我们配置文件中maxReplicas: 10规定的最多10个容器

kubectl get pods -n nginx-hpa

在这里插入图片描述

关闭负载容器后,当负载不在高出我们所规定的数值后观察pod数量

在这里插入图片描述

这里需要注意的是:
如果负载下降后,HPA 没有按预期缩减 Pod 数量,有可能是配置问题或需要等待一段时间。HPA 的自动缩减行为需要满足一些条件,并且通常有一个冷却时间窗口,以避免频繁扩缩容导致的不稳定性。这个时间窗口默认是5分钟,可以通过以下命令查看配置:

kubectl get hpa nginx-hpa -o yaml -n nginx-hpa

确保没有手动调整 Deployment 副本数,HPA 的调整策略会被手动更改副本数所覆盖。

经过一段时间以后,在观察pod的数量,发现已经自动缩减到1个
在这里插入图片描述


通过以上步骤,你应该能看到 HPA 根据 CPU 使用率自动扩展和缩减 Pod 的数量。最初部署时只有一个 Pod,但在生成负载后,你应该会看到 Pod 的数量增加。当负载减少时,Pod 的数量会再次减少。

我是为了实验效果把HPA触发的值调整的很低,生产中建议根据实际情况调整

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Oracle安装】Linux安装Oracle内存不够怎么都装不上,卡在46%、60%、36%;内存不足解决办法,疑难杂症

一、问题描述 1.oracle 安装不报错,但就是无法安装成功,卡住 总是中途卡住,不一定卡在哪儿,也许是36%、46%、60%等等 它也不报错,什么都不说,或者过一会儿服务器自己把oracle的安装进程给杀了&#xff08…

echo 反引号 tail 重定向符

echo 作用:在命令行内输出指定内容,类似与 print()语句。 语法:echo 输出内容 当输出内容复杂时,可以使用""包围。 反引号 被 包围的内容,会被当做命令执行,而非普通字符。 tail 作用&…

2024中国·淮安高端人才精英赛北京分站赛首战告捷

“诚意满淮,创赢未来”!6月20-21日,2024中国淮安高端人才精英赛首场分站赛在北京产业创新中心顺利举办。淮安市科技局党组书记、局长胡长青,淮安市委组织部人才处处长沈雪娇,淮安经开区党工委委员、管委会副主任、科技…

【2024德国工作】蓝卡攻略:人在中国,怎么去德国工作?

德国工作签证解析 外国人只要拥有符合德国劳动法的劳动合同,工资符合当地标准(非紧缺专业,税前工资一般需达到49600欧元),并且具备一定的外语能力,就可以申请德国境内工作签证!不申请者还需要有…

Perplexily首席执行官Aravind Srinivas斯里尼·瓦斯回应抄袭和侵权指控

Perplexity的“答案引擎”工作原理是收集网络上的海量信息,构建一个庞大的内容数据库(索引)。用户无需输入关键字,只需在Perplexity的平台或应用中提问,就能获得包含引文及网络内容链接的详细回答。 网站通过“机器人…

通过ETLCloud实现SQL Server数据同步至Oracle

SQL Server与Oracle作为全球两大主流的关系型数据库管理系统(RDBMS),在企业级应用中扮演着至关重要的角色。它们各自凭借独特的技术优势、强大的数据处理能力以及高度的可扩展性,支撑着从中小型企业到大型跨国公司的各类复杂业务需…

Web渗透-XSS漏洞深入及xss-labs靶场实战

一、简介 xss全称(cross site scripting)跨站脚本攻击,是最常见的web应用程序安全漏洞之一,位于owasptop102013年度第三名xss是指攻击者在网页中嵌入客户端脚本,通常是javascrip编写的危险代码,当用户使用浏览网页时&…

推荐系统三十六式学习笔记:原理篇.模型融合13|经典模型融合办法:线性模型和树模型的组合拳

目录 为什么要融合?“辑度组合”原理逻辑回归梯度提升决策树GBDT二者结合 总结 推荐系统在技术实现上一般划分为三个阶段:挖掘、召回、排序 。 为什么要融合? 挖掘的工作是对用户和物品做非常深入的结构化分析,各个角度各个层面…

【从零开始认识AI】梯度下降法

目录 1. 原理介绍 2. 代码实现 1. 原理介绍 梯度下降法(Gradient Descent)是一种用于优化函数的迭代算法,广泛应用于机器学习和深度学习中,用来最小化一个目标函数。该目标函数通常代表模型误差或损失。 基本思想是从一个初始…

《Nest系列 - 3. 掌握常见Nest 装饰器,奠定坚实基础!!!!!!》

nest 一个核心就是依赖注入,而中的大部分功能都是通过装饰器来实现的,那什么是装饰器呢? 就是一个 xxx ,诸如 Module,controller, Get, Post 那这样有什么好处呢? 可以把他理解成一个方法,在不改…

【干货】客户裂变实战:策略与案例分享

在当今竞争激烈的市场环境中,客户裂变成为了许多企业快速增长的关键策略。客户裂变,即利用现有客户的社交网络和影响力,吸引更多潜在客户,从而实现客户数量的快速增长。本文将分享一些客户裂变的实战策略及成功案例。 一、客户裂…

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议(ICIGSRST 2024)

【投稿优惠|权威主办】2024年图像、地质测绘与遥感技术国际学术会议(ICIGSRST 2024) 2024 International Conference on Image, Geological Surveying and Remote Sensing Technology(ICIGSRST 2024) ▶会议简介 2024年图像、地质…

第二届“讯方杯”全国大学生信息技术应用及创新大赛圆满落幕!

6月21日-23日,2023-2024“讯方杯”全国大学生信息技术应用及创新大赛全国总决赛在广东科技学院松山湖校区圆满举办。本届全国总决赛由深圳市讯方技术股份有限公司主办,广东科技学院承办,深圳市职前通教育有限责任公司协办。 广东科技学院副校…

艺术家电gorenje x 设计上海丨用设计诠释“生活的艺术”

2024年6月19日—22日,艺术家电gorenje亮相“设计上海”2024,以“gorenje是家电更是艺术品”为题,为人们带来融入日常的艺术之美。设计上海2024不但汇集了国内外卓越设计品牌和杰出独立设计师的家具设计作品,还联合国内外多名设计师…

国内Mac安装Homebrew方法

文章目录 前言步骤 参考:https://blog.csdn.net/itwangyang520/article/details/134125435 前言 今天尝试下载git,官方给的建议是使用Homebrew下载,但发现新电脑里没有,于是尝试Homebrew下载,但发现Homebrew不存在&am…

NAPI篇【4】——NAPI应用点亮一个LED

OpenHarmony的NAPI功能为开发者提供了JS与C/C不同语言模块之间的相互访问,交互的能力,使得开发者使用C或者C语言实现应用的关键功能。如操作开发板中某个GPIO节点的状态(OpenHarmony并没有提供直接操作GPIO口状态的API)&#xff0…

QGIS在VS2019开发

QGIS二次开发(1)—加载矢量、栅格图层(QGIS 2.14.16 && Qt-4.8.6 && VS2010 )_qgis开发教程-CSDN博客 VS2019QT5.15.2QGIS二次开发环境搭建(非源码方式)_qt qgis-CSDN博客 也许面向对象课…

diffusion model(十八):diffusion model中negative prompt的工作机制

info个人博客主页http://myhz0606.com/article/ncsn 前置阅读: DDPM: http://myhz0606.com/article/ddpm classifier-guided:http://myhz0606.com/article/guided classifier-free guided:http://myhz0606.com/article/classi…

技术干货 | AI驱动工程仿真和设计创新

在当今快速发展的技术领域,人工智能(AI)、机器学习和深度学习等技术已经成为推动工程仿真和设计创新的关键力量。Altair技术经理张晨在Altair “AI FOR ENGINEERS”线下研讨会上发表了相关精彩演讲,本文摘自演讲内容,与…

倒F天线参数

倒F天线是依据天线形状命名的。 天线的谐振点及输入阻抗余S、H和L的关系如下: 倒F天线一般用于单频点设计,使用1/4波长原理(利用镜像原理,实际相当于半波长的偶极子天线)。也就是说L的长度是谐振点对应波长的1/4&#…