kubectl run已被弃用 - 寻找替代方案

53
我将使用 kubectl run 带有环境参数来为我创建临时的 Docker 容器(例如,一些转发调试目的)。自几周以来,kubectl 抱怨 kubectl run 已被弃用。不幸的是,我找不到一个合适的替代品。
这是旧命令:
$KUBECTL run -i -t --attach=false --image djfaze/port-forward --env="REMOTE_HOST=$REMOTE_HOST" --env="REMOTE_PORT=$REMOTE_PORT" $POD_NAME

在执行此命令时,kubectl会报错,并显示以下消息:

kubectl run --generator=deployment/apps.v1beta1已过时,将在未来版本中被删除。请使用kubectl create代替。

有什么替换此run命令的方法吗?


1
如果您是从《Kubernetes实战》一书中跟随而来,请查看以下内容,或许会对您有所帮助:https://medium.com/@marko.luksa/kubernetes-in-action-introducing-replication-controllers-aaa2c05e0b4e 使用yaml文件和create命令创建复制控制器。 - Marius Pop
9个回答

72
作为问题的作者,让我解释一下这个废弃背后的意图。就像 Brendan 在 他的回答 中所解释的那样,kubectl run 本身并没有被废弃,只是除了创建 Pod 的生成器之外,所有生成器都被废弃了。
这个改变的原因有两个:
1. kubectl run 命令的绝大多数输入参数对于新手和老手来说都很难理解,不容易弄清楚调用的结果。您需要考虑几个传递的选项以及服务器版本。 2. 它背后的代码也很难维护,因为可能性的矩阵增长得比我们处理得更快。
这就是为什么我们正在努力让人们摆脱使用 kubectl run 进行日常工作,并说服他们使用明确的 kubectl create 命令更加直观的原因。最后,我们希望那些玩过 Docker 或任何其他容器引擎的新手,在 Kubernetes 中运行容器时可以拥有与之相同的体验,其中 kubectl run 将在集群中运行一个 Pod。
对于最初的混淆,我感到非常抱歉,希望这能够澄清事情。
更新(2020/01/10):从 https://github.com/kubernetes/kubernetes/pull/87077 开始,kubectl run 将仅创建 Pod。所有生成器都将被完全删除。

3
作为您回答的一部分,将问题中的 kubectl run 命令翻译为 kubectl create 命令而不使用外部的 json/yaml 文件会更有意义。能否这样做呢? - karthiks
2
但是似乎没有 kubectl create pod 命令? - Andrew Savinykh
4
我觉得@karthiks的意思是,这个问题要求如何替换运行命令以达到相同的效果,但不会产生弃用警告。我明白我们应该“使用kubectl create”,但你能给我们举个例子,具体说明如何操作吗?我猜想大多数人并不关心为什么要替换,只是想知道如何按照你现在要求的去做。 - deed02392
1
我希望这回答了你的问题。简而言之,如果你运行 kubectl create -h,你将得到一个可能的子命令列表,允许创建以下资源:clusterrole、clusterrolebinding、configmap、cronjob、deployment、job、namespace、poddisruptionbudget、priorityclass、quota、role、rolebinding、secret、service、serviceaccount。例如,运行 kubectl create job -h 将给出该命令的示例用法。 - soltysh
我发现kubectl run非常有用,至少可以创建一个基本的yaml配置文件,然后根据我的需求进行进一步编辑。如果可维护性是一个问题,那么我认为更好的选择不是将其“弃用”,而是停止在“kubernetes run”命令上添加更多功能/参数。 - Abdul Mohsin
显示剩余3条评论

21

您可以使用:

kubectl run --generator=run-pod/v1 --image=busybox busybox --dry-run --env=foo=bar

这并未被弃用。


1
所有的生成器除了pod之外,在v1.15版本中都已被弃用。请参阅https://kubernetes.io/docs/reference/kubectl/conventions/。 - Ryan

16

kubectl run 默认会创建一个 Deployment

完整命令为:

kubectl run --generator=deployment/apps.v1 <deployment_name> --image=<image_to_use_in_the_container_of_the_deployment's_pod>

因此,在执行run命令时创建的kubernetes资源由--generator标志的值定义。

该弃用消息所提示的(并且由@soltysh提供的答案也得到了澄清)是将删除这种特定做法。

因此,在未来的kubernetes版本中,run命令默认情况下(并且作为唯一选项)将创建pods(而不是部署),即命令的完整形式变为:

kubectl run --generator=run-pod/v1 <pod_name> --image=<image_of_the_container_of_the_pod>

如果您想创建其他kubernetes资源类型,则无法通过run命令实现,因此您必须使用显式命令create或声明性命令apply -f,后者指向包含相应资源定义的kubernetesyml文件,例如:

kubernetes apply -f <yaml_file_with_my_deployment.yml>

8

我注意到运行以下命令时,没有指定生成器参数:

kubectl run <name> --image=<image>

它返回以下错误信息:
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.

这条信息非常令人困惑的是,你从一开始就没有指定“--generator”参数。然而,这里的主要问题是根据错误消息的指示明确指定生成器,如下所示:
kubectl run --generator=run-pod/v1 <name> --image=<image>

接下来它应该能够成功运行。(他们本应该将生成器默认为run-pod/v1以避免这种混淆,或者鼓励使用create命令)。

然而,根据@soltysh的答案,现在他们建议使用'create'命令而不是'run'。


3

3

当你运行

kubectl run <name> --image=<image> --port=<port>

你正在隐式地运行

kubectl run --generator=deployment/apps.v1 run <name> --image=<image> --port=<port>

这告诉 Kubernetes 它需要生成什么资源

使用 run 处理如此多的参数非常繁琐。

因此,从版本v1.15开始,除了 run-pod 之外的所有 --generators 都已被弃用。

请参见下表。

Pod                                 v1                  kubectl run --generator=run-pod/v1
ReplicationController (deprecated)  v1                  kubectl run --generator=run/v1
Deployment (deprecated)         extensions/v1beta1      kubectl run --generator=deployment/v1beta1
Deployment (deprecated)         apps/v1beta1            kubectl run --generator=deployment/apps.v1beta1
Job (deprecated)                batch/v1                kubectl run --generator=job/v1
CronJob (deprecated)            batch/v2alpha1          kubectl run --generator=cronjob/v2alpha1
CronJob (deprecated)            batch/v1beta1           kubectl run --generator=cronjob/v1beta1

解决方案是使用createapply -f。后者使用yml文件。

0

0
如许多答案所述... run 只是用于创建 pod。在提问者的上下文中(用于调试的临时容器(即 pod)),这个命令是完全可以的。
只需运行 pod 并 --expose 它;设置一些 --env 变量;使用 --tty 进入,完成后可能使用 --rm
在这种情况下,run 并没有被弃用,在其他情况下,如部署、DaemonSet、StatefulSet 等,它是被弃用的 - 有很好的理由 - 它过于命令式!

-1

就像消息所说的那样,您应该使用kubectl create。只需定义一个最小的Pod YAML definition并使用kubectl create -f mypod.yml


1
这并不完全准确,kubectl create 有几个子命令可以让你创建资源 而无需编写 yaml,虽然没有 pod 创建,但 kubectl run 的这一部分 并未被弃用。 - soltysh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接