kubectl 运行 NAME - 澄清

kubectl run NAME - clarifying

根据文档:

https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#run

kubectl run NAME --image=image

将运行一张图片。

一些问题:

kubectl run NAME --image=image 命令将使用名为 [=30] 的图像生成名称为 NAME 的 pod(通过为给定图像创建相应的部署和复制集) =]图片。将此处的名称视为 Docker.

中的标签名称

然后,当您 运行 kubectl get pods 时,您将在列表中看到名称为 NAME 的 pod。

使用 kubectl get all 将获取默认名称 space 中的所有资源(还将列出部署和复制集对象)

示例:


$ kubectl run nginx --image=nginx

$ kubectl get all
NAME                         READY   STATUS              RESTARTS   AGE
pod/nginx-6db489d4b7-cs748   0/1     ContainerCreating   0          6s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   31d

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   0/1     1            0           6s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-6db489d4b7   1         1         0       6s

如果您只想创建一个没有额外部署和复制控制器对象的 pod,请使用下面的命令

kubectl run NAME --image=image --restart=Never

当您列出上述命令的结果时(参考下面的输出),您应该只会看到相应的 pod(没有创建部署和复制集对象)

$ kubectl run nginx --image=nginx --restart=Never
pod/nginx created

$ kubectl get all
NAME                      READY   STATUS              RESTARTS   AGE
pod/nginx                 0/1     ContainerCreating   0          3s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   31d

Snowcrash,你是对的。这与 docker 运行 命令基本相同。因此,使用 kubectl run NAME --image=image 将恰好 运行 一个名为 NAMEpod 来自 docker 个名为 image 的图像。 您可以使用 kubectl describe pod NAME 检查到底发生了什么 这是 kubectl run nginx --image=nginx

的示例
Events:
  Type     Reason            Age                From                    Message
  ----     ------            ----               ----                    -------
  Warning  FailedScheduling  89s (x2 over 89s)  default-scheduler       0/2 nodes are available: 2 node(s) had taints that the pod didn't tolerate.
  Normal   Scheduled         19s                default-scheduler       Successfully assigned default/nginx-7cdbd8cdc9-glkxq to centos-master
  Normal   Pulling           18s                kubelet, centos-master  pulling image "nginx"
  Normal   Pulled            14s                kubelet, centos-master  Successfully pulled image "nginx"
  Normal   Created           14s                kubelet, centos-master  Created container
  Normal   Started           14s                kubelet, centos-master  Started container

所以kubectl run之后发生的事情是:

  • 调度程序试图选择一个节点来启动容器(起初 它由于污点而失败,因为我的节点处于 NotReady 状态(不是 目前很重要,但您可以阅读更多相关信息 here)

  • 调度程序成功将pod分配给节点(centos-master)。

  • kubelet 检查 docker 镜像是否可用,如果可用则拉取它 必要的。

  • 然后容器创建并启动。

*here 你可以找到一篇有趣的文章,它以更详细的方式解释了这一点。

这个名字与pod有关,因为Pod是Kubernetes中最小的工作单元。每个 pod 可以包含一个或多个容器。 Pod 中的所有容器都具有相同的 IP 地址和端口 space,可以访问托管该 Pod 的节点上的共享存储。

基本上 kubectl 命令行工具支持几种不同的方式来 create and manage Kubernetes 对象:

  • 命令式命令
  • 命令式对象配置
  • 声明式对象配置

*您可以在 or this Medium article 中找到更多关于它们的信息。

run 命令是命令式方法的一个例子。是最简单的入手

[...] Because this technique operates directly on live objects, it provides no history of previous configurations.