从 Docker 到 K8S:最小可学习 K8S 示例

张开发
2026/4/13 2:11:11 15 分钟阅读

分享文章

从 Docker 到 K8S:最小可学习 K8S 示例
随着云原生技术的快速发展Kubernetes简称 K8s已成为现代应用部署的事实标准。对于已经熟悉 Docker 的开发者而言将容器化单体应用迁移到 Kubernetes 编排系统是提升工程能力的关键一步。本文通过一个完整的示例系统性地介绍如何将基于 Docker 的应用部署到 Kubernetes 环境中并涵盖核心概念、配置方法和最佳实践。为什么选择 KubernetesDocker 提供了轻量级、可移植的容器运行环境使得应用程序打包与本地运行变得简单高效。然而在生产环境中仅靠 Docker 无法满足高可用、弹性伸缩、服务发现、滚动更新等关键需求高可用性确保即使部分节点或容器失败服务仍能正常响应。自动扩缩容根据负载动态调整实例数量。服务通信管理在微服务架构下实现稳定、安全的服务间通信。滚动更新与回滚在不中断服务的前提下完成版本升级并支持快速回退。Kubernetes 正是为解决上述问题而设计的开源容器编排平台它通过声明式 API 和控制器机制实现了对容器化应用全生命周期的自动化管理。示例应用概览我们以一个简单的 Flask Web 应用为例其功能包括返回基本信息和提供健康检查接口。应用代码app/app.pyfromflaskimportFlask,jsonify appFlask(__name__)APP_NAMEk8s-demoAPP_VERSION0.1.0app.get(/)defindex():returnjsonify({message:hello from kubernetes,app:APP_NAME,version:APP_VERSION,})app.get(/healthz)defhealthz():returnok,200if__name____main__:app.run(host0.0.0.0,port8000)依赖文件app/requirements.txtflask3.1.0该应用监听 8000 端口提供两个端点/返回应用名称与版本信息/healthz用于健康探测返回 HTTP 200 状态码。构建 Docker 镜像在迁移到 Kubernetes 之前需先将应用打包为 Docker 镜像。DockerfileFROM python:3.12-slim WORKDIR /app COPY app/requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY app/app.py . EXPOSE 8000 CMD [python, app.py]构建镜像命令dockerbuild-tk8s-demo:0.1.0.此镜像可在本地通过docker run -p 8000:8000 k8s-demo:0.1.0验证功能是否正常。Kubernetes 核心概念解析理解以下三个基础对象是掌握 Kubernetes 部署的关键PodPod 是 Kubernetes 中最小的调度和部署单元通常包含一个主容器也可包含多个紧密耦合的辅助容器如日志收集器。每个 Pod 拥有独立的 IP 地址和网络命名空间。DeploymentDeployment 控制器用于声明期望的 Pod 副本数量并确保在任何时刻都有指定数量的健康 Pod 运行。它支持滚动更新、版本回滚和扩缩容操作。ServiceService 为一组具有相同标签的 Pod 提供稳定的网络入口实现内部负载均衡。即使后端 Pod 被替换或重建Service 的 IP 和 DNS 名称保持不变。部署到 KubernetesDeployment 配置k8s/deployment.yamlapiVersion:apps/v1kind:Deploymentmetadata:name:k8s-demospec:replicas:2selector:matchLabels:app:k8s-demotemplate:metadata:labels:app:k8s-demospec:containers:-name:webimage:k8s-demo:0.1.0imagePullPolicy:IfNotPresentports:-containerPort:8000readinessProbe:httpGet:path:/healthzport:8000initialDelaySeconds:2periodSeconds:5livenessProbe:httpGet:path:/healthzport:8000initialDelaySeconds:5periodSeconds:10该配置启动两个副本并定义了就绪探针readinessProbe和存活探针livenessProbe确保流量仅被转发到已准备好的实例且异常容器能被自动重启。Service 配置k8s/service.yamlapiVersion:v1kind:Servicemetadata:name:k8s-demospec:selector:app:k8s-demoports:-name:httpport:8000targetPort:8000type:ClusterIP此 Service 类型为ClusterIP仅在集群内部可访问适用于后端服务或配合 Ingress 对外暴露。实际操作步骤1. 创建本地 Kubernetes 集群使用 KindKubernetes in Docker快速搭建测试环境kind create cluster--namedemo查看节点kubectl get nodes2. 将镜像加载到集群kind运行在 Docker 容器里所以本地构建完镜像后还要把镜像加载进集群kind load docker-image k8s-demo:0.1.0--namedemo3. 部署到 Kuberneteskubectl apply-fk8s/deployment.yaml kubectl apply-fk8s/service.yaml4. 验证部署状态kubectl get deployments kubectl get pods kubectl get svc你应该会看到1 个名为k8s-demo的 Deployment2 个 Pod1 个 ClusterIP 类型的 Service5. 访问应用通过端口转发临时暴露服务kubectl port-forward svc/k8s-demo8000:8000在另一终端测试curlhttp://127.0.0.1:8000/# 返回 {message:hello from kubernetes,app:k8s-demo,version:0.1.0}curlhttp://127.0.0.1:8000/healthz# 返回 ok探索 Kubernetes 的核心能力自愈能力演示Kubernetes 能自动恢复因故障或人为删除的 Pod# 获取当前 Pod 名称kubectl get pods# 删除其中一个 Podkubectl delete podpod-name# 观察新 Pod 自动创建kubectl get pods-wDeployment 控制器会立即启动新 Pod 以维持副本数为 2。水平扩展通过修改replicas字段即可实现扩容或缩容# 将 replicas 改为 4重新应用kubectl apply-fk8s/deployment.yaml kubectl get pods也可使用命令式方式kubectl scale deployment/k8s-demo--replicas4健康检查的重要性在生产环境中健康探针是保障服务稳定性的关键机制Readiness Probe就绪探针决定 Pod 是否应接收流量。若失败Service 会将其从负载均衡池中移除。Liveness Probe存活探针判断容器是否仍在正常运行。若连续失败Kubernetes 会重启该容器。合理配置初始延迟initialDelaySeconds和检测周期periodSeconds可避免误判。常用调试技巧日常运维中以下命令极为实用# 查看 Deployment 详细事件与状态kubectl describe deployment k8s-demo# 查看 Pod 详细事件与状态kubectl describe podpod-name# 实时查看所有副本日志kubectl logs-f-lappk8s-demo# 显示 Pod 所在节点及 IP 信息kubectl get pods-owide# 进入容器执行命令用于临时调试kubectlexec-itpod-name-- /bin/sh# 删除应用kubectl delete-fk8s/service.yaml kubectl delete-fk8s/deployment.yaml# 删除 kind 集群kind delete cluster--namedemo从 Docker 到 Kubernetes 的思维转变Docker 操作Kubernetes 对应概念docker runPod手动启停多个容器Deploymentdocker networkService / NetworkPolicydocker-compose.yml多个 YAML 资源清单文件Kubernetes 强调“声明式”而非“命令式”管理你描述“期望状态”系统负责达成并维持该状态。后续学习路径掌握基础部署后建议深入以下方向ConfigMap 与 Secret将配置与敏感信息从镜像中解耦实现环境无关部署。Ingress 控制器通过统一入口对外暴露多个 HTTP 服务支持域名路由与 TLS。Namespace实现多团队或多环境的资源隔离。资源请求与限制Requests/Limits为容器设置 CPU 和内存约束提升集群资源利用率。Helm使用包管理工具简化复杂应用的部署与版本控制。总结本文通过一个完整的 Flask 应用示例展示了从 Docker 镜像构建到 Kubernetes 部署的全过程。我们不仅完成了基础资源配置还体验了自愈、扩缩容、健康检查等核心能力。尽管 Kubernetes 的学习曲线较为陡峭但其带来的自动化、弹性与可靠性优势使其成为现代云原生架构不可或缺的基础设施。掌握 Kubernetes 不仅能提升应用的运维效率也为构建大规模分布式系统奠定坚实基础。现在你已成功部署首个 Kubernetes 应用。下一步可尝试引入持久化存储、外部数据库连接或 CI/CD 集成逐步迈向真正的生产级部署。

更多文章