当你准备用 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 官方文档的概念部分都有详细说明。
如果你对流水线搭建或工具选型有疑问,可以阅读站内的相关文章,它们能提供更具体的场景分析。
参考资料
延伸阅读
