kube-score 使用教程:全面提升 Kubernetes 应用安全性与可靠性
前言
你是否曾经在 Kubernetes 集群中遇到过以下问题?
- 应用莫名其妙崩溃,排查半天发现是资源限制未配置
- 安全漏洞频发,容器以 root 权限运行导致权限提升风险
- 服务中断,缺少就绪探针导致流量打到未准备好的 Pod
- 网络安全隐患,Pod 未受 NetworkPolicy 保护
这些问题都可以通过 kube-score 这个强大的静态代码分析工具来预防。本文将为你全面解析 kube-score 的使用方法、最佳实践和高级技巧。
什么是 kube-score?
kube-score 是一个专门针对 Kubernetes 对象定义进行静态代码分析的工具。它能够扫描你的 YAML 配置文件,提供详细的改进建议,帮助你的应用变得更加安全、可靠和符合最佳实践。
核心价值
安装指南
kube-score 提供多种安装方式,满足不同环境需求。
二进制文件安装
# 下载最新版本
curl -LO https://github.com/zegl/kube-score/releases/latest/download/kube-score_linux_amd64.tar.gz
tar -xzf kube-score_linux_amd64.tar.gz
sudo mv kube-score /usr/local/bin/
Docker 方式运行
# 拉取最新镜像
docker pull zegl/kube-score:latest
# 运行检查
docker run -v $(pwd):/project zegl/kube-score:latest score /project/deployment.yaml
包管理器安装
# Homebrew (macOS/Linux)
brew install kube-score
# Krew (Kubernetes 插件管理器)
kubectl krew install score
基础使用
基本语法
# 检查单个文件
kube-score score deployment.yaml
# 检查多个文件
kube-score score deployment.yaml service.yaml configmap.yaml
# 检查目录下所有 YAML 文件
kube-score score manifests/*.yaml
输出格式
kube-score 支持多种输出格式:
| 格式 | 命令 | 适用场景 |
|---|---|---|
| Human | -o human (默认) | 人工查看,彩色输出 |
| JSON | -o json | 程序化处理,集成工具 |
| CI | -o ci | CI/CD 流水线,机器可读 |
| 其他格式 | -o other | 安全工具集成 |
# JSON 输出示例
kube-score score -o json deployment.yaml
# CI 格式输出
kube-score score -o ci deployment.yaml
核心检查功能详解
1. 容器资源管理
# 不良实践示例
apiVersion: v1
kind: Pod
metadata:
name: bad-pod
spec:
containers:
- name: app
image: nginx:latest
# 缺少资源限制和请求!
# 最佳实践示例
apiVersion: v1
kind: Pod
metadata:
name: good-pod
spec:
containers:
- name: app
image: nginx:1.25.3 # 使用具体版本标签
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
检查项目:
container-resources: 确保设置 CPU 和内存的请求和限制container-resource-requests-equal-limits: 建议请求和限制值相同(可选)container-image-tag: 避免使用latest标签
2. 安全上下文配置
# 安全配置示例
apiVersion: v1
kind: Pod
metadata:
name: secure-pod
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
containers:
- name: app
image: nginx:1.25.3
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
安全检查项:
container-security-context-user-group-id: 非 root 用户运行container-security-context-privileged: 禁止特权模式container-security-context-readonlyrootfilesystem: 只读根文件系统container-seccomp-profile: seccomp 安全策略(可选)
3. 探针配置
apiVersion: v1
kind: Pod
metadata:
name: probed-pod
spec:
containers:
- name: app
image: nginx:1.25.3
# 就绪探针
readinessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
# 存活探针
livenessProbe:
httpGet:
path: /livez
port: 8080
initialDelaySeconds: 15
periodSeconds: 20
探针检查:
pod-probes: 确保配置适当的探针pod-probes-identical: 就绪和存活探针不应相同
4. 网络策略
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-network-policy
spec:
podSelector:
matchLabels:
app: my-app
policyTypes:
- Ingress
- Egress
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
egress:
- to:
- podSelector:
matchLabels:
role: database
网络检查:
pod-networkpolicy: 所有 Pod 都应受 NetworkPolicy 保护networkpolicy-targets-pod: NetworkPolicy 必须目标明确的 Pod
高级使用技巧
忽略特定检查
有时某些检查不适用于你的特定场景,可以通过注解忽略:
apiVersion: v1
kind: Service
metadata:
name: nodeport-service
annotations:
kube-score/ignore: service-type # 忽略 NodePort 类型警告
spec:
type: NodePort # 确实需要使用 NodePort
ports:
- port: 80
targetPort: 8080
启用可选检查
apiVersion: v1
kind: Pod
metadata:
name: secured-pod
annotations:
kube-score/enable: container-seccomp-profile # 启用 seccomp 检查
spec:
containers:
- name: app
image: nginx:1.25.3
securityContext:
seccompProfile:
type: RuntimeDefault
CLI 参数控制
# 忽略特定测试
kube-score score --ignore-test=service-type deployment.yaml
# 启用可选测试
kube-score score --enable-optional-test=container-seccomp-profile deployment.yaml
# 设置 Kubernetes 版本
kube-score score --kubernetes-version=v1.25 deployment.yaml
# 警告时也退出(CI 场景)
kube-score score --exit-one-on-warning deployment.yaml
CI/CD 集成实践
GitHub Actions 集成
name: kube-score check
on: [push, pull_request]
jobs:
kube-score:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Download kube-score
run: |
curl -LO https://github.com/zegl/kube-score/releases/latest/download/kube-score_linux_amd64.tar.gz
tar -xzf kube-score_linux_amd64.tar.gz
sudo mv kube-score /usr/local/bin/
- name: Run kube-score
run: |
kube-score score --exit-one-on-warning --output-format=ci manifests/ > kube-score-results.txt
- name: Upload results
uses: actions/upload-artifact@v4
with:
name: kube-score-results
path: kube-score-results.txt
GitLab CI 集成
stages:
- test
kube-score:
stage: test
image: zegl/kube-score:latest
script:
- kube-score score --exit-one-on-warning manifests/
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
Jenkins Pipeline 集成
pipeline {
agent any
stages {
stage('kube-score check') {
steps {
sh '''
docker run -v $(pwd):/project zegl/kube-score:latest \
score --exit-one-on-warning /project/manifests/
'''
}
}
}
}
与不同工具链集成
Helm 集成
# 检查 Helm 模板输出
helm template my-chart . | kube-score score -
# 带值的 Helm 检查
helm template my-chart . --values values.yaml | kube-score score -
Kustomize 集成
# 检查 Kustomize 构建结果
kustomize build overlays/production | kube-score score -
ArgoCD 集成
# 检查现有集群资源
kubectl get all -n my-namespace -o yaml | kube-score score -
检查结果解读与修复
常见问题及修复方案
| 问题类型 | 错误信息示例 | 修复方案 |
|---|---|---|
| 严重错误 | ❌ Container resources: CPU limit is not set | 添加 resources.limits.cpu |
| 警告 | ⚠️ Container Image: Image with latest tag | 使用具体版本标签 |
| 建议 | 💡 Pod Probes: Liveness probe is missing | 添加 livenessProbe 配置 |
| 信息 | ℹ️ Security: running as root user | 设置 runAsNonRoot: true |
评分等级说明
自定义检查开发
kube-score 支持扩展自定义检查规则:
package main
import (
"github.com/zegl/kube-score/domain"
"github.com/zegl/kube-score/scorecard"
v1 "k8s.io/api/apps/v1"
)
// 自定义部署检查示例
func CustomDeploymentCheck(d v1.Deployment) (scorecard.TestScore, error) {
if d.Spec.Replicas != nil && *d.Spec.Replicas < 3 {
return scorecard.TestScore{
Grade: scorecard.GradeWarning,
Comments: []scorecard.TestScoreComment{{
Summary: "Deployment should have at least 3 replicas for high availability",
}},
}, nil
}
return scorecard.TestScore{Grade: scorecard.GradeAllOK}, nil
}
最佳实践总结
1. 开发阶段集成
2. 团队协作规范
- 统一标准: 团队共享同一套 kube-score 配置
- 代码审查: PR 中必须包含 kube-score 检查结果
- 渐进式改进: 逐步修复历史配置问题
- 文档化: 记录忽略检查的原因和期限
3. 监控与改进
- 定期统计检查通过率
- 跟踪常见问题类型分布
- 设置改进目标和时间线
- 分享成功案例和经验
常见问题解答
Q: kube-score 会影响集群性能吗?
A: 不会,kube-score 是静态分析工具,只在本地运行,不接触集群。
Q: 如何处理历史遗留配置?
A: 可以使用 --ignore-test 参数暂时忽略某些检查,但应制定计划逐步修复。
Q: kube-score 能检查 Helm chart 的值文件吗?
A: 不能直接检查值文件,但可以检查 helm template 的输出结果。
Q: 如何选择 Kubernetes 版本?
A: 使用 --kubernetes-version 参数指定你的生产环境版本,以获得最准确的检查结果。
结语
kube-score 是 Kubernetes 生态中不可或缺的质量保障工具。通过将 kube-score 集成到你的开发流程中,可以:
- 🛡️ 提升安全性: 避免常见安全配置错误
- 🚀 增强可靠性: 确保应用高可用性
- 📊 统一标准: 团队共享最佳实践
- ⚡ 早期发现: 在部署前发现问题
- 🔧 持续改进: 建立质量改进机制
开始使用 kube-score,让你的 Kubernetes 应用更加健壮和安全!
提示:本文基于 kube-score 最新版本编写,具体功能可能随版本更新而变化,请参考官方文档获取最新信息。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



