Kubernetes Init 容器快速入门指南

在 Kubernetes 中,一个 pod 可以托管一个或多个应用程序实例的容器。 它们还可以托管一个或多个 Init 容器。 使用此快速入门指南了解有关 Kubernetes Init 容器的更多信息。

什么是初始化容器

Init 容器是一种特殊类型的容器,在应用程序容器之前运行。 它们必须成功运行并退出,主应用程序容器才能运行。

Init 容器的特点

初始化容器与应用程序容器的不同之处在于它们适用于初始化目的。 关于初始化容器的几点:

  1. 如果 pod 有许多 init 容器,则每个 init 容器在前一个完成后运行。

  2. 重启政策 定义 kubelet 在 init 容器失败时的行为。 如果重启策略设置为 Always,kubelet 会重启容器,直到它运行并成功退出(退出代码 0)。 如果重启策略设置为 Never,kubelet 不会尝试重新启动 init 容器并且 pod 失败。

  3. 如果 pod 重新启动,如果您的 init 容器将文件写入 EmptyDir,那么就应该为上一个 pod 生命周期中创建的数据的存在做好准备。

  4. 以下字段不适用于 init 容器:

    • 生命周期

    • 活性探针

    • 就绪探针

    • 启动探针

  5. 初始化容器是独立于应用程序容器的实体。 它们使用不同的图像,并且配置不同。 这使得 pod 模块化且易于管理。

Init 容器的使用

Init 容器可以用于多种用途。 它们用于应用程序初始化目的。 以下是一些用例:

  1. 它们可用于存储敏感凭据和访问所需数据。 万一 pod 被入侵,应用程序容器就不能暴露那些敏感的凭证。 这增加了安全性。

  2. 他们可以延迟创建 pod,直到满足一组先决条件。 这些先决条件可以是:

    • 获取应用程序容器的数据。

    • 向远程服务器注册应用程序

    • 等待某些服务或资源准备好。

  3. 他们可以使用外部 IP 地址、pod IP 等可变数据生成配置文件。

使用初始化容器

初始化容器定义在 pods.spec.initContainers 场地。 要遵循本指南,请使用以下配置文件创建带有 init 容器的 Nginx 部署。 init 容器为 Nginx 创建一个网页,并将容器退出延迟 20 秒。

apiVersion: apps/v1

kind: Deployment

metadata:

  labels:

    app: nginx-server

  name: nginx-deploy

spec:

  replicas: 1

  selector:

    matchLabels:

      app: nginx-server

  template:

    metadata:

      labels:

        app: nginx-server



    spec:



      volumes:

      - name: common-disk

        emptyDir: {}



      initContainers:

      - name: busybox

        image: busybox

        volumeMounts:

        - name: common-disk

          mountPath: /web-files

        command: ["/bin/sh"]

        args: ["-c", "echo '<h2>Init container added this line here</h2>' > /web-files/index.html && sleep 20"]



      containers:

      - image: nginx

        name: nginx

        volumeMounts:

        - name: common-disk

          mountPath: /usr/share/nginx/html

要创建部署,请使用:

$ kubectl apply -f myApp.yaml

预期输出:

deployment.apps/nginx-deploy created

要检查部署的状态,请使用:

$ kubectl get deployment

样本输出:

NAME           READY   UP-TO-DATE   AVAILABLE   AGE

nginx-deploy   0/1     1            0           7s

正如你在下面看到的 准备好 场,一个 0/1 副本可用。 这是因为 init 容器没有完成。 现在检查 pod 的状态:

$ kubectl get pod

样本输出:

NAME                            READY   STATUS     RESTARTS   AGE

nginx-deploy-5c77b8f897-94r6w   0/1     Init:0/1   0          26s

您可以看到 pod 尚未准备好。 它正在等待初始化容器完成。 配置文件有 sleep 20 最后的命令,它将初始化容器的终止延迟 20 秒。 初始化容器完成后,状态变为:

NAME                            READY   STATUS            RESTARTS   AGE

nginx-deploy-5c77b8f897-94r6w   0/1     PodInitializing   0          33s

Pod 初始化后,状态变为:

NAME                            READY   STATUS    RESTARTS   AGE

nginx-deploy-5c77b8f897-94r6w   1/1     Running   0          51s

并且部署状态更改为:

NAME           READY   UP-TO-DATE   AVAILABLE   AGE

nginx-deploy   1/1     1            1           91s

结论

到目前为止,您应该已经了解了 init 容器及其工作原理。 您现在可以在设计 Kubernetes 集群时使用它们,并利用它们提供的功能。

文章标题 名称(可选) 电子邮件(可选) 描述

发送建议

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com