Kubernetes实战(二)-使用Kor过滤Kubernetes未使用资源

news2025/1/26 15:46:04

1 概述

Kor 是一个找到未使用 Kubernetes 资源的工具。目前,Kor 能够识别并列出以下未使用的资源:

  • ConfigMap

  • Secret

  • Service

  • ServiceAccount

  • Deployment

  • StatefulSet

  • Role

  • HPA

  • PVC

  • Ingresse

  • PDB

2 安装部署

安装方法

从发布页面下载对应你操作系统的二进制文件,并添加到系统路径中。

自制

对于 macOS 用户,可以通过自制来安装 Kor:

brew install kor

从源码编译

将二进制文件安装到你的 $GOBIN 或 $GOPATH/bin 目录:

go install github.com/yonahd/kor@latest

Docker

运行已经挂载了你的 kubeconfig 的容器:

docker run --rm -i yonahdissen/kor

docker run --rm -i -v "/path/to/.kube/config:/root/.kube/config" yonahdissen/kor all

Helm

在集群中作为一个定时任务运行:

helm upgrade -i kor \
    --namespace kor \
    --create-namespace \
    ./charts/kor

更多集群使用详情请查看:

https://github.com/yonahd/kor#in-cluster-usage

3 使用说明

Kor 提供多种子命令来识别和列出未使用的资源,包括:

  • all:列出指定命名空间或所有命名空间内的所有未使用资源。

  • configmap:列出指定命名空间或所有命名空间内未使用的 ConfigMap。

  • secret:列出指定命名空间或所有命名空间内未使用的 Secret。

  • services:列出指定命名空间或所有命名空间内未使用的 Service。

  • serviceaccount:列出指定命名空间或所有命名空间内未使用的 ServiceAccount。

  • deployments:列出指定命名空间或所有命名空间内未使用的 Deployment。

  • statefulsets:列出指定命名空间或所有命名空间内未使用的 StatefulSet。

  • role:列出指定命名空间或所有命名空间内未使用的 Role。

  • hpa:列出指定命名空间或所有命名空间内未使用的 HPA。

  • pvc:列出指定命名空间或所有命名空间内未使用的 PVC。

  • ingress:列出指定命名空间或所有命名空间内未使用的 Ingresse。

  • pdb:列出指定命名空间或所有命名空间内未使用的 PDB。

  • exporter:导出 Prometheus 指标。

Supported Flags

-e, --exclude-namespaces string   Namespaces to be excluded, split by comma. Example: --exclude-namespace ns1,ns2,ns3. If --include-namespace is set, --exclude-namespaces will be ignored.
-h, --help                        help for kor
-n, --include-namespaces string   Namespaces to run on, split by comma. Example: --include-namespace ns1,ns2,ns3.
-k, --kubeconfig string           Path to kubeconfig file (optional)
    --output string               Output format (table or json) (default "table")
    --slack-auth-token string     Slack auth token to send notifications to. --slack-auth-token requires --slack-channel to be set.
    --slack-channel string        Slack channel to send notifications to. --slack-channel requires --slack-auth-token to be set.
    --slack-webhook-url string    Slack webhook URL to send notifications to

要使用特定子命令,请运行 kor [subcommand] [flags]。

kor all --namespace my-namespace

有关每个子命令及其可用标志的更多信息,你可以使用 --help 标志。

kor [subcommand] --help

4 支持的资源和限制

资源它寻找什么已知的误报 ⚠️
ConfigMap

在以下位置未被使用的 ConfigMaps:

1、Pod

2、容器

3、作为 Volumes 的 ConfigMap

4、作为环境变量的 ConfigMap

由资源使用但在配置中未明确声明的 ConfigMaps。

例如:动态加载的 Grafana 仪表板、OPA 策略、fluentd 配置。

Secret

在以下位置未被引用的 Secrets:

1、Pod

2、容器

3、通过 Volumes 使用的 Secret

4、通过环境变量使用的 Secret

5、由 Ingress TLS 使用的 Secret

6、由 ServiceAccounts 使用的 Secret

未在配置中明确说明的资源使用的 Secret
ServiceService 没有端点
DeploymentDeployment 没有副本
ServiceAccount

1、Pod 未引用的 ServiceAccount

2、未被 roleBinding 或 clusterRoleBinding 引用的 ServiceAccount

StatefulSetStatefulSet 没有副本
RoleroleBinding 中未使用的 Role
PVCPod 未使用 PVC
IngresseIngresse 未指向任何 Service
HPA

1、未在 Deployment 中使用的 HPA

2、未在 StatefulSet 中使用的 HPA

PDB

1、未在 Deployment 中使用的 PDB

2、未在 StatefulSet 中使用的 PDB

5 忽略资源

若资源标记为 “kor/used = true”,即便它们未被使用,Kor 也不会将其纳入检测范围。如果你不想让某些资源被 Kor 检测,可以为它们加上这个标签。

6 引入选项

也可以把 Kor 当作一个 Go 语言库,用来程序化地查找未使用的资源。通过引入 github.com/yonahd/kor/pkg/kor 这个包,能够调用对应的功能来查找未使用的资源。此库还支持一个特性,即通过设置 outputFormat 参数,可以让查询结果以 JSON 格式展示。

import (
    "github.com/yonahd/kor/pkg/kor"
)

func main() {
    myNamespaces := kor.IncludeExcludeLists{
        IncludeListStr: "my-namespace1, my-namespace2",
    }
    outputFormat := "json" // Set to "json" for JSON output

    if outputFormat == "json" {
        jsonResponse, err := kor.GetUnusedDeploymentsStructured(myNamespaces, kubeconfig, "json")
        if err != nil {
            // Handle error
        }
        // Process the JSON response
        // ...
    } else {
        kor.GetUnusedDeployments(namespace)
    }
}

7 在集群内使用

若要在集群内部使用这个工具,可以将其设置为一个 CronJob。结果可以发送到 Slack Webhook 作为纯文本(注意,纯文本有 4000 字符的限制),或者推荐的方式是将结果作为文件上传到 Slack 频道。你可以执行以下命令来实现:

# Send to a Slack webhook as raw text
helm upgrade -i kor \
    --namespace kor \
    --create-namespace \
    --set cronJob.slackWebhookUrl=<slack-webhook-url> \
    ./charts/kor
# Send to a Slack channel by uploading a file
helm upgrade -i kor \
    --namespace kor \
    --create-namespace \
    --set cronJob.slackChannel=<slack-channel> \
    --set cronJob.slackToken=<slack-token> \
    ./charts/kor

注意:要将其作为文件发送到 Slack,需要设置 slackToken 和 slackChannel 值。

它默认设定在每周一的凌晨 1 点执行。你可以通过调整 cronJob.schedule 的值来改变定时任务的执行计划。

helm upgrade -i kor \
    --namespace kor \
    --create-namespace \
    --set cronJob.slackChannel=<slack-channel> \
    --set cronJob.slackToken=<slack-token> \
    --set cronJob.schedule="0 1 * * 1" \
    ./charts/kor

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1094342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OFDM原理及MATLAB仿真

文章目录 前言一、OFDM 总体概述1、OFDM 概述2、OFDM 优点 二、OFDM 基本原理1、基本思想2、OFDM 调制和解调3、OFDM 系统的发射机和接收机框图 三、OFDM 系统数学模型1、sinc 函数2、OFDM 时域表达式3、OFDM 频域表达式 四、OFDM 时域及频域仿真1、绘制时域及频域波形①、MATL…

SpringCloud-Sleuth

一、介绍 &#xff08;1&#xff09;用于追踪服务链路 &#xff08;2&#xff09;搭配zipkin实现 二、项目搭建 &#xff08;1&#xff09;下载zipkin.jar https://repo1.maven.org/maven2/io/zipkin/java/zipkin-server/2.12.9/&#xff08;2&#xff09;运行 java -jar …

Android---Android 是如何通过 Activity 进行交互的

相信对于 Android 工程师来说&#xff0c;startActivity 就像初恋一般。要求低&#xff0c;见效快&#xff0c;是每一个菜鸟 Android 工程师迈向高级 Android 工程师的必经阶段。经过这么多年的发展&#xff0c;startActivity 在 google 的调教下已经变得愈发成熟&#xff0c;对…

Python文件读写实战:处理日常任务的终极工具!

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python Python文件的读写操作时&#xff0c;有很多需要考虑的细节&#xff0c;这包括文件打开方式、读取和写入数据的方法、异常处理等。 在本文中&#xff0c;将深入探讨Python中的文件操作&#xff0c;旨在提供全面的…

Python开发者的宝典:CSV和JSON数据处理技巧大公开!

更多资料获取 &#x1f4da; 个人网站&#xff1a;涛哥聊Python 在Python中处理CSV和JSON数据时&#xff0c;需要深入了解这两种数据格式的读取、写入、处理和转换方法。 下面将详细介绍如何在Python中处理CSV和JSON数据&#xff0c;并提供一些示例和最佳实践。 CSV数据处理…

项目配置vue.config jsconfig babel.config .prettierc .env .eslintrc

.env 在一个产品的前端开发过程中&#xff0c;一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境&#xff0c;然后才能正式的发布。对应每一个环境可能都会有所差异&#xff0c;比如说服务器地址、接口地址、websorket地址…… 等等。在各个环境切换的时候&am…

java的Timer全网最详细总结

1.简介 在Java 1.3版本中引入了Timer工具类&#xff0c;它是一个古老的定时器&#xff0c;通常与TimerTask和TaskQueue一起使用。Timer工具类的实现涉及到TimerTask类、Timer类、TimerQueue类和TimerThread类。其中&#xff0c;TimerQueue和TimerThread类与Timer类位于同一个类…

docker安装skyWalking笔记

确保安装了docker和docker-compose sudo docker -v Docker version 20.10.12, build 20.10.12-0ubuntu4 sudo docker-compose -v docker-compose version 1.29.2, build unknown 编写docker-compose.yml version: "3.1" services: skywalking-oap:image: apach…

创意作品管理软件 Bridge 2024 mac中文版 br2024功能特色

Bridge 2024 mac旨在连接不同的Ad obe应用程序&#xff0c;帮助用户更轻松地管理和编辑他们的创意作品。 Bridge 2024 mac软件特色和功能介绍 一致的用户体验&#xff1a;Bridge 2024现在具有增强的用户界面&#xff0c;可提供与其他Creative Cloud应用程序类似的体验。用户还…

《向量数据库指南》——向量数据库一些技术难点

一些技术难点 在文章的前半部分,我们列举了一些向量数据库应该具备的特性,然后比较了以 Milvus 为代表的向量数据库和 ANN 算法库、向量检索插件的不同之处。接下来,我们来聊聊构建向量数据库过程中会遇到的一些技术难点。 就好像一架飞机一样,内部每个零部件和系统相互连通…

PPP的建链过程

下图是PPP协议整个链路过程需经历阶段的状态转移图&#xff1a; 图1 PPP链路建立过程 PPP运行的过程简单描述如下&#xff1a; 通信双方开始建立PPP链路时&#xff0c;先进入到Establish阶段。 在Establish阶段&#xff0c;PPP链路进行LCP协商。协商内容包括工作方式是SP&am…

解决win10因为WSL问题无法正常启动docker

解决win10无法成功启动dockerdesktop因为WSL问题无法启动 问题起因解决方法 问题起因 因为需要在windows复现一个CVE漏洞&#xff0c;就需要安装在WIN10上装docker&#xff0c;但是在启动的时候出现下面报错。 然后查了一下是因为WSL的版本太低了。更新以后发现打开docker仍然…

C++20中的关键字

文章目录 前言关键字列表关键字含义总结 前言 源于上一篇中提到了 decltype是一个关键字&#xff0c;所以去查了现有的关键字列表&#xff0c;其实我对C/C的关键字还停留在上世纪大概30多个的时代&#xff0c;虽然知道C加了 auto、constexpr 等关键字&#xff0c;但查询过后才…

52 杨辉三角

杨辉三角 题解1 DP 给定一个非负整数 numRows&#xff0c;生成 杨辉三角的前 numRows 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]] 示例 2: 输入: numRows 1 输出: [[1…

关于操作系统中对进程管理的认识

文章目录 前言1.计算机组成简单认识2.操作系统1). 操作系统的管理2). 操作系统的目的 3.操作系统中的进程管理1). 进程是什么&#xff1f;2).Linux中的进程 前言 在介绍进程之前&#xff0c;我们需要先了解关于进程的一些边缘的操作系统知识 以及硬件知识&#xff0c;因为操作…

leetCode 1143.最长公共子序列 动态规划 + 图解

此题我的往期文章推荐&#xff1a; leetCode 1143.最长公共子序列 动态规划 滚动数组-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/133689692?spm1001.2014.3001.5501leetCode 1143.最长公共子序列 一步步思考动态规划 优化空间复杂度_呵呵哒(&#xf…

Lua 调试库( debug )

一、调试库作用 使用调试库可以获取 Lua 环境运行过程中的变量和跟踪代码执行。 调试库主要分为两类函数&#xff1a;自省函数和钩子函数 自省函数&#xff1a;允许检查一个正在运行中的程序&#xff0c;例如活动函数的栈、当前正在执行的代码行、局部变量的名称和值。钩子函…

Java多线程悲观锁和乐观锁

悲观锁&#xff1a; 一上来就加锁&#xff0c;没有安全感&#xff0c;每次只能一个线程进入访问完毕后&#xff0c;再解锁。 线程安全&#xff0c;性能较差 乐观锁&#xff1a; 一开始不上锁&#xff0c;认为是没有问题的&#xff0c;大家一起跑&#xff0c;等要出现线程安全问…

SpringBoot--手写组件动态更新@Value的值

原文网址&#xff1a;SpringBoot--手写组件动态更新Value的值_IT利刃出鞘的博客-CSDN博客 简介 本文手写组件&#xff0c;动态更新SpringBoot里Value的值&#xff08;无需重启服务&#xff09;。 不是可以用RefreshScope吗&#xff1f;为什么要手写组件&#xff1f; 动态更…

docker数据卷+挂载(命令讲解+示例)

在容器中管理数据主要有两种方式&#xff1a; 数据卷&#xff08;Volumes&#xff09; 、挂载主机目录 (Bind mounts)。 一、数据卷 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;可以在容器之间共享和重用。 特点&#xff1a; 对 数据卷 的修改会立马生效对 …