云计算之k8s系列_第十二回

2023-11-02

上一回讲解了控制器,这一回详细看看控制器中Deployment控制器,k8s中,Deployment实现了一个非常重要的功能:pod的水平扩展与收缩。如果我们更新了Deployment的pod模板,那么deployment就需要”滚动更新(rolling update)“,来升级现有的容器。

上述功能依赖ReplicaSet对象,我们先看看这个YAML文件:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-set
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9

从上可以看出,一个ReplicaSet对象,其实就是由副本数目的定义和一个pod模板组成的。它的定义其实是Deployment的一个子集。Deployment控制器实际操作的,正是这样的ReplicaSet对象,而不是Pod对象。

接下来,我们一起看看Deployment这个YAML文件:

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

可以看到,这就是一个我们常用的nginx-deployment,他定义的Pod副本个数是3(spec.replicas=3)。

那么,在具体的实现上,这个Deployment,与ReplicaSet,以及Pod的关系是怎样的呢?Deployment -->ReplicaSet(v1)--->Pods,通过箭头,我们可以看到,一个定义了replicas=3的Deployment,与它的ReplicaSet,以及Pod的关系,实际上是一种“层控制”的关系。

其中,ReplicaSet负责通过“控制器模式”,保证系统中Pod的个数永远等于指定的个数。这也正是Deployment只允许容器的restartPolicy=Always的主要原因:只有在容器能保证自己始终是Running的状态的前提下,ReplicaSet调整Pod个数才有意义。

而在此基础上,Deployment同样通过“控制器模式”,来操作ReplicaSet的个数和属性,进而实现“水平扩展/收缩”和“滚动更新”这两个编排动作。

其中,“水平扩展/收缩”非常容易实现,Deployment Controller只需要修改它所控制的ReplicaSet的Pod副本个数就可以了。ReplicaSet就会根据修改后的值自动创建一个新的Pod。这就是“水平扩展”,反之,则是“水平收缩”。使用kubectl scale就可以实现这个操作。

$ kubectl scale deployment nginx-deployment --replicas=4
deployment.apps/nginx-deployment scaled

接下来,看看“滚动更新”的过程,

$ kubectl create -f nginx-deployment.yaml --record

这边添加了--record参数:作用是记录下你每次操作所执行的命令,方便后面查看。然后查看一下状态信息:

$ kubectl get deployments
NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3         0         0            0           1s

在返回结果中,我们可以看到四个状态字段:

1. DESIRED: 用户期望的Pod副本个数(spec.replicas);
2. CURRENT: 当前处于running状态的Pod个数;
3. UP-TO-DATE:当前处于最新版本的Pod的个数,Pod的spec部分与Deployment里Pod模块里定义的完全一致;
4. AVAILABLE:当前已经可用的Pod的个数,即:Running状态,又是最新版本,并且已经处于ready(健康检查正确)状态的Pod的个数。

可以看到,只有这个AVAILABLE字段,描述的才是用户所期望的最终状态。

而k8s项目还为我们提供了一条指令,让我们可以实时查看Deployment对象的状态变化。这个指令就是kubectl rollout status:

$ kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment.apps/nginx-deployment successfully rolled out

在这个返回结果中,“2 out of 3 new replicas have been updated”意味着已经有2个Pod进入了UP-TO-DATE状态。过一会儿,我们就能看到这个Deployment的3个Pod,就进入到了AVAILABLE状态:

NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3         3         3            3           20s

此时,我们可以查看这个Deployment所控制的ReplicaSet:

$ kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-3167673210   3         3         3       20s

从上面结果可知,在用户提交了一个Deployment对象后,Deployment Controller 就会立即创建一个Pod副本个数为3的ReplicaSet。这个ReplicaSet的名字,由Deployment的名字和一个随机字符串共同组成。这个随机字符串叫作pod-template-hash,如我们这里的3167673210。ReplicaSet把这个随机字符串加在它所控制的所有Pod的标签里,从而保证这些Pod不会与集群里的其他Pod混淆。

而ReplicaSet的DESIRED、CURRENT和READY字段的含义,和Deployment中是一致的。所以,相比之下,Deployment只是在ReplicaSet的基础上,添加了UP-TO-DATE这个跟版本有关的状态字段。

这个时候,如果我们修改了Deployment的Pod模板,“滚动更新”就会被自动触发。

修改Deployment有很多方法。比如,我们可以用kubectl edit 指令编辑Etcd里的API对象。

$ kubectl edit deployment/nginx-deployment
... 
    spec:
      containers:
      - name: nginx
        image: nginx:1.9.1 # 1.7.9 -> 1.9.1
        ports:
        - containerPort: 80
...
deployment.extensions/nginx-deployment edited

kubectl edit 这个命令只不过是把API对象内容下载到本地修改后再提交上去。kubectl edit保存退出,k8s就会立刻触发“滚动更新”的过程。可以用kubectl rollout status 查看nginx-deployment的状态变化:

$ kubectl rollout status deployment/nginx-deployment
Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment.extensions/nginx-deployment successfully rolled out

这时,你可以通过查看Deployment的Events,看到这个“滚动更新”的流程:

$ kubectl describe deployment nginx-deployment
...
Events:
  Type    Reason             Age   From                   Message
  ----    ------             ----  ----                   -------
...
  Normal  ScalingReplicaSet  24s   deployment-controller  Scaled up replica set nginx-deployment-1764197365 to 1
  Normal  ScalingReplicaSet  22s   deployment-controller  Scaled down replica set nginx-deployment-3167673210 to 2
  Normal  ScalingReplicaSet  22s   deployment-controller  Scaled up replica set nginx-deployment-1764197365 to 2
  Normal  ScalingReplicaSet  19s   deployment-controller  Scaled down replica set nginx-deployment-3167673210 to 1
  Normal  ScalingReplicaSet  19s   deployment-controller  Scaled up replica set nginx-deployment-1764197365 to 3
  Normal  ScalingReplicaSet  14s   deployment-controller  Scaled down replica set nginx-deployment-3167673210 to 0

当你修改Deployment里的Pod定义之后,Deployment Controller 会使用这个修改后的Pod模板,创建一个新的ReplicaSet(has=1764197365),这个新的ReplicaSet的初始Pod副本数是:0。

然后,在Age=24s的位置,Deployment Controller开始将这个新的ReplicaSet所控制的Pod副本数从0个变成1个,即水平扩展出一个副本。在Age=22s的位置,Deployment Controller又将旧的ReplicaSet(hash=3167673210)所控制的旧Pod副本数减少一个,即水平收缩成两个副本。如此交替进行,新ReplicaSet管理的Pod副本数,从0个变成1个,再变成2个,最后变成3个。而旧的ReplicaSet管理的Pod副本数则从3个变成2个,再变成1个,最后变成0个。这样,就完成了这一组Pod的版本升级过程。将一个集群中正在运行的多个Pod版本,交替地逐一升级的过程,就是“滚动更新”。 

在这个“滚动更新”过程完成之后,可以查看一下新旧两个ReplicaSet的最终状态:

$ kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-1764197365   3         3         3       6s
nginx-deployment-3167673210   0         0         0       30s

其中,旧ReplicaSet(hash=3167673210)已经被“水平收缩”成了0个副本。

滚动更新的好处:在升级刚开始的时候,集群中只有1个新版本的Pod。如果这时,新版本Pod有问题启动不起来,那么“滚动更新”就会停止,从而允许开发和运维人员介入。而在这个过程中,由于应用本身还有两个旧版本的Pod在线,所以服务并不会受到太大的影响。

当然,这也就要求你一定要使用Pod的Health Check机制检查应用的运行状态,而不是简单地依赖于容器Running状态。要不然的话,虽然容器已经变成Running了,但服务很有可能尚未启动,“滚动更新”的效果也就达不到了。

而为了进一步保证服务的连续性,Deployment Controller还会确保,在任何时间窗口内,只有指定比例的Pod处于离线状态。同时,它也会确保,在任何时间窗口内,只有指定比例的新Pod被创建出来。这两个比例的值都是可以配置的,默认都是DESIRED值的25%。

所以,在上面这个Deployment中,它有3个Pod副本,那么控制器在“滚动更新”的过程中永远都会确保至少有2个Pod处理可用状态,至多只有4个Pod同时存在于集群中。这个策略,是Deployment对象的一个字段,名叫RollingUpdateStrategy:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
...
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1

在上面这个RollingUpdateStrategy的配置中,maxSurge指定的是除了DESIRED数量之外,在一次“滚动”中,Deployment控制器还可以创建多个新Pod;而maxUnavailable指定的是,在一次“滚动”中,Deployment控制器可以删除多少个旧Pod。

同时,这两个配置还可以用前面我们介绍的百分比形式来表示,比如:maxUnavailable=50%,指的是我们最多可以一次删除“50%*DESIRED 数量”个Pod。

现在我们可以扩展一下上面的箭头图了:

          Deployment
               |
      _________|________
     |                 |
    ReplicaSet(v1)    ReplicaSet(v2)
     |                 |
    pods              pods

Deployment的控制器,实际上控制的是ReplicaSet的数目,以及每个ReplicaSet的属性。

而一个应用的版本,对应的正是一个ReplicaSet;这个版本应用的Pod数量,则是由ReplicaSet通过它自己的控制器(ReplicaSet Controller)来保证。通过这样的多个ReplicaSet对象,k8s项目就实现了对多个“应用版本”的描述。也就是说,应用版本和ReplicaSet是一一对应的。

Deployment对应用进行版本控制的具体原理:

这一次使用kubectl set image直接修改nginx-deployment所使用的的镜像。这一次写一个错误的镜像名字,这样,Deployment就会出现一个升级失败的版本。

$ kubectl set image deployment/nginx-deployment nginx=nginx:1.91
deployment.extensions/nginx-deployment image updated

因为nginx:1.91镜像在docker hub中并不存在,所以这个Deployment的“滚动更新”被触发后,会立刻报错并停止。这时看一下ReplicaSet的状态:

$ kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-1764197365   2         2         2       24s
nginx-deployment-3167673210   0         0         0       35s
nginx-deployment-2156724341   2         2         0       7s

通过返回结果可以看出,新版本的ReplicaSet(hash=2156724341)的“水平扩展”已经停止。而且此时,它已经创建了两个Pod,但是他们都没有进入READY状态。这当然是因为这两个Pod都拉取不到有效的镜像。与此同时,旧版本的ReplicaSet(hash=1764197365)的“水平收缩”,也自动停止了。此时,已经有一个旧Pod被删除,还剩下两个旧Pod。那么如何让这个Deployment的3个Pod,都回滚到以前的就版本呢?

我们只需要执行一条kubectl rollout undo命令,就能把整个Deployment回滚到上一个版本:

$ kubectl rollout undo deployment/nginx-deployment
deployment.extensions/nginx-deployment

这个过程,就是让旧的ReplicaSet再次“扩展”到3个Pod,新的ReplicaSet重新“收缩”到0个Pod。那么,如果我想回滚到更早之前的版本,要怎么办呢?

首先,我们需要使用kubectl rollout history命令,查看每次Deployment变更对应的版本。而由于我们在创建这个Deployment的时候,指定了--record参数,所以我们创建这些版本时执行的kubectl命令,都会被记录下来:

$ kubectl rollout history deployment/nginx-deployment
deployments "nginx-deployment"
REVISION    CHANGE-CAUSE
1           kubectl create -f nginx-deployment.yaml --record
2           kubectl edit deployment/nginx-deployment
3           kubectl set image deployment/nginx-deployment nginx=nginx:1.91

可以看到,我们前面执行的创建和更新操作,分别对应了版本1和版本2,而那次失败的更新操作,则对应的是版本3。这个命令还可以看API对象的细节:

$ kubectl rollout history deployment/nginx-deployment --revision=2

然后,我们就可以在kubectl  rollout  undo 命令行最后,加上要回滚到的指定版本的版本号,就可以回滚到指定版本了:

 

$ kubectl rollout undo deployment/nginx-deployment --to-revision=2
deployment.extensions/nginx-deployment

这样,Deployment Controller还会按照“滚动更新”的方式,完成对Deployment的降级操作。

不过,你可能已经想到了一个问题:我们对Deployment进行的每一次更新操作,都会生成一个新的ReplicaSet对象,是不是有些多余?

没错,是多余的,所以,k8s项目还提供了一个指令,使得我们对Deployment的多次更新操作,最后只生成一个ReplicaSet。在更新Deployment之前,要先执行一条kubectl rollout pause指令。

$ kubectl rollout pause deployment/nginx-deployment
deployment.extensions/nginx-deployment paused

上面命令是让这个Deployment进入了一个“暂停”状态。接下来,可以随意使用kubectl edit 或者kubectl set image命令,修改这个Deployment的内容了。由于此时Deployment正处于“暂停”状态,所以我们对Deployment的所有修改,都不会触发新的“滚动更新”,也不会创建新的ReplicaSet。当修改操作完成后,只需要执行一条kubectl rollout resume指令,就可以把这个Deployment“恢复”过来:

$ kubectl rollout resume deploy/nginx-deployment
deployment.extensions/nginx-deployment resumed

在resume和pause之间,我们对Deployment进行的所有修改,最后只会触发一次“滚动更新”。可以检查ReplicaSet状态的变化,来验证一下kubectl rollout pause 和kubectl rollout resume 指令的执行效果:

$ kubectl get rs
NAME               DESIRED   CURRENT   READY     AGE
nginx-1764197365   0         0         0         2m
nginx-3196763511   3         3         3         28s

通过返回结果,我们可以看到,只有一个hash=3196763511的ReplicaSet被创建出来。不过,即使我们小心控制ReplicaSet的生成数量,随着应用版本的不断增加,k8s中还是会为同一个Deployment保存很多很多不同的ReplicaSet。那么,我们又该如何控制这些“历史”ReplicaSet的数量呢?

很简单,Deployment对象有一个字段,叫作spec.revisionHistoryLimit,就是k8s为Deployment保留的“历史版本”个数。所以,如果把它设置为0,你就再也不能做回滚操作了。

总结:

综上所述,我们应该了解到:

1. Deployment实际上是一个两层控制器。首先,它通过ReplicaSet的个数来描述应用的版本;然后,通过ReplicaSet的属性(如replicas的值),来保证Pod的副本数量。

2. 我们可以使用这个Deployment对象来描述应用,使用kubectl rollout命令控制应用的版本。

在实际使用场景中,应用发布的流程往往是千差万别,可能有定制化需求,各个Pod之间有关联,哪些Pod能下线,不能随便选择,那么这种场景,单靠Deployment就很难实现了。

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

云计算之k8s系列_第十二回 的相关文章

  • pymongo:使用 MongoReplicaSetClient 的优点?

    看来两者Mongo客户端 http api mongodb org python current api pymongo mongo client html and MongoReplicaSet客户端 http api mongodb o
  • mod_deflate 与 Django GZipMiddleware,使用哪一个进行部署?

    我们正在使用 Apache 2 2 mod wsgi 部署 Django 应用程序 我们应该在 Apache 中启用 mod deflate 还是使用 Django 的 GZipMiddleware 哪个选项表现更好 你可能应该测试一下才能
  • 升级到 .NET 4.0 时 配置组出现问题

    因此 我们将网站从 3 5 SP1 升级到 NET 4 当我们运行该站点时 我们收到内部服务器错误 500 指出无法读取以下配置组
  • Gradle 构建和部署特定的构建类型

    我想使用特定的构建类型构建我的 gradle 项目 并使用单个命令将其部署到设备上 我的 build gradle 设置为多种构建类型 例如实时和发布 我之前与 Maven 合作过 我寻找相当于 mvn clean install P re
  • 如何直接从我的 Gitlab 存储库部署到 Heroku

    在我的团队中 我们使用 Gitlab 作为远程存储库 因此我们正在寻找一种解决方案来将应用程序自动部署到 Heroku 我们找到了 Codeship 用于从 Github 自动将应用程序部署到 Heroku 有小费吗 技巧 如果您不准备使用
  • 不使用 powershell 远程安装 .msi?

    我们有一个多服务器系统我们需要在客户端安装 我想编写一个脚本 可以 关闭远程机器上的服务 卸载多台远程计算机上的软件 在多个远程计算机上安装 msi 文件 我曾挣扎过psexec and wmic做第 2 点和第 3 点 似乎必须有一种更简
  • 启动时加载 FastAPI 项目中的模型

    所以我目前正在开发一个为多种 NLP 服务提供服务的 FastAPI 项目 为此 我想提供来自 spacy 和 Huggingface 的不同模型 自从那些模型相当大的推理时间为每个发布请求加载模型相当长 我的想法是在 FastAPI 启动
  • 将 Android apk 与其他可执行文件一起打包

    作为先前问题的后续 Android ioctl root权限和使用 https stackoverflow com questions 6983156 android ioctl root permissions and usage 698
  • 无法找到请求的.Net Framework 数据提供程序 - SQLite

    我认为 sqlite 很简单 但它给我带来了困难 我只想创建一个可以使用 ado net 实体数据类连接到 sqlite 数据库的应用程序 我在运行 Windows XP 的虚拟计算机上测试应用程序时遇到此问题 该应用程序在我当前的计算机以
  • 为什么 eclipse 无法正确部署我的动态 Web 项目?

    问题是 我在源代码控制下有一个 java 动态 Web 项目 并在我的 Eclipse 工作区中检出 之前 我能够从 eclipse 中在本地 Tomcat 服务器上运行 servlet 但是 我进行了一些更改 删除了一些文件并添加了一些新
  • 如果存在以前的版本,如何使msi覆盖程序?

    我正在使用 Visual Studio 2010 我正在开发一个 Windows 应用程序 在尝试为其创建自动更新程序时遇到了严重的问题 当程序找到新版本并尝试安装它时 由于以下两个原因而无法安装 1 the application is
  • Swift 4 - 设置最低部署目标

    当前的部署目标是 11 0 这很好 但是 我想知道如何设置最小值 8 0 您可以在项目目标的常规设置中设置部署目标 您可以在 Apple 文档中阅读更多相关信息 设定部署目标 https developer apple com librar
  • 找不到“System.Security.Cryptography.ProtectedData”,版本:“4.4.0”

    我正在尝试在 Windows Server 2012 Datacenter 上部署 NET Core 应用程序 我已经安装了 NET Core Windows Server 托管捆绑包 https aka ms dotnetcore 2 w
  • java webapp配置策略

    我的网络应用程序的一部分涉及上传图像文件 在生产服务器上 文件需要写入 somepath on Production server images 对于本地开发 我想将文件写入 some different path images 处理这些配
  • Forever.js 启动和重新启动多个脚本

    我的 Web 应用程序有 3 个主要的 Node js 组件 网站 提要和作业 为了开始这些 我永远使用 forever js var forever require forever function start name forever
  • 未找到 Azure Flask 路由

    我正在使用 Visual Studio 创建一个空白的 Flask 应用程序 当我在本地运行该应用程序时 我得到了预期的 hello world 当我发布到 Azure 应用服务时 我得到了这个丑陋的蓝色主页 这不是我制作的 在我的项目中
  • Robocopy 将文件复制到远程计算机

    我正在尝试编写一个 robocopy 命令将文件从本地计算机复制到任何一台部署服务器 ROBOCOPY MyService bin release remote computer C services myservice MIR 我收到这个
  • 在 WAR 部署期间如何检查哪个类/jar 导致“无法从最终类继承”?

    我正在将 WAR 文件部署到 Windows 7 上的 Weblogic 12 1 2 服务器 也尝试过 Mac OS X 我遇到了一个例外 见下文 看起来其中一个类引用了某个父类的旧 新版本 该父类来自一些重复的 jar 我怎样才能找到哪
  • MSBuild 项目部署到本地文件夹并转换配置

    我在尝试找到正确的方法来使用 MSBuild 构建 Web 项目并输出仅包含可部署文件 即没有 cs csproj Debug config 等 但发布到本地文件夹的项目时遇到问题然后我可以通过 FTP RoboCopy 或其他方式 传输到
  • 在 WildFly 10 中添加 jar 作为部署

    有没有办法 我们可以将 jar 部署为库 部署WildFly 10就像我们可以做到的那样weblogic服务器 或者我们可以将 jar 放在服务器的任何文件夹中并将这些依赖项定义为provided 我得到了什么部署方式jars on Wil

随机推荐

  • 公共命名空间,于2022年底

    公共命名空间的想法出现自2019年 到现在有三年了 在2022年底 总结一下这三年来的想法 就像字符集 字体 公共命名空间 新编译原理也是这么一对儿 字符集用来收集所有符号 字体用来显示字符集中的符号 公共命名空间用来收集所有的句子 新编译
  • java里的输入与输出

    一 概述 输入输出可以说是计算机的基本功能 作为一种语言体系 java中主要按照流 stream 的模式来实现 其中数据的流向是按照计算机的方向确定的 流入计算机的数据流叫做输入流 inputStream 由计算机发出的数据流叫做输出流 o
  • 想了很久的算法

    文章目录 1 求字符串中不重复的最长子串 2 斐波那契数列多种实现方式 1 求字符串中不重复的最长子串 var lengthOfLongestSubstring function s let setArr new Set result ma
  • 贺中国信通院“星火·链网”数字原生资产(DNA)服务网络隆重发布

    5月20日 中国信通院 星火 链网 数字原生资产 DNA 服务网络发布会在云端圆满举办 中国信通院院长 中关村区块链产业联盟理事长余晓晖出席会议并为 星火 链网 数字原生资产 DNA 服务网络上线发表寄语 中国信通院总工程师敖立 新华网首席
  • 识别图像模板旋转角度_基于视觉的焊缝识别与定位技术

    为了实现焊前引导 必须首先通过视觉传感系统识别工件和焊缝 确定焊接的关键点位置 建立关键点的二维或三维坐标 发送给机器人 将机器人的末端执行器运动到焊接起始点 自动完成焊前导引 焊缝识别的准确率与识别精度直接影响焊缝跟踪的精度 因此 焊缝识
  • 通过nginx代理拦截请求,进行全局访问限制

    声明 本博文用于学习总结及工作心得 运行环境 Ubantu 14 0 tomcat7 nginx 1 4 6 更新后1 5 6 项目中经常会用到权限管理 必然的就会存在权限的设定和验证 对于登陆或者模块的权限设定验证 在项目中直接实现 那么
  • 地图服务标注显示乱码问题

    版本 ArcGIS 10 1 在Catalog中发布了一个地图服务 直接切了图 切图后发现标注有乱码 操作系统是win7 不会涉及Server对字体库的访问权限问题 排查了一下 发现了原因 标注字体不能使用不支持中文的英文或者其他非中文字体
  • Golang基础 变量与常量

    Golang基础 变量与常量 01 变量声明 02 常量声明 03 变量初始化 04 常量初始化 参考资料 01 变量声明 变量就是内存堆栈区的一块地址空间用于存储数据 Go语言在使用变量时需要先声明变量 常用的声明方式有两种 使用var关
  • 用python最新版本安装web3后调试错误原因和解决方法

    由于调试web3 安装了最新版本的python3 11 用命令安装 pip install web3 提示安装错误 无法完成 仔细观察根据错误提示发现是 VC 14没有安装的原因 根据提示从微软官方下载vs BuildTools并单独安装V
  • 闭包(闭包使用场景,闭包内存泄漏,js内存管理及垃圾回收)

    1 什么是闭包 在认识闭包之前 我们先简单了解两个知识点 JavaScript 中的作用域和作用域链 JavaScript 中的垃圾回收 目的就是为了方便我们更容易理解闭包 1 JavaScript 中的作用域和作用域链 作用域就是一个独立
  • 内存泄漏全解析,从此拒绝ANR,让OOM远离你的身边,跟内存泄漏say byebye

    http www cnblogs com liushilin p 5900089 html 一 写在前面 二 一些杂谈 1 这里先安利一下java的内存分配 2 四种引用类型的介绍 3 内存抖动 这样的图很熟悉有木有 当这样的时候 说明你的
  • [医学多模态融合系列 -1] A review: Deep learning for medical image segmentation using multi-modality fusion 解读

    医学多模态融合系列 1 A review Deep learning for medical image segmentation using multi modality fusion 0 Abstract 1 Introduction
  • redis漏洞修复:CVE-2022-35977、CVE-2023-22458、CVE-2023-28856

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 漏洞内容 二 现状 三 更新redis 下载镜像 停止已有的容器 启动新的容器 四 更新后的版本 1 查看日志 2 查看版本 总结 前言 漏扫发现机器上的
  • MYSQL原理、设计与应用

    概述 数据库 Database DB 是按照数据结构来组织 存储和管理数据的仓库 其本身可被看作电子化的文件柜 用户可以对文件中的数据进行增删改查等操作 数据库系统是指在计算机系统中引入数据库后的系统 除了数据库 还包括数据库管理系统 Da
  • 攻防世界-MISC之如来十三掌

    一 下载打开附件1 出现一堆梵文 夜哆悉諳多苦奢陀奢諦冥神哆盧穆皤三侄三即諸諳即冥迦冥隸數顛耶迦奢若吉怯陀諳怖奢智侄諸若奢數菩奢集遠俱老竟寫明奢若梵等盧皤豆蒙密離怯婆皤礙他哆提哆多缽以南哆心曰姪罰蒙呐神 舍切真怯勝呐得俱沙罰娑是怯遠得呐數罰
  • 行人属性识别:HydraPlus-Net: Attentive Deep Features for Pedestrian Analysis

    参考文献 https arxiv org abs 1709 09930 代码实现 https github com xh liu HydraPlus Net 包括理解 HydraPlus Net Attentive Deep Feature
  • 小白学GAN系列4——torch.optim

    torch optim是一个实现了多种优化算法的包 大多数通用的方法都已支持 提供了丰富的接口调用 未来更多精炼的优化算法也将整合进来 为了使用torch optim 需先构造一个优化器对象Optimizer 用来保存当前的状态 并能够根据
  • 线程问题的核心: 怎么退出线程才是合适的----小话多线程(2)

    作者 陈曦 日期 2012 8 5 16 13 36 环境 Mac 10 7 1 Lion Intel i3 支持64位指令 gcc4 2 1 xcode4 2 苹果开源代码Libc 763 11 转载请注明出处 每日总结 优秀的架构都是类
  • 网络体系结构

    网络体系结构概述 1 网络协议 网络协议的三要素 语义 语法和同步 语法 规定通信双方彼此应该如何操作 即确定协议元素的格式 如 数据格式 信号平等规定 语义 规定通信双方要发出的控制信息 执行的动作和返回的应答等 包括用于调整和运行差错处
  • 云计算之k8s系列_第十二回

    上一回讲解了控制器 这一回详细看看控制器中Deployment控制器 k8s中 Deployment实现了一个非常重要的功能 pod的水平扩展与收缩 如果我们更新了Deployment的pod模板 那么deployment就需要 滚动更新