问题描述
我想下载容器镜像,但不想部署/安装镜像。 我如何部署 podspec 以仅下载图像但不应创建容器。 任何 podspec 快照?
解决方法
据我所知,没有直接的 Kubernetes 资源可以仅下载您选择的图像。要在您的 Nodes
上显示您的应用程序的图像,您可以考虑使用以下解决方案/变通方法:
- 使用
Daemonset
和initContainer
('s) - 使用 Ansible 等工具通过剧本提取图像
使用 Daemonset
和 InitContainers
假设以下情况:
您已经创建了 2 个想要在所有 Nodes
上使用的图像。
您可以使用 Daemonset
(在每个 Pod
上产生一个 Node
)和 initContainers
(以图像作为源),它将在所有节点上运行并确保图像将出现在机器上。
此类设置的示例如下:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: pull-images
labels:
k8s-app: pull-images
spec:
# AS THIS DAEMONSET IS NOT SUPPOSED TO SERVE TRAFFIC I WOULD CONSIDER USING THIS UPDATE STRATEGY FOR SPEEDING UP THE DOWNLOAD PROCESS
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 100
selector:
matchLabels:
name: pull-images
template:
metadata:
labels:
name: pull-images
spec:
initContainers:
# PUT HERE IMAGES THAT YOU WANT TO PULL AND OVERRIDE THEIR ENTRYPOINT
- name: ubuntu
image: ubuntu:20.04 # <-- IMAGE #1
imagePullPolicy: Always # SPECIFY THE POLICY FOR SPECIFIC IMAGE
command: ["/bin/sh","-c","exit 0"]
- name: nginx
image: nginx:1.19.10 # <-- IMAGE #2
imagePullPolicy: IfNotPresent # SPECIFY THE POLICY FOR SPECIFIC IMAGE
command: ["/bin/sh","exit 0"]
containers:
# MAIN CONTAINER WITH AS SMALL AS POSSIBLE IMAGE SLEEPING
- name: alpine
image: alpine
command: [sleep]
args:
- "infinity"
Kubernetes Daemonset
控制器将确保 Pod
将在每个 Node
上运行。在运行图像之前,initContainers
将充当图像的占位符。您希望在 Nodes
上拥有的图像将被拉出。 ENTRYPOINT
将被覆盖以不连续运行图像。之后,主容器 (alpine
) 将使用 sleep infinity
命令运行。
当添加新的 Nodes
时,此设置也将起作用。
根据该主题,我还会考虑查看有关 imagePullPolicy
的以下文档:
附注!
我为 imagePullPolicy
中的图像设置了不同的 initContainers
,以向您展示您可以为每个容器独立指定 imagePullPolicy
。请使用最适合您的用例的策略。
使用 Ansible 等工具通过剧本提取图像
假设您对 SSH
拥有 Nodes
访问权限,您可以考虑使用 Ansible 及其社区模块(假设您使用的是 Docker
):
community.docker.docker_image
引用此模块的文档:
此插件是 community.docker collection(1.3.0 版)的一部分。
要安装它,请使用:ansible-galaxy collection install community.docker
。
概要
构建、加载或拉取镜像,使镜像可用于创建容器。还支持将图像标记到存储库并将图像存档到 .tar
文件。
-- Docs.ansible.com: Ansible: Collections: Community: Docker: Docker image module
您可以通过以下示例使用它:
hosts.yaml
all:
hosts:
node-1:
ansible_port: 22
ansible_host: X.Y.Z.Q
node-2:
ansible_port: 22
ansible_host: A.B.C.D
playbook.yaml
- name: Playbook to download images
hosts: all
user: ENTER_USER
tasks:
- name: Pull an image
community.docker.docker_image:
name: "{{ item }}"
source: pull
with_items:
- "nginx"
- "ubuntu"
附注!
以 ansible 的方式,我需要安装 docker python 包:
$ pip3 install docker
其他资源: