深入探究initcontainer

一、initcontainers

initcontainer(初始化容器)是Kubernetes中的一种特殊容器,它主要是用来初始化或者准备一些特定的环境,以便在主容器运行之前进行配置。initcontainer与主容器运行在同一个Pod中,但它会在主容器运行之前被启动。

initcontainer与主容器共享同一个Volume和Pod的网络命名空间。

二、initcontainers spark operator

使用Spark Operator时,经常需要在Spark应用程序运行之前,准备一些环境,比如将JAR文件下载到容器内部。这时候就可以使用initcontainers。下面是部署Spark Operator时使用initcontainers的代码示例:

apiVersion: "sparkoperator.k8s.io/v1beta2"
kind: SparkApplication
metadata:
  name: pi
spec:
  type: Scala
  mode: cluster
  image: "gcr.io/spark-operator/spark:v3.1.1"
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi
  mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.12-3.1.1.jar"
  sparkVersion: "3.1.1"
  restartPolicy:
    type: OnFailure
    onFailureRetries: 3
    onFailureRetryInterval: 10
    onSubmissionFailureRetries: 5
    onSubmissionFailureRetryInterval: 20
  driver:
    cores: 1
    coreLimit: "1200m"
    memory: "512m"
    labels:
      version: 3.1.1
    serviceAccount: spark
    InitContainers:
    - name: download-files
      image: busybox
      command: ['sh', '-c', 'wget http://path/to/files.tgz -O - | tar xz -C /']
  executor:
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 3.1.1
    InitContainers:
    - name: download-files
      image: busybox
      command: ['sh', '-c', 'wget http://path/to/files.tgz -O - | tar xz -C /']

三、initcontainer挂载持久化

initcontainers可以挂载configMap或者secrets,以获取在主容器中需要使用到的配置信息或者机密数据。

下面是一个挂载configMap的initcontainers的示例:

spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /etc/nginx/nginx.conf
      name: config-volume
      subPath: nginx.conf
  initContainers:
  - name: config-nginx
    image: busybox
    command: ['sh', '-c', 'echo "server {\n listen 80;\n}" > /data/nginx.conf']
    volumeMounts:
    - mountPath: /data
      name: config-volume
  volumes:
  - name: config-volume
    configMap:
      name: nginx-config

四、initcontainer k8s

initcontainers支持Kubernetes中大多数的存储类型,比如emptyDir、configMap、secret和persistentVolumeClaim等。下面是一个使用emptyDir的示例:

spec:
  volumes:
  - name: shared-logs
    emptyDir: {}
  initContainers:
  - name: create-volume-dir
    image: busybox
    command: ['sh', '-c', 'mkdir /var/shared-logs']
    volumeMounts:
    - mountPath: /var/shared-logs
      name: shared-logs
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - mountPath: /var/log/nginx
      name: shared-logs

五、initcontainer telnet

可以使用telnet来测试容器之间的网络连接。下面是使用CentOS作为示例进行测试:

spec:
  containers:
  - name: web
    image: nginx
  - name: net
    image: centos
    command:
    - "/bin/sh"
    - "-c"
    - "yum install -y telnet && echo telnet nginx 80 && telnet nginx 80"

六、initcontainers怎么更新

initcontainers的更新方式与普通容器类似,可以通过Kubernetes的kubectl命令或者Deployment进行更新。

下面是一个使用Deployment进行更新initcontainers的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      initContainers:
      - name: init1
        image: busybox
        command: ['sh', '-c', 'echo 123 > /tmp/test']
        volumeMounts:
        - name: data
          mountPath: /tmp
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: http
        volumeMounts:
        - name: data
    volumes:
    - name: data
      emptyDir: {}

七、initcontainer重启

initcontainer与主容器同生共死,它们共用一个Pod,如果主容器需要重启,那么initcontainer也会一起重启。

八、initcontainers skywalking

可以使用SkyWalking对initcontainer进行监控。

下面是一个使用SkyWalking监控initcontainer的示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        "skywalking/nginx": "true"
        "skywalking/init": "true"
    spec:
      initContainers:
      - name: init1
        image: busybox
        command: ['sh', '-c', 'echo 123 > /tmp/test']
        volumeMounts:
        - name: data
          mountPath: /tmp
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: http
        volumeMounts:
        - name: data
    volumes:
    - name: data
      emptyDir: {}

九、initcontainer 检测端口

可以使用curl或者nc等工具来检测端口的可用性。

下面是一个使用nc检测端口的initcontainers示例:

spec:
  initContainers:
  - name: wait-for-etcd
    image: centos
    command: ['sh', '-c', 'until nc -z etcd 2379; do sleep 1; done;']
  containers:
  - name: my-container
    image: my-image

总结

通过此篇文章,我们对initcontainer有了更深入的理解。initcontainers可以在主容器运行之前,进行一些初始化或者准备工作,比如获取configMap、secrets,挂载卷、检测端口等。同时,initcontainers也可以使用Spark Operator进行部署,并且支持Kubernetes中的多种存储类型。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/200282.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-05 14:04
下一篇 2024-12-05 14:04

相关推荐

  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入剖析MapStruct未生成实现类问题

    一、MapStruct简介 MapStruct是一个Java bean映射器,它通过注解和代码生成来在Java bean之间转换成本类代码,实现类型安全,简单而不失灵活。 作为一个…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r为前缀的字符串。r字符串中的反斜杠(\)不会被转义,而是被当作普通字符处理,这使得r字符串可以非常方便…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25

发表回复

登录后才能评论