kubernetes Pod-05 容器初始化

容器初始化

在很多应用场景中,应用在启动之前丢需要进行如下的初始化操作

  • 等待其他组件正确运行(例如数据库或者某个后台服务)
  • 基于环境变量或配置模板生成配置文件
  • 从远程数据库获取本地配置,或者将自身注册到某个中央数据库中
  • 下载相关依赖包,或者对系统进行一些预配置操作

init C(初始化容器) 运行一次就结束,并且只有成功了才能继续执行下一个容器。 init C 和 其他容器区别:

  • init container的运行方式与应用容器不同,它们必须先于应用容器执行完成,当设置了多个init container时,将按顺序逐个运行,并且只有前一个init container运行成功后才能运行后一个init container。当所有init container都成功运行后,kubernetes才会初始化pod的各种信息,并开始创建和运行应用容器。 在init container的定义中也可以设置资源限制、volume的使用和安全策略等等。但资源限制的设置与应用容器不同:

    • 如果多个init container都定义了资源请求/资源限制,则取最大的值作为所有init container的资源请求值/资源限制值。
    • pod的有效资源请求值/资源限制值取以下二者中的较大值:
      • 所有应用容器的资源请求值/限制值之和
      • init container的有效资源请求值/限制值
    • 调度算法将基于pod的有效资源请求值/限制值进行计算,也就是说init container可以为初始化操作预留系统资源,即使后续应用容器无须使用这些资源。
    • pod的有效QoS等级适用于init container和应用容器。
    • 资源配额和限制将根据pod的有效资源请求/限制,与调度机制一致。
  • init container不能设置readinessProbe探针,因为必须在它们成功运行以后才能继续运行pod中定义的普通容器。将pod重启时,init container将会重新运行,常见的pod重启场景如下:

    • init container的镜像被更新时,init container将重新运行,导致pod重启,仅更新应用容器的镜像只会使得应用容器被重启。
    • podinfrastructure容器更新时,pod将会重启。
    • pod中的所有应用容器都终止了,并且RestartPolicy=Always时,则pod将会重启

通过初始化容器为Nginx创建index.html主页文件。设置共享的Volume以供Nginx访问init C 设置的index.html

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  annotations:
spec:
  initContainers:
  - name: install
    image: busybox
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - http://kubernetes.io
    volumeMounts:
    - name: workdir
      mountPath: "/work-dir"
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  dnsPolicy: Default
  volumes:
  - name: workdir
    emptyDir: {}

创建并查看结果

yaml 复制代码
# 创建
kubectl apply -f 25.yaml
# 创建后马上看结果,可以看到init C还没有完成
[root@master1 pod]# kubectl get pod
NAME                     READY   STATUS      RESTARTS   AGE
nginx                    0/1     Init:0/1    0          8s
# 等初始化容器成功后,再查看, 创建成功
[root@master1 pod]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          105s

查看详情

yaml 复制代码
[root@master1 pod]# kubectl describe pod nginx
Name:         nginx
Namespace:    pod-ns
Priority:     0
Node:         node1/192.168.40.182
Start Time:   Mon, 18 Mar 2024 09:36:28 -0400
Labels:       <none>
Annotations:  cni.projectcalico.org/podIP: 10.244.166.159/32
              cni.projectcalico.org/podIPs: 10.244.166.159/32
Status:       Running
IP:           10.244.166.159
IPs:
  IP:  10.244.166.159
Init Containers:
  install:
    Container ID:  docker://52e8ade73bce8b916868afbe5f7029188a3ebb43044f01033f63ff52a32800d0
    Image:         busybox
    Image ID:      docker-pullable://busybox@sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
    Port:          <none>
    Host Port:     <none>
    Command:
      wget
      -O
      /work-dir/index.html
      http://kubernetes.io
    State:          Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Mon, 18 Mar 2024 09:36:45 -0400
      Finished:     Mon, 18 Mar 2024 09:36:53 -0400
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9p2fw (ro)
      /work-dir from workdir (rw)
Containers:
  nginx:
    Container ID:   docker://af3ef01f84ccafcf005b3fc155dff1893a4212eae79e470bbe3d807fa38e5c54
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
    Port:           80/TCP
    Host Port:      0/TCP
    State:          Running
      Started:      Mon, 18 Mar 2024 09:37:09 -0400
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /usr/share/nginx/html from workdir (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9p2fw (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  workdir:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:
    SizeLimit:  <unset>
  default-token-9p2fw:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-9p2fw
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  6m44s  default-scheduler  Successfully assigned pod-ns/nginx to node1
  Normal  Pulling    6m44s  kubelet            Pulling image "busybox"
  Normal  Pulled     6m28s  kubelet            Successfully pulled image "busybox" in 15.84749033s
  Normal  Created    6m28s  kubelet            Created container install
  Normal  Started    6m28s  kubelet            Started container install
  Normal  Pulling    6m19s  kubelet            Pulling image "nginx"
  Normal  Pulled     6m4s   kubelet            Successfully pulled image "nginx" in 15.695593204s
  Normal  Created    6m4s   kubelet            Created container nginx
  Normal  Started    6m4s   kubelet            Started container nginx

查看事件,先创建install容器,也就是init C容器,成功后再创建nginx容器。

进入容器查看详情

yaml 复制代码
[root@master1 pod]# kubectl exec -it nginx -c nginx /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nginx:/# more /usr/share/nginx/html/index.html
<!doctype html><html lang=en class=no-js><head class=live-site><meta name=robots content="index, follow"><link rel=alternate hreflang=zh-cn href=https://kubernetes.io/zh-cn/><link rel=alternate
hreflang=fr href=https://kubernetes.io/fr/><link rel=alternate hreflang=de href=https://kubernetes.io/de/><link rel=alternate hreflang=hi href=https://kubernetes.io/hi/><link rel=alternate hrefl
ang=id href=https://kubernetes.io/id/><link rel=alternate hreflang=it href=https://kubernetes.io/it/><link rel=alternate hreflang=ja href=https://kubernetes.io/ja/><link rel=alternate hreflang=k
o href=https://kubernetes.io/ko/><link rel=alternate hreflang=pl href=https://kubernetes.io/pl/><link rel=alternate hreflang=pt-br href=https://kubernetes.io/pt-br/><link rel=alternate hreflang=
ru href=https://kubernetes.io/ru/><link rel=alternate hreflang=es href=https://kubernetes.io/es/><link rel=alternate hreflang=uk href=https://kubernetes.io/uk/><link rel=alternate hreflang=vi hr
ef=https://kubernetes.io/vi/><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=generator content="Hugo 0.121.2"><link rel=alternate
 type=application/rss+xml href=https://kubernetes.io/feed.xml><link rel="shortcut icon" type=image/png href=/images/favicon.png><link rel=apple-touch-icon href=/favicons/apple-touch-icon-180x180
.png sizes=180x180><link rel=manifest href=/manifest.webmanifest><link rel=apple-touch-icon href=/images/kubernetes-192x192.png><title>Kubernetes</title><meta property="og:title" content="Produc
tion-Grade Container Orchestration">
......
</body></html>
相关推荐
m0_741768856 小时前
使用docker的小例子
运维·docker·容器
最新小梦9 小时前
Docker日志管理
运维·docker·容器
ZHOU西口10 小时前
微服务实战系列之玩转Docker(十五)
nginx·docker·微服务·云原生·swarm·docker swarm·dockerui
有你的晚安._11 小时前
pod基本概念
kubernetes
lgbisha11 小时前
828华为云征文|华为云Flexus X实例docker部署最新Appsmith社区版,搭建自己的低代码平台
低代码·docker·华为云
记得开心一点嘛11 小时前
在Linux系统上使用Docker部署javaweb项目
linux·运维·docker
Persistence is gold13 小时前
cassandra指定配置文件的docker启动方法
运维·docker·容器
C语言扫地僧14 小时前
Docker 镜像制作(Dockerfile)
linux·服务器·docker·容器
ken_coding18 小时前
Windows11 WSL2的ubuntu 22.04中拉取镜像报错
linux·ubuntu·docker
Richardlygo18 小时前
(k8s)Kubernetes部署Promehteus
云原生·容器·kubernetes