我们上一章介绍了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非常适合用于执行那些需要在应用容器启动前完成的任务,例如下载配置文件、等待某个服务变得可用、注入秘密信息或其他敏感数据等。通过这种方式,可以使应用程序容器更加精简,专注于业务逻辑,同时确保了必要的前置条件得到满足。
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容器的。
从执行记录来看也可以看出来,先下载第一个镜像,启动容器,然后接着才是第二个,最后才是业务容器。
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