joeの小窝

Loading...

k8s 资源复习

pod

pod基本介绍

  • 在kubernetes中,pod是最基本的单元,也是最小的单元,我们之前总是听说有这个控制器,其实这个控制器控制的也是pod

  • 所以说pod是kubernetes中最重要的一个资源对象,它是一个namespace级别的对象

  • pod是什么呢?里面包含了一个或者多个容器,可以看成有多个进程在这个pod里面执行任务

  • 创建一个pod,就相当于是在宿主机上面创建一个虚拟机,专门用来跑一个任务的

  • 为什么一定要用pod呢?不用容器呢?

    • 为了打包和配套业务,业务容器+日志采集+监控+网络代理

    • 这些辅助容器和业务容器必须同 IP、同网络、一起启停,用 Pod 封装刚刚好

    • 管理方便,只需要管理pod,pod里面有多个容器

  • 最重要的一个点就是sidecar容器

    • 每次创建pod,里面都会有一个这个容器

    • 共享同一个网络,多个容器在一个pod的里面时,共享同一个ip地址

    • 共享同一个存储,同一个pid,同一个命名空间

    • sidecar不提供业务,只是一个辅助的功能

pod基本参数设置

介绍pod各种参数的设置

上文提到过,创建一个pod,就相当于是创建一个极简版虚拟机,那么就会有这网络,存储,镜像这些方面的问题

pod 镜像拉取三个策略

Always策略,设置了这个参数的话,每次从网上拉取最新的镜像,不管你的本地有没有这个镜像,他都会从网上拉取最新的镜像,时效性

IfNotPresent策略,先从本地拉取,本地如果没有的话,就需要从网上进行拉取,这个是最常见的选项

Never策略,从来不上网,只从本地拉取镜像

hostnetwork 参数

这个就是用来控制pod的ip地址,没有这个参数的话,创建的pod就是从calico网络插件里面分配这个ip地址,但是如果不想这样的话,就需要使用这个hostnetwork参数

这个参数的唯一作用就是将pod的ip设置为宿主机的ip地址,直接使用宿主机的网路,而不是走的pod网络

env 环境变量参数

直接为pod注入环境变量,可以直接使用的

# 启动一个mysql容器,是需要传入环境变量,才能启动的
kubectl run m1 --image mysql --image-pull-policy IfNotPresent --dry-run=client -o yaml > msyql.yml  --env="MYSQL_ROOT_PASSWORD=123" --env="MYSQL_DATABASE=test_k8s" 


bash-5.1# mysql -uroot -p123 

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test_k8s           |
+--------------------+

dnsPolicy 参数配置

ClusterFirst策略:优先使用集群的core-dns,失败的话,使用宿主机的dns

Default策略:使用的是宿主机的dns,调度在哪一个节点上面就使用该节点的dns

none 策略:忽略集群dns,使用自己指定的dns配置,需要结合dnsConfig指定dns

clusterfirstwithhostnet: 就是如果pod使用的是ip是宿主机的ip(结合hostnetwork参数),默认策略是使用集群的dns 10.96.0.10

重启策略(restartPolicy)

Always策略:容器正常退出后,总是重启

OnFailure:容器异常退出,就是非0退出时,重启

Never: 从不重启

健康检查

三个探针,判断容器的存活,应用是否能够提供

  • Start Probe 启动探针,1.16版本出来的,这个优先级是最高的,判断容器内的应用是否已启动成功

    • 专门给启动很慢的应用用的,java,mysql,中间件

    • 这个启动探针没有成功的话,liveness,readiness都不生效

    • 主要的目的就是给足启动的时间,避免还没启动就被存活探针误杀重启,启动探针失败次数超限,认为启动失败,重启pod

    • 案例:比如 MySQL、Java 微服务启动要 60 秒

      • 不加启动探针:Liveness 等个 10 秒没就绪,直接把 Pod 杀掉重启,无限死循环

      • 加了启动探针:给它 60~120s 启动宽限期,期间不判活、不杀,等它起来之后再开启存活、就绪探针

  • Liveness Probe 存活探针

    • 判断容器进程是否卡死,崩溃,假死,判断容器是否存活

    • 判断失败,重启

  • Readiness Probe 就绪探针

    • 检测容器是否能够正常的对外提供服务

    • 探测失败的话,将pod从svc的后端端点删除,不转发到这个pod上

    • pod不重启,只是暂时不接收请求

三个探测方式

  • HTTPGet: 访问pod的接口url,返回2,3开头的才能成功

  • TCP: 测试端口能不能通,3306,80这些

  • Exec: 在容器里面执行命令,返回码为0成功

初始化容器 initcontainers

  • 为主容器准备数据的,提前准备一些数据

  • 启动容器结束才能执行后面的主容器启动

资源配额 resources

  • requests 最少需要多少资源才能跑这个pod

  • limits 容器最多能吃多少资源,超过这限制就杀死

  • cpu: 100m = 0.1 核,memory: 128Mi = 128MB 内存

k8s控制器

控制器和pod的最主要区别就是,单个pod被删除的话,就彻底被删除了,但是控制器控制的pod,被删除的话,会重新再次创建一个pod,不会彻底删除,除非删除控制器,pod就会被彻底删除

控制器主要是通过标签来控制自己的pod,具有相同标签的pod视为一组,被控制器管理着

deploy控制器

最常见的控制器,频繁的使用

更新的策略,重建,滚动更新策略2种

  • 滚动更新(RollingUpdate),maxSurge和maxUnavailable 2个参数一起控制

  • maxSurge就是先创建多少个,在删除多少个,更新的时候,允许超过最大副本数量

  • maxUnavailabe 允许不可用最大pod数,先删除pod,然后创建pod,最多允许几个不可用,这个一般设置为0,不可用的数量为0,也就是全部都可用

  • 默认值都是25%,最优解配置

# 3个副本数量,滚动更新策略25%

# 3*25% =0.75 向下取整数 就是0, 允许最多不可用数量为0个,也就是全部可用

# 3*25% =0.75 向上取整数 就是1  允许超过副本数量的1个



金丝雀发布(灰度发布)

  • v1版本在提供业务,更新了一个v2版本,需要替换v1版本,替换的流程

  • 不会全部替换掉,就是在更新的时候,先创建一部分的v2的pod出来

  • 然后暂停更新,测试这个v2版本的pod能不能提供正常的业务访问

  • 如果测试没有问题的话,就是继续更新,逐步的替换v1版本的pod

Statefulset控制器

这个控制器是有序的,就是名字都是有序的,唯一的标识符,0,1,2这种的

串行的启动pod数量,就是先创建一个pod,然后再来创建第二个pod

创建这个控制器还需要提供一个无头服务,headless service

apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  clusterIP: None  # 设置为none就是 headless svc
  selector:
     app: web1
  ports:
    - port: 80
      targetPort: 80

访问这个服务,会返回一系列的pod的对应的dns

daemonset控制器

就是在每个节点上面运行一个pod,有且只有一个pod,不会有多余的pod

适用的场景就是监控,日志收集,网络插件等

job控制器

专门用来跑一次性任务的,正常的退出,不会重启pod

cronjob控制器

定时创建job任务,job再去跑pod里面的任务

k8s 调度详解

k8s存储详解

k8s svc详解

posted @ 2026-05-15 16:42  乔的港口  阅读(2)  评论(0)    收藏  举报