删除一个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.reflogExpireUnreachable
和gc.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
,那么标签v1
在x
被删除后是否仍然可用? (考虑旧版本的错误修复,当版本只是 master 上提交的标签。每个版本没有特定的发布分支)
是的,只要你不删除标签,提交仍然被引用,因此不会被删除。如果你再次需要一个分支,你可以创建一个从标签的提交开始的分支,例如git branch <branchname> 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 <tag>
删除它。
【讨论】:
那么如果你想签出一个标签,它指向一个已删除分支中的提交,这个标签是无效的吗? @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 或容器配置时会发生啥?