如何用 Docker 和 Kubernetes 构建 DevOps 环境

本文从实际问题出发,演示如何用 Docker 容器化应用、用 Kubernetes 编排集群,并集成 OpenTelemetry 实现可观测性,逐步构建一个可扩展的 DevOps 环境,涵盖操作步骤、常见误区与取舍。

如何用 Docker 和 Kubernetes 构建 DevOps 环境
封面图:ZuCDN · ZuCDN 原创

当你准备用 Docker 和 Kubernetes 搭建 DevOps 环境时,第一个问题往往是:先学哪个?实际上,两者解决的是不同层面的问题——Docker 负责把应用及其依赖打包成镜像,而 Kubernetes 负责在集群中运行和管理这些容器。本文将从一次真实的部署需求出发,带你逐步构建一个可观测的 DevOps 环境。

为什么需要 Docker 和 Kubernetes?

假设你有一个微服务应用,需要部署到多台服务器,还要支持自动扩缩容和滚动更新。如果只用 Docker,你可以在每台机器上手动运行容器,但无法统一管理;而 Kubernetes 提供了声明式配置和自动化能力,正如官方文档所述,它是一个“可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,促进声明式配置和自动化”。因此,两者结合是构建 DevOps 环境的主流选择。

第一步:用 Docker 容器化应用

首先,你需要将应用打包成 Docker 镜像。以 Node.js 应用为例,创建一个 Dockerfile

FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "server.js"]

然后构建并运行:

docker build -t my-app:1.0 .
docker run -p 3000:3000 my-app:1.0

注意:构建镜像时,应尽量使用官方基础镜像并指定版本,避免使用 latest 标签,以保证可重现性。Docker 官方文档也强调,开始使用 Docker 时,应遵循最佳实践优化开发工作流。

第二步:编写 Kubernetes 部署清单

当镜像构建完成后,你需要用 Kubernetes 来编排它。创建 deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: my-app:1.0
        ports:
        - containerPort: 3000

应用配置:

kubectl apply -f deployment.yaml

这里的关键是理解 Pod——Kubernetes 中最小的可部署计算对象。Deployment 管理 Pod 的副本数,并支持滚动更新。你可以通过 kubectl get pods 查看状态。

第三步:暴露服务与配置管理

要让外部访问应用,需要创建 Service:

apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
  type: LoadBalancer

同时,配置管理可以使用 ConfigMap 和 Secret,将配置与镜像分离,便于环境间迁移。

第四步:集成可观测性

DevOps 环境必须包含可观测性。OpenTelemetry(OTel)是一个供应商中立、开源的观测框架,用于生成、收集和导出遥测数据(如 trace、metric、log)。你可以为应用添加 OTel SDK,并将数据导出到 Prometheus 或 Jaeger。

例如,在 Kubernetes 中部署 OTel Collector 作为 DaemonSet,统一接收各 Pod 的遥测数据。这样,你就能通过 Grafana 等工具监控集群和应用状态。

第五步:构建 CI/CD 流水线

最后,将上述过程自动化。常见的做法是使用 Jenkins 或 GitLab CI 构建镜像并推送镜像仓库,然后更新 Kubernetes 部署。你可以参考站内的 DevOps 流水线搭建指南和工具链选型对比,但核心思路是:代码提交触发构建,构建成功后自动更新集群。

常见误区与失败条件

  • 误区一:忽略资源限制。不设置 CPU/内存 limit,可能导致节点资源耗尽。
  • 误区二:把镜像标签设为 latest,导致无法回滚。
  • 失败条件:Kubernetes 集群版本过旧,不兼容最新的 API 版本。
  • 注意:Docker 与 Kubernetes 的版本兼容性需提前验证。

总结与进一步阅读

通过以上步骤,你已经用 Docker 和 Kubernetes 构建了一个基本的 DevOps 环境,并集成了可观测性。实际操作中,你可能还需要考虑网络策略、存储卷、安全上下文等,这些在 Kubernetes 官方文档的概念部分都有详细说明。

如果你对流水线搭建或工具选型有疑问,可以阅读站内的相关文章,它们能提供更具体的场景分析。

参考资料

延伸阅读