第7课:命名空间和资源配额
掌握Kubernetes中的多租户隔离和资源管理机制
🎯 学习目标
- 理解命名空间的概念和作用
- 掌握命名空间的创建、管理和使用
- 学习资源配额的配置和管理
- 了解资源限制和请求的设置
- 掌握多租户环境的最佳实践
7.1 命名空间基础
🎯 什么是命名空间?
命名空间(Namespace)是Kubernetes中用于隔离和组织资源的虚拟集群,它允许在单个物理集群中创建多个虚拟集群。
🏗️ 命名空间架构图
命名空间提供资源隔离,不同命名空间中的资源名称可以重复
7.2 命名空间的应用场景
🏢 多团队隔离
为不同团队创建独立的命名空间,避免资源冲突,便于权限管理。
🌍 多环境隔离
为开发、测试、生产环境创建不同的命名空间,实现环境隔离。
📦 多应用隔离
为不同应用创建独立的命名空间,便于应用生命周期管理。
🔒 安全隔离
通过命名空间实现资源访问控制,提高集群安全性。
7.3 命名空间管理
📋 命名空间操作命令
# 1. 查看命名空间
kubectl get namespaces
kubectl get ns
# 2. 查看命名空间详情
kubectl describe namespace default
# 3. 创建命名空间
kubectl create namespace dev
# 4. 从文件创建命名空间
cat > namespace.yaml << EOF
apiVersion: v1
kind: Namespace
metadata:
name: prod
labels:
environment: production
EOF
kubectl apply -f namespace.yaml
# 5. 删除命名空间
kubectl delete namespace dev
# 6. 在指定命名空间中创建资源
kubectl create deployment nginx --image=nginx -n dev
# 7. 查看指定命名空间中的资源
kubectl get pods -n dev
# 8. 设置默认命名空间
kubectl config set-context --current --namespace=dev
📋 命名空间配置文件
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
environment: development
team: frontend
spec:
finalizers:
- kubernetes
7.4 资源配额管理
🎯 什么是资源配额?
资源配额(ResourceQuota)是Kubernetes中用于限制命名空间资源使用的对象,它可以限制命名空间中创建的资源数量和资源消耗。
📋 资源配额配置
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
requests.cpu: 2
requests.memory: 4Gi
limits.cpu: 4
limits.memory: 8Gi
pods: 10
services: 5
deployments.apps: 3
configmaps: 10
secrets: 10
7.5 资源限制和请求
🔄 资源请求与限制的区别
| 类型 |
说明 |
作用 |
| 资源请求(requests) |
容器保证获得的资源量 |
用于调度决策 |
| 资源限制(limits) |
容器最多可以使用的资源量 |
防止资源滥用 |
📋 Pod资源配置
apiVersion: v1
kind: Pod
metadata:
name: resource-demo
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: 100m # 0.1个CPU
memory: 256Mi
limits:
cpu: 500m # 0.5个CPU
memory: 512Mi
7.6 资源配额的作用
💰 成本控制
通过限制资源使用,控制集群运行成本。
⚖️ 资源公平分配
确保不同团队和应用公平使用集群资源。
🛡️ 防止资源滥用
限制单个应用的资源使用,防止影响其他应用。
📊 资源使用可预测性
通过配额管理,提高集群资源使用的可预测性。
7.7 实战操作示例
# 1. 创建开发命名空间
kubectl create namespace dev
# 2. 创建资源配额
cat > quota.yaml << EOF
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
requests.cpu: "2"
requests.memory: "4Gi"
limits.cpu: "4"
limits.memory: "8Gi"
pods: "10"
services: "5"
EOF
kubectl apply -f quota.yaml
# 3. 查看资源配额
kubectl get resourcequota -n dev
kubectl describe resourcequota dev-quota -n dev
# 4. 创建带资源限制的Pod
cat > pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: app-pod
namespace: dev
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "100m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
EOF
kubectl apply -f pod.yaml
# 5. 测试资源配额限制
cat > big-pod.yaml << EOF
apiVersion: v1
kind: Pod
metadata:
name: big-pod
namespace: dev
spec:
containers:
- name: app
image: nginx
resources:
requests:
cpu: "3"
memory: "10Gi"
EOF
# 这将失败,因为超过了资源配额
kubectl apply -f big-pod.yaml
# 6. 清理
kubectl delete pod app-pod -n dev
kubectl delete resourcequota dev-quota -n dev
kubectl delete namespace dev
7.8 最佳实践和注意事项
💡 命名空间使用建议
- 合理规划命名空间:根据团队、环境或应用划分命名空间
- 使用标签管理:为命名空间添加标签,便于管理和查询
- 设置资源配额:为每个命名空间配置合适的资源配额
- 实施RBAC:结合RBAC实现命名空间级别的访问控制
- 定期清理:及时清理不再使用的命名空间
⚡ 资源配置建议
- 合理设置请求值:根据应用实际需求设置资源请求
- 设置适当的限制值:限制值应大于请求值,但不要过大
- 监控资源使用:定期检查资源使用情况,调整配置
- 考虑突发流量:为可能有突发流量的应用预留足够资源
- 使用limitrange:为命名空间设置默认资源限制
⚠️ 注意事项
- 命名空间删除:删除命名空间会同时删除其中的所有资源
- 资源配额限制:超过配额的资源创建会失败
- 默认命名空间:未指定命名空间的资源会创建在默认命名空间中
- 系统命名空间:不要随意修改或删除系统命名空间(如kube-system)
- 资源计算:资源配额是基于所有资源的总和计算的
7.9 进阶概念
🚀 LimitRange
LimitRange用于为命名空间中的资源设置默认的资源限制和请求,确保所有资源都有合理的资源配置。
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: dev
spec:
limits:
- default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 256Mi
type: Container
🔧 ResourceQuota作用域
ResourceQuota支持不同的作用域,可以限制特定类型的资源:
- Terminating:限制有终止时间的资源
- NonTerminating:限制无终止时间的资源
- BestEffort:限制BestEffort QoS等级的资源
- NotBestEffort:限制非BestEffort QoS等级的资源