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,管理有状态应用。