加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Kubernetes-6:Pod生命周期介绍(init Container)

发布时间:2020-12-14 15:16:12 所属栏目:百科 来源:网络整理
导读:Pod生命周期 ? 生命周期 1、API server调用kubelet下达Pod创建指令 2、容器环境初始化 3、进入Pod生命周期内(Pod开始创建) 4、Pod只要创建,就会自动生成一个pause容器,用于共享网络,共享存储 5、init C(init Container)初始化容器 init C仅仅负责初始化

Pod生命周期

?

生命周期

1、API server调用kubelet下达Pod创建指令

2、容器环境初始化

3、进入Pod生命周期内(Pod开始创建)

4、Pod只要创建,就会自动生成一个pause容器,用于共享网络,共享存储

5、init C(init Container)初始化容器

  init C仅仅负责初始化,初始化完毕后,init 容器会自动销毁

  init C不能并列进行,每个init C必须在下一个init C启动前完成

  如果Pod的init C失败,k8s会不断重启Pod,直到init C成功为止,除非设置Pod的restartPolicy为Never

6、开始执行 Main C(主容器)

  主容器运行时会进行一个START(一进入容器就运行的指令)和STOP(退出容器前运行的指令)操作

7、readiness 就绪检测(探测),可以设置探测间隔时间

8、Liveness 生存检测,主要检测容器内是否可以正常提供服务,若不能则进行一系列操作

?

Init C示例

优势:

1)它们可以包含并运行实用工具,但是出于安全考虑,是不建议在应用程序容器镜像中包含这些实用工具的

2)它们可以包含使用工具和定制化代码来安装,但是不能出现在应用程序镜像中。例如,创建镜像没必要FROM另一个镜像,只需要在安装过程中使用类似sed、 ?awk、python或dig这样的工具。

3)应用程序镜像可 以分离出创建和部署的角色,而没有 必要联合它们构建一个单独的镜像。

4)Init容器使用Linux Namespace,所以相对应用程序容器来说具有不同的文件系统视图。因此,它们能够具有访问Secret 的权限,而应用程序容器则不能。

5)它们必须在应用程序 容器启动之前运行完成, 而应用程序容器是并行运行的, 所以Init容器能够提供了-种简单的阻塞或延迟应用容器的启动的方法,直到满足了一组先决条件。

?

测试:

## 编辑Pod资源清单
vim initc.yaml
...
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
    version: v1
spec:
  containers:
  - name: myapp-container
    image: busybox:v1
    command: ['sh',-cecho The app is running! && sleep 3600']
    imagePullPolicy: IfNotPresent
  initContainers:
  - name: init-myapp
    image: busybox:v1
    command: [until cat /root/myapp;do echo /root/myapp no such file or directory!;sleep 2;done]
    imagePullPolicy: IfNotPresent
  - name: init-mydb
    image: busybox:v1
    command: [until cat /root/mydb;do echo /root/mydb no such file or directory!;sleep 2;done]
    imagePullPolicy: IfNotPresent
...

## 以initc.yaml创建Pod
[root@Centos8 ~]# kubectl create -f initc.yaml 
pod/myapp-pod created

[root@Centos8 ~]# kubectl get pod   #查看发现,STATUS为init未完成
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   0/1     Init:2   0          3m26s

## 查看Pod描述
[root@Centos8 ~]# kubectl describe pod myapp-pod

## 查看init C的Pod日志,可以看到init C没有执行成功,myservice无法解析
[root@Centos8 k8sYaml]# kubectl  log  myapp-pod -c init-myapp
log is DEPRECATED and will be removed in a future version. Use logs instead.
cat: cant open '/root/myapp: No such file or directory
/root/myapp no such file or directory!
/root/myapp no such file or directory!
: No such file or directory
file or directory!

## 创建 myapp 文件,创建完毕后可发现,Init已经成功了一个
[root@Centos8 k8sYaml]# kubectl exec -it myapp-pod -c init-myapp -- touch /root/myapp
[root@Centos8 k8sYaml]# kubectl get pod 
NAME        READY   STATUS     RESTARTS   AGE
myapp-pod   1/          5m19s

## 创建 mydb 文件,两个init全部完成,Pod正常运行
[root@Centos8 k8sYaml]# kubectl exec -it myapp-pod -c init-mydb -- mydb
[root@Centos8 k8sYaml]# kubectl get pod 
NAME        READY   STATUS    RESTARTS   AGE
myapp-pod   1     Running             7m50s

## 只要Iint C初始化完毕,此容器立刻就会消失

?

Init C特殊说明

?如果Pod重启,所有的Init C将会重新执行

?Pod启动过程中,Init C会按顺序在网络和数据卷(pause容器)初始化之后启动,每个容器必须在下一个容器启动之前退出

?如果由于运行时或失败退出,将导致容器启动失败,它会根据Pod的restartPolicy指定的策略进行重试,然而,如果Pod的restartPolicy设置为Always,Init 容器失败时会使用RestartPolicy策略

?在所有的Init C没有成功之前,Pod将不会变成Ready状态,Init C的端口将不会再service中进行聚集。正在初始化中的Pod处于Pending状态,但应该会将Initializing状态设置为true

?Init C中spec的修改被限制在容器image字段,修改其他字段不会生效,更改image字段等同于重启该Pod

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读