• k8s 基础


    一、核心技术 Pod

    1. Pod的基本概念

    • k8s中的最小部署单元
    • 一个 Pod 包含一个或多个容器
    • 一个 Pod 中的容器共享网络命名空间
    • Pod 声明周期是短暂的,随容器的调度二产生

    2. Pod存在的意义

    • Pod 是多进程设计,运行多个应用程序;一个 Pod 有多个容器,一个容器运行一个应用程序
    • Pod 存在为了亲密性应用
      • 两个应用之间进行交互
      • 两个应用之间网络调用

    3. Pod 实现机制

    Pod 主要有两大机制 共享网络共享存储;如下:

    • 网络共享:通过 Pause 容器,将其他的业务容器加入到 Pause 容器里面,让所有的业务容器在统一个名称空间中进行实现网络共享
    • 共享存储:引入数据卷 Volumn 概念;进行存储共享(数据卷也可做实体化宿主机数据)

    4. Pod 镜像拉取策略

    我们可以使用资源文件的 yaml 文件对容器的镜像拉取策略进行限制;如下:

    spec:
      containers:
        - name: xxx
          image: xxx
          imagePullPolicy: Always
    # 拉取策略如下:
    # 	IfNotPresent: 默认值,镜像在宿主机不存在时进行拉取
    # 	Always: 每次创建Pod时都会进行拉取
    # 	Never: 从来都不进行拉取
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5. Pod 资源限制策略

    我们在进行 containers 进行配置容器时,进行资源限制;如下:

    spec:
      containers:
        - name: xxx
          image: xxx
          imagePullPolicy: Always
          resources:
          	requests:
          	  memory: "64Mi"
          	  cpu: "250m"
          	limits:
          	  memory: "128Mi"
          	  cpu: "500m"
    # 其中 requests 中的 memory、cpu 是创建 pod 的最低限制,而 limits 中的则是最大限制
    # 这里的 cpu: 1c = 1000m
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    6. Pod 重启策略

    配置容器的重启策略,如下:

    spec:
      containers:
        - name: xxx
          image: xxx
          imagePullPolicy: Always
      restartPolicy: Always
    # 重启策略:
    # 	Always: 默认值,容器终止退出后,总是重启
    # 	OnFailure: 容器异常退出(退出状态码非0)时,重启
    # 	Never: 当容器终止退出,从不重启容器
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    7. Pod 健康检查

    Pod 有2种探测类型:

    • livenessProbe(存活性探测):检测容器是否处于 Running 状态;若 liveness 探测到容器不健康时,通过 kubelet 杀掉该容器,并根据重启策略进行后续处理
    • readinessProbe(就绪性探测):检测容器是否能正常对外提供服务;若 readiness 探测结果为不健康,则会将这个容器从接入层 serviceEndpoint 中移除掉,直到下一次判断成功,才会将这个容器再次挂回到相应的 Endpoint

    探测方式有 3 种方式:

    • exec:通过执行容器中的一个命令来判断服务是否正常,命令返回值为0则表示容器是健康的
    • httpGet:通过发送http Get请求来进行判断,若返回200-399状态码时,则表示容器是健康的
    • tcpSocket:通过探测容器的 IP 和 Port,执行TCP健康检查,若这个TCP的链接能够正常被建立,则表示容器是健康的

    有 3 种探测结果:

    • Success:表示 container 通过了健康检查
    • Failure:表示 container 没有通过健康检查。若未通过检查,则会做一个相应处理,Readiness 处理方式就是,在 service 层将没有通过 Readiness 检查的 pod 进行摘除,而 Liveness 就是将这个 pod 进行重新拉起或删除
    • Unknown:表示说当前这次检查操作没有完整执行,可能是因为超时或一些脚本没有及时返回。此时Readiness-probeLiveness-probe 不做任何操作,会等待下一次的机制来进行检验

    探测相关参数:

    • initialDelaySeconds:在Pod容器启动多少秒后再检测。比如JAVA应用, 涉及jvm及其jar加载,启动时间会较长
    • periodSeconds:探测的间隔时间,默认为10秒。
    • timeoutSeconds:探测的超时时间,默认为1秒。当超时时间之内没有检测成功,则会认为是一个失败状态。
    • successThreshold:从探测失败到再一次判断探测成功的连续次数。比如为2,表示失败后,下面2次都成功,才表示正常
    • failureThreshold:探测失败的重试次数,默认为3次。

    Exec方式:
    条件:当探测到Pod容器里的/tmp/healthy文件不存在时,认为容器运行不正常;
    场景:创建Pod后,等30s,/tmp/healthy文件被删掉后,liveness就会检测到POD容器运行不正常,并尝试重启容器

    spec:
      containers:
      - name: liveness-test
        image: busybox:latest
        command: ["/bin/sh","-c","touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"]
        livenessProbe:
          exec:
            command: ["test","-e","/tmp/healthy"]
          initialDelaySeconds: 1
          periodSeconds: 3
      restartPolicy: Always
    # readinessProbe 探测只需要将 livenessProbe 替换为 readinessProbe
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    httpGet方式:
    条件:当探测到 http://容器:80/index.html 网页不能访问时,认为容器运行不正常
    场景:创建 Pod 后,进入 Pod 容器,手动删除index.html文件。由于网页不能访问,所以会检测到Pod容器运行不正常(处于终止状态),并尝试重启容器

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-liveness-http
    spec:
      containers:
      - name: liveness
        image: ikubernetes/myapp:v1
        ports:
        - name: http
          containerPort: 80
        livenessProbe:
          httpGet:
            port: http
            path: /index.html
          initialDelaySeconds: 1
          periodSeconds: 3
      restartPolicy: Always
    # readinessProbe 探测只需要将 livenessProbe 替换为 readinessProbe
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    另一种方式用的不多暂时不做演示

  • 相关阅读:
    【Redis数据库百万字详解】数据类型
    Python ArcPy批量掩膜、重采样大量遥感影像
    Spring Cloud项目(三)——实现Nacos数据信息持久化到MySQL
    安卓百度地图之步行路径规划
    Docker 部署 PostgreSQL 服务
    【java期末复习题】第10章 Java输入与输出
    Xcode14.3.1 真机调试iOS17的方法(无iOS17 DeviceSupport)
    【ACM】前言(1)
    Spring Cloud Eureka:服务注册与发现
    java.lang.Float类下equals()方法具有什么功能呢?
  • 原文地址:https://blog.csdn.net/qq_35530330/article/details/126101908