Kubernetes Web 服务部署架构总结
一、Kubernetes 基本概念对比
概念 | 类型 | 作用 | 是否运行实体 | 属于控制面/数据面 |
---|
Pod | 最小运行单元 | 封装容器,提供统一网络/存储视图 | ✅ 是,运行容器进程 | 数据面 |
Node | 虚拟/物理主机 | 承载 Pod 的计算资源 | ✅ 是,运行 kubelet/containerd 等 | 数据面 |
Deployment | 控制器资源 | 管理 Pod 副本数与滚动发布策略 | ❌ 否,仅为声明式配置 | 控制面 |
Service | 虚拟资源 | 提供 Pod 的统一访问入口与负载均衡 | ❌ 否,由 kube-proxy 实现 | 控制面 + 数据面 |
Ingress | 路由规则 | 定义 HTTP(S) 的域名路由 | ❌ 否,实际代理由 Ingress Controller 执行 | 控制面 |
Ingress Controller | 实体服务 | 实现 Ingress 路由转发,如 nginx/traefik | ✅ 是,运行在 Pod 中 | 数据面 |
kubelet | Agent 进程 | 每个 Node 的管理守护进程,控制容器运行 | ✅ 是,常驻进程 | 数据面 |
kube-proxy | 网络代理 | 维护 Service 到 Pod 的路由规则 | ✅ 是,运行在每个 Node 上 | 数据面 |
kube-apiserver | 中心组件 | 控制面入口,所有操作都需通过它 | ✅ 是,集群入口服务 | 控制面 |
kube-scheduler | 控制器 | 负责 Pod 的调度分配 | ✅ 是 | 控制面 |
二、典型 Web 服务部署架构组件
以下是一个对外提供 HTTP 服务的典型架构组成:
组件 | 功能 | 类型 | 部署位置 |
---|
Web 应用 Pod | 运行业务容器 | Deployment → Pod | 多个 Node 上调度运行 |
Service | 提供内部统一访问 + 负载均衡 | ClusterIP | 控制面定义,Node 上转发 |
Ingress | 定义路由规则 | 资源对象 | 控制面定义 |
Ingress Controller | 实际处理 HTTP 请求 | DaemonSet / Deployment | 多个节点运行 |
External LB | 提供公网入口 | 云厂商资源 | 集群外(如 AWS ELB) |
ConfigMap/Secret | 配置与密钥注入 | K8s 原生对象 | 控制面中,由 API Server 管理 |
Fluentd / Promtail | 日志采集 | DaemonSet / Sidecar | 每个节点或 Pod 内 |
HPA / PDB | 弹性伸缩与高可用保障 | 控制器资源 | 控制面运行逻辑 |
kubelet / kube-proxy | 控制与转发 | 进程守护 | 每个 Node 上 |
三、典型网络流量路径
1用户请求 ➜ 云厂商 LB ➜ Ingress Controller Pod ➜ Service ➜ Pod(8080)
- 云 LB 是公网/入口网关,一般为四层或七层代理(TCP/HTTP);
- Ingress Controller 实际执行反向代理,通常使用 NGINX、Traefik、Istio Gateway 等;
- Service 实现 Pod 层的负载均衡,使用 kube-proxy 的 iptables 或 ipvs;
四、AWS 和阿里云架构差异对比
AWS 架构示意:
1[Route53]
2 ↓
3[AWS ALB/NLB] (公网/内网)
4 ↓
5[Ingress Controller Pod] (运行在 Node 上)
6 ↓
7[Service]
8 ↓
9[Pod]
- 云 LB:ALB (7层)、NLB (4层)
- 证书管理:AWS Certificate Manager
- 弹性扩容:结合 ASG + HPA + Cluster Autoscaler
- 镜像仓库:ECR (Elastic Container Registry)
阿里云架构示意:
1[阿里云解析 DNS] (阿里云 DNS)
2 ↓
3[SLB (共享型/独享型)]
4 ↓
5[Ingress Controller Pod] (支持 Cert-Manager)
6 ↓
7[Service]
8 ↓
9[Pod]
- 云 LB:阿里云 SLB
- 证书管理:阿里云证书中心(或接入 cert-manager)
- 弹性扩缩容:ACK 支持弹性伸缩组 + Cluster Auto Scaling
- 镜像仓库:阿里云容器镜像服务(ACR)
五、CI/CD 集成部署流程
阶段 | 工具举例 | 说明 |
---|
代码提交 | GitHub / GitLab | 开发者推送代码至主干分支 |
编译构建 | Docker / BuildKit | 制作镜像并打 tag(CI) |
镜像发布 | Harbor / ACR / ECR | 镜像推送到仓库 |
部署触发 | ArgoCD / Jenkins / GitLab CI | 自动或手动触发部署流程 |
应用发布 | Helm / Kustomize / kubectl | 通过 Helm 或 YAML 部署到 K8s |
发布策略 | RollingUpdate / Blue-Green / Canary | 分批上线、灰度发布等策略支持 |
CI/CD 通常与 GitOps 结合,可通过 ArgoCD/Flux 监听 Git 仓库中 YAML 变化,自动完成部署。
六、常见问题 Q&A
Q1: 节点和 Pod 的区别与联系?挂了怎么恢复?
比较项 | Node(节点) | Pod(运行单元) |
---|
定义 | 物理或虚拟主机 | K8s 中最小部署单元 |
内容 | OS、kubelet、容器运行时等 | 一个或多个容器及其共享资源 |
管理者 | 云平台 + kubelet | K8s 控制面(Deployment、ReplicaSet) |
挂掉后恢复 | 云平台重启或重新加入集群 | K8s 控制器检测后重新调度到其他节点 |
Q2: Deployment 和 Service 是“实际运行服务”吗?
不是,它们是 Kubernetes 控制面上的逻辑资源:
- Deployment:声明式定义副本数、更新策略,由控制器创建 Pod;
- Service:定义访问策略、负载方式,由 kube-proxy 实现访问路径;
- 都不是进程,也不是运行在 Node 上的实体程序。
Q3: 各个组件运行位置分别在哪?
组件 | 运行位置 |
---|
kube-apiserver / controller-manager / scheduler | Master 节点(控制面) |
kubelet / containerd / kube-proxy | 所有工作节点(Node) |
Deployment / Service / Ingress | 存储于 etcd,通过控制器解释执行 |
Pod(业务) | 部署在多个 Worker Node 上 |
Ingress Controller | 一般以 DaemonSet 或 Deployment 运行在 Node 上 |
Q4: Ingress Controller 为什么在图里画在 Cluster 外边?
- 从网络流量视角来看,公网流量先经过云 LB,再进入 Ingress Controller;
- 所以图中将 Ingress Controller 视为“集群边缘接入点”;
- 实际上它是运行在集群内部的 Pod,只是为了便于理解边界流量而画在外面。
Q5: Kubernetes 提供的负载均衡 vs 云厂商的 LB 有何区别?
比较项 | Kubernetes Service | 云厂商 LB(如 ELB) |
---|
作用域 | 集群内部 Pod 之间 | 集群外部 → 内部入口 |
实现方式 | kube-proxy + iptables/ipvs | 云平台原生资源,如四层/七层代理 |
是否自动创建 | 是(ClusterIP / NodePort / LoadBalancer) | 是(Service 设置为 LoadBalancer) |
是否需公网 IP | 否(除非 LoadBalancer 类型) | 是 |
使用场景 | Pod-to-Pod、微服务内部调用 | 终端用户访问集群 HTTP 服务 |