k8s之三、pod 生命周期/ 探针/ 调度策略/ 副本ReplicaSet / 控制器Deployment

2023-11-15

pod 生命周期官方文档

https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/

一、容器初始化

创建当前pod容器前 先创建 依赖的其他 containers 容器

  ## 创建容器 (需等待初始化操作完成在创建容器)
  containers:
  - name: mayikt-main-container
    image: nginx:1.17.9
    ports:
    - name: nginx-port
      containerPort: 80
      
  ## 初始化操作 (睡眠40),实际可修改为等待指定服务启动成功
  initContainers:
  - name: mayikt-mysql
    image: busybox:1.30  
    command: [ "/bin/sh","-c","sleep 40;"]   

二、钩子函数

k8s在主容器的启动之后和停止之前提供了两个钩子函数,进行容器启动后 和 容器停止后的相关操作

  • 1.post-start: 容器创建之后执行 (相关命令),如果失败了则会自动重启容器, 容器创建后立即执行,注意由于是异步执行,它无法保证一定在 ENTRYPOINT 之前运行。如果失败,容器会被杀死,并根据 RestartPolicy 决定是 否重启
  • 2.pre-stop : 容器终止之前执行 (相关命令) 例如 杀死进程等 容器终止前执行,常用于资源清理。执行完成之后容器将成功终止,如果失败,容器同样也会被杀死。在其完成之前 会阻塞删除容器的操作
    钩子的回调函数支持三种方式

2.1、Exec命令 模式

执行 linux 命令

spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    lifecycle:
      postStart:
        exec: # 容器创建之后执行(相关命令)修改nginx 页面
          command: ["/bin/sh","-c","echo mayikt > /usr/share/nginx/html/index.html"]
      preStop:
        exec: # 容器停止之后 执行停止nginx服务
          command: [" /usr/sbin/nginx","-s" , "quit" ]

2.2、TCPSocket 模式

对指定端口发起请求检查

 lifecycle:
    # 容器创建之后执行
    postStart:
      tcpSocket:
        port: 8080

2.3、HTTPGet 模式

发起一个http请求

lifecycle:
    postStart:
      # 容器创建之后执行
      httpGet:
        path: /init   # URI地址
        port: 80  # 端口号
        host: 192.168.110.1 # 主机地址
        scheme: HTTP   # 支持的协议,http或https

# http://192.168.110.1/init

三、容器探针

相当于容器的心跳检测,发现容器挂掉了可以主动进行重启

  1. livenessProbe 存活探针(可用性探针): 用于检测容器实例当前是否处于正常运行的状态,如果不是为运行状态,k8s则会重启容器;
  2. readinessProbe 就绪探针(就绪性探针): 就绪性探针,用于检测应用实例当前是否可以接收请求,如果不能接受实例,k8s不会转发到该实例

3.1、Exec命令 模式

spec:
  containers:
  - name: main-container
    image: nginx:1.17.1
    livenessProbe: # 存活探针(可用性探针)
      exec:        # 执行一个pwd
        command: ["/bin/pwd" ,"/"] 

3.2、TCPSocket 模式

    livenessProbe:  ## 存活探针(可用性探针)
      tcpSocket:    ## 底层会尝试访问容器ip:8080
        port: 8080 

3.3、HTTPGet 模式

    livenessProbe:
      httpGet: #访问指定的scheme://host:port/path
        scheme: HTTP   # 支持的协议,http或者https
        port: 80       # 端口号
        path: /mayikt  # URI地址 该地址不存在 会报错404

3.4、探针探测时间和次数指定

    livenessProbe:
      httpGet: #访问指定的scheme://host:port/path
        scheme: HTTP #支持的协议,http或者https
        port: 80 #端口号
        path: /mayikt #URI地址 该地址不存在 会报错404
      initialDelaySecands: 10   # 容器启动后10s开始探测   
      failureThreshold: 2       # 探测2次认为是失败   

3.5、重启策略配置

  • 1.Always: 出现问题时 自动重启该容器,默认方式。
  • 2.OnFailure : 容器终止运行且退出码不为0时重启
  • 3.Never :不论状态为何,都不重启该容器
spec:
  containers:
  - name: nginx
    image: nginx:1.17.9
  --------------   
  restartPolicy: Never   # 设置重启策略为Never 无论状态如何 不会重启

四、pod调度策略

4.1、运行到指定 node 节点

spec:
  containers:
  - name: nginx-container
    image: nginx:1.17.9
    
  nodeName: node1 #指定该pod运行在node1 节点

4.2、运行到指定 lable 标签的节点

  containers:
  - name: nginx
    image: nginx:1.17.9
    
  nodeSelector:
    nodev: v2 #指定调度到具有node=v2标签 node节点上

4.3、策略和亲和性

策略

  • 硬策略: 通过指定的规则,如果没有找到具体运行的Node节点 则会报错
  • 软策略: 优先走指定的规则, 如果没有找到具体运行的Node节点 则采用自动随机方式运行在node节点上。

亲和性

  • 1.nodeAffinity(node亲和性) : pod根据node标签选择器 决定pod运行在那个node节点上
  • 2.podAffinity(pod亲和性): pod根据参照pod标签选择器 解决多个pod运行在同一个node节点上
  • 3.podAntiffinity(pod反亲和性): pod根据参照pod标签选择器 解决多个pod不允许在同一个node节点上

operator关系符

  • 支持Exists, DoesNotExist, In, NotIn, Gt, Lt

4.3.1、node亲和性 + 硬限制

容器创建必须在标签v3或v4中,如果没有v3或v4标签的节点,则创建失败

spec:
  containers: 
  - name: nginx
    image: nginx:1.17.9
  ------------------------------------------------------------------------
  affinity: # 设置亲和性
    nodeAffinity: # 亲和性node 设置
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
        nodeSelectorTerms:
        - matchExpressions: # 匹配nodev的值在[v3,v4 ]中的标签 node节点
          - key: nodev
            operator: In
            values: ["v3" , "v4"]

4.3.2、node亲和性 + 软限制

容器创建必须在标签v3或v4中,如果没有v3或v4标签的节点,则随机分配到其他节点中

  ------------------------------------------------------------------------
  affinity: # 亲和性设置
    nodeAffinity: # 设置node亲和性
      preferredDuringSchedulingIgnoredDuringExecution: # 软限制
      - weight: 1
        preference:
          matchExpressions: # 匹配当前node节点标签是否有 ["v3" , "v4"]
          - key: nodev
            operator: In
            values: ["v3" , "v4"]    

4.3.3、pod 亲和性 + 硬限制

容器直接创建在指定 pod 中

  ------------------------------------------------------------------------
  affinity: #亲和性设置
    podAffinity: #设置pod亲和性
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
      - labelSelector:
          matchExpressions:  # 匹配podinfo的值在 [mayikt-pod03]中的标签
          - key: podinfo
            operator: In
            values: ["pod01"] 
        topologyKey: kubernetes.io/hostname

4.3.4、pod 反亲和性 + 硬限制

容器创建除了不会分配到以下指定的 pod,随机分发到其他 pod 中

  ------------------------------------------------------------------------
  affinity: #亲和性设置
    podAntiAffinity: #设置pod反亲和性
      requiredDuringSchedulingIgnoredDuringExecution: # 硬限制
      - labelSelector:
          matchExpressions:  # 匹配podinfo的值在 [mayikt-pod03]中的标签
          - key: podinfo
            operator: In
            values: ["pod01"] 
        topologyKey: kubernetes.io/hostname

五、副本 ReplicaSet

创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能

5.0、前置相关命令

# 创建命名空间
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit

# 查看执行命名空间下pods 
kubectl get pods -n mayikt-sit

# 查看指定命名空间下的 pods 详情
kubectl describe  pods -n mayikt-sit

# 查看执行命名空间下副本集
kubectl get rs mayikt-rp -n mayikt-sit -o wide 

5.1、副本yml配置

yml

apiVersion: apps/v1
kind: ReplicaSet
# 命名空间
metadata:
  name: mayikt-rp
  namespace: mayikt-sit
spec:
  # 创建副本数量
  replicas: 3 
  # 选择器,选择副本的标签,pod控制器与pod之间建立联系 (对应副本配置的标签) 
  selector:
    matchLabels:
      app: nginx-pod
  # 副本配置    
  template:
    # 副本中的容器标签
    metadata:
      labels:
        app: nginx-pod
    # 副本中的对应容器
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.9

命令

# 执行yml文件
kubectl create -f  mayikt-pod-controller01.yml

5.2、弹性扩容缩容

执行命令
会进入yml vi编辑模式, 修改 replicas 副本数量,保存后自动进行扩容缩容

kubectl edit rs mayikt-rp -n mayikt-sit

5.3、更新镜像

同扩容缩容操作,编辑副本 image 版本即可

kubectl edit rs mayikt-rp -n mayikt-sit

5.4、删除镜像

k8s删除ReplicaSet前,会将ReplicaSet的replicasclear调整为0,等待所有的Pod被删除后,在执行RS对象的删除。

kubectl delete rs mayikt-rp -n mayikt-sit

六、pod控制器 Deployment

Deployment 是 ReplicaSet 的二次封装,在原基础功能上增加的 滚动更新版本回退

6.0、前置相关命令

# 创建命名空间
kubectl delete ns mayikt-sit
kubectl create ns mayikt-sit

# 查看指定命名空间下pods 
kubectl get pods -n mayikt-sit
kubectl get pods -n mayikt-sit -w

# 查看指定命名空间下的 pods 详情
kubectl describe  pods -n mayikt-sit

# 查看执行命名空间下副本集
kubectl get deploy -n mayikt-sit -o wide

# 查看执行命名空间下副本
kubectl get rs -n mayikt-sit 

6.1、Deployment yml配置

apiVersion: apps/v1
kind: Deployment
# 命名空间配置
metadata:
  name: mayikt-deployment
  namespace: mayikt-sit
spec:
  # 副本数量
  replicas: 3
  # 选择器,选择副本的标签,pod控制器与pod之间建立联系 (对应副本配置的标签) 
  selector:
    matchLabels:
      app: nginx-pod
  # 副本配置
  template:
    # 副本中的容器标签
    metadata:
      labels:
        app: nginx-pod
    # 副本中的对应容器
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.9

命令

# 执行yml文件
kubectl create -f  mayikt-pod-controller01.yml

6.2、弹性扩容缩容

直接命令形式更改, 修改 replicas 副本数量,自动进行扩容缩容

kubectl scale deploy mayikt-deployment --replicas=6 -n mayikt-sit

6.3、更新镜像

直接命令形式更改, 修改 replicas 副本数量,自动进行扩容缩容

6.3.1、副本策略说明

  • Recreate 先杀掉所有已存在的Pod,在创建出新的Pod
  • RollingUpdate(滚动更新) 杀死一部分, 就启动一部分 存在两个版本Pod---- 同时支持版本回退
    RollingUpdate 下两个属性:
    maxUnavailable: 用来指定在升级过程中不可用Pod的最大数量,默认为25%。
    maxSurge: 用来指定在升级过程中 可以超过期望的Pod的最大数量,默认为25%。

6.3.2、重建更新配置

yml 中 spec 配置

spec:
  strategy: # 策略
    type: Recreate # 重建更新
  replicas: 3

6.3.3、滚动更新配置

yml 中 spec 配置

spec:
  strategy: # 策略
    type: RollingUpdate # 滚动更新
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25% 
  replicas: 3

6.3.4、更新命令

更新时根据配置策略来决定是 重建更新 还是 滚动更新

kubectl set image deploy mayikt-deployment nginx=nginx:1.17.8 -n mayikt-sit

6.4、版本回退

# 首次执行yml创建时需加上--record 让其支持版本回退
kubectl create -f  mayikt-pod-controller04.yml --record

# 查看版本更新状态
kubectl rollout status deploy mayikt-deployment -n mayikt-sit

# 查看历史更新记录
kubectl rollout history deploy mayikt-deployment -n mayikt-sit

# 版本回退 to-revision=11是对应的历史更新记录的版本号
kubectl rollout undo deployment mayikt-deployment --to-revision=1 -n mayikt-sit

# 查看执行命名空间下副本集
kubectl get deploy -n mayikt-sit -o wide

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s之三、pod 生命周期/ 探针/ 调度策略/ 副本ReplicaSet / 控制器Deployment 的相关文章

随机推荐

  • git push origin与git push -u origin master的区别

    git push origin 上面命令表示 将当前分支推送到origin主机的对应分支 如果当前分支只有一个追踪分支 那么主机名都可以省略 git push 如果当前分支与多个主机存在追踪关系 那么这个时候 u选项会指定一个默认主机 这样
  • 什么是区块链?

    原文出处 https mp weixin qq com s uzPoQBVkEy WVVS 1DFDoA 在今天 无论商业圈 科技圈还是金融圈 最热的词汇无非只有一个 那就是 区块链 我是黑马程序员的 无崖子 老师 下面我来介绍一下区块链的
  • Sentinel做服务熔断与限流,服务能被监控,但是监控列表为空的问题思考

    首先我觉得 服务和Sentinel不在同一台机器上面 本身是能够正常监控的 只要保证两台机器能够在一个内网中 能够互相连通即可 我在学习Sentinel的时候 我盲目使用云服务器的docker拉取Sentinel镜像 但是我开启了服务后 服
  • CV学习笔记 — 数据集预处理常用脚本总结

    笔者在学习计算机视觉时 需要经常借助脚本对数据集进行预处理 现将常用的脚本总结如下 1 批量修改文件后缀名 批量修改 import os import sys 需要修改后缀的文件目录 os chdir r H 葡萄 datasets JPE
  • 17.subplot():绘制网格区域中的几何形状相同的子区布局

    文章目录 1 函数subplot 的使用方法 2 在极坐标轴上绘制折线图 3 在极坐标轴上绘制散点图 4 在非等分画布的绘图区域上实现图形展示 subplot C R P 表示在C行R列的网格布局上 子区subplot 会被放置到第p个位置
  • 如何用Python提升未来竞争力?十年工作经验老程序员来告诉你。一般人我都不告诉他

    今年很多人在问一个问题 到底什么才是抗风险能力 稳定的工作 存款 理财 有人预测 到2030年 今天一半的工作岗位都将消失 关于哪些工作最先消失 李开复提出过 五秒钟准则 一项工作如果可以在5秒钟内作出相应决定 那就非常可能被人工智能取代
  • 【iOS】【最新】2023苹果开发者账号注册流程(公司类型)

    一 Apple Developer 申请开发者账号 Apple Developer 点击 Account 创建 Apple ID 最好新注册一个新的 专门用做开发 需要注意的是 开发者的名字和 ID 想好在填写 注册成功后 不能自己修改 需
  • Netty网络编程(一):初步了解

    文章目录 简介 netty介绍 netty的第一个服务器 netty的第一个客户端 运行服务器和客户端 总结 简介 我们常用浏览器来访问web页面得到相关的信息 通常来说使用的都是HTTP或者HTTPS协议 这些协议的本质上都是IO 客户端
  • Javaweb的request请求

    1请求数据 request getMethod 获取请求方法 request getContextPath 获取虚拟路径 request getRequestURI 获取url String类型 request getRequestURL
  • Linux环境下安装Hadoop(完全分布式)

    切换到安装目录 解压Hadoop压缩包 修改软件名称 hadoop配置 切换目录 将以下配置文件放在usr app hadoop2 7 3 etc hadoop 目录下 这里 的文件是老师配好的 配置hadoop环境 让hadoop环境配置
  • msvcp120.dll丢失的解决方法?哪种解决方法比较推荐?

    关于msvcp120 dll丢失的解决方法这个问题 小编最近也经常看到有人在提问 可能这是一个比较容易丢失的文件 小编就来给大家详细的分析一下 说说它的三种解决方法 方便大家以后遇到这种问题 自己知道怎么处理 msvcp120 dll丢失的
  • mc服务器server文件夹位置,MC server.properties文件详解

    注 这里true为开启 false为关闭 Minecraft server properties 标题注释 Wed Sep 05 19 27 44 CST 2018 保存时间 spawn protection 16 设置为0将不会禁用出生点
  • Innovus/Encounter时序报告解读

    最近在学report timing这个命令 发现自己对timing report的认知只停留在看slack和delay数值上 于是 决定研究一下这个report Innovus Encounter的report格式确实有点不按套路出牌 初看
  • Es中索引的删除操作

    package com atguigu es test import org apache http HttpHost import org elasticsearch action admin indices delete DeleteI
  • Unity Android 安装apk后显示两个app的问题

    简介 前些天使用Unity打Android包的时候 安装到手机上 出现了两个icon一样的引用 分别点开后 启动的application不一致 原因 在项目中接入了一些SDK SDK的AndroidManifest文件中有个Applicat
  • webpack之引入css

    前言 本文演示了如何打包css文件 涉及到的loader css loader style loader css loader的任务 把css文件作为模块打包 style loader的任务 把打包好的css文件动态的插入到html文件的
  • js中获取token的函数

    1 从cookies获取 从Cookies中获取token function getToken var strcookie document cookie 获取cookie字符串 var arrcookie strcookie split
  • 功能安全专题之功能安全概念阶段

    目录 前言 1 基本概念 1 1 相关项定义 Item Definition 1 2 相关项的构成 1 3 危害分析与风险识别 Hazard Analysis Risk Assessment 1 4 危害与危害事件 Hazard and H
  • Mysql进阶四:常见函数-流程控制函数

    进阶四 流程控制函数 作者 alicomon 寄语读者 博客为学习记录 目的有二 记录知识点 方便温故知新 为读者提供帮助 用于交流 共同提高 流程控制函数 可好玩了 1 if函数 if else 函数 SELECT IF 10 gt 5
  • k8s之三、pod 生命周期/ 探针/ 调度策略/ 副本ReplicaSet / 控制器Deployment

    pod 生命周期官方文档 https kubernetes io zh cn docs concepts workloads pods pod lifecycle 一 容器初始化 创建当前pod容器前 先创建 依赖的其他 container