Kubernetes怎么对Go服务进行扩容、更新、回滚、平滑重启?教你用Deployment全搞定!

Kubernetes与Docker实战:Java应用容器化部署与运维指南 容器化技术通过将应用及其依赖打包成标准单元,解决了环境一致性和部署标准化问题。Docker作为容器运行时,提供了轻量级、可移植的打包方案,而Kubernetes作为容器编排平台,则负责在分布式集群中自动化部署、扩展和管理容器化应用。这一组合在云原生时代具有重要技术价值,能够实现应用的高可用、弹性伸缩和自动化运维。在Java开发领域,结合Spring Boot等框架,开发者可以构建高效、安全的容器镜像,并通过Kubernetes的Deployment、Service、ConfigMap等资源对象进行声明式管理 阅读详情

经过前面不少文章的铺垫,终于可以写这个大家都感兴趣的话题了,在前面两篇文章,我们讲了Kubernetes里的 Pod和 副本集ReplicaSet (RS) 这两个API对象。知道了Pod是Kubernetes里的最小调度单元,ReplicaSet则是控制Pod副本数的一个基础控制器。文章最后留下了一个话题:

Kubernetes里一般使用Deployment控制器而不是直接使用ReplicaSet,Deployment是一个管理ReplicaSet并提供水平扩展/收缩、Pod声明式更新、应用的版本管理以及许多其他功能的更高级的控制器。

所以部署到Kubernetes集群里的Go项目就是通过Deployment这个控制器实现应用的水平扩展/收缩和更应用新管理的,它通过自己的控制循环确保集群里当前的状态始终等于Deployment对象定义的期望状态。

我会使用《Kubernetes入门实践--部署运行Go项目》文章里用过的项目作为演示项目,演示Kubernetes怎么对应用服务进行水平扩容、发版更新、版本回滚等操作,在演示的过程中一起探讨下面几个话题:

  • 什么是Deployment控制器
  • Deployment的工作原理。
  • 怎么创建Deployment。
  • 如何使用Deployment滚动更新应用。
  • 如何使用Deployment进行应用的版本回滚。

什么是Deployment

在Kubernetes中,建议使用Deployment来部署Pod 和 RS,因为它具有很多方便管理集群的内置功能,比如:

  • 轻松部署RS(副本集)
  • 清理不再需要的旧版RS
  • 扩展/缩小RS里的Pod数量
  • 动态更新Pod(根据Pod模板定义的更新用新Pod替换旧Pod)
  • 回滚到以前的Deployment版本
  • 保证服务的连续性

以下面这个Deployment对象的定义为例,第一部分是自己的元信息(name, labels)的定义,第二部分是ReplicaSet对象的定义(spec.replica=3....),ReplicaSet定义里又包含了Pod的定义(spec.template):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
复制代码

在具体的实现上,这个Deployment,与ReplicaSet,以及Pod 的关系和管理层级我们可以用一张图把它描述出来:

 

Deployment、RS和Pod的关系

 

 

Deployment的工作原理

Kubernetes里有很多种控制器,每一个控制器,都以独有的方式负责某种编排功能。Deployment,正是这些控制器中的一种。它们都遵循 Kubernetes 项目中的一个通用编排模式,即:控制循环(control loop),每种控制器负责的编排功能就是它们自己在控制循环里实现的逻辑。

接下来,还是以上面定义的Deployment 为例,我和你简单描述一下的工作原理:

  • Deployment 控制器从 Etcd 中获取到所有携带了“app: nginx”标签的 Pod,然后统计它们的数量,这就是实际状态;
  • Deployment 对象的 Replicas 字段的值就是期望状态,Deployment 控制器将两个状态做比较;
  • 根据比较结果,Deployment确定是创建 Pod,还是删除已有的 Pod,还是什么不干;

这是针对Pod副本数的编排,至于Pod的动态更新和Deployment对象版本的回滚文章下面再说。总而言之,控制器的核心思想就是通过控制循环不断地将实际状态调谐成定义的期望状态,一旦期望状态有更新就会触发控制循环里的调谐逻辑。

怎么创建Deployment

创建Deployment前需要先声明它的对象定义,我们拿以前文章《Kubernetes入门实践--部署运行Go项目》里用到过的Deployment定义简单解释下每部分的含义:

apiVersion: apps/v1
kind: Deployment
metadata: # Deployment的元数据
  name: my-go-app
spec:
  replicas: 1 # ReplicaSet部分的定义
  selector:
    matchLabels:
      app: go-app
  template: # Pod 模板的定义
    metadata:
      labels:
        app: go-app
    spec: # Pod里容器相关的定义
      containers:
        - name: go-app-container
          image: kevinyan001/kube-go-app
          resources:
            limits:
              memory: "128Mi"
              cpu: "100m"
          ports:
            - containerPort: 3000
复制代码
  • apiVersion 声明了对象的API版本,Kubernetes回去对应的包里加载库文件。

  • kind声明对象的种类,其实就是告诉Kubernetes去加载什么对象。

  • metadata里就是我们这个对象的元数据。

  • spec.replicas 定义副本集有多少个Pod副本,而spec.selectors则是副本集匹配Pod的规则。

  • spec.template是Pod模板的定义,其中的内容就是一个完整的Pod对象的定义。

  • spec.template.spec里是关于Pod里容器相关的定义。

具体里面每个字段的意思和用途我就不多说了,前面的文章里都讲过,重点强调一下容器配置里limits.memory的128Mi代表的是内存分配给容器128兆,而limits.cpu的1000m = 1核心。100m就是分配给容器0.1核,这个在自己电脑上实践的时候尽量别分配太大,不然根本启动不起来。

写好声明文件后,使用kubectl create命令创建Deployment对象,Kubernetes里所有的API对象都是这么创建的。

➜  kubectl create -f deployment.yaml --record
deployment.apps/my-go-app created
➜   
复制代码

对于在笔记本上实践的同学,需要先安装Minikube,具体的安装步骤可以参考:Minikube-运行在笔记本上的Kubernetes集群。

在继续使用Deployment进行更高级的编排工作前,我们先用下面两个命令确保一下Deployment的运行状态:

  • kubectl rollout status deployment 告诉我们Deployment对象的状态变化。

    ➜ kubectl rollout status deployment my-go-app
    deployment "my-go-app" successfully rolled out
    复制代码
  • kubectl get deployment 显示期望的副本数和正在更新的副本数,以及当前可提供服务的Pod数量。因为我们在定义里只指定了一个副本,所以当前只有一个Pod。

    kubectl get deployment my-go-app
    NAME        READY   UP-TO-DATE   AVAILABLE   AGE
    my-go-app   1/1     1            1           13m
    复制代码
  • kubectl get replicaset 查看Deployment为Pod创建的ReplicaSet的状态。

    kubectl get replicaset          
    NAME                   DESIRED   CURRENT   READY   AGE
    my-go-app-864496b67b   1         1         1       19m
    复制代码

    默认情况下,Deployment会将pod-template-hash添加到它创建的ReplicaSet的名称中。比如这里的my-go-app-864496b67b

  • 最后 kubectl get pod 命令可以查看ReplicaSet创建出来的Pod副本的状态。

    NAME                         READY   STATUS             RESTARTS   AGE
    my-go-app-864496b67b-ctkf9   1/1     Running            0          25m
    复制代码

使用Deployment滚动更新应用

Deployment 通过"控制器模式",来操作ReplicaSet 的个数和属性,进而实现"水平扩展 / 收缩"和"滚动更新"这两个编排动作。

水平扩展/收缩

"水平扩展 / 收缩"非常容易实现,Deployment 只需要修改它所控制的ReplicaSet 的 Pod副本个数就可以了。比如,把这个值从 1 改成 3,那么 Deployment 所对应的 ReplicaSet,就会根据修改后的值自动创建两个新的Pod,"水平收缩"则反之。这个操作的指令也非常简单,就是 kubectl scale,比如:

➜ kubectl scale --replicas=3 deployment my-go-app --record
deployment.apps/my-go-app scaled
复制代码

如果你手快点还能通过上面说的命令 kubectl rollout status deployment my-go-app 看到扩展过程中Deployment对象的状态变化:

kubectl rollout status deployment my-go-app    
Waiting for deployment "my-go-app" rollout to finish: 1 of 3 updated replicas are available...
Waiting for deployment "my-go-app" rollout to finish: 2 of 3 updated replicas are available...
deployment "my-go-app" successfully rolled out
复制代码

可以通过下面的命令观察到ReplicaSet的Name没有发生变化:

➜   kubectl get replicaset                         
NAME                   DESIRED   CURRENT   READY   AGE
my-go-app-864496b67b   3         3         3       53m
复制代码

这证明了 Deployment水平扩展和收缩副本集是不会创建新的ReplicaSet的,但是涉及到Pod模板的更新后,比如更改容器的镜像,那么Deployment会用创建一个新版本的ReplicaSet用来替换旧版本。

滚动更新

在上面的Deployment定义里,Pod模板里的容器镜像设置的是kevinyan001/kube-go-app,接下来比如我们的Go项目代码更新了,用最新的代码打包了镜像 kevinyan001/kube-go-app:v0.1,部署Go项目的新镜像的过程就会触发Deployment的滚动更新。

有两种方式更新镜像,一种是更新deployment.yaml里的镜像名称,然后执行 kubectl apply -f deployment.yaml。一般公司里的Jenkins等持续继承工具用的就是这种方式。还有一种就是使用kubectl set image 命令,为了方便演示我们这里就是用第二种方式进行Pod的滚动更新。

➜ kubectl set image deployment my-go-app go-app-container=kevinyan001/kube-go-app:v0.1 --record
deployment.apps/my-go-app image updated
复制代码

执行滚动更新后通过命令行查看ReplicaSet的状态会发现Deployment用新版本的ReplicaSet对象替换旧版本对象的过程。

➜  kubectl get replicaset                                                                
NAME                   DESIRED   CURRENT   READY   AGE
my-go-app-6749dbc697   3         3         2       19s
my-go-app-864496b67b   1         1         1       72m
➜  kubectl get replicaset
NAME                   DESIRED   CURRENT   READY   AGE
my-go-app-6749dbc697   3         3         3       24s
my-go-app-864496b67b   0         0         0       72m
复制代码

通过这个Deployment的Events可以查看到这次滚动更新的详细过程:

➜  kubectl describe deployment my-go-app
Name:                   my-go-app
Namespace:              default
CreationTimestamp:      Sat, 29 Aug 2020 00:31:56 +0800

Events:
.....
  Normal  ScalingReplicaSet  37h                deployment-controller  Scaled up replica set my-go-app-6749dbc697 to 1
  Normal  ScalingReplicaSet  37h                deployment-controller  Scaled down replica set my-go-app-864496b67b to 2
  Normal  ScalingReplicaSet  37h                deployment-controller  Scaled up replica set my-go-app-6749dbc697 to 2
  Normal  ScalingReplicaSet  37h (x2 over 37h)  deployment-controller  Scaled down replica set my-go-app-864496b67b to 1
  Normal  ScalingReplicaSet  37h                deployment-controller  Scaled up replica set my-go-app-6749dbc697 to 3
  Normal  ScalingReplicaSet  37h                deployment-controller  Scaled down replica set my-go-app-864496b67b to 0
复制代码

当你修改了Deployment里的Pod定义之后,Deployment 会使用这个修改后的 Pod 模板,创建一个新的 ReplicaSet(hash=6749dbc697),这个新的ReplicaSet 的初始Pod副本数是:0。然后Deployment 开始将这个新的ReplicaSet 所控制的Pod 副本数从 0 个变成 1 个,即:"水平扩展"出一个副本。紧接着Deployment又将旧的 ReplicaSet(hash=864496b67b)所控制的旧 Pod 副本数减少一个,即:"水平收缩"成两个副本。如此交替进行就完成了这一组Pod 的版本升级过程。像这样,将一个集群中正在运行的多个 Pod 版本,交替地逐一升级的过程,就是 "滚动更新"。

用示意图描述这个过程的话就像下图这样

Deployment滚动更新的过程

 

 

为了保证服务的连续性,Deployment 还会确保,在任何时间窗口内,只有指定比例的Pod 处于离线状态。同时,它也会确保,在任何时间窗口内,只有指定比例的新 Pod 被创建出来。这两个比例的值都是可以配置的,默认都是期望状态里spec.relicas值的 25%。所以,在上面这个 Deployment 的例子中,它有 3 个 Pod 副本,那么控制器在“滚动更新”的过程中永远都会确保至少有 2 个Pod 处于可用状态,至多只有 4 个 Pod 同时存在于集群中。这个策略可以通过Deployment 对象的一个字段,RollingUpdateStrategy来设置:


apiVersion: apps/v1
kind: Deployment
...
spec:
...
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
复制代码

回滚Deployment版本

上面执行变更命令的时候都使用了--record 参数,这个参数能让Kubernetes在这个Deployment的变更记录里记录上产生变更当时执行的命令。

执行kubectl rollout history deployment my-go-app 就能看到这个Deployment的更新记录:

➜  kubectl rollout history deployment my-go-app                                   
deployment.apps/my-go-app 
REVISION  CHANGE-CAUSE
1         kubectl scale deployment my-go-app --replicas=3 --record=true
2         kubectl set image deployment my-go-app go-app-container=kevinyan001/kube-go-app:v0.1 --record=true
复制代码

假如刚才那个滚动更新的Go项目镜像有问题,我们想回退到以前的版本。借助--record参数帮我们记录的执行命令和更新记录里的修订号就可以找到想要回滚的版本修订号。

一旦确定了修订号后我们kubectl rollout undo命令就能完成Deployment对象的版本回滚。

kubectl rollout undo  deployment my-go-app --to-revision=1
deployment.apps "my-go-app"
复制代码

执行完后我们会发现一个非常有意思的事情,以前那个版本的ReplicaSet(hash=864496b67b)的Pod的数又变回了3,新ReplicaSet(hash=6749dbc697)的Pod数变成了0。

➜ kubectl get rs
NAME                   DESIRED   CURRENT   READY   AGE
my-go-app-6749dbc697   0         0         0       3m33s
my-go-app-864496b67b   3         3         3       4m30s
复制代码

证明Deployment在上次滚动更新后并不会把旧版本的ReplicaSet删掉,而是留着回滚的时候用,所以ReplicaSet相当于一个基础设施层面的应用的版本管理。

回滚后在看变更记录,发现已经没有修订号1的内容了,而是多了修订号为3的内容,这个版本的变更内容其实就是回滚前修订号1里的变更内容。

➜ kubectl rollout history deployment my-go-app   
deployment.apps/my-go-app 
REVISION  CHANGE-CAUSE
2         kubectl set image deployment my-go-app go-app-container=kevinyan001/kube-go-app:v0.1 --record=true
3         kubectl scale deployment my-go-app --replicas=3 --record=true
复制代码

控制ReplicaSet的版本数量

你可能已经想到了一个问题:我们对Deployment 进行的每一次更新操作,都会生成一个新的ReplicaSet 对象,是不是有些多余,甚至浪费资源?所以,Kubernetes 项目还提供了一个指令,使得我们对 Deployment 的多次更新操作,最后只生成一个ReplicaSet对象。具体的做法是,在更新Deployment前,你要先执行一条 kubectl rollout pause 指令。它的用法如下所示:

➜ kubectl rollout pause deployment my-go-app
deployment.apps/my-go-app paused
复制代码

这个命令的作用,是让这个Deployment进入了一个"暂停"状态。由于此时Deployment正处于“暂停”状态,所以我们对Deployment的所有修改,都不会触发新的“滚动更新”,也不会创建新的ReplicaSet。而等到我们对 Deployment 修改操作都完成之后,只需要再执行一条 kubectl rollout resume 指令,就可以把这个 它恢复回来,如下所示:

➜ kubectl rollout resume deployment my-go-app
deployment.apps/my-go-app resumed
复制代码

随着应用版本的不断增加,Kubernetes会为同一个Deployment保存很多很多不同的ReplicaSet。那么,Deployment 对象有一个字段,叫作 spec.revisionHistoryLimit,就是 Kubernetes 为 Deployment 保留的"历史版本"个数。如果把它设置为 0,就再也不能做回滚操作了。

总结

Kubernetes 项目对 Deployment 的设计,代替我们完成了对应用的抽象,让我们可以用一个Deployment 对象来描述应用,使用 kubectl rollout 命令控制应用的版本。

Deployment 还会保证服务的连续性,确保滚动更新时在任何时间窗口内,只有指定比例的Pod 处于离线状态,同时也只有指定比例的新 Pod 被创建出来,这样就保证了服务能平滑更新。用Go写的HTTP服务举例子来说,我们不需要再在代码里自己实现HTTP Server平滑重启的功能,因为这些功能都由Deployment在应用抽象层面替我们实现了。

希望大家都能跟着今天文章里的演示,掌握Deployment的提供的各种功能的用法。文章里我用的镜像已经上传到DockerHub上了,如果网络受限拉取不了镜像,可以下方扫码后回复k8s获取项目的源码和构建镜像用的Dockerfile。

Kubernetes声明式原理与控制循环深度解析 Kubernetes作为云原生时代的分布式系统操作系统,其核心在于声明式API与持续调谐的控制循环机制。它摒弃传统命令式运维,转而通过YAML定义终态(Desired State),由Scheduler、Controller Manager、Kubelet等组件协同驱动实际状态(Actual State)向终态收敛。这种‘意图优先’的设计赋予系统自愈性、可预测性与强一致性,成为SRE和平台工程师构建高可用服务的底层信任基石。结合etcd状态存储、API Server统一入口与控制器模式,Kubernetes 阅读详情

相关推荐

Triton模型服务化实战:Kubernetes+Feature Gateway生产部署指南

模型服务化是机器学习落地的关键环节,指将训练完成的模型封装为高可用、低延迟、可监控的在线API服务。其核心原理在于解耦模型推理与业务逻辑,通过动态批处理、GPU资源隔离、模型热更新等机制保障SLA。技术价值体现在提升推理吞吐、降低P99延迟、支持AB测试与灰度发布,并实现跨框架(PyTorch/XGBoost/ONNX)统一调度。典型应用场景包括金融实时风控、电商个性化推荐和IoT设备预测。本文聚焦NVIDIA Triton Inference Server在Kubernetes环境下的生产级部署,结合Fe

weixin_34239592的博客 592

平滑重启_让你的 Go 服务优雅的重启 (解决代码发布 Go 服务闪断的问题)

起因有同学反馈 发布 Go 服务代码 监控报警会出现一堆 5xx 报警原因查看生产环境的项目部署脚本 发现目前的部署脚本会 supervisorctl restart monkey_interact_service暴力重启 supervisor 托管的守护进程会导致 go 的 server 先 stop 停止 web 服务,再 start 提供新的 web 服务,导致上线过程中的请求失...

weixin_36063465的博客 898

机器学习模型生产化落地:从Notebook到K8s的全链路工程实践

机器学习模型部署不是简单运行predict(),而是构建可监控、可回滚、可计费的生产级服务。其核心在于解耦数据加载、特征计算、模型推理与服务编排四层异构系统,并通过ONNX标准化序列化、Triton/KServe统一推理、Feature Store分离特征逻辑、Distroless镜像加固安全、Helm+Kustomize实现基础设施即代码。技术价值体现在P99延迟可控、SLO精准归因、概念漂移可感知、GPU资源可隔离。典型应用场景覆盖电商推荐、金融反欺诈与工业预测性维护——当模型成为业务流水线中一个稳定环

congju3179的博客 522

go socket通信+守护进程启动服务器+平滑重启

什么是Socket? Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。Socket就是该模式的一个实现,网络的Socket数据传输是一种特殊的I/O,Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用:Socket(),该函数返回一个整型的Soc...

daily886的博客 1533

Golang HTTP 服务平滑重启及升级的思路

Golang HTTP服务在上线时,需要重新编译可执行文件,关闭正在运行的进程,然后再启动新的运行进程。这篇文章主要介绍了Golang HTTP 服务平滑重启及升级,需要的朋友可以参考下

ESP32-C61 eFuse控制器深度解析:寄存器架构与安全烧写实践

eFuse(电子熔丝)是嵌入式芯片实现硬件级不可逆配置与信任根构建的核心物理机制,其本质是通过电学编程固化关键安全参数。原理上依赖熔丝单元的单向导通/断开特性,结合Reed-Solomon纠错、多级写保护和时序可控编程,保障数据在宽温域与工艺偏差下的高可靠性。技术价值在于为Secure Boot、Flash加密、密钥隔离等安全功能提供可信锚点,支撑从启动到运行的全链路防护。典型应用场景涵盖物联网设备量产烧录、安全启动使能、MAC地址固化及抗DPA密码运算配置。本文聚焦ESP32-C61平台,深入解析其eFu

weixin_42589700的博客 123

Golang学习--平滑重启

在上一篇博客介绍TOML配置的时候,讲到了通过信号通知重载配置。我们在这一篇中介绍下如何的平滑重启server。 与重载配置相同的是我们也需要通过信号来通知server重启,但关键在于平滑重启,如果只是简单的重启,只需要kill掉,然后再拉起即可。平滑重启意味着server升级的时候可以不用停止业务。 我们先来看下Github上有没有相应的库解决这个问题,然后找到了如下三个库: facebook...

weixin_34015336的博客 532

MTK-Display技术解析:从MDP到DDP的架构演进

本文深入解析了联发科(MTK)显示技术从MDP到DDP的架构演进。MDP作为多媒体数据预处理中心,负责格式转换与缩放;而DDP则整合了OVL、COLOR、AAL等模块,并引入CMDQ与场景化模式,实现了从分散处理到统一智能调度的飞跃,旨在提升画质、流畅度并降低功耗。

weixin_29218509的博客 255

K8S的伸缩应用程序-扩缩容,版本回滚

创建 Deployment 之后,Kubernetes 会创建一个 Pod(容器组)来放置应用程序实例(container 容器)。

杜小帅的博客 1133

手把手教你用Pico4UE搭建100平米VR大空间:从设备检查、系统升级到地图绘制全流程

本文详细介绍了使用Pico4UE搭建100平米VR大空间的完整流程,包括设备检查、系统升级、地图绘制和性能优化等关键步骤。通过实战案例和专业技术建议,帮助用户高效部署企业级VR解决方案,适用于展厅漫游、工业仿真等多种场景。

weixin_28273593的博客 507

OpenCASCADE:Direct3D CSharp 示例

OpenCASCADE:Direct3D CSharp 示例OpenCASCADE:Direct3D CSharp 示例 OpenCASCADE:Direct3D CSharp 示例 此示例演示了如何在使用CSharp和Windows Presentation Foundation (WPF)编写的.Net应用程序中使用 OCCT 和 DirectX 库。 .Net、OCCT (C++) 和 DirectX 级别之间的连接由用 C++/CLI 编写的代理库OCCProxy和D3DProxy提供。代理库OCC

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1824

Kubernetes水平扩展收缩与滚动更新

kubernetes水平扩展、收缩与版本更新

passerbyji的博客 249

【DEIM创新改进】独家下采样创新改进篇 | ECCV 2026 | DEIM 引入FSD-Down频域-空间动态下采样,在下采样过程中保留小目标的高频信息、助力小目标检测、遥感小目标检测有效涨点

🔥本文提出了一种名为FSD-Down的频域-空间动态下采样模块,用于改进DEIM网络模型在小目标检测中的性能。FSD-Down通过小波分解显式保留低频语义和高频细节,结合分组卷积、动态通道权重和可学习缩放因子,自适应强化目标边缘与纹理特征。该模块能有效减轻传统下采样造成的频率混叠和细节丢失,提升对小目标、密集目标和低对比度目标的检测能力。实验表明,FSD-Down计算开销可控,在保持实时性的同时显著提升检测精度,特别是在VisDrone和AITODv2数据集上对小目标的检测性能提升显著。

Ai缝合怪、助力小伙伴高效发论文 82

K8s上的Go服务怎么扩容、发版更新、回滚、平滑重启?教你用Deployment全搞定!

经过前面不少文章的铺垫,终于可以写这个大家都感兴趣的话题了,在前面两篇文章,我们讲了Kubernetes里的 Pod和 副本集ReplicaSet (RS) 这两个API对象。知道了Po...

kevin_tech的博客,微信搜「网管叨bi叨」 1568

【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。

qq_35635374的博客 2600

光谱数据预处理综合

除了化学信息,光谱还包含其他不相关或不需要的信息,如电噪声,基质背景,杂散光,散射效应等。在用化学计量学方法建立校准模型时,利用预处理方法消除光谱数据中的无关信息和噪声是非常必要的。

qq_44204759的博客 5191

go html template 数据怎么加减乘除_K8s上的Go服务怎么扩容、发版更新、回滚、平滑重启?教你用Deployment全搞定!...

经过前面不少文章的铺垫,终于可以写这个大家都感兴趣的话题了,在前面两篇文章,我们讲了Kubernetes里的 Pod和 副本集ReplicaSet (RS) 这两个API对象。知道了Pod是Kubernetes里的最小调度单元,ReplicaSet则是控制Pod副本数的一个基础控制器。文章最后留下了一个话题:Kubernetes里一般使用Deployment控制器而不是直接使用Repli...

weixin_29219539的博客 153

数据结构之博弈树搜索(深度优先搜索)

数据结构之博弈树搜索(深度优先搜索)

LucianaiB的博客 1524

查看当前正在回滚的事物_k8s 上 go 服务实战: 扩容 发版更新 回滚 平滑重启

k8s 上 go 服务实战: 扩容 发版更新 回滚 平滑重启实践为主, 部分 内容/细节 略去, 详情请查看最后的资料写在前面:go 稳坐 云原生第一编程语言对概念的理解很重要, 这篇主要涉及 k8s 发布涉及到的 deployment replicaSet pod 3个概念动手对学习真的很重要, 不仅要 BB那么多, show me the code, 还要 show and run the c...

weixin_39608526的博客 225

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

go每日新闻--2020-09-02

go 语言中文网(每日资讯)_2020-09-02 一、Go 语言中文网 用 Go 开发桌面应用程序(GUI):Webview、Lorca 与 Electron Go 每日一库之云原生 go-zero 微服务框架 深入剖析 go 中字符串的编码问题——特殊字符的 string 怎么转 byte? 设计模式之观察者模式 二、亚军进化史 Go 技术日报(2020-09-01) 三、 网管叨 bi 叨 K8s 上的 Go 服务怎么扩容、发版更新、回滚、平滑重启?教你用 Deployment 全搞定! 四、

韩亚军的博客 597

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java应用容器化实战:Docker与Kubernetes生产级部署指南

在云原生时代,容器化技术已成为现代应用部署和运维的基石。其核心原理是通过操作系统层面的虚拟化,将应用及其依赖打包成标准、轻量的镜像,实现环境的一致性和隔离性。这项技术的核心价值在于彻底解决了“开发环境能跑,生产环境就崩”的经典难题,并大幅提升了资源利用率和部署效率。随着微服务架构的普及,容器编排平台应运而生,它能自动化管理成百上千个容器的生命周期、网络和存储,是实现服务弹性伸缩与高可用的关键。对于广大Java开发者而言,将传统的Spring Boot应用迁移到容器化平台,是拥抱DevOps、提升交付速度的必

weixin_34034261的博客 408

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

建木替代Jenkins:基于K8s原生Job的声明式CI/CD架构实践

CI/CD是现代软件交付的核心基础设施,其本质是将代码变更自动转化为可验证、可部署的运行态服务。传统脚本驱动型工具(如Jenkins)依赖插件生态与Groovy引擎,在规模增长后易陷入配置耦合、权限失控与故障扩散困境;而声明式编排范式通过JSON/YAML定义任务拓扑,结合Kubernetes Job等原生资源实现执行环境隔离、弹性伸缩与RBAC权限收敛。建木正是这一演进路径的典型代表——它不管理执行过程,只编排K8s资源,从而天然具备环境一致性、故障自愈性与基础设施无关性。本文聚焦于从Jenkins迁移至

336

DigitalOcean Kubernetes 部署 Eclipse Theia 云 IDE 实战

Cloud IDE 是指基于浏览器访问、后端运行于远程服务器的集成开发环境,其核心原理是前后端分离架构与 Language Server Protocol(LSP)协议协同实现智能编码能力。技术价值在于消除本地环境差异、支持细粒度权限管控与弹性资源调度,广泛应用于远程协作开发、教学实验平台及企业级代码审查场景。本文聚焦 Eclipse Theia 在 DigitalOcean Kubernetes(DOKS)上的生产级落地,结合 Helm 声明式部署、Block Storage 持久化与 NGINX Ing

闲谈 508

Kubernetes生产环境Jaeger分布式追踪实战指南

分布式追踪是微服务可观测性的核心能力,其本质是通过唯一Trace ID贯穿跨服务请求链路,实现调用路径、耗时、错误与上下文的自动串联。其技术原理依赖OpenTelemetry(OTel)标准协议、进程间上下文透传(如traceparent头)、采样策略与后端存储协同。该能力直接支撑故障快速定位、性能瓶颈分析与SLA保障,广泛应用于电商下单、支付清结算、实时推荐等高并发分布式场景。本文聚焦Kubernetes环境下Jaeger的生产级落地——涵盖All-in-One陷阱规避、Sidecar与DaemonSet

weixin_34161032的博客 662

DigitalOcean Kubernetes自动伸缩实战:从HPA到Cluster Autoscaler

Kubernetes自动伸缩不是简单配置CPU阈值,而是以业务指标(如QPS、延迟)为驱动的系统工程。其核心原理在于分层协同:HorizontalPodAutoscaler(HPA)基于实时业务水位动态调整Pod副本数,Cluster Autoscaler(CA)据此预判节点资源缺口并弹性扩缩底层Droplet,而DigitalOcean托管服务(DOKS)则通过开箱即用的Cilium网络、分层节点池与Block Storage存储,屏蔽了etcd、kube-scheduler等底层复杂性。这种声明式、可观

weixin_34121304的博客 420

DOKS弹性伸缩实战:Kubernetes自动扩缩四大支柱详解

Kubernetes弹性伸缩(Scaling)是云原生应用应对流量波动的核心能力,其本质是通过声明式策略实现资源的按需调度与动态调整。原理上依赖指标采集(Metrics Server)、控制器决策(HPA/CA/VPA/KEDA)与基础设施联动三者协同;技术价值在于降低运维负担、提升资源利用率并保障业务SLA;典型应用场景涵盖电商大促、API网关扩容、消息队列消费加速等高并发服务。DigitalOcean Kubernetes(DOKS)凭借对Droplet、Load Balancer等底层资源的深度集成,

chunqingtai2922的博客 428
上一篇: 我以为自己MySQL够牛逼了,直到看到了Alibaba的面试题
下一篇: 别再手动管理接口文档了
java架构师小芷
博客等级 码龄6年 216粉丝 519原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值