跳转到内容

Kubernetes命名空间资源

来自代码酷

Kubernetes命名空间资源[编辑 | 编辑源代码]

介绍[编辑 | 编辑源代码]

Kubernetes命名空间(Namespace)是Kubernetes中用于逻辑隔离集群资源的机制。命名空间允许用户将集群划分为多个虚拟集群,每个命名空间内的资源名称必须唯一,但不同命名空间中的资源可以重名。命名空间常用于多租户环境、开发/测试/生产环境隔离或团队资源分配。

命名空间的主要特点包括:

  • 资源隔离:不同命名空间的资源(如Pod、Service)默认相互不可见。
  • 资源配额:可为命名空间设置CPU、内存等资源的限制(通过ResourceQuota)。
  • 权限控制:结合RBAC(基于角色的访问控制),实现不同团队或用户的权限隔离。

核心概念[编辑 | 编辑源代码]

默认命名空间[编辑 | 编辑源代码]

Kubernetes安装后会预置以下命名空间:

  • default:未指定命名空间时的默认位置
  • kube-system:Kubernetes系统组件(如kube-proxy、CoreDNS)
  • kube-public:所有用户可读的公共资源
  • kube-node-lease:节点心跳检测相关

命名空间作用域[编辑 | 编辑源代码]

命名空间作用域的资源(如Pod、Service)属于特定命名空间,而集群作用域的资源(如Node、PersistentVolume)不属于任何命名空间。

基本操作[编辑 | 编辑源代码]

查看命名空间[编辑 | 编辑源代码]

# 列出所有命名空间
kubectl get namespaces
# 或缩写形式
kubectl get ns

输出示例:

NAME              STATUS   AGE
default           Active   15d
kube-system       Active   15d
kube-public       Active   15d
kube-node-lease   Active   15d

创建命名空间[编辑 | 编辑源代码]

# namespace-example.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: dev-team

应用配置:

kubectl apply -f namespace-example.yaml

或使用命令直接创建:

kubectl create namespace dev-team

在命名空间中创建资源[编辑 | 编辑源代码]

# pod-in-namespace.yaml
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  namespace: dev-team  # 指定命名空间
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2

切换当前命名空间[编辑 | 编辑源代码]

# 设置默认命名空间
kubectl config set-context --current --namespace=dev-team
# 验证当前命名空间
kubectl config view --minify | grep namespace

高级功能[编辑 | 编辑源代码]

资源配额(ResourceQuota)[编辑 | 编辑源代码]

限制命名空间的资源使用量:

# quota-example.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-team-quota
  namespace: dev-team
spec:
  hard:
    requests.cpu: "2"
    requests.memory: 4Gi
    limits.cpu: "4"
    limits.memory: 8Gi
    pods: "10"

网络策略(NetworkPolicy)[编辑 | 编辑源代码]

控制命名空间内Pod的网络流量:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-web
  namespace: dev-team
spec:
  podSelector:
    matchLabels:
      role: web
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          purpose: monitoring

实际应用案例[编辑 | 编辑源代码]

场景1:多团队开发环境[编辑 | 编辑源代码]

graph LR A[Cluster] --> B[Team A ns] A --> C[Team B ns] A --> D[Team C ns] B --> E[Pod A1] B --> F[Pod A2] C --> G[Pod B1] D --> H[Pod C1]

每个团队在独立命名空间中工作:

  • 避免命名冲突(如都创建名为"api"的Service)
  • 独立设置资源配额
  • 通过RBAC控制访问权限

场景2:环境隔离[编辑 | 编辑源代码]

graph TD Cluster --> Production Cluster --> Staging Cluster --> Development Production --> P1[Payment Service] Staging --> S1[Payment Service] Development --> D1[Payment Service]

同一应用在不同环境使用相同资源名称但不同命名空间:

  • production/staging/development命名空间
  • 相同的部署配置(仅namespace不同)
  • 避免测试影响生产环境

数学表示[编辑 | 编辑源代码]

命名空间可形式化表示为: Namespace=(Name,{Resource1,Resource2,...,Resourcen},Quota,Policies) 其中:

  • Name 是命名空间唯一标识符
  • {Resource} 是该命名空间包含的资源集合
  • Quota 是资源配额配置
  • Policies 是网络/安全策略

最佳实践[编辑 | 编辑源代码]

1. 避免滥用:小型集群可能不需要多个命名空间 2. 命名规范:使用团队/项目/环境作为命名标准(如team-frontend, prod-eu) 3. 配额监控:为关键命名空间设置合理的ResourceQuota 4. 清理策略:对临时命名空间设置TTL(通过Kubernetes的CronJob或外部工具)

常见问题[编辑 | 编辑源代码]

Q1: 如何查看某个命名空间的所有资源?[编辑 | 编辑源代码]

kubectl get all -n dev-team

Q2: 能否跨命名空间访问Service?[编辑 | 编辑源代码]

可以,使用完全限定域名(FQDN)格式: service-name.namespace-name.svc.cluster.local

Q3: 删除命名空间会怎样?[编辑 | 编辑源代码]

命名空间及其包含的所有资源将被删除(需确认无重要资源)

总结[编辑 | 编辑源代码]

Kubernetes命名空间是集群资源管理的基础单元,通过逻辑隔离实现:

  • 多租户支持
  • 环境隔离
  • 资源配额管理
  • 安全边界控制

合理使用命名空间能使集群管理更加清晰高效,特别是在多人协作或复杂环境场景中。