要了解 Google Compute Engine 如何管理 ssh 密钥,您必须了解 GCE 如何管理 metadata(因为正如您所写,它们位于元数据存储中)。
更具体地说,project and instance metadata 之间的区别至关重要。引用文档(参见之前的链接):
可以在项目和实例级别分配元数据。项目级元数据传播到项目内的所有虚拟机实例,而实例级元数据仅影响该实例。您可以同时设置项目和实例级元数据,但如果您为项目和实例元数据设置相同的键,Compute Engine 将使用实例元数据。
虽然这看起来相当合乎逻辑和直截了当,但必须非常密切地注意所使用的术语:
项目级元数据传播到项目内的所有虚拟机实例 [...]
和
您可以同时设置两个 [...],但如果您为两个设置相同的键 [...],Compute Engine 将使用实例元数据。
如果你考虑这两个断言,它意味着两件事:
- 如果您在项目级别设置元数据ONLY,它将在您的实例中传播。
- 如果您在 instance 级别设置元数据,它将优先于 project 级别的元数据,并且不会传播任何内容。
因此,GCE 平台负责在实例中放置/删除您的 ssh 密钥(并在放置它们时创建相关用户,同时在删除它们时从 ~user/.ssh/authorized_keys 文件中删除密钥 -所以你不会丢失~user 的任何数据仅当你没有指定自己的密钥时(在实例创建时或以后)。如果这样做,GCE 平台会将 ssh 密钥管理视为手动,并且不会与元数据存储保持同步。
幸运的是,GCE 平台做得很好,因此,您无需重新创建实例即可让 GCE 平台管理您的密钥:您只需删除与sshKeys 相关的实例级元数据。
同理,如果你添加一些实例级别的元数据键为sshKeys,它会禁用ssh键GCE平台管理;除非您删除该实例级别的元数据。
关于延迟问题:到目前为止,除了网络延迟(因此没有明显的平台执行延迟)之外,我没有任何延迟。我认为平台时不时出现延迟不是不可能的,但似乎不太可能是您问题的原因。
补充说明:
一些发行版(例如 ubuntu)包括一个特定的用户(在 ubuntu 的情况下:~ubuntu),每个用户都存在于 项目级 ssh 密钥可以登录;但是该用户的authorized_keys 是在实例创建时生成的,GCE 平台似乎再也不会更改。恕我直言,应该首选自动 ssh 密钥管理。
来源:个人使用 GCE、terraform 和 Google 开发者控制台的经验