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 调度详解

调度2字的意思是针对这个pod的,pod被调度在哪一个节点上,有什么决定的

k8s的调度策略:

  • 首先过滤掉不满足条件的节点(自己可以指定规则,淘汰哪些节点不能运行这个pod)

  • 从通过的节点进行优先排序

  • 从中选择优先级别最高的节点,运行这个pod

我们来详细讲一下这个规则,有很多种

nodename 主机名进行调度

这个非常的直接,就是选择指定的主机名进行调度,当然这个不是最优解,因为如果是一个控制器的话,那岂不是所有的pod都调度在这个节点上面

NodeSelector 主机标签名进行调度

根据节点上面的标签进行调度,这个节点有app标签,pod就调度在这个节点上面

污点和容忍度

这个有点意思

污点是干什么的呢?

  • 设置在节点上面,主要就是防止pod调度在设置污点的节点上的

污点三个等级

  • PreferNoSchedule 这个是最轻的等级,就是尽量不要调度在我这个节点,但是其他节点都不满足的话,还是能调度在我这个节点上面的

  • NoSchedule 新的pod不要调度在我这个节点上,原来已经在我这个节点上的pod保持不变

  • NoExecute 这个是最重量级别等级,就是所有pod全部驱除,新旧pod全部赶走,不要在我这个节点上运行

上面就是污点的讲解,那节点上有污点的设置,我还是想要在这个节点上运行呢?其实有办法的,就是容忍度,容忍这个污点的存在,依然调度在有污点的节点上

tolerations 这个字段来设置容忍度

操作符

  • Equal 就是key和value必须相等

  • Exists的话就是只关心这个key存在即可,不关心这个值

容忍所有污点,就是只写Exists ,其他key和value和effect都不写

还有一个亲和性调度策略,这个就是一个更加高级的用法,比标签选择器支持更多的操作,逻辑与和逻辑或这些

主要分为2个节点亲和性和pod亲和性

节点亲和性:根据节点上的有哪些标签来进行调度

  • 硬亲和性:必须满足标签才能在这个节点上进行调度

  • 软亲和性:就是没有标签合适的,还是能够调度在这个上面,不可控的

pod亲和性:根据pod上的标签来进行调度,和上面的大差不差

主要就是这个反亲和性比较的重要,就是关于存储数据的pod,肯定不能运行在同一个节点上面,否则节点挂了,数据也挂了

因此的话反亲和性就是:主要的目的就是打散pod,分布在不同的节点上面

一个deploy2个副本,标签为app,就选择自己的标签,就是不要运行在含有app的标签的pod上运行该pod,这样做的目的就是将2个pod分布在不同的节点上面

k8s存储详解

k8s网络服务

k8s网络模型

三个基本条件:

  • 所有pod都可以与其他pod直接通信:通过cni插件(calico),每个节点维护路由表,知道哪些pod位于哪个节点

  • 所有node可以与pod直接通信:节点通过虚拟网桥cni0或者路由连接到pod网络

  • pod看到的ip,其他节点看到的也是同一个ip(pod ip全局可达,不变)

四个目标:

  • 同一个pod内多个容器间通信

  • pod之间通信,有可能同一个节点或者不同节点

  • service到pod之间的通信,svc作为pod的稳定访问入口,提供了负载均衡能力,解决了pod地址易变的问题

  • 集群外部和service之间的通信,允许外部客户端访问集群内部服务

k8s svc详解

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