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/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

发表回复

登录后才能评论