当通过 kubernetes 部署创建时,为什么 pod 名称会在其名称后附加 5 个随机字母数字字符?

use*_*669 4 kubernetes

当通过 kubernetes 部署创建时,为什么 pod 名称会在其名称后附加 5 个随机字母数字字符?是否有可能摆脱它们以使豆荚名称不改变?我经常删除和创建部署,并且希望 pod 名称不要更改。

更新:我想使用相同的名称,因为我不断删除/重新创建相同的部署,如果名称没有改变,那么我可以快速重用旧命令来执行/查看容器的日志。

Raj*_*nde 5

这就是部署的工作原理,每次 pod 死亡时,ReplcaSet 都会创建具有不同名称的 pod 来匹配所需的状态,并附加到 pod 名称的随机数以赋予它们唯一的名称。

无论您想要实现什么目标,部署对象都是不可能的,因为它们适用于无状态应用程序。由于您想保留应用程序的状态(名称),这当然可以使用 StatefulSet 实现。

因此,如果您使用 StatefulSet 对象来管理副本,则每个 pod 都将以特定的名称约定创建,例如 POD_NAME-1、POD_NAME-2 等,即索引将附加到 pod 名称。此外,当 pod 死亡时,将以相同名称创建新的 pod。

您想要实现的 Ao 是 StatefulSet 的理想用例。大胆试试吧。


Din*_*ian 5

在 pod 名称中包含随机字母数字的原因:

当我们创建 a 时deployment,它不会直接创建 pod(以匹配副本数)。

  • 它将创建一个副本集(名称 = deployname_name + 10 位 aplhanumeric)。但是为什么要额外的字母数字呢?当我们进行部署升级时,使用新的字母数字创建新的副本集,而旧的则保持原样。这个旧的副本集用于回滚
  • 创建的副本集将创建pod(名称 = replicaset_name + 5 位字母数字)。但是为什么要额外的字母数字呢?我们不能有两个同名的 Pod。

如果你的用例是经常使用的旧命令,然后去Statefulset没有很好的解决方案。Statefulset 是heavy weight(有序部署、有序终止、唯一网络名称),它们专门设计用于在重新启动时保持状态(与持久卷结合)。

您可以使用的工具很少:

  1. 严厉的
  2. kube-fzf

您的问题的轻量级解决方案:

  1. 您可以使用标签来跨部署获取相同的 pod:

    kubectl get pods -l app=my_app,app_type=server
    NAME                             READY   STATUS    RESTARTS   AGE
    my-app-5b7644f7f6-4hb8s   1/1     Running   0          22h
    my-app-5b7644f7f6-72ssz   1/1     Running   0          22h
    
    Run Code Online (Sandbox Code Playgroud)

在此之后,我们可以使用一些 bash 魔法来得到我们想要的,如下所示

最终命令:

kubectl get pods -l app=my_app,app_type=server -o name | rg "pod/" -r "" | head -n 1 | awk '{print "kubectl logs " $0}' | bash
Run Code Online (Sandbox Code Playgroud)

解释:

  1. 获取 pod 名称列表

    kubectl get pods -l app=my_app,app_type=server -o namenames
    pod/my-app-5b7644f7f6-4hb8s
    pod/my-app-5b7644f7f6-72ssz
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用ripgrepor sed(rg "pod/" -r "")替换 pod/

  3. 只使用一个吊舱 head -n 1
  4. 使用 awk 打印 exec/see_log 命令
  5. 通过管道将其传递给 bash 以执行