前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Kubernetes(k8s)-初始化容器(InitContainers)介绍

Kubernetes(k8s)-初始化容器(InitContainers)介绍

作者头像
运维小路
发布2025-01-23 20:09:04
发布2025-01-23 20:09:04
18000
代码可运行
举报
文章被收录于专栏:运维小路运维小路
运行总次数:0
代码可运行

我们上一章介绍了Docker基本情况,目前在规模较大的容器集群基本都是Kubernetes,但是Kubernetes涉及的东西和概念确实是太多了,而且随着版本迭代功能在还增加,笔者有些功能也确实没用过,所以只能按照我自己的理解来讲解。

我们前面配置的工作负载,都是直接调度开始使用。但是如果某些业务需要依赖另外一个服务,或者说需要一些初始数据。我们可以通过什么方法确认这些依赖能够符合预期以后才开始运行我的内容呢,好在Kubernetes给我们提供了一个资源配置叫做InitContainers,下面就是关于他的介绍及使用方法。

Init Containers,中文可以称为初始化容器,是Kubernetes中的一种特殊类型的容器,在Pod中的应用程序容器启动之前执行。它们具有以下特点和作用:

顺序执行:Init Containers按照定义的顺序依次运行,每个初始化容器必须成功完成其任务后,下一个初始化容器才会开始执行。

阻塞应用容器:在所有初始化容器成功完成之前,Pod内的应用程序容器不会启动。

共享卷(Volumes):Init Containers可以挂载Pod级别的共享卷,这样它们可以为应用程序容器准备必要的数据或配置文件。

资源独立:Init Containers可以指定自己的资源需求(CPU、内存等),这些需求与应用程序容器的需求是分开计算的。

健康检查:由于Init Containers是保证Pod启动前环境正确设置的一种方式,因此它们不支持存活探针(liveness probes)或就绪探针(readiness probes),因为它们应该在任何探测开始之前就已经完成并退出。

错误处理:如果任何一个初始化容器失败,那么Kubernetes会根据Pod的重启策略决定是否重新启动该Pod。默认情况下,Kubernetes会在初始化容器失败时重试,直到它成功完成。

灵活性:可以有多个Init Containers,每个都可以包含不同的镜像,这意味着你可以使用最适合特定任务的工具,而不需要将所有工具打包到应用容器的镜像中。

Init Containers非常适合用于执行那些需要在应用容器启动前完成的任务,例如下载配置文件、等待某个服务变得可用、注入秘密信息或其他敏感数据等。通过这种方式,可以使应用程序容器更加精简,专注于业务逻辑,同时确保了必要的前置条件得到满足。

代码语言:javascript
代码运行次数:0
复制
apiVersion: v1
kind: Pod
metadata:
  name: example-app
spec:
  containers:
  - name: example-app-container
    image: nginx
    ports:
    - containerPort: 80
  initContainers:
  - name: init-myservice
    image: 192.168.31.43:5000/busybox
    command: ['sh', '-c', 'until nslookup my-service; do echo waiting for myservice; sleep 2; done;']
  - name: init-mydb
    image: 192.168.31.43:5000/busybox
    command: ['sh', '-c', 'sleep 60']

1.必须先能够解析my-service,然后再进行下一步,当前是下载initcontaier容器镜像失败,第二个init容器及真实业务容器压根就没执行。而且注意看下面的图,STATUS下面显示的是Init镜像下载失败。

2.当第一个init容器执行正常退出(exit退出代码为0)以后,开始执行第二个容器里面的任务,如果第二个容器也执行失败,后续也不会执行。下图就是第一个已经完成,再执行第二个init容器。

3.当前面2个容器都正常执行退出以后,真实的业务容器才会启动,然后执行对应的逻辑,然后查询pod是感觉不知道那个init容器的。

从执行记录来看也可以看出来,先下载第一个镜像,启动容器,然后接着才是第二个,最后才是业务容器。

代码语言:javascript
代码运行次数:0
复制
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  2m30s  default-scheduler  Successfully assigned default/example-app to node01
  Normal  Pulling    2m30s  kubelet            Pulling image "192.168.31.43:5000/busybox"
  Normal  Pulled     2m30s  kubelet            Successfully pulled image "192.168.31.43:5000/busybox" in 40.534474ms
  Normal  Created    2m30s  kubelet            Created container init-myservice
  Normal  Started    2m30s  kubelet            Started container init-myservice
  Normal  Pulled     2m29s  kubelet            Successfully pulled image "192.168.31.43:5000/busybox" in 39.403194ms
  Normal  Pulling    2m29s  kubelet            Pulling image "192.168.31.43:5000/busybox"
  Normal  Created    2m29s  kubelet            Created container init-mydb
  Normal  Started    2m29s  kubelet            Started container init-mydb
  Normal  Pulling    89s    kubelet            Pulling image "192.168.31.43:5000/nginx"
  Normal  Pulled     89s    kubelet            Successfully pulled image "192.168.31.43:5000/nginx" in 38.181598ms
  Normal  Created    89s    kubelet            Created container example-app-container
  Normal  Started    89s    kubelet            Started container example-app-container
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维小路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档