删除一个pod会发生啥事情?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了删除一个pod会发生啥事情?相关的知识,希望对你有一定的参考价值。

参考技术A kube-apiserver会接受到用户的删除指令,默认有30秒时间等待优雅退出,超过30秒会被标记为死亡状态,此时pod的状态Terminating,kubelet看到pod标记为Terminating就开始了关闭pod的工作;

关闭流程如下:

    ●    pod从service的endpoint列表中被移除;

    ●    如果该pod定义了一个停止前的钩子,其会在pod内部被调用,停止钩子一般定义了如何优雅的结束进程;

    ●    进程被发送TERM信号(kill-14);

    ●    当超过优雅退出的时间后,pod中的所有进程都会被发送SIGKILL信号(kill-9)。

指向已删除提交的 Git 标记会发生啥情况

【中文标题】指向已删除提交的 Git 标记会发生啥情况【英文标题】:What happen to Git tags pointing to a removed commit指向已删除提交的 Git 标记会发生什么情况 【发布时间】:2016-01-21 20:51:33 【问题描述】:

假设我做了以下事情:

    创建分支X 创建标签t(到分支X) 推送 删除分支X

标记t 会发生什么?它只是漂浮在那里吗?算不算垃圾?

我应该在删除分支本身之前删除所有指向分支的标签吗?

参考

来自Git Basics - Tagging:

Git 使用两种主要类型的标签:轻量级和带注释的。一种 轻量级标签很像一个不会改变的分支——它是 只是一个指向特定提交的指针。

【问题讨论】:

【参考方案1】:

标签 t 会发生什么?

假设您从提交 E 创建了分支 x,然后使用标签 t 标记了该提交。例如

                           x (branch)
                           |
                           V             
A-----B------C------D------E
                           ^
                           |
                           t (tag)

如果您删除分支x,标记t 不会发生任何事情。

git branch -D x

标签仍然指向提交E

A-----B------C------D------E
                           ^
                           |
                           t (tag)

算不算垃圾?

否,因为该提交仍被标记 t 引用。

如果提交被删除怎么办?

您不会删除提交。您删除指向提交的指针,如果不再引用提交,git 有一天会垃圾收集它们(取决于您的配置)。

git gc

即使你删除了所有普通的 refs,比如分支和标签,提交仍然会在 reflog 中被引用一段时间,你可以访问它们,例如重新创建一个分支,标记它们或挑选等。

您可以使用git reflog 查看引用日志。也看看gc.reflogExpireUnreachablegc.reflogExpire


编辑

如果 git 的对象数据库不知何故损坏了来自.git/objects 的文件被删除(例如,您使用文件资源管理器或命令行命令意外删除了它)或 ref 指向不存在的 git 对象 (如提交、树或 blob 对象),如果 git 尝试访问这些对象,您将得到错误。

以下是 git 尝试访问不存在的对象或引用不存在的对象时可能发生的错误列表。

提交

fatal: Could not parse object '<ref-name>'.

示例:

fatal: Could not parse object 'master'.

fatal: unable to read tree <tree-sha1>

示例:

fatal: unable to read tree 13a3e0908e4f6fc7526056377673a5987e753fc8

斑点

error: unable to read sha1 file of <blob-name> (<blob-sha1>)

示例:

error: unable to read sha1 file of test.txt (e69de29bb2d1d6434b8b29ae775ad8c2e48c5391)

请查看Git Internals 以获得更深入的了解。

【讨论】:

这是否意味着如果我在一个分支中标记了稍后被删除的提交,我仍然可以使用标记引用它。例如。如果我将标签v1添加到分支x,那么标签v1x被删除后是否仍然可用? (考虑旧版本的错误修复,当版本只是 master 上提交的标签。每个版本没有特定的发布分支) 是的,只要你不删除标签,提交仍然被引用,因此不会被删除。如果你再次需要一个分支,你可以创建一个从标签的提交开始的分支,例如git branch &lt;branchname&gt; v1.【参考方案2】:

我不是在解决 OP 问题中的特定场景,而是在标题中的问题:指向已删除提交的 git 标签会发生什么?

如果您确实设法删除了由标签引用的提交(不确定如何做到这一点 - 请参阅 René Link's answer),该标签将只是指向无效提交的指针(您可以通过从 .git/refs/tags 手动编辑标签)。

在这种情况下,git tag 的输出将是这样的:

$ git tag
error: refs/tags/v1.0 does not point to a valid object!
v1.1
...etc

结帐也会产生错误:

$ git checkout v1.0
fatal: reference is not a tree: v1.0

因此,对于“引用已删除提交的 git 标记会怎样?”这个问题的答案是什么?没什么。它会一直保留在那里,指向一个无效的引用,直到你用git tag -d &lt;tag&gt; 删除它。

【讨论】:

那么如果你想签出一个标签,它指向一个已删除分支中的提交,这个标签是无效的吗? @testing 没有。这个答案正在解决OP描述的假设情况。实际场景见上文René's answer。 Renè 的示例显示了提交上的标签,该标签在删除分支后存在。如果标签位于分支 X 上的以下提交之一上(示例中未显示)怎么办?然后标记是否指向从合并创建的提交?例如。您在功能分支中的一个提交上有标签,将该功能分支合并到开发中,最后删除该功能分支。 删除分支不会删除任何提交。只有任何标记、分支或其他 ref 无法访问的提交才会被删除,并且只有在垃圾收集运行之后。【参考方案3】:

如果您删除创建标签的分支,这不会影响标签。标签不包含创建它的位置的引用。

如果您想了解更多关于标签与分支的信息,我建议您查看以下问题:How is a tag different from a branch? Which should I use, here?

【讨论】:

查看我的编辑:标签非常像一个不会改变的分支——它只是一个指向特定提交的指针。。如果提交被删除怎么办? 你如何“删除”一个提交?假设您在 master 上,并且您将 master 分支标记为“1.0”,然后您想回滚 master 上的最新两次提交。您将运行“git reset --hard HEAD~2”,这将使您的 HEAD 恢复两次提交,使这些提交从您的主分支中“消失”。但是它们仍然存储在您的存储库中,只是不在主分支中。您的标签“1.0”仍然指向正确的提交没有问题。 或者我猜你的情况。如果您仅在分支中提交。你删除那个分支。这些提交不会被删除。如果您在删除分支后使用“git reflog”,您仍然应该能够从该分支中​​找到您提交的 SHA1,这就是标签所指向的内容。

以上是关于删除一个pod会发生啥事情?的主要内容,如果未能解决你的问题,请参考以下文章

当我们扩展 kubernetes 部署并更改其中一个 pod 或容器配置时会发生啥?

指向已删除提交的 Git 标记会发生啥情况

当我删除指针的指针时会发生啥?

删除 iOS 配置文件时会发生啥

存储对已删除 NSManagedObject 的引用的局部变量会发生啥

当删除没有虚拟析构函数的多态对象时会发生啥?