← 返回首页
🔧

Kubernetes Namespace 命名空间

📂 devops ⏱ 2 min 344 words

Kubernetes Namespace 命名空间

什么是 Namespace

Namespace 是 Kubernetes 中用于将集群资源划分为多个虚拟集群的机制。它为不同团队、项目或环境提供逻辑隔离,避免资源名称冲突,并支持基于命名空间的访问控制和资源配额。

默认命名空间

Kubernetes 默认创建以下命名空间:

kubectl get namespaces

输出示例:

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

创建 Namespace

通过命令行创建

kubectl create namespace dev
kubectl create namespace staging
kubectl create namespace production

通过 YAML 文件创建

apiVersion: v1
kind: Namespace
metadata:
  name: dev
  labels:
    env: development
    team: backend
kubectl apply -f namespace.yaml

使用 Namespace

指定命名空间创建资源

kubectl run my-pod --image=nginx --namespace=dev
kubectl create deployment my-app --image=nginx --namespace=dev
kubectl apply -f deployment.yaml -n dev

切换默认命名空间

# 临时切换
kubectl config set-context --current --namespace=dev

# 查看当前命名空间
kubectl config view --minify | grep namespace

查看所有命名空间的资源

# 查看所有命名空间的 Pod
kubectl get pods --all-namespaces

# 查看特定命名空间的资源
kubectl get pods -n dev

资源配额管理

ResourceQuota

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

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
    pods: "20"
    services: "10"
    persistentvolumeclaims: "5"

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"

命名空间的网络隔离

NetworkPolicy

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: dev-network-policy
  namespace: dev
spec:
  podSelector: {}
  policyTypes:
    - Ingress
    - Egress
  ingress:
    - from:
        - namespaceSelector:
            matchLabels:
              env: development
  egress:
    - to:
        - namespaceSelector:
            matchLabels:
              env: development

标签和选择器

给命名空间打标签

kubectl label namespace dev env=development
kubectl label namespace staging env=staging
kubectl label namespace production env=production

按标签选择命名空间

kubectl get namespaces -l env=development

清理 Namespace

# 删除命名空间及其所有资源
kubectl delete namespace dev

# 仅删除命名空间(保留资源)
kubectl delete ns dev --cascade=orphan

命名空间与集群资源

查看命名空间资源使用情况

kubectl top nodes
kubectl top pods -n dev

查看命名空间的资源配额

kubectl get resourcequota -n dev
kubectl describe resourcequota dev-quota -n dev

实践案例:多环境部署

# 创建三个环境的命名空间
for env in dev staging production; do
  kubectl create namespace $env
done

# 为每个环境创建资源配额
kubectl apply -f resource-quota.yaml -n dev
kubectl apply -f resource-quota.yaml -n staging
kubectl apply -f resource-quota.yaml -n production

# 在不同环境部署应用
kubectl apply -f deployment.yaml -n dev
kubectl apply -f deployment.yaml -n staging
kubectl apply -f deployment.yaml -n production

最佳实践

总结

Namespace 是 Kubernetes 多租户和资源隔离的基础。通过合理使用 Namespace,可以有效管理集群资源,实现环境隔离和访问控制。