Kubernetes命名空间(Namespace)

Namespace 是 Kubernetes 中用于实现资源隔离和多租户管理的核心机制。它通过将集群资源划分为逻辑上的不同分组,实现了不同团队、项目或环境之间的资源隔离与管理。

1、默认的 Namespace

Kubernetes 集群初始化时会自动创建 4 个默认 Namespace:

  1. default
    • 未指定 Namespace 时的默认选择
    • 通常用于临时测试或单机学习环境
  2. kube-system
    • 用于存放 Kubernetes 系统组件(如 kube-proxy、coredns 等)
    • 不建议在此 Namespace 部署用户应用
  3. kube-public
    • 所有用户(包括未认证用户)均可访问
    • 通常用于存放集群级的公共信息(如集群配置地图)
  4. 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-namespace
  labels:
    environment: production
    team: 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-quota
  namespace: 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-namespace
  name: 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-limits
  namespace: my-namespace
spec:
  limits:
  - default:
      cpu: "500m"
      memory: "512Mi"
    defaultRequest:
      cpu: "100m"
      memory: "256Mi"
    type: Container

5、Namespace 注意事项

  1. 资源范围限制

    • 并非所有资源都属于 Namespace,如 Node, PersistentVolume, ClusterRole, ClusterRoleBinding, Namespace 本身、StorageClass 等。
    • 可通过 kubectl api-resources --namespaced=true 查看命名空间级资源
  2. 删除影响

    • 删除 Namespace 会级联删除其下所有资源
    • 被删除的 Namespace 会处于 Terminating 状态,直到所有资源都被清理
  3. 默认资源

    • 避免在 default Namespace 部署生产应用
    • 不要修改或删除 kube-system 中的系统组件
  4. 数量限制

    • 单个集群中 Namespace 数量不宜过多(建议不超过 1000)
    • 过多的 Namespace 会增加 etcd 负担和管理复杂度
posted @ 2025-09-10 17:54  xclic  阅读(34)  评论(0)    收藏  举报