Appearance
云原生生态:容器运行时 / Service Mesh / GitOps / CI-CD
一、什么是"云原生"(Cloud Native)
CNCF 定义:云原生技术让组织能在公有云/私有云/混合云等现代动态环境中,构建和运行可弹性扩展的应用。代表技术:容器、服务网格、微服务、不可变基础设施、声明式 API。
四要素(常考):容器化、微服务、DevOps / CI-CD、持续交付。 延伸:可观测性(Observability)、Service Mesh、Serverless、GitOps。
核心思想:应用与基础设施解耦、一切声明式、面向失败设计(假设会挂,能自愈)、不可变基础设施。
二、容器基础
- 容器 vs 虚拟机:容器共享宿主机内核,靠 namespace(隔离视图)+ cgroups(限制资源) 实现隔离,轻量、启动快;VM 有独立内核,重、隔离更强。
- 镜像分层:镜像由只读层叠加,容器加一个可写层;分层复用让拉取/存储高效。
- Docker → containerd:Docker 把容器运行时拆出 containerd;K8s 通过 CRI 接口对接运行时,Docker 因不直接实现 CRI 被弃用(dockershim 移除),现在默认 containerd / CRI-O。
- OCI 标准:镜像规范(OCI Image)+ 运行时规范(OCI Runtime),保证生态互通。
三、Service Mesh(服务网格)
- 解决什么:微服务间通信的流量治理、安全(mTLS)、可观测性、熔断限流重试——原本要写进业务代码,现在下沉到基础设施层。
- 实现方式:Sidecar 代理(Istio 用 Envoy)与业务容器同 Pod,拦截所有进出流量;控制平面下发规则。
- 代表:Istio、Linkerd、Consul。新趋势:Ambient Mesh / eBPF(如 Cilium)减少 sidecar 开销。
- Service Mesh vs Ingress:Ingress 管南北向(集群入口),Mesh 管东西向(服务间)+ 南北向。
四、GitOps
- 核心:Git 是唯一事实来源;集群状态由 Git 中声明的期望状态驱动,用控制器持续同步。
- 工具:ArgoCD、Flux。
- 优点:可审计(Git history)、可回滚、声明式、自动化;避免"手工 kubectl 改线上"。
- Pull 模式:集群内 agent 拉取 Git 并 apply(比 Push 模式更安全,凭证不出集群)。
五、CI/CD
- CI(持续集成):代码提交后自动构建、测试、镜像打包。
- CD(持续交付/部署):自动把镜像发布到环境。
- 典型流水线:
commit → build → test → 构建镜像 → 推送镜像仓库 → 部署(kubectl set image / Helm / ArgoCD)。 - 工具:GitLab CI、GitHub Actions、Jenkins、Tekton、Argo Workflows。
六、包管理与配置
- Helm:K8s 的包管理器,用 Chart 模板化 +
values.yaml参数化,管理复杂应用的一组资源,支持版本与回滚。 - Kustomize:无模板、用 overlay 叠加定制多环境(原生集成在 kubectl)。
- Operator:CRD + 控制器,把领域运维知识编码成软件(如 Prometheus Operator、各种数据库 Operator)。
七、其他高频名词
- CRD / CR:扩展 K8s API,自定义资源(Custom Resource Definition)与其实例。
- Serverless / FaaS:Knative、OpenFaaS,按需运行、缩到零。
- 不可变基础设施:不原地改,而是替换(重建新容器/镜像)。
- 容器镜像仓库:Harbor、镜像扫描、多架构镜像。
- 多集群 / 联邦:Karmada、集群网格,跨云跨区管理。
八、高频速答
Q:容器和虚拟机本质区别? A:容器共享宿主内核、用 namespace/cgroups 隔离,轻量启动快;VM 有独立内核,隔离强但重。
Q:Service Mesh 解决了什么问题?为什么不直接写 SDK? A:把通信治理(mTLS、重试、熔断、指标)从业务代码下沉到 sidecar,语言无关、统一治理、可独立升级;代价是额外延迟与资源开销。
Q:GitOps 和普通 CI/CD 区别? A:GitOps 强调"Git 为唯一事实来源 + 控制器持续同步(Pull 模式)",状态可审计可回滚,天然声明式;普通 CD 常是流水线 Push 部署。
Q:Helm 的作用? A:把一组 K8s 资源模板化打包成 Chart,参数化复用、版本管理与回滚,解决"手写一堆 YAML"的痛点。
Q:什么是 Operator? A:用 CRD 定义自定义资源 + 控制器实现其运维逻辑,把人工运维知识自动化(如自动扩缩、备份、故障恢复)。
Q:K8s 为什么不用 Docker 了? A:K8s 通过 CRI 对接容器运行时,Docker 不直接实现 CRI(需 dockershim 适配层),故移除;containerd 更轻、更符合分层设计。