🏢 比喻:Kubernetes命名空间就像公司办公室的不同部门

想象一下,你有一个大型公司(Kubernetes集群),里面有多个部门(命名空间):

  • 市场部(命名空间1):负责广告、客户沟通
  • 研发部(命名空间2):负责开发新产品
  • 财务部(命名空间3):负责预算和报销

每个部门有自己的办公桌、电脑和文件(资源),但整个公司只有一个大的办公空间(集群)。命名空间就是用来组织这些部门的工具。

📌 什么是命名空间?

命名空间是Kubernetes中用来隔离资源组的机制,就像公司里不同的部门一样。

简单说:命名空间是Kubernetes集群中的"虚拟分区",帮助你把资源(Pods、Services等)组织成不同的组。

🔍 为什么需要命名空间?

1. 多用户环境(就像多部门)

  • 当公司有多个团队(开发、测试、运维)时
  • 每个团队有自己的工作空间(命名空间)
  • 避免互相干扰:开发团队不会误删测试环境的资源

2. 资源隔离(就像不同部门的文件)

  • 你可以在不同命名空间中使用相同的资源名称
    • 例如:frontend-service可以同时存在于devprod命名空间中
  • 同一个命名空间内,资源名称必须唯一

3. 资源配额(就像部门预算)

  • 可以为不同命名空间设置资源限制
    • 开发团队:最多10个Pod
    • 测试团队:最多5个Pod
  • 防止某个团队用光所有资源

🧩 命名空间的"初始设置"(Kubernetes默认的命名空间)

Kubernetes安装后会自动创建4个命名空间:

命名空间作用类比
default新集群的默认命名空间公司的"公共休息区"
kube-node-lease存储节点心跳信息公司的"门禁系统"
kube-public所有用户可读公司的"公共公告板"
kube-systemKubernetes系统组件公司的"IT部门"

💡 重要提示:生产环境不要使用default命名空间,应该创建自己的命名空间。

🛠️ 命名空间的使用方式

1. 查看当前命名空间

kubectl get namespace

输出示例:

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

2. 在特定命名空间中运行命令

# 创建一个Pod在dev命名空间
kubectl run nginx --image=nginx --namespace=dev

# 获取dev命名空间的Pod
kubectl get pods --namespace=dev

3. 永久设置当前命名空间

# 设置当前上下文默认使用dev命名空间
kubectl config set-context --current --namespace=dev

# 验证设置
kubectl config view --minify | grep namespace:

🌐 命名空间与DNS(重要!)

当你在Kubernetes中创建Service时,会自动创建DNS记录:

<service-name>.<namespace-name>.svc.cluster.local

例子:

  • dev命名空间中创建名为nginx-service的Service
  • DNS记录为:nginx-service.dev.svc.cluster.local
  • 如果在dev命名空间的Pod中使用nginx-service,会自动解析到dev命名空间的Service
  • 如果想访问prod命名空间的Service,需要使用完整域名:nginx-service.prod.svc.cluster.local

📌 关键点:在同一个命名空间内,可以直接用Service名称;跨命名空间必须用完整域名。

⚠️ 命名空间的命名规则

  1. 必须是有效的RFC 1123 DNS标签

    • 只能包含小写字母、数字和连字符(如my-dev-namespace
    • 不能以连字符开头或结尾
    • 不能超过63个字符
  2. 避免使用kube-前缀

    • 这是Kubernetes系统保留的前缀
    • 例如:kube-system是系统命名空间,不要创建kube-myapp

📋 哪些资源在命名空间中?哪些不在?

资源类型是否在命名空间中例子
Podnginx-pod
Servicenginx-service
Deploymentnginx-deployment
Namespace命名空间本身不在任何命名空间中
Node集群的物理节点
PersistentVolume存储卷

💡 命令验证

# 查看在命名空间中的资源
kubectl api-resources --namespaced=true

# 查看不在命名空间中的资源
kubectl api-resources --namespaced=false

📌 命名空间的标签(高级特性)

Kubernetes控制平面会自动为所有命名空间添加一个不可变标签:

kubernetes.io/metadata.name: <namespace-name>

这个标签是Kubernetes内部使用的,你无法修改它。

🌟 为什么命名空间如此重要?

  1. 组织清晰:让集群资源有条理
  2. 安全隔离:不同团队不会互相干扰
  3. 资源管理:可以为不同团队设置资源配额
  4. 环境区分:开发、测试、生产环境可以分开
  5. DNS隔离:不同命名空间的Service不会冲突

📝 实际使用场景

场景1:开发环境 vs 生产环境

  • dev命名空间:开发团队使用
  • prod命名空间:生产环境使用
  • 两个命名空间可以有同名的Service(如app-service),但不会冲突

场景2:多团队协作

  • team-a命名空间:团队A的资源
  • team-b命名空间:团队B的资源
  • 每个团队有自己的资源池,不会互相影响

场景3:资源配额控制

apiVersion: v1
kind: ResourceQuota
metadata:
  name: dev-quota
  namespace: dev
spec:
  hard:
    pods: "10"
    requests.cpu: "2"
    requests.memory: "4Gi"

这个配额限制dev命名空间最多使用10个Pod、2个CPU和4GB内存。

❌ 什么时候不应该使用命名空间?

  • 当你只有少量用户(比如1-2个团队)
  • 当你需要区分的只是不同版本的同一软件(用标签区分更好,而不是命名空间)
    • 例如:version=v1version=v2,而不是创建两个命名空间

📌 Kubernetes官方建议:开始时不要使用命名空间,当确实需要时再添加。

💡 总结:命名空间就像公司里的部门

概念类比说明
Kubernetes集群整个公司一个大的办公空间
命名空间公司部门如市场部、研发部
资源名称办公桌编号同一部门内唯一
跨命名空间访问跨部门沟通需要使用完整地址

命名空间是Kubernetes中组织资源的基石,它让大型团队能够高效协作,同时保持环境的清晰和安全。记住:不要过度使用命名空间,只在确实需要时才创建新的命名空间。

📌 关键提示:生产环境不要使用default命名空间,应该创建自己的命名空间,比如prodstagingdev等。

这就是Kubernetes命名空间的全部内容!现在你已经理解了命名空间的工作原理,可以在自己的Kubernetes集群中开始使用了。

更多推荐