Docker提供了一种使用docker run
或者仅使用docker pull
找到了doc,其中显示了docker命令和kubectl之间的映射。
在此文档中找不到docker pull
等效项。
如果没有等效于docker pull
的东西,那么有什么方法可以使用kubectl
cli提取图像。
答案 0 :(得分:1)
简而言之-不,没有。
为什么会有? Kubernetes是Docker的编排工具,如果需要,它将自动为您拉动Pod,因此实际上并不需要手动拉动容器的命令。
答案 1 :(得分:1)
我认为没有kubectl ...
等效项,其中某些原因可能是:
docker pull
映像后,您计划随后在Docker主机上使用它。 kubectl ...
部署时,您希望平台安排一切。例如,如果您有许多工作节点,而副本将仅计划到其中两个,则其他节点不必提取映像。 kubectl
是与API服务器对话以控制集群的工具。使它也负责容器映像(请参阅Leaky Abstractions)是错误的,因为您有一个与容器运行时接口进行对话的较低级工具:crictl
。
k8s-master:~$ crictl --help
NAME:
crictl - client for CRI
USAGE:
crictl [global options] command [command options] [arguments...]
VERSION:
v1.12.0
COMMANDS:
attach Attach to a running container
create Create a new container
exec Run a command in a running container
version Display runtime version information
images List images
inspect Display the status of one or more containers
inspecti Return the status of one or more images
inspectp Display the status of one or more pods
logs Fetch the logs of a container
port-forward Forward local port to a pod
ps List containers
pull Pull an image from a registry
...
图片来自:www.aquasec.com/wiki/display/containers/Kubernetes+Architecture+101
在引擎盖下运行时发生的事情很复杂,并且还在不断发展。考虑一下这一点,人们开始创建Kubernetes集群,并且使用的容器引擎是Docker。然后Docker采用了containerd
,因此我们在Kubernetes上将Docker放在了containerd
之上,这引起了如下问题:
用户将不会看到Kubernetes使用
docker images
命令提取图像...反之亦然,Kubernetes不会看到docker pull
,docker load
或{{1}创建的图像}命令...
答案 2 :(得分:0)
在cli中无需使用Kubernetes。
为什么?
因为当您运行if(e.target.value.match('^[a-zA-Z0-9]*$')){
console.log('match')
}
else{
console.log('not match')
}
}
时,它包含一个图像,并提示该图像存在或不存在。如果不存在,它将自动提取图像。
答案 3 :(得分:0)
在Kubernetes中找不到docker pull
的等效项,因为此命令与图像管理有关。以下说明。
Docker
功能之一是可以创建Images
。您可以使用Dockerfile
(docker build .
)创建自己的图像,也可以从包含许多预构建图像的Docker Hub中提取图像。
如果使用pull
命令,它将仅下载映像,不会部署任何容器。
$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 5 months ago 1.84kB
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
如您所见,$ docker pull
仅显示下载图像。由于Docker还负责图像管理,因此您可以pull
或push
图像到存储库(DockerHub)。
要在Docker
中创建容器,必须使用$ docker run
。该命令将自动下载图像并运行容器。
$ docker run --name mynginx -p 80:80 -d nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
...
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4abf804611a8 nginx "nginx -g 'daemon of…" 4 minutes ago Up 4 minutes 0.0.0.0:80->80/tcp mynginx
简而言之:
Create
在图像上方添加一个可写容器,并将其设置为运行您在CMD中指定的任何命令。容器ID被报告回,但尚未启动。
Start
将启动所有已停止的容器。这包括新创建的容器。
Run
是创建和启动的组合。它会创建容器并启动它。
Kubernetes是容器编排系统,因此它不负责创建或编辑图像。 这就是为什么您找不到与docker pull
等效的内容(仅下载图像)的原因。
像kubectl apply -f <deployment>
这样的命令在YAML文件中包含图像,或者kubectl run nginx --image=nginx
都是基于DockerHub的图像(更像docker create
)。
希望有帮助。
答案 4 :(得分:0)
这可能有些棘手,但是使用docker pull
可以达到类似于kubectl
的结果。您只需要知道如何使用零退出代码来退出容器。
这个想法是在Kubernetes集群的所有节点上提取几个图像。
为此,您可以创建一个DaemonSet,它将尝试在集群中的每个适用节点上创建Pod。要一次提取多个图像,只需将几个initContainers添加到DaemonSet模板中。 ImagePullPolicy
设置为IfNotPresent
,restartPolicy
设置为Never
。分别为每个initContainer设置command
,以使其成功退出。您需要使用sh -c "exit 0"
之类的东西,只需确保容器内部包含sh
二进制文件,或使用另一个可能通常为您提供零退出代码的命令:<appname_binary> version
或<appname_binary> --help
。>
将该DaemonSet应用到集群后,Kubernetes从每个节点上的DaemonSet模板创建Pod,并按存在顺序在Pod中运行每个initContainer。在启动每个容器之前,kubelet会拉出运行该容器所需的映像。
当您看到所有DaemonSet Pod成功完成时-您可以确保在每个节点上都有运行这些容器所需的所有图像。
如果只想在特定节点上运行DaemonSet,则可以玩nodeAffinity或taints/tolerations。