POD生命周期

POD生命周期

POD创建流程

生命周期

## init container
初始化容器是指,在主容器启动之前,我们可以让他做一些准备工作。
比如:
1.两个容器做了共享存储,那么我们可以让它先启动一个容器,来对目录进行更改用户和授权
2.容器需要连接数据可,那么可以让初始化容器检测数据库是否可以正常连接,如果可以再启动主容器


## hook
PostStart:在容器启动创建后,立即执行,但时间不能太长,否则容器不会是running状态
PreStop:在容器停止前,执行一些命令,主要用于优雅关闭程序

## liveness probe
存活探针,用于定义容器内,应用是否满足探针指定状态

## readiness probe
就绪探针,指定何时允许容器进入流量

POD针对应用封装

那么我们在工作中,一个pod究竟要放几个容器?

在实际工作中我们除了完成任务以外还需要考虑以后扩容的问题,就拿wordpress举例,有以下两种方案:

第一种:全部放一个pod里

那么如何扩容呢?如果第一种方案大家会发现没有办法很好的扩容,因为数据库和wordpress已经绑定成一个整体了,扩容wordpress就得扩容mysql。而第二种方案就要灵活的多。

初始化容器

## init container
初始化容器是指,在主容器启动之前,我们可以让他做一些准备工作。
比如:
1.两个容器做了共享存储,那么我们可以让它先启动一个容器,来对目录进行更改用户和授权
2.容器需要连接数据可,那么可以让初始化容器检测数据库是否可以正常连接,如果可以再启动主容器


apiVersion: v1
kind: Pod
metadata:
  name: nginx-init
spec:
  nodeName: node2
  
  volumes: 
  - name: nginx-index	# 变量名
    emptyDir: {}		# 找一个临时目录挂载,容器删除后也会删除

  initContainers:		# 初始化容器
  - name: init
    image: busybox
    imagePullPolicy: IfNotPresent
    args: [/bin/sh, -c, 'echo k8s >> /usr/share/nginx/html/index.html']		# 传参
    args:
    - /bin/sh
    - -c
    - 'echo k8s >> /usr/share/nginx/html/index.html'
    
    volumeMounts:
    - name: nginx-index
      mountPath: "/usr/share/nginx/html"

  containers:
  - name: nginx
    image: nginx:alpine
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    volumeMounts:
    - name: nginx-index
      mountPath: "/usr/share/nginx/html"

hook

postStart(启动钩子)

# 在容器启动创建后,立即执行,但时间不能太长,否则容器不会是running状态


apiVersion: v1
kind: Pod
metadata:
  name: postStart
spec:
  nodeName: node2
    
  containers:
  - name: nginx
    image: nginx:alpine
    lifecycle:		# 钩子
      postStart:
        exec:
          command: [/bin/sh, -c, 'echo k8s > /usr/share/nginx/html/index.html']
    ports:
    - containerPort: 80

preStop(停止钩子)

apiVersion: v1
kind: Pod
metadata:
  name: prestop
spec:
  volumes: 
  - name: nginxlog
    hostPath: 
      path: /var/log/nginx/
    
  containers:
  - name: nginx
    image: nginx:alpine
    lifecycle:
      postStart:
        exec:
          command: [/bin/sh, -c, 'echo postStart and preStop > /usr/share/nginx/html/index.html']
      preStop:
        exec:
          command: [/bin/sh, -c, 'echo bye > /var/log/nginx/stop.log']
    ports:
    - containerPort: 80

    volumeMounts:
    - name: nginxlog
      mountPath: /var/log/nginx/

存活探针

存活探针简单来说就是用来检测容器的应用程序是否还正常工作,如果应用程序不正常,即使容器还活着也没有意义了,所以这时候就可以使用存活探针来探测,如果应用程序不正常,就重启POD。
## 使用exec方法
apiVersion: v1
kind: Pod
metadata:
  name: liveness-pod
spec:
  nodeName: node2

  volumes: 
  - name: nginx-html
    hostPath: 
      path: /usr/share/nginx/html/

  containers:
  - name: liveness
    image: nginx 
    imagePullPolicy: IfNotPresent

    lifecycle:
      postStart:
        exec:
          command: [/bin/sh, -c, 'echo k8s > /usr/share/nginx/html/index.html']

    livenessProbe:
      exec:
        command:
        - cat
        - /usr/share/nginx/html/index.html
      initialDelaySeconds: 3
      periodSeconds: 1

    volumeMounts:
    - name: nginx-html
      mountPath: /usr/share/nginx/html/

# 创建
[root@k8s-m01 ~]# kubectl apply -f liveness.yaml

# 自动修复,重启
[root@k8s-n01 html]# rm -f index.html 
[root@k8s-n01 html]# ll
total 4
-rw-r--r-- 1 root root 9 Sep 14 01:00 index.html


 ## 使用getHttp方法
apiVersion: v1
kind: Pod
metadata:
  name: liveness-pod
spec:
  nodeName: node2

  volumes: 
  - name: nginx-html
    hostPath: 
      path: /usr/share/nginx/html/

  containers:
  - name: liveness
    image: nginx 
    imagePullPolicy: IfNotPresent

    lifecycle:
      postStart:
        exec:
          command: [/bin/sh, -c, 'echo k8s > /usr/share/nginx/html/index.html']

    livenessProbe:
      #exec:
      #  command:
      #  - cat
      #  - /usr/share/nginx/html/index.html
      httpGet:
        path: /index.html
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 3

    volumeMounts:
    - name: nginx-html
      mountPath: /usr/share/nginx/html/
 
 ### 参数解释
    livenessProbe:
      httpGet:                                  #基于http请求探测
        path: /index.html          #请求地址,如果这个地址返回的状态码在200-400之间正常
        port: 80                                #请求的端口
      initialDelaySeconds: 3        #第一次启动探测在容器启动后3秒开始
      periodSeconds: 3                  #容器启动后每隔3秒检查一次
      
# 检查不一致会退出,重启

就绪探针

有时候我们Pod本身已经起来了,但是pod的容器还没有完全准备好对外提供服务,那么这时候流量进来就会造成请求失败的情况出现,针对这种情况k8s有一种探针叫就绪探针,他的作用就是让k8s知道你的Pod内应用是否准备好为请求提供服务。只有就绪探针ok了才会把流量转发到pod上。



有时候,应用程序会暂时性的不能提供通信服务。 例如,应用程序在启动时可能需要加载很大的数据或配置文件,或是启动后要依赖等待外部服务。 在这种情况下,既不想杀死应用程序,也不想给它发送请求。 Kubernetes 提供了就绪探测器来发现并缓解这些情况。 容器所在 Pod 上报还未就绪的信息,并且不接受通过 Kubernetes Service 的流量。
apiVersion: v1
kind: Pod
metadata:
  name: liveness-pod
spec:
  containers:
  - name: liveness-pod
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo ok > /usr/share/nginx/html/health.html"]
    readinessProbe:     ## 就绪探针
      httpGet:
        path: /actuator/health
        port: 8080
      initialDelaySeconds: 5
      timeoutSeconds: 3
      periodSeconds: 3
      successThreshold: 3
      failureThreshold: 3
    livenessProbe:
      httpGet:
        path: /health.html
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 3

POD资源限制

在学习Docker的时候我们知道容器可以使用Linux系统的CGroup技术限制内存和CPU的使用率,那么POD里应该如何限制容器的CPU和内存资源呢?
apiVersion: v1
kind: Pod
metadata:
  name: resource-demo
spec:
  containers:
  - name: resource-demo
    image: nginx
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: 50Mi
        cpu: 1500m
      limits:
        memory: 100Mi
        cpu: 2000m
        
        
# 不接受nodeIP和classIP的流量,本地curlpodip可以的

参数解释:

requests :节点所需的最小计算资源量,k8s调度的时候的依据值
limits :限制允许的最大计算资源量,真正的资源限制参数

数值的转换:

1 CPU = 1000m
0.5 CPU = 500m
1 Mib = 1024 Kib
1 MB = 1000 KB

查看验证:

docker inspect 容器ID|grep CgroupParent
cd /sys/fs/cgroup/cpu/kubepods.slice/kubepods-burstable.slice/kubepods-burstable-podxxxx.slice
cat cpu.cfs_quota_us
posted @ 2022-09-13 18:27  Gabydawei  阅读(39)  评论(0编辑  收藏  举报