在 Kubernetes 中,一个 pod 可以托管一个或多个应用程序实例的容器。 它们还可以托管一个或多个 Init 容器。 使用此快速入门指南了解有关 Kubernetes Init 容器的更多信息。
什么是初始化容器
Init 容器是一种特殊类型的容器,在应用程序容器之前运行。 它们必须成功运行并退出,主应用程序容器才能运行。
Init 容器的特点
初始化容器与应用程序容器的不同之处在于它们适用于初始化目的。 关于初始化容器的几点:
如果 pod 有许多 init 容器,则每个 init 容器在前一个完成后运行。
这 重启政策 定义 kubelet 在 init 容器失败时的行为。 如果重启策略设置为
Always
,kubelet 会重启容器,直到它运行并成功退出(退出代码 0)。 如果重启策略设置为Never
,kubelet 不会尝试重新启动 init 容器并且 pod 失败。如果 pod 重新启动,如果您的 init 容器将文件写入
EmptyDir
,那么就应该为上一个 pod 生命周期中创建的数据的存在做好准备。以下字段不适用于 init 容器:
生命周期
活性探针
就绪探针
启动探针
初始化容器是独立于应用程序容器的实体。 它们使用不同的图像,并且配置不同。 这使得 pod 模块化且易于管理。
Init 容器的使用
Init 容器可以用于多种用途。 它们用于应用程序初始化目的。 以下是一些用例:
它们可用于存储敏感凭据和访问所需数据。 万一 pod 被入侵,应用程序容器就不能暴露那些敏感的凭证。 这增加了安全性。
他们可以延迟创建 pod,直到满足一组先决条件。 这些先决条件可以是:
获取应用程序容器的数据。
向远程服务器注册应用程序
等待某些服务或资源准备好。
他们可以使用外部 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