深入探究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/zh-tw/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

發表回復

登錄後才能評論