Kubernetes准入控制
外观
Kubernetes准入控制[编辑 | 编辑源代码]
准入控制(Admission Control)是Kubernetes安全机制的核心组件之一,它在API请求被持久化到集群状态之前,对请求进行拦截、验证和修改。准入控制通过一系列插件(称为"准入控制器")实现,确保集群操作符合安全策略、资源限制和其他自定义规则。
准入控制的工作原理[编辑 | 编辑源代码]
Kubernetes API服务器处理请求的流程中,准入控制发生在认证(Authentication)和授权(Authorization)之后,对象持久化之前:
准入控制器分为两类:
- 变更型准入控制器(Mutating Admission Controllers):可以修改请求对象
- 验证型准入控制器(Validating Admission Controllers):只能验证请求,不能修改
内置准入控制器[编辑 | 编辑源代码]
Kubernetes默认启用多个准入控制器,常见的有:
控制器名称 | 类型 | 功能描述 |
---|---|---|
NamespaceLifecycle | 验证型 | 防止在终止的Namespace中创建新对象 |
LimitRanger | 变更型 | 实施资源限制(如CPU/内存默认值) |
ResourceQuota | 验证型 | 强制执行命名空间资源配额 |
PodSecurity | 验证型 | 实施Pod安全标准(替代以前的PodSecurityPolicy) |
DefaultStorageClass | 变更型 | 为未指定存储类的PVC设置默认值 |
自定义准入控制[编辑 | 编辑源代码]
通过动态准入控制(Dynamic Admission Control),用户可以创建自定义逻辑:
准入Webhooks[编辑 | 编辑源代码]
两种类型的Webhooks:
- MutatingWebhookConfiguration:变更请求
- ValidatingWebhookConfiguration:验证请求
示例MutatingWebhook配置:
apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
name: "example.mutating.webhook"
webhooks:
- name: "example.mutating.webhook"
rules:
- apiGroups: [""]
apiVersions: ["v1"]
operations: ["CREATE"]
resources: ["pods"]
clientConfig:
service:
namespace: "webhook-namespace"
name: "webhook-service"
caBundle: "<CA证书>"
admissionReviewVersions: ["v1"]
sideEffects: None
timeoutSeconds: 5
实际案例[编辑 | 编辑源代码]
案例1:自动注入Sidecar容器[编辑 | 编辑源代码]
使用MutatingWebhook在Pod创建时自动注入监控Sidecar:
# Webhook返回的JSON补丁示例
[
{
"op": "add",
"path": "/spec/containers/-",
"value": {
"name": "monitoring-sidecar",
"image": "monitoring:latest",
"ports": [{"containerPort": 9090}]
}
}
]
案例2:强制标签校验[编辑 | 编辑源代码]
ValidatingWebhook确保所有部署必须包含"team"标签:
// 简化版校验逻辑
func validateDeployment(deployment *appsv1.Deployment) bool {
labels := deployment.GetLabels()
if _, exists := labels["team"]; !exists {
return false
}
return true
}
数学原理[编辑 | 编辑源代码]
准入控制可以形式化为决策函数:
其中:
- 是第i个验证函数
- 是第j个变更函数
最佳实践[编辑 | 编辑源代码]
1. 启用必要的默认控制器:根据集群需求配置--enable-admission-plugins 2. Webhook性能优化:设置适当的timeout和failurePolicy 3. 幂等性设计:确保MutatingWebhook可重复应用 4. 审计日志:记录准入决策以便故障排查 5. 渐进式部署:新Webhook应先配置failurePolicy: Fail
故障排除[编辑 | 编辑源代码]
常见问题及解决方案:
- Webhook超时:检查服务可用性,增加timeoutSeconds
- 证书问题:确保证书链完整且未过期
- 循环调用:避免Webhook修改自己关注的资源
- 资源版本不兼容:指定多个admissionReviewVersions
准入控制是构建安全、合规Kubernetes集群的关键防线,通过合理配置可以显著提升集群的安全性和一致性。