在 Kubernetes 中,Namespace、Project(部分平台特有概念)、Cluster 以及 应用间通信 是核心的组织和交互机制。以下是详细解释:
一、核心概念关系
1. Cluster(集群)
- 定义:Kubernetes 集群是由一组物理或虚拟机(Nodes)组成的集合,包含 Master 控制平面和 Worker 节点。
- 作用:提供资源池,运行所有容器化应用。
- 类比:集群相当于一个“数据中心”,管理所有计算、存储和网络资源。
2. Namespace(命名空间)
- 定义:集群内的逻辑分区,用于隔离资源(如 Pod、Service、Deployment)。
- 典型用途:
- 环境隔离(如
dev
、prod
)。 - 团队隔离(如
team-a
、team-b
)。
- 环境隔离(如
- 特点:
- 同一 Namespace 内的资源名称必须唯一。
- 默认 Namespace 是
default
,系统组件在kube-system
。
- 操作示例:
kubectl get pods --namespace=dev
3. Project(项目)
- 定义:并非原生 K8s 概念,而是某些平台(如 Rancher、OpenShift)的抽象层。
- 作用:
- 比 Namespace 更高维度的分组,可能包含多个 Namespace。
- 集成权限、配额、CI/CD 等管理功能。
- 示例:
Rancher 中一个 Project 可以包含多个 Namespace,方便统一管理。
4. 三者的层级关系
- 一个 Cluster 可以有多个 Projects(平台相关)。
- 一个 Project 可以包含多个 Namespaces。
- 一个 Namespace 包含多个 应用资源(Pod/Service 等)。
二、应用间通信机制
K8s 中的应用通信分为 同一 Namespace 内 和 跨 Namespace/Cluster 两种场景:
1. 同一 Namespace 内通信
- 直接通过 Service 名称:
K8s 的 DNS 服务会自动解析 Service 名称到 ClusterIP。<Service-Name>.<Namespace>.svc.cluster.local
- 示例:
在dev
Namespace 中,frontend
Pod 访问backend
Service:
(同一 Namespace 下可省略后缀,直接curl http://backend.dev.svc.cluster.local
http://backend
)
- 示例:
2. 跨 Namespace 通信
- 通过完整 DNS 名称:
指定目标 Service 的 Namespace。<Service-Name>.<Target-Namespace>.svc.cluster.local
- 示例:
prod
Namespace 的frontend
访问dev
Namespace 的backend
:curl http://backend.dev.svc.cluster.local
- 示例:
3. 跨 Cluster 通信
- 需依赖额外工具:
- Service Mesh(如 Istio):跨集群服务发现。
- Kubernetes Federation:同步多个集群的资源。
- 外部负载均衡:通过公网暴露 Service(如 LoadBalancer 或 Ingress)。
4. 通信的底层实现
- Service 类型决定访问方式:
Service 类型 通信范围 示例用途 ClusterIP
(默认)集群内部 微服务间通信 NodePort
集群外部通过节点端口访问 临时测试 LoadBalancer
云厂商提供的公网 IP 生产环境对外暴露 Headless
直接访问 Pod IP 有状态应用(如数据库集群)
三、关键注意事项
-
网络策略(NetworkPolicy)
- 默认情况下,所有 Pod 可以跨 Namespace 通信。
- 如需隔离,需配置
NetworkPolicy
限制流量:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: deny-cross-namespace namespace: dev spec: podSelector: {} policyTypes: - Ingress ingress: - from: - namespaceSelector: matchLabels: name: dev # 只允许来自 dev Namespace 的流量
-
DNS 解析优化
- 避免硬编码 IP,始终使用 Service 名称。
- 跨 Namespace 调用时,使用完整 DNS 名称。
-
安全实践
- 敏感服务(如数据库)应限制 Namespace 访问权限(通过 RBAC + NetworkPolicy)。
- 生产环境慎用
kube-system
等系统 Namespace。
四、总结图示
- 通信本质:K8s 通过 DNS 和 Service 抽象了底层网络,开发者只需关注逻辑名称。
- 隔离需求:通过 Namespace + NetworkPolicy 实现“软隔离”,物理隔离需多集群。