k8s列出所有未配置探针的deployment

在 Kubernetes 中,探针(Probes)用于检测容器的健康状态,主要包括以下三种:

  1. Liveness Probe(存活探针):检测容器是否正在运行。
  2. Readiness Probe(就绪探针):检测容器是否准备好接收流量。
  3. Startup Probe(启动探针):检测容器是否已完成启动。

如果 Deployment 未配置这些探针,可能会导致容器在异常状态下继续运行或接收流量。因此,列出所有未配置探针的 Deployment 是一个常见的运维需求。


列出所有未配置探针的 Deployment

以下是一个 Shell 脚本,用于列出 Kubernetes 集群中所有未配置探针的 Deployment:

bash 复制代码
#!/bin/bash

# 设置命名空间(默认为所有命名空间)
NAMESPACE="${1:-}"

# 获取所有 Deployment
if [[ -z "$NAMESPACE" ]]; then
  DEPLOYMENTS=$(kubectl get deployments --all-namespaces -o json)
else
  DEPLOYMENTS=$(kubectl get deployments -n "$NAMESPACE" -o json)
fi

# 解析 Deployment
echo "$DEPLOYMENTS" | jq -r '
  .items[] | 
  select(
    (.spec.template.spec.containers[]? | 
      (.livenessProbe? == null) and 
      (.readinessProbe? == null) and 
      (.startupProbe? == null)
    )
  ) | 
  "Namespace: \(.metadata.namespace) | Deployment: \(.metadata.name)"
'

脚本说明

  1. 参数说明

    • NAMESPACE:可选参数,指定要检查的命名空间。如果不指定,则检查所有命名空间。
  2. 获取 Deployment

    • 使用 kubectl get deployments 获取所有 Deployment 的 JSON 格式数据。
  3. 过滤未配置探针的 Deployment

    • 使用 jq 解析 JSON 数据,筛选出未配置 livenessProbereadinessProbestartupProbe 的 Deployment。
  4. 输出结果

    • 输出未配置探针的 Deployment 的命名空间和名称。

使用方法

  1. 安装依赖

    • 确保已安装 kubectljq

    • 安装 jq

      bash 复制代码
      # Ubuntu/Debian
      sudo apt-get install jq
      
      # CentOS/RHEL
      sudo yum install jq
      
      # macOS
      brew install jq
  2. 运行脚本

    • 检查所有命名空间:

      bash 复制代码
      ./check-probes.sh
    • 检查指定命名空间(如 default):

      bash 复制代码
      ./check-probes.sh default
  3. 示例输出

    Namespace: default | Deployment: my-app
    Namespace: kube-system | Deployment: coredns
    

扩展功能

  1. 列出未配置特定探针的 Deployment

    如果需要单独检查未配置 livenessProbereadinessProbestartupProbe 的 Deployment,可以修改 jq 过滤条件。例如:

    • 仅检查未配置 livenessProbe 的 Deployment:

      bash 复制代码
      echo "$DEPLOYMENTS" | jq -r '
        .items[] | 
        select(
          (.spec.template.spec.containers[]? | 
            (.livenessProbe? == null)
          )
        ) | 
        "Namespace: \(.metadata.namespace) | Deployment: \(.metadata.name)"
      '
  2. 输出详细信息

    如果需要输出 Deployment 的详细信息(如容器名称),可以修改 jq 输出格式:

    bash 复制代码
    echo "$DEPLOYMENTS" | jq -r '
      .items[] | 
      select(
        (.spec.template.spec.containers[]? | 
          (.livenessProbe? == null) and 
          (.readinessProbe? == null) and 
          (.startupProbe? == null)
        )
      ) | 
      "Namespace: \(.metadata.namespace) | Deployment: \(.metadata.name) | Containers: \([.spec.template.spec.containers[].name] | join(", "))"
    '

    示例输出:

    Namespace: default | Deployment: my-app | Containers: app, sidecar
    
  3. 导出结果到文件

    将结果导出到文件:

    bash 复制代码
    ./check-probes.sh > no-probes-deployments.txt

总结

通过该脚本,可以快速列出 Kubernetes 集群中所有未配置探针的 Deployment,帮助运维人员及时发现潜在问题并优化容器健康检查配置。