Kubernetes-Init容器的六个特性

云计算
本文主要从以下四个方面介绍Init容器:Init容器作用、Init容器特性、Init容器与应用容器的区别、Init容器实战。

本文主要从以下4个方面介绍Init容器:Init容器作用、Init容器特性、Init容器与应用容器的区别、Init容器实战。

Kubernetes中的Pod内可以运行多个容器,主要分为2种:Init容器、应用容器,Sidecar容器也是一种特殊的Init容器。

Init容器的作用

Init 容器是一种特殊容器,在Pod内的应用容器启动之前运行。用于执行一些初始化的任务或设置,或者用于延迟执行应用容器。

有不少场景都需要在应用容器启动之前进行部分初始化操作,比如:等待某个服务需要等待其关联的服务可用后才启动、从配置中心获取配置后再启动 等。

Init容器的特性

  • Pod中的所有Init容器按定义的顺序串行运行,直到它们全部成功结束后,才能启动应用容器。
  • Init容器通常很小,执行简单的逻辑,它们以轻量的方式快速运行。
  • Init容器与编程语言中的初始化对象类似,只会执行一次。
  • 在所有的 Init 容器没有成功完成之前,Pod不会变成 Ready 状态。
  • 某个Init容器运行失败后,会导致整个Pod重新启动(重启策略为 Never 时例外)。如果 Pod 对应的重启策略为Never,并且 Pod 的 Init 容器失败,则Kubernetes会将Pod状态设置为失败。
  • Pod重启后,初始化容器也会再次运行,因此需要确保所有Init容器的操作具有幂等性。这一点与应用开发中要保证某个接口的幂等性类似。

Init容器与应用容器的关系

Init 容器与应用容器非常像,Init容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置,Init容器与应用容器共享数据卷和网络。关系如下图:

但是Init容器与应用容器也有三点不同:

  • 应用容器运行后没有特殊情况不会停止,他们持续提供服务,没有运行完成的概念。但是Init容器的存在就是为了初始化任务,所以必须是一个从开始到结束的过程。
  • 应用容器可以多个并行运行。但是Init容器必须当前这个启动完成后,才能启动下一个。
  • Init容器的设计是为了完成初始化任务,所以Init容器必须要在 Pod 就绪之前运行完成。自然的Init容器就不支持 生命周期、存活探针、就绪探针。

Init容器使用实战

实战描述

  • 定义一个Pod,Pod里定义了Init容器和应用容器。
  • Pod里的Init容器先从网络上下载数据,将下载的数据放到emptyDir。
  • 等待init容器执行完毕后,应用容器会自动启动,在应用容器中挂载emptyDir,此时应用容器可以看到Init容器之前下载的数据。

yaml编排文件如下

apiVersion: v1
kind: Pod
metadata:
  name: init-container-test
  namespace: demo
  labels:
    app: init-container-test
spec:
  nodeName: k8s-worker-1
  initContainers:
    - name: download
      image: busybox
      command:
        - wget
        - -O
        - /temp-dir/index.html
        - http://www.baidu.com
      volumeMounts:
        - name: temp-dir
          mountPath: /temp-dir
  containers:
    - name: web-app
      image: nginx
      ports:
        - containerPort: 80
          hostPort: 8082
      volumeMounts:
        - name: temp-dir
          mountPath: /usr/share/nginx/html
  volumes:
    - name: temp-dir
      emptyDir: {}

执行kubectl describe pod init-container-test -n demo命令,可以看到有两处容器:

如果Init容器执行有异常,可以看到Pod会被不停地重启。

总结

本文主要从以下四个方面介绍Init容器:Init容器作用、Init容器特性、Init容器与应用容器的区别、Init容器实战。

重点要注意:

  • Init容器按定义的顺序串行运行。
  • 确保所有Init容器的操作具有幂等性。
责任编辑:赵宁宁 来源: 不焦躁的程序员
相关推荐

2021-10-27 10:15:25

Python新特性编程语言

2012-06-15 11:30:55

ibmdw

2021-12-02 10:17:07

Kubernetes公共云云计算

2022-02-10 19:46:19

Kubernetes云原生云安全

2023-08-04 12:07:11

2022-05-26 11:11:19

Kubernetes容器云安全

2020-07-02 15:43:26

Kubernetes容器工作负载

2021-11-11 15:13:15

人工智能容器技术

2022-06-28 10:17:23

安全职位首席信息安全官

2023-04-19 15:26:52

JavaScriptES13开发

2023-05-22 15:53:06

JavaScrip代码素材

2014-08-20 13:59:13

Linux

2021-10-21 10:04:37

零信任技术前线企业

2023-03-28 10:43:03

IT部门IT 领导者

2013-11-01 09:51:39

2021-07-19 10:06:30

数据治理数字化转型CIO

2021-06-22 14:53:35

零信任网络安全网络攻击

2010-09-07 14:42:28

2022-04-29 17:03:37

WordPress开发者网站安全

2023-07-06 14:29:11

点赞
收藏

51CTO技术栈公众号