k8s学习之路 | Day20 k8s 工作负载 Deployment(下)

news2024/11/15 9:08:09

文章目录

  • 3. HPA 动态扩缩容
    • 3.1 HPA
    • 3.2 安装 metrics-server
    • 3.3 验证指标收集
    • 3.4 扩缩容的实现
    • 3.5 增加负载
    • 3.6 降低负载
    • 3.7 更多的度量指标
  • 4. 金丝雀部署
    • 4.1 蓝绿部署
    • 4.2 金丝雀部署
    • 4.3 金丝雀部署的实现
  • 5. Deployment 状态与排查
    • 5.1 进行中的 Deployment
    • 5.2 完成的 Deployment
    • 5.3 失败的 Deployment
    • 5.4 对失败 Deployment 的操作

3. HPA 动态扩缩容

3.1 HPA

Horizontal Pod Autoscaler 可以根据 CPU 利用率自动扩缩 ReplicationController、 Deployment、ReplicaSet 或 StatefulSet 中的 Pod 数量

image-20230305130606096

HorizontalPodAutoscaler(简称 HPA ) 自动更新工作负载资源(例如 Deployment 或者 StatefulSet), 目的是自动扩缩工作负载以满足需求。

水平扩缩意味着对增加的负载的响应是部署更多的 Pod。 这与 “垂直(Vertical)” 扩缩不同,对于 Kubernetes, 垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的 Pod。

如果负载减少,并且 Pod 的数量高于配置的最小值, HorizontalPodAutoscaler 会指示工作负载资源(Deployment、StatefulSet 或其他类似资源)缩减。

3.2 安装 metrics-server

有关 metrics-server 地址:https://github.com/kubernetes-sigs/metrics-server#readme

Metrics Server是 k8s 内置自动缩放管道的可扩展、高效的容器资源度量源。

Metrics Server 从 Kubelets 收集资源度量,并通过Metrics API在Kubernetes apiserver中公开这些度量,供Horizontal Pod Autoscaler和Vertical Pod Autocaler使用。kubectl top还可以访问Metrics API,从而更容易调试自动缩放管道。

准备 yaml 文件

##### metrics-server.yaml
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:
  - pods
  - nodes
  - nodes/stats
  - namespaces
  - configmaps
  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
        - --kubelet-insecure-tls
        - --secure-port=4443
        - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
        - --kubelet-use-node-status-port
        image: registry.cn-hangzhou.aliyuncs.com/lfy_k8s_images/metrics-server:v0.4.3
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          httpGet:
            path: /livez
            port: https
            scheme: HTTPS
          periodSeconds: 10
        name: metrics-server
        ports:
        - containerPort: 4443
          name: https
          protocol: TCP
        readinessProbe:
          failureThreshold: 3
          httpGet:
            path: /readyz
            port: https
            scheme: HTTPS
          periodSeconds: 10
        securityContext:
          readOnlyRootFilesystem: true
          runAsNonRoot: true
          runAsUser: 1000
        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

image-20230305131522989

查看一下状态

kubectl get pod -n kube-system

image-20230305131601302

查看一下指标

##节点使用情况
kubectl top nodes --use-protocol-buffers

##pod使用情况
kubectl top pods --use-protocol-buffers

image-20230305131845365

3.3 验证指标收集

我们可以登陆 Dashboard 上去查看信息收集

image-20230305132701907

image-20230305132723914

3.4 扩缩容的实现

HPA 也是 k8s 中的一种资源,就是写这个资源的 yaml 文件来实现的

image-20230305134103259

准备一个镜像

来自1.21版本的k8s 官方文档

FROM php:5-apache
COPY index.php /var/www/html/index.php
RUN chmod a+rx index.php

index.php 文件内容

<?php
  $x = 0.0001;
  for ($i = 0; $i <= 1000000; $i++) {
    $x += sqrt($x);
  }
  echo "OK!";
?>

构建一下这个镜像:docker build -t hpa-example .

image-20230305134821735

准备 Deployment

###hpa-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        imagePullPolicy: Never
        image: hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

启动一下

image-20230305135358262

编写 HPA

怎么写这个东西呢?直接描述就行了 kubectl explain hpa

如果不是整合第三方的话,这个资源能写的信息很少

image-20230305135947624

FIELDS:
   maxReplicas  <integer> -required- ## 自动缩放器可设置的数量上限,不能小于Min
     upper limit for the number of pods that can be set by the autoscaler;
     cannot be smaller than MinReplicas.

   minReplicas  <integer>
     minReplicas is the lower limit for the number of replicas to which the
     autoscaler can scale down. It defaults to 1 pod. minReplicas is allowed to
     be 0 if the alpha feature gate HPAScaleToZero is enabled and at least one
     Object or External metric is configured. Scaling is active as long as at
     least one metric value is available.

   scaleTargetRef       <Object> -required- ##缩放资源类型
     reference to scaled resource; horizontal pod autoscaler will learn the
     current resource consumption and will set the desired number of pods by
     using its Scale subresource.

   targetCPUUtilizationPercentage       <integer>  ##目标平均CPU利用率
     target average CPU utilization (represented as a percentage of requested
     CPU) over all the pods; if not specified the default autoscaling policy
     will be used.

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:  ##元数据
  name: php-apache
spec:
  maxReplicas: 10  ##最大10个
  minReplicas: 1   ##最小1个
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment  ##资源类型,将于动态扩缩容的目标引用
    name: php-apache
  targetCPUUtilizationPercentage: 50 ## 目标CPU使用率就扩容,低于就缩容

创建一下 HPA

image-20230305141007348

3.5 增加负载

动态监控一下

kubectl get hpa -w
kubectl get pod -l run=php-apache -w

增加负载

##一直访问
while true;do curl 10.96.169.3;done

image-20230305142100227

动态观察结果

运行一段发现负载升高,实现了自动扩容

image-20230305142212237

image-20230305142219160

image-20230305142231701

3.6 降低负载

Ctrl + C 取消循环后,资源利用率会降下去,但是会有一个缓冲时间才会进行缩容

image-20230305142729382

等一段时间后(好像是5分钟),最终会缩容到一个

image-20230305142758619

3.7 更多的度量指标

有很多度量指标,参考最新版本的地址:https://kubernetes.io/zh-cn/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/#autoscaling-on-multiple-metrics-and-custom-metrics

基于多项度量指标和自定义度量指标自动扩缩

4. 金丝雀部署

4.1 蓝绿部署

  • 系统存在两个版本:V1 和 V2(绿和蓝)
  • 将一些流量请求发往蓝色的版本的,如果发现是对的,就将系统切换到蓝版本

a6324354-canary

4.2 金丝雀部署

金丝雀部署来源于矿场的一个场景:矿工进矿洞之前会放入金丝雀,金丝雀对瓦斯气体很敏感,如果放进去了没有叽叽喳喳声音,矿工就不会进去了

  • 现在有2个版本:V1 和 V2
  • 先部署一个 V2 版本,请求流量会走向 V1和 V2
  • 再逐渐增加 V2 数量,将全部流量走向 V2,销毁 V1

与滚动发布相比

滚动发布:

  • 也都是同时存在2个版本,都能接受流量
  • 滚动发布短时间就直接结束了,不能直接控制新老版本的存活时间

4.3 金丝雀部署的实现

首先准备一个 service

  • 选择“app: canary-nginx”标签进行一个对外负载访问
##canary-test.yaml
apiVersion: v1
kind: Service
metadata:
  name: canary-test
  namespace: default
spec:
  selector:
    app: canary-nginx
  type: NodePort  ## 浏览器可以直接访问
  ports:
  - name: canary-test
    port: 80   ### 
    targetPort: 80  ## Pod的访问端口
    protocol: TCP
    nodePort: 31666  ## 浏览器访问端口

准备三个版本镜像

##v1版本:nginx-demo1
FROM nginx
ENV version="v1"
RUN echo $version > /usr/share/nginx/html/index.html

##v2版本:nginx-demo2
FROM nginx
ENV version="v2"
RUN echo $version > /usr/share/nginx/html/index.html

##v3版本:nginx-demo3
FROM nginx
ENV version="v3"
RUN echo $version > /usr/share/nginx/html/index.html

构建镜像

docker build -t nginx:demo1 .

准备一个 v1 版本的 Deployment

###canary-deploy-demo1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: canary-dep-v1
  namespace: default
  labels:
    app: canary-dep-v1
spec:
  selector:
    matchLabels:
      app: canary-nginx
      version: v1
  replicas: 1
  template:
    metadata:
      labels:
        app: canary-nginx
        version: v1
    spec:
      containers:
      - name: nginx
        image: nginx:demo1
        imagePullPolicy: Never

创建一次 Deployment

kubectl apply -f canary-deploy-demo1.yaml

访问检查

image-20230305170250716

再启动一个v2版本

###canary-deploy-demo2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: canary-dep-v2
  namespace: default
  labels:
    app: canary-dep-v2
spec:
  selector:
    matchLabels:
      app: canary-nginx
      version: v2
  replicas: 1
  template:
    metadata:
      labels:
        app: canary-nginx
        version: v2
    spec:
      containers:
      - name: nginx
        image: nginx:demo2
        imagePullPolicy: Never

访问一下

image-20230305173606080

v2版本没问题,我们进行一个扩容操作

##更改canary-deploy-demo2.yaml的.spec.replicas字段信息
  replicas: 5

image-20230305173845980

这个时候,通往 v2 版本的流量就增加了

image-20230305173947067

我们的新版本就OK,就可以删除v1版本了

image-20230305174107366

5. Deployment 状态与排查

5.1 进行中的 Deployment

执行下面的任务期间,Kubernetes 标记 Deployment 为进行中(Progressing)_:

  • Deployment 创建新的 ReplicaSet
  • Deployment 正在为其最新的 ReplicaSet 扩容
  • Deployment 正在为其旧有的 ReplicaSet(s) 缩容
  • 新的 Pod 已经就绪或者可用(就绪至少持续了 MinReadySeconds 秒)。

当上线过程进入“Progressing”状态时,Deployment 控制器会向 Deployment 的 .status.conditions 中添加包含下面属性的状况条目:

  • type: Progressing
  • status: "True"
  • reason: NewReplicaSetCreated | reason: FoundNewReplicaSet | reason: ReplicaSetUpdated

监视 Deployment 进度:kubectl rollout status deploy nginx-deployment

5.2 完成的 Deployment

当 Deployment 具有以下特征时,Kubernetes 将其标记为完成(Complete);

  • 与 Deployment 关联的所有副本都已更新到指定的最新版本,这意味着之前请求的所有更新都已完成。
  • 与 Deployment 关联的所有副本都可用。
  • 未运行 Deployment 的旧副本。

当上线过程进入“Complete”状态时,Deployment 控制器会向 Deployment 的 .status.conditions 中添加包含下面属性的状况条目:

  • type: Progressing
  • status: "True"
  • reason: NewReplicaSetAvailable

5.3 失败的 Deployment

Deployment 可能会在尝试部署其最新的 ReplicaSet 受挫,一直处于未完成状态。 造成此情况一些可能因素如下:

  • 配额(Quota)不足
  • 就绪探测(Readiness Probe)失败
  • 镜像拉取错误
  • 权限不足
  • 限制范围(Limit Ranges)问题
  • 应用程序运行时的配置错误

描述性查看 Deployment 情况:kubectl describe deployment nginx-deployment

5.4 对失败 Deployment 的操作

可应用于已完成的 Deployment 的所有操作也适用于失败的 Deployment。 你可以对其执行扩缩容、回滚到以前的修订版本等操作,或者在需要对 Deployment 的 Pod 模板应用多项调整时,将 Deployment 暂停。

清理策略

可以在 Deployment 中设置 .spec.revisionHistoryLimit 字段以指定保留此 Deployment 的多少个旧有 ReplicaSet。其余的 ReplicaSet 将在后台被垃圾回收。 默认情况下,此值为 10。

将此字段设置为 0 将导致 Deployment 的所有历史记录被清空,造成 Deployment 将无法回滚

万能的排错方式kubectl describe xxxxxx

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

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

相关文章

wordpress更新文章后总是向文章内连接发送GET请求

通过观察wordpress请求发现&#xff0c;wordpress在更新文章后会向文章发送GET请求。在发送请求之前会执行一个调用定时的一个请求POST /wp-cron.php?doing_wp_cron1678081385.6844499111175537109375 HTTP/1.1执行这个定时后&#xff0c;这篇文章的所有链接都会发送HEAD和GET…

源码阅读笔记 InputFormat、FileInputFormat、CombineTextInputFormat

1. InputFormat InputFormat是MapReduce框架提供的用来处理job输入的基类 它主要定义了三个功能&#xff1a; 1.验证job输入是否合法 2.对输入文件进行逻辑切片(InputSplit)&#xff0c;然后将每个切片分发给单独的MapTask 3.提供切片读取器(Re…

Java的注解(Annotation)

Java 注解&#xff08;Annotation&#xff09;又称 Java 标注&#xff0c;是 JDK5.0 引入的一种注释机制。Java 中的类、构造器、方法、成员变量、参数等都可以被注解进行标注。例如JUnit单元测试中的Test方法&#xff0c;可以使得方法直接运行。JUnit单元测试Test单元测试是针…

2023年湖北助理工程师在哪里申报?助理工程师的五大作用你知道吗

2023年湖北助理工程师在哪里申报&#xff1f;助理工程师的五大作用你知道吗 助理工程师申报条件&#xff1a; 大学本科毕业&#xff1a;毕业满一年&#xff0c;工科类专业&#xff0c;6个月以上社保证明 大学专科毕业&#xff1a;毕业满三年&#xff0c;工科类专业&#xff0…

贝塞尔曲线与B样条曲线

文章目录0.参考1.问题起源与插值法的曲线拟合1.1.问题起源1.2.拉格朗日插值1.3.“基”的概念1.4.插值存在的Runge现象2.贝塞尔曲线2.1.控制点的思想2.2.由控制点生成贝塞尔曲线2.3.多个控制点时的贝塞尔曲线公式2.4.贝塞尔曲线的递推公式2.5.贝塞尔曲线的性质3.B样条曲线3.1.B样…

项目设计原则

单一设计原则 做过管理系统项目的同学肯定都接触过用户、机构、角色管理这些模块&#xff0c;实现方式都是基于RBAC模型&#xff08;Role-Based Access Control&#xff0c;基于角色的访问控制&#xff0c;通过分配和取消角色来完成用户权限的授予和取消&#xff0c;使动作主体…

web开发 用idea创建一个新项目

这个写着就是给自己当备忘录用的QAQ 这个老师上课一通操作啥也没看清…卑微搞了半天看样子是成功了 记录一下省的以后忘了怎么创建&#xff08;&#xff1f; zufe lxy 2023.3 先行条件是已经自己装好了Tomcat和idea&#xff01;&#xff01;&#xff08;我的idea是申请了教育…

MSDP实验配置

目录 配置MSDP 配置PIM SM协议 配置各PIM SM域内的静态RP 配置MSDP对等体 配置域内的MSDP对等体 AR8和AR9建立EBGP邻居 配置域间的MSDP对等体 进行实验验证 什么是MSDP MSDP&#xff08;Multicast Source Discovery Protocol&#xff09;组播源发现协议的简称 用来传递…

帆船结构3D线上展示教学的亮点有哪些?

由广州华锐互动开发的帆船结构3D线上展示教学系统&#xff0c;是一种创新的教学方式&#xff0c;基于虚拟现实技术&#xff0c;通过3D模型、交互式模拟等技术手段&#xff0c;可以让学生在虚拟环境中进行帆船组装和调试训练&#xff0c;以达到实践教学的目的。不同于传统的实践…

Python绘图

1.二维绘图 a. 一维数据集 用 Numpy ndarray 作为数据传入 ply 1. import numpy as np import matplotlib as mpl import matplotlib.pyplot as pltnp.random.seed(1000) y np.random.standard_normal(10) print "y %s"% y x range(len(y)) print "x%s&q…

XShell连接ubuntu20.04.LTS

1 下载XshellXShell官方下载地址打开XSHELL官方下载地址&#xff0c;我们可以选择【家庭和学校用户的免费许可证】&#xff0c;输入邮箱之后即可获得下载链接安装非常简单&#xff0c;跟着提示进行即可。2 连接ubuntu2.1 查看ubuntu的ip地址输入命令查看ip地址ifconfig刚开始可…

ssh 远程连接方式总结

SSH 概述 SSH&#xff08;安全外壳协议 Secure Shell Protocol&#xff0c;简称SSH&#xff09;是一种加密的网络传输协议&#xff0c;用于在网络中实现客户端和服务端的连接&#xff0c;典型的如我们在本地电脑通过 SSH连接远程服务器&#xff0c;从而做开发&#xff0c;Wind…

SpringCloud基础(3)-微服务远程调用

SpringCloud基础1. 微服务的远程调用2. Eureka注册中心1. 搭建Eureka服务注册中心1. 微服务的远程调用 服务提供者&#xff1a;一次业务中被其它服务调用的一方&#xff1b; 服务消费者&#xff1a;一次业务中调用其它服务的一方&#xff1b; 2. Eureka注册中心 记录所有服务…

【FMCW 03】测速

从上一讲 测距 末尾的frame讲起。我们知道一个chirp对应了一个采样后的IF信号&#xff0c;我们将这些采样后的IF信号按chirp的次序排列成一个帧&#xff08;frame&#xff09;&#xff0c;这就得到了我们实际中接收后处理的FMCW信号。 由于chirp的发射返回时间很短&#xff0c;…

Spark Catalyst

Spark Catalyst逻辑计划逻辑计划解析逻辑计划优化Catalyst 规则优化过程物理计划Spark PlanJoinSelection生成 Physical PlanEnsureRequirementsSpark SQL 端到端的优化流程&#xff1a; Catalyst 优化器 : 包含逻辑优化/物理优化Tungsten : Spark SQL的优化过程 : 逻辑计划 …

什么是以太网供电POE

POE指的是以太网供电&#xff0c;就是一根网线在传输网络的同时还传输设备所需的电源。我们最常见的就是通过POE交换机连接网络摄像头&#xff0c;网络摄像头无需的电源适配器&#xff0c;仅靠一根网线就能实现电源和网络的传输。POE供电一般可以到100米。POE包含两个部分&…

shp文件导入到mysql

一、下载GDAL 官网&#xff1a;https://gdal.org/ 进入它&#xff0c;选个最新的win64位。GISInternals Support SiteGISInternals Support Sitehttps://www.gisinternals.com/release.php 进去选择如图所示的包下载即可 下载后解压即可&#xff0c;无需安装。 测试运行ogr2…

ChatGPT  一本正经的胡说八道 那也看看原理吧

最近&#xff0c;ChatGPT横空出世。这款被马斯克形容为“强大到危险”的AI&#xff0c;不但能够与人聊天互动&#xff0c;还能写文章、改代码。于是&#xff0c;人们纷纷想让AI替自己做些什么&#xff0c;有人通过两分钟的提问便得到了一篇完美的论文&#xff0c;有人希望它能帮…

js中的回调地狱

之前遇见过一个面试题&#xff1a;面试官问我&#xff1a;’有个需求&#xff0c;它需要你调完一个接口后拿这个接口的响应数据去请求一个新的接口&#xff0c;并源源不断得去请求下一个新的接口&#xff0c;那么请问如何解决‘&#xff0c;这个问题就是典型的回调地狱问题首先…

认识Spring(下)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Spring框架 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 Spring更加高效的读取和存储对象 存储bean对象 五大注解 关于五大类注解 对象的注入 属性注入 构造方法注入 Setter注入 三种注入方式的…