k8s初始化容器

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 讲解k8s初始化容器(init container)的相关概念及案例

01 引言

声明:本文为《Kubernetes权威指南:从Docker到Kubernetes实践全接触(第5版)》的读书笔记

在很多应用场景中,应用在启动之前都需要进行如下初始化操作:

  • 等待其他关联组件正确运行(例如数据库或某个后台服务);
  • 基于环境变量或配置模板生成配置文件;
  • 从远程数据库获取本地所需配置,或者将自身注册到某个中央数据库中;
  • 下载相关依赖包,或者对系统进行一些预配置操作。

Kubernetes 1.3版本引入了一个Alpha版本的新特性init container(初始化容器),用于在启动应用容器(app container)之前启动一个或多个初始化容器,完成应用容器所需的预置条件

与应用容器在本质上是一样的,但它们是仅运行一次就结束的任务,并且必须在成功运行完成后,系统才能继续执行下一个容器,如下图所示:
在这里插入图片描述

备注:根据Pod的重启策略(RestartPolicy),当init container运行失败而且设置了RestartPolicy=Never时,Pod将会启动失败;而设置RestartPolicy=Always时,Pod将会被系统自动重启。

02 举例

下面以Nginx应用为例,在启动Nginx之前,通过初始化容器busybox,为Nginx 创建一个index.html主页文件。

2.1 配置资源文件

这里为init containerNginx设置了一个共享的Volume,以供Nginx访问init container设置的index.html文件
apiversion: v1
kind: Pod
metadata:
    name: nginx
    annotations:
spec:
    # These containers are run during pod initialization 
    initContainers:
    - name: install
      image: busybox
      command:
      - wget
      -"-o"
      -"/work-dir/index.html" 
      - http://kubernetes.io 
      volumeMounts:
      - name: workdir
        mountPath: "/work-dir"
    
    containers:
    - name: nginx
      image: nginx
      ports:
      - containerPort: 80
      volumeMounts:
      - name: workdir
        mountPath: /usr/share/nginx/html 
    dnsPolicy: Default
    
    volumes: 
    - name: workdir
      emptyDir: {}

2.2 创建并查看pod状态

创建完成后,在运行init container的过程中查看Pod的状态,可见init过程还未完成:

$ kubectl create -f nginx-init-containers.yaml 
pod "nginx"created

$ kubectl get pods
NAME    READY    STATUS        RESTARTS    AGE
nginx    0/1        Init:0/1    0            1m

init container成功运行完成后,系统继续启动Nginx容器,再次查看Pod的状态:

$ kubectl get pods
NAME    READY    STATUS    RESTARTS     AGE
nginx    1/1        Running    0        7s

查看Pod的事件,可以看到系统首先创建并运行init container容器(名为install),成功后继续创建和运行Nginx容器:
在这里插入图片描述
启动成功后,登录进Nginx容器,可以看到/usr/share/nginx/html目录下的 index.html文件为init container所生成。

03 初始化容器与应用容器的区别

3.1 运行方式不同

init container 的运行方式与应用容器不同,它们必须先于应用容器执行完成,当设置了多个init container时,将按顺序逐个运行,并且只有前一个init container运行成功后才能运行后一个init container

在所有init container都成功运行后,Kubernetes才会初始化Pod的各种信息,并开始创建和运行应用容器。

3.2 资源与策略设置等

init container的定义中也可以设置资源限制、Volume的使用和安全策略等等,资源限制的设置与应用容器略有不同:

  • 如果多个init container都定义了资源请求/资源限制,则取最大的值作为所有init container的资源请求值/资源限制值。
  • Pod的有效 (effective)资源请求值/资源限制值取以下二者中的较大值:①所有应用容器的资源请求值/资源限制值之和;②init container的有效资源请求值/资源限制值
  • 调度算法将基于Pod的有效资源请求值/资源限制值进行计算,也就是说 init container可以为初始化操作预留系统资源,即使后续应用容器无须使用这些资源。
  • Pod的有效QoS等级适用于init container和应用容器。 资源配额和限制将根据Pod的有效资源请求值/资源限制值计算生效。
  • Pod级别的cgroup:将基于Pod的有效资源请求/限制,与调度机制一致。

3.3 探针设置

init container不能设置readinessProbe探针,因为必须在它们成功运行后才能继续运行在Pod中定义的普通容器。

Pod重新启动时,init container将会重新运行,常见的Pod重启场景如下:

  • init container的镜像被更新时,init container将会重新运行,导致Pod重启。仅更新应用容器的镜像只会使得应用容器被重启。
  • Pod的infrastructure容器更新时,Pod将会重启。
  • Pod中的所有应用容器都终止了,并且RestartPolicy=Always,则Pod会重启。

03 文末

本文主要讲解pod的初始化容器,希望能帮助到大家,谢谢大家的阅读,本文完!

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
8天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
33 2
|
10天前
|
存储 Kubernetes Docker
【赵渝强老师】Kubernetes中Pod的基础容器
Pod 是 Kubernetes 中的基本单位,代表集群上运行的一个进程。它由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。基础容器负责维护 Pod 的网络空间,对用户透明。文中附有图片和视频讲解,详细介绍了 Pod 的组成结构及其在网络配置中的作用。
【赵渝强老师】Kubernetes中Pod的基础容器
|
10天前
|
运维 Kubernetes Shell
【赵渝强老师】K8s中Pod的临时容器
Pod 是 Kubernetes 中的基本调度单位,由一个或多个容器组成,包括业务容器、基础容器、初始化容器和临时容器。临时容器用于故障排查和性能诊断,不适用于构建应用程序。当 Pod 中的容器异常退出或容器镜像不包含调试工具时,临时容器非常有用。文中通过示例展示了如何使用 `kubectl debug` 命令创建临时容器进行调试。
|
10天前
|
Kubernetes 调度 容器
【赵渝强老师】K8s中Pod中的业务容器
Pod 是 Kubernetes 中的基本调度单元,由一个或多个容器组成。除了业务容器,Pod 还包括基础容器、初始化容器和临时容器。本文通过示例介绍如何创建包含业务容器的 Pod,并提供了一个视频讲解。示例中创建了一个名为 "busybox-container" 的业务容器,并使用 `kubectl create -f firstpod.yaml` 命令部署 Pod。
|
10天前
|
Kubernetes 容器 Perl
【赵渝强老师】K8s中Pod中的初始化容器
Kubernetes的Pod包含业务容器、基础容器、初始化容器和临时容器。初始化容器在业务容器前运行,用于执行必要的初始化任务。本文介绍了初始化容器的作用、配置方法及优势,并提供了一个示例。
|
18天前
|
Kubernetes 监控 开发者
掌握容器化:Docker与Kubernetes的最佳实践
【10月更文挑战第26天】本文深入探讨了Docker和Kubernetes的最佳实践,涵盖Dockerfile优化、数据卷管理、网络配置、Pod设计、服务发现与负载均衡、声明式更新等内容。同时介绍了容器化现有应用、自动化部署、监控与日志等开发技巧,以及Docker Compose和Helm等实用工具。旨在帮助开发者提高开发效率和系统稳定性,构建现代、高效、可扩展的应用。
|
14天前
|
关系型数据库 MySQL API
|
7天前
|
缓存 监控 开发者
掌握Docker容器化技术:提升开发效率的利器
在现代软件开发中,Docker容器化技术成为提升开发效率和应用部署灵活性的重要工具。本文介绍Docker的基本概念,并分享Dockerfile最佳实践、容器网络配置、环境变量和秘密管理、容器监控与日志管理、Docker Compose以及CI/CD集成等技巧,帮助开发者更高效地利用Docker。
|
8天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
8天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多