【问题标题】:kubectl run is deprecated - looking for alternativekubectl run 已弃用 - 寻找替代方案
【发布时间】:2019-03-24 05:57:50
【问题描述】:

我正在使用带有环境参数的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。

任何想法如何替换此运行命令?

【问题讨论】:

标签: kubernetes kubectl


【解决方案1】:

如消息所述,您应该使用 kubectl create 。只需定义一个最小的 pod yaml definition 并使用 kubectl create -f mypod.yml

【讨论】:

  • 这不太准确,kubectl create 有几个子命令允许您创建资源 而不 编写 yaml,没有 pod 创建,但 kubectl run 的那部分没有被弃用。
【解决方案2】:

你可以使用:

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

没有被弃用。

【讨论】:

【解决方案3】:

作为问题的作者,让我稍微解释一下这种弃用背后的意图。就像 Brendan 在 his answer 中解释的那样,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。所有生成器将被完全删除。

【讨论】:

  • 在不使用外部 json/yaml 文件的情况下将有问题的 kubectl run 命令转换为 kubectl create 命令会更有意义。介意将其作为您答案的一部分吗?
  • 我不确定我是否理解您的要求。基本上你可以使用任何 kubectl create 子命令而不是使用 json/yaml 文件。我没有提及任何具体内容,因为我们还没有涵盖所有资源,但至少是主要资源。
  • 但是好像没有kubectl create pod
  • 我认为@karthiks 所说的问题是询问如何将运行命令替换为具有相同效果但不会产生弃用警告的命令。当然,我知道我们应该“使用 kubectl create”,但是你能用一个例子告诉我们究竟是如何做到的,而不是仅仅解释为什么会有警告吗?我怀疑我们大多数人并不真正关心它为什么被替换,只是想知道如何做你想让我们现在做的事情。
  • 我希望这能回答您的问题,简而言之,如果您运行kubectl create -h,您将获得允许创建以下资源的可能子命令列表:clusterrole、clusterrolebinding、configmap、cronjob、deployment 、作业、命名空间、poddisruptionbudget、priorityclass、配额、角色、角色绑定、秘密、服务、服务帐户。例如,运行 kubectl create job -h 应该会为您提供该命令的示例用法。
【解决方案4】:

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 命令将默认(并且作为only 选项)创建pods(而不是部署),即命令完整的将变为:

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

如果您想创建任何其他 kubernetes 资源类型,这将无法通过 run 命令进行,因此您将不得不求助于显式命令式create 或声明式apply -f,后者指向@987654333 @yml 具有相应资源定义的文件,如

kubernetes apply -f <yaml_file_with_my_deployment.yml>

【讨论】:

    【解决方案5】:

    我注意到在没有指定生成器参数的情况下运行以下命令:

    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 的回答,听起来他们现在建议使用“创建”而不是“运行”。

    【讨论】:

      【解决方案6】:

      要运行一个 pod,这个简单的命令就足够了:

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

      查看https://www.k8s-school.fr/resources/blog/1-kubectl-run-deprecated/#pod 了解更多信息。

      【讨论】:

        【解决方案7】:

        当你跑步时

        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 文件。

        【讨论】:

          猜你喜欢
          • 2023-03-20
          • 2021-01-24
          • 1970-01-01
          • 2012-04-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-08
          • 2020-11-07
          相关资源
          最近更新 更多