(二)k8s实战-深入Pod详解

一、配置文件详解

创建Pod nginx样例

apiVersion: v1 # api文档版本
kind: Pod # 资源对象类型,Pod, Deployment,StatefulSet
metadata: # Pod相关的元数据,用于描述Pod的数据
  name: nginx-demo # Pod的名称
  labels: # 定义Pod的标签
    type: app # 自定义lable标签,名称为tyoe,值为app
    test: 1.0.0 # 自定义lable标签,描述Pod版本号
  namespace: 'default' # 命名空间的配置
spec: # 期望Pod按照这里的描述进行创建
  containers: # Pod中的容器描述
  - name: nginx # 容器名称
    image: arm64v8/nginx:latest # 指定容器的镜像
    imagePullPolicy: IfNotPresent # 镜像拉取策略,Always, Never, IfNotPresent
    command: # 指定容器启动时执行的命令
    - nginx
    - -g
    - 'daemon off;' # nginx -g daemon off;
    workingDir: /usr/share/nginx/html # 定义容器启动后默认的目录
    ports:
    - name: http # 端口名称
      containerPort: 80 # 容器内需要暴露的端口
      protocol: TCP # 描述该端口是基于哪种协议通信的
    env: # 环境变量
    - name: JVM_OPTS # 环境变量名称
      value: '-Xms120m -Xmx128m' # 环境变量的值

    resources:
      requests: # 最少需要多少资源
        cpu: 100m # 限制cpu最多使用0.1个核心
        memory: 128Mi # 限制内存最少使用128兆
      limits: # 最多可以用多少资源
        cpu: 200m # 限制cpu最多使用0.2个核心
        memory: 256Mi # 限制最多使用256兆

  restartPolicy: OnFailure # pod重启策略,Always,OnFailure,Never,默认值为Always, OnFailure 只有pod非零推出码终止时,kubelet才会重启改容器,容器正常>结束的退出码为0

K8S 的资源清单

参数名类型字段说明
apiVersionStringK8S APl 的版本,可以用 kubectl api versions 命令查询
kindStringyam 文件定义的资源类型和角色
metadataObject元数据对象,下面是它的属性
metadata.nameString元数据对象的名字,比如 pod 的名字
metadata.namespaceString元数据对象的命名空间
SpecObject详细定义对象
spec.containers[]list定义 Spec 对象的容器列表
spec.containers[].nameString为列表中的某个容器定义名称
spec.containers[].imageString为列表中的某个容器定义需要的镜像名称
spec.containers[].imagePullPolicystring定义镜像拉取策略,有 Always、Never、IfNotPresent 三个值可选
- Always(默认):意思是每次都尝试重新拉取镜像
- Never:表示仅适用本地镜像
- IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。
spec.containers[].command[]list指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。
spec.containers[].args[]list指定容器启动命令参数,因为是数组可以指定多个。
spec.containers[].workingDirstring指定容器的工作目录
spec.containers[].volumeMounts[]list指定容器内部的存储卷配置
spec.containers[].volumeMounts[].namestring指定可以被容器挂载的存储卷的名称
spec.containers[].volumeMounts[].mountPathstring指定可以被容器挂载的存储卷的路径
spec.containers[].volumeMounts[].readOnlystring设置存储卷路径的读写模式,ture 或者 false,默认是读写模式
spec.containers[].ports[]list指定容器需要用到的端口列表
spec.containers[].ports[].namestring指定端口的名称
spec.containers[].ports[].containerPortstring指定容器需要监听的端口号
spec.containers[].ports[].hostPortstring指定容器所在主机需要监听的端口号,默认跟上面 containerPort 相同,注意设置了 hostPort 同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突)
spec.containers[].ports[].protocolstring指定端口协议,支持 TCP 和 UDP,默认值为 TCP
spec.containers[].env[]list指定容器运行前需设置的环境变量列表
spec.containers[].env[].namestring指定环境变量名称
spec.containers[].env[].valuestring指定环境变量值
spec.containers[].resourcesObject指定资源限制和资源请求的值(这里开始就是设置容器的资源上限)
spec.containers[].resources.limitsObject指定设置容器运行时资源的运行上限
spec.containers[].resources.limits.cpustring指定 CPU 的限制,单位为 Core 数,将用于 docker run –cpu-shares 参数
spec.containers[].resources.limits.memorystring指定 mem 内存的限制,单位为 MIB、GiB
spec.containers[].resources.requestsObject指定容器启动和调度时的限制设置
spec.containers[].resources.requests.cpustringCPU请求,单位为core数,容器启动时初始化可用数量
spec.containers[].resources.requests.memorystring内存请求,单位为MIB、GiB,容器启动的初始化可用数量
spec.restartPolicystring定义 pod 的重启策略,可选值为 Always、OnFailure、Never,默认值为 Always。
- Always:pod 一旦终止运行,则无论容器是如何终止的,kubelet 服务都将重启它。
- OnFailure:只有 pod 以非零退出码终止时,kubelet 才会重启该容器。如果容器正常结束(退出码为0),则 kubectl 将不会重启它。
- Never:Pod 终止后,kubelet 将退出码报告给 master,不会重启该 pod
spec.nodeSelectorObject定义 Node 的 label 过滤标签,以 key:value 格式指定
spec.imagePullSecretsObject定义 pull 镜像时使用 secret 名称,以 name:secretkey 格式指定
spec.hostNetworkBoolean定义是否使用主机网络模式,默认值为 false。设置 true 表示使用宿主机网络,不使用 docker 网桥,同时设置了 true将无法在同一台宿主机上启动第二个副本

常用命令:
删除pod
kubectl delete po nginx-demo
创建pod
kubectl create -f nginx-demo.yaml
查看pod
kubectl get po
实时查看pod(动态)
kubectl get po -w
查看pod详细信息
kubectl get po -o wide
查看pod构建详细信息
kubectl describe po nginx-demo
查看路由
route -n

二、探针

为什么需要存活探针和就绪探针

上面的配置文件中,通过配置restartPolicy字段来对容器退出后执行3种不同的重启策略,但这并不能解决我们所有的问题,比如容器中的Java应用程序抛出OutOfMemoryErrors,但JVM进程会一致存在,容器并没有退出,再比如,Java停止响应或死锁,容器也没有终止等等,这时如果有一种机制来告诉kubernetes来重启容器那就最好了,在k8s中,提供了一种存活探针的机制来实现上诉的问题。

  • livenessProbe,叫做存活探针,是为了检测容器是否正在运行,是否活着;
  • readinessProbe,叫做就绪探针,是为了检测容器是否准备就绪,是否能接受客户端请求;
  • startupProbe,叫做启动探针,用于判断容器进程是否已经启动。

关于探针看这篇文章,写的太好了⬇️
pod健康检查之容器的存活探针、就绪探针

1、StartupProbe启动探针

k8s 1.16 版本新增的探针,用于判断应用程序是否已经启动了。
当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。

作用:由于有时候不能准确预估应用一定是多长时间启动成功,因此配置另外两种方式不方便配置初始化时长来检测,而配置了 statupProbe 后,只有在应用启动成功了,才会执行另外两种探针,可以更加方便的结合使用另外两种探针使用。

startupProbe:  #启动探针配置
  httpGet:  # 探测方式,基于http请求探测
    path: /api/startup # http请求路径
    port: 80 # 请求端口

2、LivenessProbe就绪探针

用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。

livenessProbe: #就绪探针配置
  httpGet: # 探测方式,基于http请求探测
    path: /health # http请求路径
    port: 8080 # 请求端口
    scheme: HTTP
  initialDelaySeconds: 60 # 初始延时,表示容器启动60秒后才开始探测
  failureThreshold: 5  # 失败多少次才算真正失败
  periodSeconds: 10 # 间隔时间
  successThreshold: 1 # 多少次检测成功才算成功
  timeoutSeconds: 5  # 请求的超时时间

3、ReadinessProbe存活探针

用于探测容器内的程序是否健康,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的。

readinessProbe: # 存活探针配置
  httpGet:
    path: /ready
    port: 8181
    scheme: HTTP
  failureThreshold: 3 # 错误次数
  periodSeconds: 10 # 间隔时间
  successThreshold: 1 # 多少次检测成功才算成功
  timeoutSeconds: 1 # 请求的超时时间

4、三种探测方式

# 1.ExecAction 
# 在容器内部执行一个命令,如果返回值为 0,则任务容器时健康的。
livenessProbe:
  exec:
    command:
      - cat
      - /health

# 2.TCPSocketAction
# 通过 tcp 连接监测容器内端口是否开放,如果开放则证明该容器健康
livenessProbe:
  tcpSocket:
    port: 80

# 3.HTTPGetAction
# 生产环境用的较多的方式,发送 HTTP 请求到容器内的应用程序,如果接口返回的状态码在 200~400 之间,则认为容器健康。
livenessProbe:
  failureThreshold: 5
  httpGet:
    path: /health
    port: 8080
    scheme: HTTP
    httpHeaders:
      - name: xxx
        value: xxx

5、探针的附加参数配置

initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 监测间隔时间
successThreshold: 1 # 检查 1 次成功就表示成功
failureThreshold: 2 # 监测失败 2 次就表示失败

注意:定义存活探针时,一定要设置initialDelaySeconds属性,该属性为初始延时,如果不设置,默认容器启动时探针就开始探测了,这样可能会存在应用程序还未启动就绪,就会导致探针检测失败,k8s就会根据pod重启策略杀掉容器然后再重新创建容器的莫名其妙的问题。
在生产环境中,一定要定义一个存活探针。

三、Pod生命周期

生命周期阅读这篇文章⬇️
pod生命周期以及探针介绍

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

Pod 退出流程(删除操作)

  1. Endpoint 删除 pod 的 ip 地址
  2. Pod 变成 Terminating 状态
  3. 执行 preStop 的指令

PreStop 的应用

  1. 注册中心下线
  2. 数据清理
  3. 数据销毁

下一篇:(三)k8s实战-资源调度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值