2025-06-19 22:23:00
如果你是一名开发者或运维工程师,正在为 Kubernetes 集群的复杂管理而头疼,那么今天我要给你安利一款超好用的神器——k8m!这是一款轻量级、AI 驱动的 Mini Kubernetes AI Dashboard,专为简化集群管理而生,功能强大又易上手,堪称 Kubernetes 管理界的“效率担当”!
k8m 是一款跨平台的 Kubernetes 管理工具,集成了大模型、AI 智能体和 MCP(Model Context Protocol)支持,旨在通过智能化和轻量化的设计,让开发者与运维人员轻松驾驭 Kubernetes 集群。它的核心理念是 “AI 驱动,轻便高效,化繁为简”,不仅功能全面,还支持单文件部署,跨 Linux、macOS、Windows 等多平台,真正做到开箱即用!
k8m 的亮点多到数不过来,这里为你精选几个“真香”功能,让你感受它的强大:
新手真的很适合本地学习,简单又快捷
支持多集群统一管理,界面直观,集群切换一键搞定。无论是 Kind、MiniKube 还是生产环境的大集群,k8m 都能无缝接入,管理得井井有条。另外也支持多集群权限管理。支持对用户、用户组进行授权,可按集群授权,包括集群只读、Exec 命令、集群管理员三种权限。对用户组授权后,组内用户均获得相应授权。支持设置命名空间黑白名单
一键安装和管理 Helm 应用,快速部署常用工具,省时省力。
内置 AI 诊断功能,点击事件旁的“AI 解读”按钮,秒速分析异常原因,提供详细修复建议,排查问题 so easy!
k8m 遵循 MIT 协议,完全开源,允许自由定制和商用,更新频率高,bug 修复快
从 GitHub 下载最新版本:https://github.com/weibaohui/k8m
运行命令:./k8m,然后访问 http://127.0.0.1:3618
想用 Docker?直接用 docker-compose 启动,配置文件参考 GitHub 文档
---
apiVersion: v1
kind: Namespace
metadata:
name: k8m
---
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: k8m
name: k8m
namespace: k8m
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
app: k8m
name: k8m
namespace: k8m
rules:
- verbs:
- "*"
apiGroups:
- "*"
resources:
- "*"
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
labels:
app: k8m
name: k8m
rules:
- verbs:
- "*"
apiGroups:
- "*"
resources:
- "*"
- verbs:
- "*"
nonResourceURLs:
- "*"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
app: k8m
name: k8m
namespace: k8m
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: k8m
subjects:
- kind: ServiceAccount
name: k8m
namespace: k8m
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: k8m
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: k8m
subjects:
- kind: ServiceAccount
name: k8m
namespace: k8m
---
apiVersion: v1
kind: Service
metadata:
name: k8m
namespace: k8m
labels:
app: k8m
spec:
ports:
- name: http-k8m
protocol: TCP
port: 3618
targetPort: 3618
selector:
app: k8m
type: ClusterIP
# type: LoadBalancer
# loadBalancerClass: tailscale
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: k8m-pvc
namespace: k8m
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 8Gi
---
apiVersion: apps.kruise.io/v1alpha1
kind: CloneSet
metadata:
name: k8m
namespace: k8m
labels:
app: k8m
spec:
replicas: 1
selector:
matchLabels:
app: k8m
template:
metadata:
labels:
app: k8m
spec:
containers:
- name: k8m
# image: docker.io/weibh/k8m:v0.0.130
# image: ghcr.io/weibaohui/k8m:v0.0.130
image: registry.cn-hangzhou.aliyuncs.com/minik8m/k8m:v0.0.130
env:
# 是否开启debug模式
- name: DEBUG
value: "false"
# log输出日志级别,同klog用法
- name: LOG_V
value: "2"
# 监听的端口号
- name: PORT
value: "3618"
# 开启AI功能,默认开启
- name: ENABLE_AI
value: "true"
# # 是否启用临时管理员账户配置,默认关闭
- name: ENABLE_TEMP_ADMIN
value: "false"
# kubectl shell镜像地址
- name: KUBECTL_SHELL_IMAGE
value: "bitnami/kubectl:latest"
# Node shell镜像地址
- name: NODE_SHELL_IMAGE
value: "alpine:latest"
# 持久化数据库地址
- name: SQLITE_PATH
value: "/app/data/k8m.db"
# 启动程序后,是否自动连接发现的集群,默认关闭
- name: CONNECT_CLUSTER
value: "true"
# 是否自动注册纳管宿主集群,默认启用
- name: IN_CLUSTER
value: "true"
# 是否打印配置信息
- name: PRINT_CONFIG
value: "false"
ports:
- containerPort: 3618
protocol: TCP
name: http-k8m
livenessProbe:
httpGet:
path: /healthz
port: 3618
initialDelaySeconds: 30
periodSeconds: 10
imagePullPolicy: IfNotPresent
volumeMounts:
- name: k8m-data
mountPath: /app/data
restartPolicy: Always
serviceAccountName: k8m
volumes:
- name: k8m-data
persistentVolumeClaim:
claimName: k8m-pvc
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
labels:
app: k8m
name: k8m
namespace: k8m
spec:
rules:
- host: k8m.i.ysicing.net
http:
paths:
- backend:
service:
name: k8m
port:
name: http-k8m
path: /
pathType: ImplementationSpecific
将上面的 yaml 保存为 k8m.yaml
kubectl apply -f k8m.yaml
等待服务启动完成后访问ingress 域名,默认用户:k8m,默认密码 k8m
登录后第一件事就是新建新的管理员账号,开启 MFA,删除默认管理员(只有删除功能没法禁用)
支持 OIDC,其实就能对接很多 OAUTH 服务了,具体 OIDC 使用说明
内置模型其实也还行,当然也可以自己的模型
效果还是很不错的
想了解更多?可以直接访问 k8m 的 GitHub 仓库:https://github.com/weibaohui/k8m
简单贴一下,更多细节可以使用 Demo 用户名密码 demo/demo
通过 MCP 协议集成到 Cursor、Claude Desktop 等工具,解锁更多 AI 交互场景。 目前 k8m 内置 k8s 多集群 MCP 工具 49 种,可组合实现超百种集群操作,可作为 MCP Server 供其他大模型软件使用。轻松实现大模型管理 k8s,可详细记录每一次 MCP 调用,安全使用,无后顾之忧,避免操作越权。
在 Kubernetes 管理工具层出不穷的今天,k8m 凭借轻量、AI 驱动、易用的特点脱颖而出。无论是个人开发者学习 Kubernetes,还是企业团队优化运维流程,k8m 都能为你节省时间、提升效率。更重要的是,它完全免费、开源,背后还有活跃的社区支持,未来发展值得期待!
PS: 作者修复 BUG 速度特别快。
关注我的微信公众号,更多技术吐槽和干货!
2025-06-06 19:24:44
在 DevOps 实践中,软件包管理是不可或缺的一环。JFrog Artifactory 作为一款强大的制品管理工具,广泛应用于存储和管理二进制文件。本文简单介绍如何部署 Artifactory 开源版。
主要有客户需要部署这个,简单研究一下,上次用这个还是 4 年前了,新版本部署坑有点多,没老版本丝滑。简单说不如 Nexus,有兴趣的可以看看我之前写的私有化部署 Nexus3 镜像源
镜像有点点大
docker pull releases-docker.jfrog.io/jfrog/artifactory-oss:7.111.8
# 国内
docker pull ccr.ccs.tencentyun.com/k7scn/artifactory-oss:7.111.8
services:
traefik:
image: traefik:v3.4
container_name: traefik
networks:
- ysicing-net
command:
- "--api=true"
- "--api.insecure=true"
- "--api.dashboard=true"
- "--providers.docker=true"
- "--providers.docker.exposedbydefault=false"
- "--entrypoints.http.address=:80"
- "--providers.docker.network=ysicing-net"
- "--log.level=INFO"
- "--accesslog=true"
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik-dashboard.entrypoints=http"
- "traefik.http.routers.traefik-dashboard.rule=Host(`traefik.192.168.23.16.sslip.io`)"
- "traefik.http.routers.traefik-dashboard.service=dashboard@internal"
- "traefik.http.routers.traefik-dashboard-api.entrypoints=http"
- "traefik.http.routers.traefik-dashboard-api.rule=Host(`traefik.192.168.23.16.sslip.io`) && PathPrefix(`/api`)"
- "traefik.http.routers.traefik-dashboard-api.service=api@internal"
- "traefik.http.middlewares.gzip.compress=true"
- "traefik.http.routers.traefik-dashboard.middlewares=gzip@docker"
ports:
- "80:80"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
restart: always
artifactorydb:
image: docker.io/bitnami/postgresql:15
# image: ccr.ccs.tencentyun.com/k7scn/postgresql:15
container_name: artifactorydb
restart: always
networks:
- ysicing-net
volumes:
- './postgresql:/bitnami/postgresql'
environment:
- POSTGRESQL_USERNAME=bn_artifactory
- POSTGRESQL_DATABASE=bitnami_artifactory
- POSTGRESQL_PASSWORD=bitnami
artifactory:
image: releases-docker.jfrog.io/jfrog/artifactory-oss:7.111.8
# image: ccr.ccs.tencentyun.com/k7scn/artifactory-oss:7.111.8
container_name: artifactory
depends_on:
- artifactorydb
labels:
- "traefik.enable=true"
- "traefik.http.routers.artifactory.rule=Host(`artifactory.192.168.23.16.sslip.io`)"
- "traefik.http.routers.artifactory.service=artifactory"
- "traefik.http.services.artifactory.loadbalancer.server.port=8081"
- "traefik.http.routers.artifactory-ui.service=artifactory-ui"
- "traefik.http.routers.artifactory-ui.rule=Host(`artifactory-ui.192.168.23.16.sslip.io`)"
- "traefik.http.services.artifactory-ui.loadbalancer.server.port=8082"
networks:
- ysicing-net
environment:
- EXTRA_JAVA_OPTIONS=-Dartifactory.home=/var/opt/jfrog/artifactory
- JF_ROUTER_ENTRYPOINTS_EXTERNALPORT=8082
# ports:
# - 8082:8082 # for router communication
# - 8081:8081 # for artifactory communication
volumes:
- artifactory_data:/var/opt/jfrog/artifactory
- /etc/localtime:/etc/localtime:ro
- ./system.yaml:/opt/jfrog/artifactory/var/etc/system.yaml
restart: always
logging:
driver: json-file
options:
max-size: "50m"
max-file: "10"
ulimits:
nproc: 65535
nofile:
soft: 32000
hard: 40000
volumes:
artifactory_data:
driver: local
networks:
ysicing-net:
name: ysicing-net
driver: bridge
默认使用 pg 数据库,方便些
touch system.yaml
创建完配置文件,生成相关配置
shared:
database:
type: postgresql
driver: org.postgresql.Driver
url: jdbc:postgresql://artifactorydb:5432/bitnami_artifactory
username: bn_artifactory
password: bitnami
修改文件权限
chown -R 1030:1030 system.yaml
chmod 644 system.yaml
服务非常吃资源,机器配置太低不推荐。
docker compose up -d
地址:artifactory-ui.192.168.23.16.sslip.io
默认的账号密码 | 默认用户名 admin,默认密码 password
没有特殊要求,不推荐。
欢迎关注我的微信公众号,可以看看我郑再打工每天都在折腾什么。
2025-06-05 22:13:15
FFmpeg 是一个强大的开源多媒体处理工具,广泛应用于音视频的转换、裁剪、合并、提取等操作。无论是开发、剪辑还是日常处理,掌握 FFmpeg 的常用命令都能极大提升效率。本文整理了一些高频使用的 FFmpeg 命令,方便你快速上手或作为备忘录收藏!
临时需要处理一些上次到群晖 MinIO 的视频,写个流水线自动化处理。温故一下相关命令。
Fmpeg 是一个跨平台的音视频处理框架,支持几乎所有格式的音视频文件。它功能强大、命令灵活,堪称“音视频处理瑞士军刀”。以下是常见操作的命令合集,建议收藏备用!
将文件从一种格式转换为另一种格式,例如将 MP4 转为 AVI:
ffmpeg -i input.mp4 output.avi
-i:指定输入文件
提示:FFmpeg 会根据输出文件名自动推断目标格式
从视频中提取音频,例如提取 MP3
ffmpeg -i input.mp4 -vn -acodec mp3 output.mp3
裁剪视频的指定时间段,例如从第 10 秒到第 30 秒:
ffmpeg -i input.mp4 -ss 10 -t 20 output.mp4
# 通常搭配如下
ffmpeg -i input.mp4 -ss 10 -t 20 -c copy output.mp4
ffmpeg -ss 00:20:00 -i "input.mp4" -vframes 1 "01.jpg"
压缩视频文件大小,调整比特率:
ffmpeg -i input.mp4 -vcodec libx264 -b:v 1000k output.mp4
将视频缩放到指定分辨率,例如 1280x720:
ffmpeg -i input.mp4 -vf scale=1280:720 output.mp4
更改视频帧率,例如从 60fps 转为 24fps:
ffmpeg -i input.mp4 -r 24 output.mp4
例如 h264 编码无损转换至 h265 编码
ffmpeg -c:v h264_cuvid -i input.mp4 -c:v hevc_nvenc -r 24 -c:a copy -x265-params lossless=1 output.mp4;
将视频转为图片序列,例如每秒提取一帧:
ffmpeg -i input.mp4 -vf fps=1 frame_%04d.png
快速查看音视频文件的详细信息:
ffmpeg -i input.mp4
输出包含编码格式、分辨率、时长等详细信息
通常如下所用一键输出视频的编码、帧率、码率
codec=$(ffprobe -v error -select_streams v:0 -show_entries stream=codec_name -of default=noprint_wrappers=1:nokey=1 input.mp4)
r_frame_rate=$(ffprobe -v error -select_streams v:0 -show_entries stream=r_frame_rate -of default=noprint_wrappers=1:nokey=1 input.mp4)
bit_rate=$(ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 input.mp4)
echo -e "$codec\t$r_frame_rate\t$bit_rate\tinput.mp4"
将多个视频文件合并为一个(需确保分辨率、编码一致):
# 创建文件列表 mv.txt
echo "file 'input1.mp4'" > mv.txt
echo "file 'input2.mp4'" >> mv.txt
ffmpeg -f concat -i mv.txt -c copy output.mp4
这个没用过,仅供参考
我仅在这两个环境实操过,其他环境可以参考官方文档,类似文档很详细了
另外结合脚本语言很方便,例如 bash
FFmpeg 的功能远不止这些,熟练使用后,你可以轻松应对音视频处理的各种场。对于我而言,掌握基本功能从视频中导出音频文件使用就行(大部分还用不上,因为还有一些第三方工具帮你自动一键搞定)
欢迎关注我的微信公众号。
2025-06-03 22:14:14
近日,MinIO 社区版迎来重大更新,删除了 11 万行代码,彻底移除 Web 管理控制台功能,官方称此举为“精简代码,专注核心存储功能”。这一决定引发社区热议,对用户体验和项目生态造成显著影响。本文将深入剖析这一变化的细节、影响及社区反应。
MinIO 作为一款高性能分布式对象存储系统,因其 S3 协议兼容性和易用性深受开发者喜爱。其 Web 管理控制台是社区版的核心功能,支持存储桶管理、文件浏览和权限配置,极大降低了操作门槛,尤其适合:
然而,新版本将 Web 控制台的核心管理功能(包括用户账户管理、访问策略配置、存储桶管理和系统配置)全部移除,官方推荐使用 mc 命令行工具替代。相比可视化界面,mc 命令行工具对新手不够友好,且在快速调试和监控场景下效率较低。
此次更新几乎清空了 Web 管理控制台的功能,仅保留基本的对象浏览能力。以下是主要受影响的模块:
简言之,新版 Web 界面已不再是管理控制台,而是一个功能极简的文件浏览器。用户被迫转向 mc 命令行工具完成所有管理任务,操作门槛显著提高
ccr.ccs.tencentyun.com/k7scn/minio:2025.4.22
MinIO 官方称,删除 11 万行代码旨在优化性能、聚焦核心存储功能。然而,Web 控制台资源占用较低,维护成本有限,社区对这一理由普遍质疑。相比之下,MinIO 商用版保留了完整的 Web 管理功能,功能更强大,引发了“社区版精简是为了推销商用版”的猜测
X 平台和 Reddit 等社区反馈显示,开发者认为这是开源项目商业化的常见策略:通过削减免费版功能,引导用户转向付费版本。部分用户甚至称此次更新为特洛伊木马式更新,批评官方未提供过渡方案,给中小团队带来额外适配成本
作为回应,社区迅速行动:
MinIO 社区版移除 Web 管理功能的决定,削弱了其易用性和吸引力。开源项目的核心在于平衡社区需求与商业利益,MinIO 的后续决策将直接影响其在对象存储领域的地位。对于依赖 Web 控制台的团队,建议暂时停留在 2025.4.22 版本,或探索其他替代方案。
欢迎关注,可以看看我郑再打工每天都在折腾什么。
2025-05-31 23:07:05
各位小伙伴!今天给大家安利一款超硬核、超上头的模拟经营类游戏——缺氧(Oxygen Not Included)! 如果你喜欢挑战脑力、沉浸式体验和无限可能的建造乐趣,这款游戏绝对不容错过!
缺氧是由 Klei Entertainment(饥荒开发商)打造的一款生存模拟类游戏。玩家需要在一个地下星球中管理一群可爱的小人(复制人),通过建造基地、分配资源、应对环境危机,让他们在缺氧、缺食、缺电的恶劣环境中存活下来!
我的玩法开局看水和铜多不多,不多重开
当然耐心很重要, 同时要有自我控制能力,因为很容易肝上头
推荐直接购买缺氧完整包, 我上个月入手大概不到 90CNY。
推荐购买正版,请勿相信廉价购买,谨防虚假入库,导致游戏和钱两失。
欢迎关注,可以看看我郑再打工每天都在折腾什么。
2025-05-30 21:20:34
K3s 作为轻量级 Kubernetes 发行版,以其高效、简洁的特性深受开发者与运维人员喜爱。但手动升级 K3s 集群可能是个繁琐的任务,幸好有 System Upgrade Controller!这个工具能让你的 K3s 集群实现自动化、无宕机升级,省时又省心。本文将带你了解 System Upgrade Controller 的魅力,并提供简洁的部署步骤,让你的集群管理更轻松!
主要用于升级 k3s 集群节点上的服务,不仅仅局限于 k3s 服务本身。
System Upgrade Controller 是 Rancher 开发的一个自动化升级工具。它通过 Kubernetes 原生资源(如 Plan)管理节点和 K3s 版本的升级,核心优势包括:
如果你想让 K3s 集群保持最新或者减少运维负担,绝对值得一试!
项目地址:
以下是快速部署 System Upgrade Controller 的步骤,简单易上手
kubectl apply -f https://raw.githubusercontent.com/rancher/system-upgrade-controller/master/manifests/system-upgrade-controller.yaml
或者
kubectl apply -k github.com/rancher/system-upgrade-controller
服务控制器默认会部署到 system-upgrade
命名空间下
kubectl get deploy -n system-upgrade
NAME READY UP-TO-DATE AVAILABLE AGE
system-upgrade-controller 1/1 1 1 335d
常见使用如下,由于权限极高,操作时需要确保重复执行没影响。
由于我现在的环境特殊,只有一个 master 节点,每次跨版本升级 master 节点都是先手动升级到最新版本,然后在使用下面的命令升级计算节点。(保障至少 1 个控制节点版本是最新的)
---
apiVersion: v1
kind: Secret
metadata:
name: k3s1306
namespace: system-upgrade
type: Opaque
stringData:
upgrade.sh: |
#!/bin/bash
set -x
binfile=$(command -v k3s)
$binfile -v | grep "v1.30.6" && (
echo "done"
exit 0
) || (
wget https://c.ysicing.net/oss/tiga/linux/amd64/k3s
chmod +x k3s
mv k3s $binfile && systemctl restart k3s
)
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: k3s1306
namespace: system-upgrade
spec:
concurrency: 3
nodeSelector:
matchExpressions:
- {key: kubernetes.io/os, operator: Exists}
tolerations:
- {operator: Exists}
serviceAccountName: system-upgrade
secrets:
- name: k3s1306
path: /host/run/system-upgrade/secrets/k3s1306
cordon: false
version: latest
upgrade:
image: hub.ysicing.net/ysicing/debian-upgrade:20230909
command: ["chroot", "/host"]
args: ["sh", "/run/system-upgrade/secrets/k3s1306/upgrade.sh"]
想了解更多官方的姿势,可以参考
---
apiVersion: v1
kind: Secret
metadata:
name: ts-script
namespace: system-upgrade
type: Opaque
stringData:
upgrade.sh: |
#!/bin/bash
set -x
if tailscale version 2>/dev/null | grep -q "1.82.5"; then
echo "Tailscale 1.82.5 already installed"
exit 0
fi
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y --no-install-recommends tailscale
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: ts1825
namespace: system-upgrade
spec:
concurrency: 1
nodeSelector:
matchExpressions:
- {key: kubernetes.io/os, operator: Exists}
tolerations:
- {operator: Exists}
serviceAccountName: system-upgrade
secrets:
- name: ts-script
path: /host/run/system-upgrade/secrets/ts-script
cordon: false
version: latest
upgrade:
image: hub.ysicing.net/ysicing/debian-upgrade:20230909
command: ["chroot", "/host"]
args: ["sh", "/run/system-upgrade/secrets/ts-script/upgrade.sh"]
---
apiVersion: v1
kind: Secret
metadata:
name: debian
namespace: system-upgrade
type: Opaque
stringData:
upgrade.sh: |
#!/bin/sh
set -e
if easytier-core -V 2>/dev/null | grep -q "2.2.4"; then
echo "easytier 2.2.4 already installed"
exit 0
fi
apt-get --assume-yes update
DEBIAN_FRONTEND=noninteractive apt-get dist-upgrade --assume-yes
curl https://c.ysicing.net/oss/scripts/easytier.sh | bash
---
apiVersion: upgrade.cattle.io/v1
kind: Plan
metadata:
name: debian-25021514
namespace: system-upgrade
spec:
concurrency: 3
nodeSelector:
matchExpressions:
- {key: kubernetes.io/os, operator: Exists}
tolerations:
- {operator: Exists}
serviceAccountName: system-upgrade
secrets:
- name: debian
path: /host/run/system-upgrade/secrets/debian
cordon: false
version: latest
upgrade:
image: ysicing/debian
command: ["chroot", "/host"]
args: ["sh", "/run/system-upgrade/secrets/debian/upgrade.sh"]
通过上面 3 个例子,其实就是帮你去每个节点执行相关脚本,如果你有大量类似的重复的工作,System Upgrade Controller 就是个绝佳的运维工具,它让版本管理变得简单、高效、无忧,显著提升你的运维体验。
欢迎关注,可以看看我郑再打工每天都在折腾什么。