• Kubernetes Pod


    一、Kubernetes Pod 生命周期

    Pod 的 status 定义在 PodStatus 对象中,其中有一个 phase 字段

    下面是 phase 可能的值:

    • 挂起(Pending):Pod 已被 Kubernetes 系统接受,但有一个或者多个容器镜像尚未创建。等待时间包括调度 Pod 的时间和通过网络下载镜像的时间,这可能需要花点时间。
    • 运行中(Running):该 Pod 已经绑定到了一个节点上,Pod 中所有的容器都已被创建。至少有一个容器正在运行,或者正处于启动或重启状态。
    • 成功(Succeeded):Pod 中的所有容器都被成功终止,并且不会再重启。
    • 失败(Failed):Pod 中的所有容器都已终止了,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或者被系统终止。
    • 未知(Unknown):因为某些原因无法取得 Pod 的状态,通常是因为与 Pod 所在主机通信失败。

    二、kubernetes (k8s)Pod容器探针和重启策略

    探针 是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler。有三种类型的处理程序:

    ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
    TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
    HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。

    每次探测都将获得以下三种结果之一:

    成功:容器通过了诊断。
    失败:容器未通过诊断。
    未知:诊断失败,因此不会采取任何行动。

    Kubelet 可以选择是否执行在容器上运行的两种探针执行和做出反应:

    livenessProbe(存活探测):
    指示容器是否正在运行。如果存活探测失败,则 kubelet 会杀死容器,并且容器将受到其 重启策略 的影响。如果容器不提供存活探针,则默认状态为 Success。

    readinessProbe(就绪探测):

    指示容器是否准备好服务请求。如果就绪探测失败,端点控制器将从与 Pod 匹配的所有 Service 的端点中删除该 Pod 的 IP 地址。初始延迟之前的就绪状态默认为 Failure。如果容器不提供就绪探针,则默认状态为 Success。

    该什么时候使用存活(liveness)和就绪(readiness)探针?

    如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,则不一定需要存活探针; kubelet 将根据 Pod 的restartPolicy 自动执行正确的操作。

    如果您希望容器在探测失败时被杀死并重新启动,那么请指定一个存活探针,并指定restartPolicy 为 Always 或 OnFailure。

    如果要仅在探测成功时才开始向 Pod 发送流量,请指定就绪探针。在这种情况下,就绪探针可能与存活探针相同,但是 spec 中的就绪探针的存在意味着 Pod 将在没有接收到任何流量的情况下启动,并且只有在探针探测成功后才开始接收流量。

    如果您希望容器能够自行维护,您可以指定一个就绪探针,该探针检查与存活探针不同的端点。

    请注意,如果您只想在 Pod 被删除时能够排除请求,则不一定需要使用就绪探针;在删除 Pod 时,Pod 会自动将自身置于未完成状态,无论就绪探针是否存在。当等待 Pod 中的容器停止时,Pod 仍处于未完成状态。

    三、重启策略:
    Pod的重启策略包括:Always、OnFailure和Never,默认值为Always:

    Always: 当容器失效时,由kubelet自动重启该容器。
    OnFailure: 当容器终止运行且退出码不为0时,由kubelet自动重启该容器。
    Never: 不论容器运行状态如何,kubelet都不会重启该容器。

    四、Pod 配置内存申请和限制

    给容器配置内存申请,只要在容器的配置文件里添加resources:requests就可以了。配置限制的话, 则是添加resources:limits.

    apiVersion: v1
    kind: Pod
    metadata:
    name: memory-demo
    spec:
    containers:
    - name: memory-demo-ctr
    image: vish/stress
    resources:
    limits:
    memory: "200Mi"
    requests:
    memory: "100Mi"
    args:
    - -mem-total
    - 150Mi
    - -mem-alloc-size
    - 10Mi
    - -mem-alloc-sleep
    - 1s

    如果不配置内存限制
    如果不给容器配置内存限制,那下面的任意一种情况可能会出现:

    容器使用内存资源没有上限,容器可以使用当前节点上所有可用的内存资源。
    容器所运行的命名空间有默认内存限制,容器会自动继承默认的限制。集群管理员可以使用这个文档 LimitRange来配置默认的内存限制。

    五、Pod 声明内存申请和限制
    给容器声明一个CPU请求,只要在容器的配置文件里包含这么一句resources:requests就可以, 声明一个CPU限制,则是这么一句resources:limits.

    六、Kubernetes 给 Pod 配置服务质量(QoS)等级

    QoS 等级
    当 Kubernetes 创建一个 Pod 时,它就会给这个 Pod 分配一个 QoS 等级:

    • Guaranteed
    • Burstable
    • BestEffort

    1.> 想要给 Pod 分配 QoS 等级为 Guaranteed:

    Pod 里的每个容器都必须有内存限制和请求,而且必须是一样的。
    Pod 里的每个容器都必须有 CPU 限制和请求,而且必须是一样的

    当出现下面的情况时,则是一个 Pod 被分配了 QoS 等级为 Burstable :

    2.> 该 Pod 不满足 QoS 等级 Guaranteed 的要求。
    Pod 里至少有一个容器有内存或者 CPU 请求。

    3.> 要给一个 Pod 配置 BestEffort 的 QoS 等级, Pod 里的容器必须没有任何内存或者 CPU 的限制或请求。

    参考文档: http://docs.kubernetes.org.cn/719.html

  • 相关阅读:
    5 静态链接和动态链接
    4 程序编译与链接
    3.死锁
    2.调度算法
    1 select,poll和epoll
    python语言特性
    python动态规划
    python语言编程算法
    链表
    认识黑客常用的入侵方法
  • 原文地址:https://www.cnblogs.com/saneri/p/15015990.html
Copyright © 2020-2023  润新知