• k8s 转载:https://mp.weixin.qq.com/s/2XDtMeMoEdoGC4xaCfAwAw


    4. k8s service 类型?

    ClusterIP 集群内部容器访问地址,会生成一个虚拟 IP 与 pod 不在一个网段。

    NodePort 会在宿主机上映射一个端口,供外部应用访问模式。

    Headless CluserIP 无头模式,无 serviceip,即把 spec.clusterip 设置为 None 。

    LoadBalancer 使用外部负载均衡。

    5. pod 之间如何通信?

    pod 内部容器之间,这种情况下容器通讯比较简单,因为 k8s pod 内部容器是共享网络空间的,所以容器直接可以使用 localhost 访问其他容器。k8s 在启动容器的时候会先启动一个 pause 容器,这个容器就是实现这个功能的。

    pod 与 pod 容器之间,这种类型又可以分为两种情况:

    两个 pod 在一台主机上面,两个 pod 分布在不同主机之上 针对第一种情况,就比较简单了,就是 docker 默认的 docker 网桥互连容器。

    第二种情况需要更为复杂的网络模型了,k8s 官方推荐的是使用 flannel 组建一个大二层扁平网络,pod 的 ip 分配由 flannel 统一分配,通讯过程也是走 flannel 的网桥。

    6. k8s 健康检查方式

    存活性探针(liveness probes)和就绪性探针(readiness probes) 用户通过 Liveness 探测可以告诉 Kubernetes 什么时候通过重启容器实现自愈;Readiness 探测则是告诉 Kubernetes 什么时候可以将容器加入到 Service 负载均衡池中,对外提供服务。语法是一样的。

    7. k8s pod 状态

    Pod --Pending 状态

    Pending 说明 Pod 还没有调度到某个 Node 上面。可以通过 kubectl describe pod命令查看到当前 Pod 的事件,进而判断为什么没有调度。可能的原因包括

    资源不足,集群内所有的 Node 都不满足该 Pod 请求的 CPU、内存、GPU 等资源。

    HostPort 已被占用,通常推荐使用 Service 对外开放服务端口

    Pod --Waiting 或 ContainerCreating 状态

    首先还是通过 kubectl describe pod 命令查看到当前 Pod 的事件。可能的原因包括

    镜像拉取失败,比如配置了镜像错误、Kubelet 无法访问镜像、私有镜像的密钥配置错误、镜像太大,拉取超时等。

    CNI 网络错误,一般需要检查 CNI 网络插件的配置,比如无法配置 Pod 、无法分配 IP 地址

    容器无法启动,需要检查是否打包了正确的镜像或者是否配置了正确的容器参数。

    Pod -- ImagePullBackOff 状态

    这也是我们测试环境常见的,通常是镜像拉取失败。这种情况可以使用 docker pull  来验证镜像是否可以正常拉取。

    或者 docker images | grep 查看镜像是否存在(系统有时会因为资源问题自动删除一部分镜像),

    Pod -- CrashLoopBackOff 状态

    CrashLoopBackOff 状态说明容器曾经启动了,但可能又异常退出了。此时可以先查看一下容器的日志 kubectl logskubectl logs --previous

    这里可以发现一些容器退出的原因,比如

    容器进程退出 健康检查失败退出 Pod --Error 状态

    通常处于 Error 状态说明 Pod 启动过程中发生了错误。常见的原因包括

    依赖的 ConfigMap、Secret 或者 PV 等不存在。请求的资源超过了管理员设置的限制,比如超过了 LimitRange 等。

    违反集群的安全策略,比如违反了 PodSecurityPolicy 等。

    容器无权操作集群内的资源,比如开启 RBAC 后,需要为 ServiceAccount 配置角色绑定。

    Pod --Terminating 或 Unknown 状态 从 v1.5 开始,Kubernetes 不会因为 Node 失联而删除其上正在运行的 Pod,而是将其标记为 Terminating 或 Unknown 状态。想要删除这些状态的 Pod 有三种方法:

    从集群中删除该 Node。使用公有云时,kube-controller-manager 会在 VM 删除后自动删除对应的 Node。而在物理机部署的集群中,需要管理员手动删除 Node(如 kubectl delete node。Node 恢复正常。Kubelet 会重新跟 kube-apiserver 通信确认这些 Pod 的期待状态,进而再决定删除或者继续运行这些 Pod。用户强制删除。用户可以执行 kubectl delete pods--grace-period=0 --force 强制删除 Pod。除非明确知道 Pod 的确处于停止状态(比如 Node 所在 VM 或物理机已经关机),否则不建议使用该方法。特别是 StatefulSet 管理的 Pod,强制删除容易导致脑裂或者数据丢失等问题。

    Pod -- Evicted 状态

    出现这种情况,多见于系统内存或硬盘资源不足,可 df-h 查看 docker 存储所在目录的资源使用情况,如果百分比大于 85%,就要及时清理下资源,尤其是一些大文件、docker 镜像。

    8. k8s 资源限制

    对于一个 pod 来说,资源最基础的 2 个的指标就是:CPU 和内存。Kubernetes 提供了个采用 requests 和 limits 两种类型参数对资源进行预分配和使用限制。

    limit 会限制 pod 的资源利用:

    当 pod 内存超过 limit 时,会被 oom。当 cpu 超过 limit 时,不会被 kill,但是会限制不超过 limit 值。

  • 相关阅读:
    正则表达式在行首添加指定内容
    linux之find命令详解
    一次安装rpcbind失败引发的思考
    配置linux实现路由功能
    chkconfig命令详解
    1225 数数字
    蛇形填数 ------- 模拟水题
    开灯问题---------简单模拟
    单源最短路径
    图的表示方式
  • 原文地址:https://www.cnblogs.com/testzcy/p/12981907.html
Copyright © 2020-2023  润新知