Kubernetes Podspec 仅下载容器映像但不应安装 使用 Daemonset 和 InitContainers使用 Ansible 等工具通过剧本提取图像概要

如何解决Kubernetes Podspec 仅下载容器映像但不应安装 使用 Daemonset 和 InitContainers使用 Ansible 等工具通过剧本提取图像概要

我想下载容器镜像,但不想部署/安装镜像。 我如何部署 podspec 以仅下载图像但不应创建容器。 任何 podspec 快照?

解决方法

据我所知,没有直接的 Kubernetes 资源可以下载您选择的图像。要在您的 Nodes 上显示您的应用程序的图像,您可以考虑使用以下解决方案/变通方法:

  • 使用 DaemonsetinitContainer('s)
  • 使用 Ansible 等工具通过剧本提取图像

使用 DaemonsetInitContainers

假设以下情况:

您已经创建了 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


其他资源:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?