Namespace 是 Kubernetes 中用于实现资源隔离和多租户管理的核心机制。它通过将集群资源划分为逻辑上的不同分组,实现了不同团队、项目或环境之间的资源隔离与管理。
1、默认的 Namespace
Kubernetes 集群初始化时会自动创建 4 个默认 Namespace:
- default
- 未指定 Namespace 时的默认选择
- 通常用于临时测试或单机学习环境
- kube-system
- 用于存放 Kubernetes 系统组件(如 kube-proxy、coredns 等)
- 不建议在此 Namespace 部署用户应用
- kube-public
- 所有用户(包括未认证用户)均可访问
- 通常用于存放集群级的公共信息(如集群配置地图)
- kube-node-lease
- 用于存放节点租约(Lease)对象
- 用于节点心跳检测,提高集群的可用性
2、Namespace 的操作
2.1 查看 Namespace
# 查看所有 Namespace
kubectl get namespaces
kubectl get ns # 简写形式# 查看 Namespace 详细信息
kubectl describe namespace default# 查看特定 Namespace 中的资源
kubectl get pods -n default # -n 或 --namespace 指定 Namespace
kubectl get pods --namespace kube-system
2.2 创建 Namespace
命令行方式:
kubectl create namespace my-namespace
YAML 配置方式(推荐):
# namespace.yaml
apiVersion: v1
kind: Namespace
metadata:name: my-namespacelabels:environment: productionteam: devops
创建命令:
kubectl apply -f namespace.yaml
2.3 设置默认 Namespace
为避免每次操作都需指定 -n
参数,可设置默认 Namespace:
# 设置默认 Namespace
kubectl config set-context --current --namespace=my-namespace# 查看当前上下文配置
kubectl config view --minify | grep namespace:
2.4 删除 Namespace
kubectl delete namespace my-namespace
注意:删除 Namespace 会同时删除该 Namespace 下的所有资源,请谨慎操作!
3、Namespace 资源隔离特性
3.1 资源名称隔离
不同 Namespace 中可以有同名的资源,它们被视为完全独立的资源:
# 在 default Namespace 创建名为 nginx 的 Pod
kubectl run nginx --image=nginx# 在 my-namespace 创建同名 Pod,不会冲突
kubectl run nginx --image=nginx -n my-namespace
3.2 网络隔离(非默认)
所有 Pod 无论位于哪个节点或哪个命名空间,都可以直接通过 IP 地址相互通信。
同一命名空间内:Pod 可以简单地使用 <service-name>
来访问 Service。
例如:在 frontend命名空间的 Pod 访问同一命名空间的 api-service,直接使用 http://api-service:80。
跨命名空间访问:Pod 必须使用 Service 的完全限定域名(FQDN):<service-name>.<namespace-name>.svc.cluster.local
。
例如:在 frontend命名空间的 Pod 要访问 backend命名空间的 database-service,需要使用 http://database-service.backend.svc.cluster.local:5432。
简单来说:跨命名空间通信的秘诀就是使用 [服务名].[命名空间名].svc.cluster.local
这个 DNS 地址
4、Namespace 与多租户管理
Namespace 是实现 Kubernetes 多租户管理的基础,结合其他功能可构建完整的多租户解决方案:
4.1 资源配额(Resource Quota)
为每个 Namespace 设置资源使用上限:
apiVersion: v1
kind: ResourceQuota
metadata:name: my-namespace-quotanamespace: my-namespace
spec:hard:pods: "10"requests.cpu: "4"requests.memory: "8Gi"limits.cpu: "8"limits.memory: "16Gi"
4.2 访问控制(RBAC)
通过 RBAC 为不同 Namespace 配置精细的权限控制:
# 仅允许在 my-namespace 中管理 Pod 的角色
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:namespace: my-namespacename: pod-manager
rules:
- apiGroups: [""]resources: ["pods"]verbs: ["get", "watch", "list", "create", "update", "patch", "delete"]
3. 资源限制范围(Limit Range)
为 Namespace 中的资源设置默认和边界值:
apiVersion: v1
kind: LimitRange
metadata:name: my-namespace-limitsnamespace: my-namespace
spec:limits:- default:cpu: "500m"memory: "512Mi"defaultRequest:cpu: "100m"memory: "256Mi"type: Container
5、Namespace 注意事项
-
资源范围限制:
- 并非所有资源都属于 Namespace,如 Node, PersistentVolume, ClusterRole, ClusterRoleBinding, Namespace 本身、StorageClass 等。
- 可通过
kubectl api-resources --namespaced=true
查看命名空间级资源
-
删除影响:
- 删除 Namespace 会级联删除其下所有资源
- 被删除的 Namespace 会处于 Terminating 状态,直到所有资源都被清理
-
默认资源:
- 避免在 default Namespace 部署生产应用
- 不要修改或删除 kube-system 中的系统组件
-
数量限制:
- 单个集群中 Namespace 数量不宜过多(建议不超过 1000)
- 过多的 Namespace 会增加 etcd 负担和管理复杂度