kubernetes之pod的生命周期(3)

一、简介

init容器是在pod运行之前运行的容器,并包括一些应用镜像中不不存在的实用工具和安装脚本。

(1)Init 容器与普通的容器非常像,除了如下两点:

  • 它们总是运行到完成。
  • 每个都必须在下一个启动之前成功完成。
    与普通容器的不同之处
    init 容器支持应用容器的全部字段和特性,包括资源限制、数据卷和安全设置。 然而,Init 容器对资源请求和限制的处理稍有不同

(2)Init容器能做什么?

因为 Init 容器具有与应用容器分离的单独镜像,其启动相关代码具有如下优势:

  • Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。例如,没有必要仅为了在安装过程中使用类似 sed、 awk、 python 或 dig 这样的工具而去FROM 一个镜像来生成一个新的镜像。
  • Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
  • 应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
  • Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。
  • 由于 Init 容器必须在应用容器启动之前运行完成,因此 Init 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。

二、init容器示例

注:在做此实验前,关闭iptables规则,使得k8s机器不能访问外网
实验代码来自官网:init容器官网介绍

[root@node1 manifest]# cat init.yml 
apiVersion: v1
kind: Pod
metadata:
  name: jd618
  labels:
    app: myapp
spec:
  containers:
  - name: jd001
    image: busyboxplus:latest
    command: ['sh', '-c', 'echo The app is running! && sleep 3600']
  initContainers:
  - name: init-myservice
    image: busyboxplus:latest
    command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]    #此处将官网的xxx换成default ...
  - name: init-mydb
    image: busyboxplus:latest
    command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

创建,此时jd618一直处于init,准备未完成状态,只有当service创建完之后,才能处于running

[root@node1 manifest]# kubectl apply -f init.yml 
pod/jd618 created
[root@node1 manifest]# kubectl get pod
NAME    READY   STATUS     RESTARTS   AGE
jd618   0/1     Init:0/2   0          8s
[root@node1 manifest]# kubectl get pod
NAME    READY   STATUS     RESTARTS   AGE
jd618   0/1     Init:0/2   0          10s

没有解析
在这里插入图片描述
当服务创建完成之后,再次查看状态
service.yml

[root@node1 manifest]# cat service.yml 
kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9376
---
kind: Service
apiVersion: v1
metadata:
  name: mydb
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 9377

[root@node1 manifest]# kubectl apply -f service.yml 
service/myservice created
service/mydb created
[root@node1 manifest]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   44h
mydb         ClusterIP   10.111.16.207   <none>        80/TCP    11s
myservice    ClusterIP   10.108.94.5     <none>        80/TCP    12s
[root@node1 manifest]# kubectl get pod
NAME    READY   STATUS    RESTARTS   AGE
demo    1/1     Running   0          12m
jd618   1/1     Running   0          13m

也能解析到了
在这里插入图片描述

eg1. 存活探针

影响的是kubectl get pod中RESTARTS下面的参数

在容器里加这
livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 1  #容器启动后的延迟
      periodSeconds: 2   #每次探测间隔,单位是秒
      timeoutSeconds: 1

完整版init.yml

apiVersion: v1
kind: Pod
metadata:
  name: jd618
  labels:
    app: myapp
spec:
  containers:
  - name: jd001
    image: myapp:v1
    imagePullPolicy: IfNotPresent
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 2
      timeoutSeconds: 1
  initContainers:
  - name: init-myservice
    image: busyboxplus:latest
    command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
  - name: init-mydb
    image: busyboxplus:latest
    command: ['sh', '-c', "until nslookup mydb.default.svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

因为里有init容器,所以得保证svc服务开起来。
在这里插入图片描述
容器运行起来
在这里插入图片描述
测试:进入容器关闭nginx

在这里插入图片描述

eg2. 就绪探针

影响的是kubectl get pod中READY下面的参数
service.yml

[root@node1 manifest]# cat service.yml 
kind: Service
apiVersion: v1
metadata:
  name: myservice
spec:
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  selector:
    app: myapp

init.yml

[root@node1 manifest]# cat init.yml 
apiVersion: v1
kind: Pod
metadata:
  name: jd618
  labels:
    app: myapp
spec:
  containers:
  - name: jd001
    image: myapp:v1
    imagePullPolicy: IfNotPresent
    livenessProbe:  #存活检测
      tcpSocket: 
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 2
      timeoutSeconds: 1
    readinessProbe:   #就绪检测
      httpGet:
        path: /hostname.html
        port: 80
      initialDelaySeconds: 1
      periodSeconds: 3
      timeoutSeconds: 1

  initContainers:  #Init容器
  - name: init-myservice
    image: busyboxplus:latest
    command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]

创建pod,
[root@node1 manifest]# kubectl apply -f init.yml
pod/jd618 created
因为里面有init容器,所以要运行service.yml服务
[root@node1 manifest]# kubectl apply -f service.yml
service/myservice created

正常是将Ip加到Endpoints里,为了看到实验效果,进到容器里:将/hostname.yml给注释掉。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如何恢复?
在这里插入图片描述
在这里插入图片描述
再运行一个pod2.yml,里面的标签改为app:myapp
在这里插入图片描述

[root@node1 manifest]# cat pod2.yml 

apiVersion: apps/v1
kind: Deployment
metadata:
  # Unique key of the Deployment instance
  name: deployment-example
spec:
  # 3 Pods should exist at all times.
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        # Apply this label to pods and default
        # the Deployment label selector to this value
        app: myapp
    spec:
      containers:
      - name: myapp
        # Run this image
        image: myapp:v1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值