跳转至

注意事项

本地磁盘限制

防止将宿主机的磁盘撑满,导致宿主机不可用。

ephemeral-storage

ephemeral-storage 包括:

  • emptyDir volumes, except tmpfs emptyDir volumes
  • directories holding node-level logs
  • writeable container layers

在每个Kubernetes的节点上,kubelet的根目录(默认是/var/lib/kubelet)和日志目录(/var/log)保存在节点的主分区上,这个分区同时也会被Pod的EmptyDir类型的volume、容器日志、镜像的层、容器的可写层所占用

  • kubelet会统计当前节点的主分区的可分配的磁盘资源,或者可以覆盖节点上kubelet的配置来自定义可分配的资源。
  • 在创建Pod时会根据存储需求调度到满足存储的节点,在Pod使用超过限制的存储时会对其做驱逐的处理来保证不会耗尽节点上的磁盘空间。

注意事项:

  • 如果k8s的根目录(kubelet root-dir)跟容器镜像存储根目录(/var/lib/{docker})是单独挂载的磁盘(非root盘),则通过 kubectl 查看 node 的 ephemeral-storage 只会显示根分区(/) 的存储空间。
  • The kubelet will only track the root filesystem for ephemeral storage. OS layouts that mount a separate disk to /var/lib/kubelet or /var/lib/containers will not report ephemeral storage correctly.
  • 在申请资源的时候,可能会出问题(因为总的资源量结果不对)

  • K8s 1.22 版本及之后,允许容器镜像存储根目录(/var/lib/{docker})单独挂载盘,如果镜像可写层超过限制,可以正常被驱除;

使用示例 Pod:

resources:
  requests:
    cpu: 1
    memory: 2048Mi
    # k8s 1.8开始引入的特性,限制容器存储空间的使用
    ephemeral-storage: 2Gi
  limits:
    cpu: 2
    memory: 2048Mi
    ephemeral-storage: 5Gi

当ephemeral-storage超出限制时,kublet会驱除当前容器

Pod 内的容器不会被重启(不会受 restartPolicy 影响,也不会受存活等探针影响),因此需要配合 deployment 等使用,由 deployment 重新创建 Pod;

  • 已经 restart 过,但是有错误信息,reason状态导致不会继续重启(k8s 1.22版本),参考Pod驱除
  • get pods -o yaml信息如下:
status:
  - lastProbeTime: null
    lastTransitionTime: "2024-02-04T09:31:31Z"
    reason: PodFailed
    status: "False"
    type: Ready
  - ...
  containerStatuses:
  - image: nginx
    ...
    ready: false
    restartCount: 1
    started: false
    state:
      terminated:
        exitCode: 137
        finishedAt: null
        message: The container could not be located when the pod was terminated
        reason: ContainerStatusUnknown
        startedAt: null
  message: 'Pod ephemeral local storage usage exceeds the total limit of containers 1Gi. '
  phase: Failed
  qosClass: Burstable
  reason: Evicted

查看事件时如下:

  Warning  Evicted    27s    kubelet            Pod ephemeral local storage usage exceeds the total limit of containers 1Gi.
  Normal   Killing    27s    kubelet            Stopping container nginx

Event 持久化

Event作为kubernetes的一个对象资源,记录了集群运行所遇到的各种大事件,有助于排错,但大量的事件如果都存储在etcd中,会带来较大的性能与容量压力,所以 etcd 中默认只保存最近1小时的。

k8s集群规模的增加,集群内的object数量也与日俱增,那么events的数量也会伴随其大量增加,那么当用户请求这些events的时候apiserver的负载压力就会增加,很可能造成 apiserver 处理请求延迟,可以将 events 持久化,通过 webhook 拦截用户请求。

eventrouter

A simple introspective kubernetes service that forwards events to a specified sink.

ADD或者 Update的事件,以及对应的 newEventoldEvent,发送给Sink。

  • 通过 informers.NewSharedInformerFactory进行监听和处理;
  • 统计 NormalWARNING相同的次数,给prometheus使用;

kubewatch

kubewatch is a Kubernetes watcher that currently publishes notification to available collaboration hubs/notification channels. Run it in your k8s cluster, and you will get event notifications through webhooks.

supported webhooks:

  • slack, slackwebhook, hipchat, mattermost, flock, cloudevent
  • webhook
  • smtp

可以配置监听不同的资源,

resource:
  deployment: false
  replicationcontroller: false
  replicaset: false
  daemonset: false
  services: true
  pod: true
  job: false
  node: false
  clusterrole: false
  clusterrolebinding: false
  serviceaccount: false
  persistentvolume: false
  namespace: false
  secret: false
  configmap: false
  ingress: false

kube-eventer

kube-eventer emit kubernetes events to sinks.

支持的Sink

Sink Name Description
dingtalk sink to dingtalk bot
sls sink to alibaba cloud sls service
elasticsearch sink to elasticsearch
honeycomb sink to honeycomb
influxdb sink to influxdb
kafka sink to kafka
mysql sink to mysql database
wechat sink to wechat
webhook sink to webhook
mongodb sink to mongodb