Namespace - 命名空间
Namespace - 命名空间
什么是 Namespace
Namespace 是 Kubernetes 提供的虚拟集群,用于在物理集群中创建多个虚拟集群。
为什么需要 Namespace
在实际使用中,我们需要:
- 环境隔离:开发、测试、生产环境分离
- 团队隔离:不同团队使用独立空间
- 资源隔离:限制不同空间的资源使用
- 权限隔离:控制不同用户的访问权限
默认 Namespace
Kubernetes 默认创建了几个 Namespace:
kubectl get namespaces
# 输出
NAME STATUS AGE
default Active 10d
kube-node-lease Active 10d
kube-public Active 10d
kube-system Active 10d
各 Namespace 作用
default
- 默认命名空间
- 不指定 namespace 时使用
kube-system
- Kubernetes 系统组件
- CoreDNS、kube-proxy 等
kube-public
- 公开资源
- 所有用户都可读取
kube-node-lease
- 节点心跳信息
- 用于节点健康检查
创建 Namespace
方法一:命令行
# 创建 namespace
kubectl create namespace dev
kubectl create namespace test
kubectl create namespace prod
# 查看
kubectl get ns
方法二:YAML 文件
apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
env: dev
team: backend
kubectl apply -f namespace.yaml
在 Namespace 中创建资源
方法一:指定 namespace
# 创建资源时指定
kubectl run nginx --image=nginx -n dev
# 查看指定 namespace 的资源
kubectl get pods -n dev
# 查看所有 namespace 的资源
kubectl get pods --all-namespaces
# 或简写
kubectl get pods -A
方法二:YAML 中指定
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev # 指定 namespace
spec:
containers:
- name: nginx
image: nginx
方法三:设置默认 namespace
# 查看当前 context
kubectl config current-context
# 设置默认 namespace
kubectl config set-context --current --namespace=dev
# 验证
kubectl config view --minify | grep namespace:
设置后,所有 kubectl 命令默认在 dev namespace 执行。
跨 Namespace 访问
DNS 访问格式
Service 的完整 DNS 名称:
<service-name>.<namespace>.svc.cluster.local
示例:
# dev namespace 中的 Pod 访问 prod namespace 的 mysql
curl http://mysql.prod.svc.cluster.local:3306
# 简写形式(跨 namespace)
curl http://mysql.prod
同 namespace:直接使用 service 名称
curl http://mysql
实战示例
# dev namespace 的应用
apiVersion: v1
kind: Pod
metadata:
name: webapp
namespace: dev
spec:
containers:
- name: webapp
image: myapp
env:
# 访问 prod namespace 的数据库
- name: DB_HOST
value: "mysql.prod.svc.cluster.local"
ResourceQuota - 资源配额
限制 Namespace 的资源使用。
创建 ResourceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
# Pod 数量限制
pods: "10"
# 资源请求限制
requests.cpu: "4"
requests.memory: "8Gi"
# 资源限制
limits.cpu: "8"
limits.memory: "16Gi"
# 存储限制
persistentvolumeclaims: "5"
requests.storage: "100Gi"
# Service 数量
services: "10"
services.loadbalancers: "2"
kubectl apply -f resourcequota.yaml
# 查看配额
kubectl get resourcequota -n dev
kubectl describe resourcequota dev-quota -n dev
配额状态查看
kubectl describe quota -n dev
# 输出
Name: dev-quota
Namespace: dev
Resource Used Hard
-------- ---- ----
limits.cpu 2 8
limits.memory 4Gi 16Gi
pods 5 10
requests.cpu 1 4
requests.memory 2Gi 8Gi
LimitRange - 资源限制范围
为 Namespace 中的资源设置默认值和限制。
创建 LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: dev-limits
namespace: dev
spec:
limits:
# 容器级别限制
- type: Container
default:
cpu: 500m
memory: 512Mi
defaultRequest:
cpu: 100m
memory: 128Mi
max:
cpu: 2
memory: 2Gi
min:
cpu: 50m
memory: 64Mi
# Pod 级别限制
- type: Pod
max:
cpu: 4
memory: 4Gi
# PVC 限制
- type: PersistentVolumeClaim
max:
storage: 10Gi
min:
storage: 1Gi
kubectl apply -f limitrange.yaml
# 查看
kubectl describe limitrange -n dev
效果
创建 Pod 时不指定资源:
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
spec:
containers:
- name: nginx
image: nginx
# 没有指定 resources
Kubernetes 会自动应用 LimitRange 的默认值:
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
实战示例
多环境部署
# 创建三个环境的 namespace
apiVersion: v1
kind: Namespace
metadata:
name: dev
labels:
env: development
---
apiVersion: v1
kind: Namespace
metadata:
name: staging
labels:
env: staging
---
apiVersion: v1
kind: Namespace
metadata:
name: prod
labels:
env: production
为每个环境设置配额
# dev 环境 - 资源较少
apiVersion: v1
kind: ResourceQuota
metadata:
name: dev-quota
namespace: dev
spec:
hard:
pods: "10"
requests.cpu: "2"
requests.memory: "4Gi"
---
# staging 环境 - 中等资源
apiVersion: v1
kind: ResourceQuota
metadata:
name: staging-quota
namespace: staging
spec:
hard:
pods: "20"
requests.cpu: "4"
requests.memory: "8Gi"
---
# prod 环境 - 资源充足
apiVersion: v1
kind: ResourceQuota
metadata:
name: prod-quota
namespace: prod
spec:
hard:
pods: "50"
requests.cpu: "16"
requests.memory: "32Gi"
部署应用到不同环境
# 部署到 dev
kubectl apply -f app.yaml -n dev
# 部署到 staging
kubectl apply -f app.yaml -n staging
# 部署到 prod
kubectl apply -f app.yaml -n prod
常用命令
# Namespace 管理
kubectl create namespace <name>
kubectl get namespaces
kubectl describe namespace <name>
kubectl delete namespace <name>
# 在指定 namespace 操作
kubectl get pods -n <namespace>
kubectl apply -f app.yaml -n <namespace>
kubectl delete pod <name> -n <namespace>
# 查看所有 namespace
kubectl get pods -A
kubectl get svc --all-namespaces
# 设置默认 namespace
kubectl config set-context --current --namespace=<name>
# ResourceQuota
kubectl get resourcequota -n <namespace>
kubectl describe quota <name> -n <namespace>
# LimitRange
kubectl get limitrange -n <namespace>
kubectl describe limitrange <name> -n <namespace>
删除 Namespace
⚠️ 警告:删除 namespace 会删除其中的所有资源!
# 删除 namespace
kubectl delete namespace dev
# 会删除该 namespace 中的:
# - 所有 Pod
# - 所有 Service
# - 所有 Deployment
# - 所有 ConfigMap/Secret
# - 所有其他资源
安全删除
# 1. 先查看要删除的资源
kubectl get all -n dev
# 2. 备份重要数据
# 3. 确认后删除
kubectl delete namespace dev
最佳实践
1. 使用 Namespace 隔离环境
project/
├── dev/ # 开发环境
├── staging/ # 预发布环境
└── prod/ # 生产环境
2. 为每个 Namespace 设置配额
防止资源被某个 namespace 耗尽:
apiVersion: v1
kind: ResourceQuota
metadata:
name: quota
namespace: dev
spec:
hard:
requests.cpu: "4"
requests.memory: "8Gi"
3. 使用标签标识 Namespace
metadata:
name: backend-dev
labels:
team: backend
env: dev
project: myapp
4. 配置 RBAC 权限
限制用户只能访问特定 namespace:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: dev-admin
namespace: dev
subjects:
- kind: User
name: alice
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
5. 命名规范
- 环境区分:
project-dev,project-staging,project-prod - 团队区分:
team-backend,team-frontend - 项目区分:
myapp-dev,myapp-prod
6. 监控资源使用
# 查看各 namespace 资源使用
kubectl top pods -A
kubectl top nodes
# 查看配额使用情况
kubectl describe quota -n dev
Namespace 不能隔离的资源
以下资源是集群级别的,不属于任何 namespace:
- Node
- PersistentVolume
- StorageClass
- Namespace 本身
- ClusterRole / ClusterRoleBinding
查看所有资源的 namespace 属性:
# 查看资源是否有 namespace
kubectl api-resources
# 输出
NAME NAMESPACED KIND
pods true Pod
services true Service
nodes false Node
persistentvolumes false PersistentVolume
小结
Namespace 是 Kubernetes 多租户和资源隔离的核心机制:
核心功能:
- 逻辑隔离:虚拟集群
- 资源隔离:ResourceQuota 限制资源
- 权限隔离:RBAC 控制访问
- 环境隔离:dev/staging/prod 分离
最佳实践:
- 使用 namespace 区分环境
- 为每个 namespace 设置配额
- 配置 RBAC 权限控制
- 使用标签管理 namespace
跨 Namespace 访问:
service-name.namespace.svc.cluster.local
下一章我们将学习进阶篇的 StatefulSet,管理有状态应用。