【kubernetes系列】kubernetes之initcontainer初始化容器

这篇具有很好参考价值的文章主要介绍了【kubernetes系列】kubernetes之initcontainer初始化容器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

Init Container就是用来做初始化工作的容器,可以是一个或者多个,如果有多个的话,这些容器会按定义的顺序依次执行,只有所有的Init Container执行完后,主容器才会被启动。我们知道一个Pod里面的所有容器是共享数据卷和网络命名空间的,所以Init Container里面产生的数据可以被主容器使用到的。 Init Container与应用容器本质上是一样的,但他们是仅运行一次就结束的任务,并且必须在成功执行完后,系统才能继续执行下一个容器。

一个pod完整的生命周期如下:

【kubernetes系列】kubernetes之initcontainer初始化容器,Kubernetes,kubernetes,容器,云原生

从上面这张图我们可以直观的看到PostStart和PreStop包括liveness和readiness是属于主容器的生命周期范围内的,而Init Container是独立于主容器之外的,当然他们都属于Pod的生命周期范畴之内的。

另外我们可以看到上面我们的Pod右边还有一个infra的容器,这是一个什么容器呢?我们可以在集群环境中去查看任意一个Pod对应的运行的Docker容器,我们可以发现每一个Pod下面都包含了一个pause-amd64的镜像,这个就是我们的infra镜像,我们知道Pod下面的所有容器是共享同一个网络命名空间的,这个镜像就是来做这个事情的,所以每一个Pod当中都会包含一个这个镜像,其实就是我们之前了解到的pause容器。

应用场景

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

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

示例1

我们先来测试使用initcontainer创建一个服务依赖的场景的Pod:

##引入了外部mysql
[root@k8s-m1 k8s-total]# cat mysql-svc.yml 
kind: Endpoints
apiVersion: v1
metadata:
  name: mysql-production
subsets:
  - addresses:
      - ip: 192.168.2.142
    ports:
      - port: 3306
---
apiVersion: v1
kind: Service
metadata:
  name: mysql-production
spec:
  ports:
    - port: 3306

##部署nginx
[root@k8s-m1 k8s-total]# cat my-nginx.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-nginx
  labels:
    app: nginx
spec:
  selector:
    matchLabels:
      tier: frontend
  replicas: 1
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 80
  selector:
    tier: frontend

##有初始化容器的pod

apiVersion: v1
kind: Pod
metadata:
  name: init-pod-1
  labels:
    app: init
spec:
  containers:
  - name: main-container
    image: busybox
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-service
    image: busybox
    command: ['sh', '-c', 'until nslookup nginx-service; do echo waiting for nginx-service; sleep 2; done;']
  - name: init-mysql
    image: busybox
    command: ['sh', '-c', 'until nslookup mysql-production; do echo waiting for mysql; sleep 2; done;']
#部署
[root@k8s-m1 k8s-init-container]# kubectl apply  -f mysql-svc.yml  -f  my-nginx.yml  -f init-pod-1.yml 

#查看
[root@k8s-m1 k8s-total]# kubectl get ep,po
NAME                               ENDPOINTS                                                  AGE
endpoints/nginx-service            10.244.42.159:80                           10m
endpoints/mysql-production         192.168.2.142:3306                                         10m

NAME                            READY   STATUS    RESTARTS   AGE
pod/init-pod-1                   1/1     Running   0          10m
pod/my-nginx-7ff446c4f4-tbtpc   1/1     Running   1          10m

我们可以 describe 下看看详细信息:

[root@k8s-m1 k8s-total]# kubectl describe pod init-pod-1 
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  13m   default-scheduler  Successfully assigned default/init-pod-1 to k8s-m1
  Normal  Pulling    13m   kubelet            Pulling image "busybox"
  Normal  Pulled     13m   kubelet            Successfully pulled image "busybox" in 15.979657153s
  Normal  Created    13m   kubelet            Created container init-service
  Normal  Started    13m   kubelet            Started container init-service
  Normal  Pulling    12m   kubelet            Pulling image "busybox"
  Normal  Pulled     12m   kubelet            Successfully pulled image "busybox" in 15.995762509s
  Normal  Created    12m   kubelet            Created container init-mysql
  Normal  Started    12m   kubelet            Started container init-mysql
  Normal  Pulling    12m   kubelet            Pulling image "busybox"
  Normal  Pulled     12m   kubelet            Successfully pulled image "busybox" in 15.976887445s
  Normal  Created    12m   kubelet            Created container main-container

可以看到,我们在Pod启动过程中,初始化容器会按顺序在网络和数据卷初始化之后启动。每个容器必须在下一个容器启动之前成功退出。如果由于运行时或失败退出,导致容器启动失败,它会根据Pod的restartPolicy指定的策略进行重试。 然而,如果 Pod 的 restartPolicy 设置为 Always,Init 容器失败时会使用 RestartPolicy 策略。

在所有的初始化容器没有成功之前,Pod将不会变成 Ready状态。正在初始化中的Pod处于Pending状态,但应该会将条件Initializing设置为 true。

示例2

接下来我们测试使用initcontainer创建一个做初始化配置工作的Pod:

[root@k8s-m1 k8s-init-container]# cat init-pod-2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: init-demo
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  initContainers:
  - name: install
    image: busybox
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - http://www.baidu.com
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  volumes:
  - name: workdir
    emptyDir: {}

我们可以看到这里又出现了volumes,spec.volumes指的是Pod中的卷,spec.containers.volumeMounts,是将指定的卷 mount 到容器指定的位置,相当于Docker里面的-v 宿主机目录:容器目录,我们前面用到过hostPath,我们这里使用的是emptyDir{},这个就相当于一个共享卷,是一个临时的目录,生命周期等同于Pod的生命周期。

初始化容器执行完,会下载一个 html 文件映射到emptyDir{},而主容器也是和 spec.volumes 里的 emptyDir{} 进行映射,所以nginx容器的/usr/share/nginx/html目录下会映射 index.html 文件。

我们来创建下该Pod,然后验证nginx容器是否运行:

[root@k8s-m1 k8s-init-container]# kubectl apply  -f init-pod-2.yaml 
pod/init-demo created
[root@k8s-m1 k8s-init-container]# kubectl get po -o wide
NAME                        READY   STATUS    RESTARTS   AGE    IP              NODE     NOMINATED NODE   READINESS GATES
init-demo                   1/1     Running   0          60s    10.244.42.155   k8s-m1   <none>           <none>

[root@k8s-m1 k8s-init-container]# curl 10.244.42.155 

正常效果我们可以看到有百度相关的信息,就可以证明我们上面的初始化的工作正常完成。

更多关于kubernetes的知识分享,请前往博客主页。编写过程中,难免出现差错,敬请指出文章来源地址https://www.toymoban.com/news/detail-518032.html

到了这里,关于【kubernetes系列】kubernetes之initcontainer初始化容器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot 底层机制分析【Tomcat 启动+Spring 容器初始化+Tomcat 如何关联Spring 容器】【下】

    😀前言 本篇博文是关于SpringBoot 底层机制分析实现,希望能够帮助你更好的了解SpringBoot 😊 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动力😉😉 💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客

    2024年02月13日
    浏览(42)
  • SpringBoot集成kubernetes-client升级k8s后初始化失败问题

    SpringBoot集成kubernetes-client升级k8s后初始化失败问题 1.问题描述 程序以前使用的k8s版本是1.16,fabric8.kubernetes-client的版本是4.10.2,springboot版本是2.3.5。由于环境切换,这次需要升级k8s的版本,现在将k8s版本升级到了1.26,程序中使用了新配置的certificate-authority-data,client-certific

    2024年02月10日
    浏览(47)
  • 【K8S系列】快速初始化⼀个最⼩集群

    走得最慢的人,只要不丧失目标,也比漫无目的地徘徊的人走得快。 文章标记颜色说明: 黄色 :重要标题 红色 :用来标记结论 绿色 :用来标记一级重要 蓝色 :用来标记二级重要 希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言

    2024年02月04日
    浏览(50)
  • 【C++11】{}初始化、std::initializer_list、decltype、STL新增容器

    在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字取代了C++98称为C++11之前的最新C++标准名称。 不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。 从C++0x到C++11,C

    2024年02月07日
    浏览(36)
  • 【SpringBoot系列】初始化机制几种实现策略模式

    前言 Spring Boot是一个用于快速构建基于Spring框架的应用程序的开发框架。 它提供了许多便捷的功能和特性,使得开发者可以更加高效地开发和部署应用程序。 其中,初始化策略是Spring Boot中一个重要的概念,它决定了应用程序在启动时如何进行初始化和配置。 本文将介绍S

    2024年02月07日
    浏览(38)
  • WPS二次开发系列:WPS SDK初始化

    本文将详细介绍WPS SDK初始化,帮您能够更好的在项目中接入WPS SDK实现自己的应用和WPS应用进行通信交互。 向WPS官方发送邮件申请,邮件格式如下 邮件模板: 发起人 :有需要申请接入WPS移动端的企业或者个人 邮件主题: XXX公司XXX项目---WPS Android端 SDK二次开发集成申请 邮件

    2024年04月16日
    浏览(37)
  • [Kubernetes[K8S]集群:master主节点初始化]:通过Calico和Coredns网络插件方式安装

    主节点:安装coredns - init初始化 主节点(此时还没有安装calico) 从节点:基于主节点生成join命令加入集群 主节点:安装calico:apply 生成pod,此时没有调整yaml网卡 coredns 和calico pod 运行成功 但是 calico-node-cl8f2 运行失败 查看 解决链接 因为之前写过一篇,calico一直异常,步骤

    2024年04月15日
    浏览(49)
  • DPDK系列之二十八内存分配启动和初始化

    在前面对DPDK中的内存进行了各个模块的分析,这次开始整体流程的分析说明。重点是分析一下内存从开始准备到最终应用的过程,从而把各个分别讲的模板贯穿起来,从而能够更好的了解和认识DPDK中内存的使用。 DPDK中,启动时对内存的处理如下: 1、大页内存的处理 这个在

    2024年02月10日
    浏览(52)
  • 【奇葩瑞萨-004】RX系列单片机的GPIO初始化

    以RX66T单片机和RX130单片机为例。 端口的配置,就是写入端口配置相关寄存器的过程。 就瑞萨RX系列单片机而言,包括PORT寄存器和MPC寄存器。 PDR:GPIO方向寄存器,读/写型 1:输出 0:输入(默认值) PORTm.PDR.BITn对应Pmn。 有些端口只内建了输入逻辑门电路,即便将其PDR位设置

    2024年02月14日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包