podinit解析:詳細講解podinit的用法和實現原理

一、PodInitializing

PodInitializing作為Kubernetes中的一個生命周期鉤子,用來對Pod做初始化操作。PodInitializing允許其他容器在容器生命周期鉤子(Pod lifecycle hook)被調用之前運行自己的指定初始化容器。這個容器可以執行任意用戶指定的操作,並且只在pod創建的時候運行一次。

這時候就要用到podinit了。PodInit是一種簡單的解決方案,在Kubernetes pod對象的生命周期管理中,我們向容器中添加了一個額外的容器。這個容器僅僅在Pod第一次啟動時運行一次,然後退出。它完成一些特定的初始化任務,並且這些任務旨在在其他容器之前運行。

同時,如果主容器(即正常應用運行的容器)從故障中恢復,則沒有必要再次運行初始化容器。因此,PodInit使用一個注釋來跟蹤每個容器的狀態。當容器成功地寫出到本地文件系統時,PodInit在啟動時通過查詢注釋來檢查容器是否運行過。

二、查看podinit日誌

1、查看podinit日誌文件路徑

cat /var/log/pods/${pod_namespace}_${pod_name}_${container_name}/init.log

2、監聽podinit日誌

kubectl logs -n $pod_namespace $pod_name $container_name -c $container_name --follow | grep PODINIT-TRACE-LOG

3、查看podinit容器日誌

kubectl logs -n $pod_namespace $pod_name $container_name -c podinit

三、podinit實現原理

PodInit使用一個init container來完成特定的初始化任務。Pod的其餘部分被保留,僅在Init容器完成後才運行。使用kubelet中的PodAdmitHandler(以及PodAdmitFunc)來修改PodSpec以包含一個額外的初始化容器。

實現podinit需要以下步驟:

1、構建一個健壯的鏡像,該鏡像應該包含podinit可執行文件。

# Dockerfile
FROM alpine:3.7
RUN apk add --no-cache tini
ADD pod init
ENTRYPOINT ["/sbin/tini", "-g", "--", "/pod"]

2、創建init容器

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  containers:
  - image: nginx
    name: nginx
    volumeMounts:
    - name: shared-data
      mountPath: /usr/share/nginx/html
  initContainers:
  - image: busybox
    name: install
    command:
    - cp
    - -a
    - /mnt/data/. /usr/share/nginx/html
    volumeMounts:
    - name: shared-data
      mountPath: /mnt/data
  volumes:
  - name: shared-data
    emptyDir: {}

3、podinit代碼示例:

#!/bin/sh -eu

export PODINIT_LOG_LOCATION=${PODINIT_LOG_LOCATION:-'/var/log/pod-init.log'}

echo "PODINIT-TRACE-LOG: pod namespace: $POD_NAMESPACE" >> $PODINIT_LOG_LOCATION
echo "PODINIT-TRACE-LOG: pod name: $POD_NAME" >> $PODINIT_LOG_LOCATION
echo "PODINIT-TRACE-LOG: container name: $CONTAINER_NAME" >> $PODINIT_LOG_LOCATION

# We are using this file to store the pod name and container name which are
# initialized by this init container so that if this init container crashes
# or fails, we don't re-run the init container.
INIT_FILE=/mnt/pod-init.data
INIT_MARKER="pod-init"

if [ ! -f ${INIT_FILE} ]; then
  echo "PODINIT-TRACE-LOG: Creating init file ${INIT_FILE} in container ${CONTAINER_NAME}" >> $PODINIT_LOG_LOCATION
  echo "${INIT_MARKER}" > ${INIT_FILE}
else
  echo "PODINIT-TRACE-LOG: Initialization already executed in container ${CONTAINER_NAME}" >> $PODINIT_LOG_LOCATION
fi

四、podinit使用例子

1、podinit示例:

apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  initContainers:
  - name: init-myservice
    image: busybox
    command: ['sh','-c', 'echo Initializing... && sleep 3600']
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
  containers:
  - name: myapp
    image: busybox
    command: ['sh','-c', 'echo Sleeping... && sleep 3600']
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace

2、podinit搭配kubernetes-csi使用:

apiVersion: v1
kind: Pod
metadata:
  name: myapp
spec:
  initContainers:
  - name: init-myservice
    image: my-image
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    command: ['sh','-c','/bin/podinit $MY_PARAM && $MY_VOLUME_SCRIPT']
    volumeMounts:
    - name: my-volume
      mountPath: /mnt/data
  containers:
  - name: myapp
    image: busybox
    command: ['sh','-c', 'echo Sleeping... && sleep 3600']
    env:
    - name: POD_NAME
      valueFrom:
        fieldRef:
          fieldPath: metadata.name
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace
    volumeMounts:
    - name: my-volume
      mountPath: /mnt/data
  volumes:
  - name: my-volume
    emptyDir: {}

以上兩個例子展示了podinit的使用場景,一個是與busybox一起使用,一個是與kubernetes-csi一起使用。這也充分說明了podinit的靈活性,開發人員可以自由發揮他的想像力。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/188645.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-28 13:32
下一篇 2024-11-28 13:32

相關推薦

  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網路BP演算法原理

    本文將從多個方面對神經網路BP演算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP演算法簡介 BP演算法是一種常用的神經網路訓練演算法,其全稱為反向傳播演算法。BP演算法的基本思想是通過正…

    編程 2025-04-29
  • GloVe詞向量:從原理到應用

    本文將從多個方面對GloVe詞向量進行詳細的闡述,包括其原理、優缺點、應用以及代碼實現。如果你對詞向量感興趣,那麼這篇文章將會是一次很好的學習體驗。 一、原理 GloVe(Glob…

    編程 2025-04-27
  • 編譯原理語法分析思維導圖

    本文將從以下幾個方面詳細闡述編譯原理語法分析思維導圖: 一、語法分析介紹 1.1 語法分析的定義 語法分析是編譯器中將輸入的字元流轉換成抽象語法樹的一個過程。該過程的目的是確保輸入…

    編程 2025-04-27
  • index.html怎麼打開 – 詳細解析

    一、index.html怎麼打開看 1、如果你已經擁有了index.html文件,那麼你可以直接使用任何一個現代瀏覽器打開index.html文件,比如Google Chrome、…

    編程 2025-04-25
  • Resetful API的詳細闡述

    一、Resetful API簡介 Resetful(REpresentational State Transfer)是一種基於HTTP協議的Web API設計風格,它是一種輕量級的…

    編程 2025-04-25
  • AXI DMA的詳細闡述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基於AMBA…

    編程 2025-04-25
  • neo4j菜鳥教程詳細闡述

    一、neo4j介紹 neo4j是一種圖形資料庫,以實現高效的圖操作為設計目標。neo4j使用圖形模型來存儲數據,數據的表述方式類似於實際世界中的網路。neo4j具有高效的讀和寫操作…

    編程 2025-04-25
  • 關鍵路徑的詳細闡述

    關鍵路徑是項目管理中非常重要的一個概念,它通常指的是項目中最長的一條路徑,它決定了整個項目的完成時間。在這篇文章中,我們將從多個方面對關鍵路徑做詳細的闡述。 一、概念 關鍵路徑是指…

    編程 2025-04-25

發表回復

登錄後才能評論