30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度最近两年云计算和容器化技术已经从“加分项”变成了后端和运维工程师的“生存技能”。很多朋友想学但一看到 Docker、K8s 那一堆概念和命令就头疼镜像、容器、Pod、Service、Ingress…… 网上的教程要么太浅只教几个命令要么太深直接从源码讲起学完还是不知道怎么用到实际项目里。这篇文章要解决的就是这个问题。它不是一个简单的命令手册而是一套从零到一的实战路径。我会带你理解为什么在 2026 年的今天掌握 Docker 和 K8s 依然是构建现代应用交付能力的核心更重要的是我会把这两个看似庞大的技术栈拆解成一个个可执行、可验证的模块让你在本地就能搭建一个微缩的“生产环境”亲身体验从代码打包、部署到扩缩容、服务发现的完整流程。如果你符合以下任何一种情况这篇文章就是为你写的后端开发想摆脱“本地能跑上线就崩”的困境让应用环境标准化。运维或 DevOps 工程师需要系统掌握容器编排而不仅仅是会用几个kubectl命令。技术负责人或架构师正在评估或推进团队的技术栈容器化改造。学生或转行者希望获得一份能写进简历的、有深度的实战项目经验。我们不会空谈概念而是通过一个完整的 Spring Boot 或 Python Flask 应用你可以任选其一完成从 Docker 化到 K8s 集群部署的全过程。过程中每一个步骤都有代码和配置每一个决策点都会解释“为什么”。读完并跟着操作你收获的将不仅仅是知识而是一套可复用的工程能力。1. 重新理解 Docker 与 K8s解决什么问题不解决什么问题在动手之前我们必须先统一认知Docker 和 K8s 各自的核心价值是什么以及它们如何分工协作。很多初学者会混淆两者的边界。Docker 的核心是“封装”与“交付”。它解决的是“环境一致性”问题。没有 Docker 时开发在 Mac 上基于 Python 3.9 写好了代码交给运维。运维在 CentOS 7 上用 Python 3.6 部署结果一堆库不兼容应用启动失败。经典的“在我机器上能跑”。有了 Docker 后开发将应用代码、Python 3.9 解释器、所有依赖库打包成一个不可变的“镜像”。这个镜像在任何安装了 Docker 的机器上无论是开发机、测试机还是生产服务器都能以完全一致的方式运行起来。它封装的是单个应用及其直接依赖。Kubernetes (K8s) 的核心是“编排”与“管理”。它解决的是“规模化运维”问题。没有 K8s 时你手动在 10 台服务器上启动 Docker 容器需要自己写脚本监控容器健康、处理某台服务器宕机后的容器迁移、配置容器间的网络通信和负载均衡。当应用有 100 个实例时这几乎是不可能完成的任务。有了 K8s 后你告诉 K8s“我需要运行 5 个我的应用实例并且它们需要能互相发现对外通过一个域名提供服务。” K8s 会自动在集群中选择合适的节点创建容器Pod确保始终有 5 个健康的实例在运行自动配置网络策略和服务发现。它管理的是成百上千个容器化应用的生命周期。一个精辟的类比Docker 像是集装箱它标准化了货物的包装方式镜像使得货物应用可以在轮船、火车、卡车不同环境间高效搬运。而 K8s 像是现代化的港口自动化调度系统它决定哪些集装箱应该放在哪艘船的哪个位置调度如何高效装卸生命周期管理以及如何应对风暴导致某艘船延误故障自愈。理解了这个分工你就明白学习路径了先学会用 Docker 把应用“装进集装箱”再学会用 K8s 来“调度和管理整个港口的集装箱舰队”。2. 环境准备2026 年我们用什么工具链工欲善其事必先利其器。为了获得最佳的学习体验和贴近生产环境我推荐以下工具链组合。这套组合在 2026 年依然是主流且稳定的选择。2.1 核心运行环境操作系统Linux (Ubuntu 22.04 LTS 或 CentOS Stream 9)或macOS。Windows 用户强烈建议使用WSL 2 (Windows Subsystem for Linux)并安装 Ubuntu 发行版。纯 Windows Docker Desktop 环境在涉及 Linux 特有操作时可能会遇到兼容性问题。Docker版本 24.x 或更高。Docker 已经将docker-compose功能集成到 CLI 中我们主要使用docker命令。Kubernetes对于本地学习和开发我们使用Minikube或Kind (Kubernetes in Docker)。它们都能在单机上快速启动一个功能完整的 K8s 集群。本文以Minikube为例因为它对新手更友好集成功能更多。kubectlK8s 的命令行管理工具用于与任何 K8s 集群包括 Minikube交互。2.2 安装与验证步骤以下命令在 Ubuntu/WSL2 环境下执行。其他系统请参考对应官方文档。步骤一安装 Docker# 1. 卸载旧版本如有 sudo apt-get remove docker docker-engine docker.io containerd runc # 2. 更新 apt 包索引并安装依赖 sudo apt-get update sudo apt-get install -y \ ca-certificates \ curl \ gnupg \ lsb-release # 3. 添加 Docker 官方 GPG 密钥 sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 4. 设置稳定版仓库 echo \ deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 5. 安装 Docker Engine sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 6. 将当前用户加入 docker 组避免每次使用 sudo sudo usermod -aG docker $USER # **重要**执行此命令后你需要**退出当前终端并重新登录**或者重启系统才能使组权限生效。 # 7. 验证安装 docker --version # 预期输出Docker version 24.0.7, build xxxxxxx docker run hello-world # 如果能成功运行并看到 Hello from Docker! 等信息说明安装成功。步骤二安装 Minikube 和 kubectl# 1. 安装 kubectl curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl kubectl version --client # 预期输出客户端版本信息 # 2. 安装 Minikube curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 sudo install minikube-linux-amd64 /usr/local/bin/minikube minikube version # 预期输出 Minikube 版本信息 # 3. 启动 Minikube 集群需要重新登录后docker 权限生效 # 这里使用 Docker 作为驱动这是最方便的方式 minikube start --driverdocker # 这个过程会下载 K8s 镜像可能需要几分钟。 # 4. 验证集群状态 minikube status # 预期输出host, kubelet, apiserver 均为 Running kubectl cluster-info # 预期输出 Kubernetes control plane 和 CoreDNS 的地址 kubectl get nodes # 预期输出一个名为 minikube 的节点状态为 Ready至此你的本地学习环境已经就绪。我们有了 Docker打包工具有了一个单节点的 K8s 集群Minikube也有了管理集群的kubectl遥控器。3. 第一步实战将你的应用 Docker 化理论再好不如一行代码。我们从一个简单的 Web 应用开始。你可以选择 Java (Spring Boot) 或 Python (Flask) 版本原理相通。3.1 示例应用代码Python Flask 版 创建一个项目目录docker-k8s-demo并在其中创建以下文件# app.py from flask import Flask import os import socket app Flask(__name__) app.route(/) def hello(): hostname socket.gethostname() return fHello from Docker K8s! Container Hostname: {hostname}\n app.route(/health) def health(): return OK, 200 if __name__ __main__: app.run(host0.0.0.0, port5000)# requirements.txt Flask2.3.3Spring Boot 版 如果你熟悉 Java可以使用 Spring Initializr 生成一个基础项目依赖只需选择Spring Web。创建后修改主应用类// src/main/java/com/example/demo/DemoApplication.java package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import java.net.InetAddress; SpringBootApplication RestController public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } GetMapping(/) public String hello() throws Exception { String hostname InetAddress.getLocalHost().getHostName(); return Hello from Docker K8s! Container Hostname: hostname \n; } GetMapping(/health) public String health() { return OK; } }# src/main/resources/application.properties server.port80803.2 编写 Dockerfile构建镜像的“食谱”Dockerfile 是构建镜像的指令文件。它是 Docker 化的核心。在项目根目录与app.py或pom.xml同级创建Dockerfile无后缀名Python 版 Dockerfile# 第一阶段使用官方 Python 轻量级镜像作为构建和运行环境 FROM python:3.11-slim AS builder # 设置工作目录 WORKDIR /app # 将依赖文件复制到工作目录 COPY requirements.txt . # 安装依赖使用清华镜像加速可根据网络情况调整或移除 RUN pip install --no-cache-dir -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt # 第二阶段复制应用代码 FROM python:3.11-slim WORKDIR /app COPY --frombuilder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY --frombuilder /usr/local/bin /usr/local/bin # 复制应用源码 COPY app.py . # 声明容器运行时暴露的端口 EXPOSE 5000 # 定义容器启动时执行的命令 CMD [python, app.py]Spring Boot 版 Dockerfile# 使用官方 Maven 镜像来构建 JAR 包 FROM maven:3.8.7-eclipse-temurin-17 AS builder WORKDIR /app COPY pom.xml . # 利用 Docker 层缓存先只下载依赖 RUN mvn dependency:go-offline -B COPY src ./src # 打包跳过测试 RUN mvn clean package -DskipTests # 使用轻量级 JRE 镜像运行 FROM eclipse-temurin:17-jre-alpine WORKDIR /app # 从构建阶段复制打好的 jar 包 COPY --frombuilder /app/target/*.jar app.jar # 暴露端口 EXPOSE 8080 # 启动应用 ENTRYPOINT [java, -jar, app.jar]关键解释FROM指定基础镜像。我们选择了官方、稳定、体积较小的镜像-slim,-alpine。WORKDIR设置容器内的工作目录。COPY将宿主机文件复制到镜像内。RUN在构建镜像时执行的命令如安装依赖。EXPOSE声明容器监听的端口仅声明实际映射在运行时才确定。CMD/ENTRYPOINT容器启动时执行的命令。一个 Dockerfile 中只能有一个CMD/ENTRYPOINT生效。3.3 构建镜像并运行容器在项目根目录执行构建命令# Python 版 docker build -t my-python-app:1.0 . # Spring Boot 版 docker build -t my-java-app:1.0 .-t参数为镜像打标签名称:版本.表示 Dockerfile 在当前目录。构建成功后运行容器# Python 版 docker run -d -p 5000:5000 --name python-app my-python-app:1.0 # Spring Boot 版 docker run -d -p 8080:8080 --name java-app my-java-app:1.0-d后台运行。-p 宿主机端口:容器端口端口映射。--name为容器指定一个名字。验证应用运行curl http://localhost:5000 # Python # 或 curl http://localhost:8080 # Java你应该看到Hello from Docker K8s! Container Hostname: xxxxx的输出。Hostname就是容器的 ID。恭喜你已经完成了应用容器化的第一步。现在这个应用及其所有依赖都被封装在一个独立的、可移植的镜像里了。4. 第二步实战理解 K8s 核心对象与部署应用现在我们要把这个“集装箱”交给 K8s 这个“港口管理系统”来管理。首先需要理解 K8s 的几个最核心的对象资源。PodK8s 管理和调度的最小单位。一个 Pod 包含一个或多个紧密关联的容器通常是一个共享网络和存储空间。你可以把 Pod 看作是一个“逻辑主机”。Deployment定义 Pod 的期望状态。它管理 Pod 的副本数、更新策略、回滚等。我们一般不直接创建 Pod而是通过创建 Deployment 来让 K8s 自动创建和管理 Pod。Service为一组 Pod 提供稳定的网络访问入口。Pod 是短暂的IP 会变。Service 通过 Label 选择器找到对应的 Pod并提供负载均衡。Ingress管理集群外部 HTTP/HTTPS 流量的入口规则可以将不同路径或域名的流量路由到不同的 Service。相当于更智能的“网关”或“路由”。4.1 编写 K8s 部署清单YAML在项目根目录创建k8s-manifests文件夹并创建以下文件。1. deployment.yaml - 定义应用部署# k8s-manifests/deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: demo-app-deployment # Deployment 的名称 labels: app: demo-app # 给这个 Deployment 打上标签 spec: replicas: 3 # 我们希望运行 3 个 Pod 副本 selector: matchLabels: app: demo-app # 选择器用于找到要管理的 Pod template: # Pod 的模板 metadata: labels: app: demo-app # Pod 的标签必须与上面的 selector.matchLabels 匹配 spec: containers: - name: demo-app-container # 容器名称 image: my-python-app:1.0 # 使用我们本地构建的镜像 # 如果是 Java 应用则改为 image: my-java-app:1.0 ports: - containerPort: 5000 # 容器监听的端口 # Java 应用改为 containerPort: 8080 resources: requests: # 容器启动所需的最小资源 memory: 64Mi cpu: 50m # 50 milliCPU即 0.05 个 CPU 核心 limits: # 容器运行所能使用的最大资源 memory: 128Mi cpu: 100m livenessProbe: # 存活探针检查容器是否健康 httpGet: path: /health port: 5000 initialDelaySeconds: 30 # 容器启动后 30 秒开始探测 periodSeconds: 10 # 每 10 秒探测一次 readinessProbe: # 就绪探针检查容器是否准备好接收流量 httpGet: path: /health port: 5000 initialDelaySeconds: 5 periodSeconds: 52. service.yaml - 定义内部服务# k8s-manifests/service.yaml apiVersion: v1 kind: Service metadata: name: demo-app-service # Service 的名称 spec: selector: app: demo-app # 选择标签为 app: demo-app 的 Pod ports: - protocol: TCP port: 80 # Service 对集群内暴露的端口 targetPort: 5000 # 转发到 Pod 的哪个端口 # Java 应用改为 targetPort: 8080 type: ClusterIP # 默认类型仅在集群内部可访问3. ingress.yaml - 定义外部访问入口可选但重要为了让集群外的浏览器能访问我们需要 Ingress。Minikube 需要先启用 Ingress 插件。minikube addons enable ingress然后创建 Ingress 规则文件# k8s-manifests/ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-app-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: demo-app.local # 本地测试用的域名 http: paths: - path: / pathType: Prefix backend: service: name: demo-app-service # 关联到我们创建的 Service port: number: 804.2 部署应用到 K8s 集群在部署前有一个关键步骤Minikube 集群无法直接使用我们本地docker build的镜像因为它有自己的 Docker 环境。我们需要将镜像加载到 Minikube 的内部镜像仓库。# 对于 Python 应用 minikube image load my-python-app:1.0 # 对于 Java 应用 minikube image load my-java-app:1.0现在使用kubectl apply命令部署所有清单kubectl apply -f k8s-manifests/这个命令会递归地应用k8s-manifests目录下的所有.yaml文件。查看部署状态# 查看 Deployment kubectl get deployments # 预期输出demo-app-deployment 3/3 3 3 2m # 查看 Pod kubectl get pods # 预期输出三个名称以 demo-app-deployment- 开头的 Pod状态均为 Running # 查看 Service kubectl get svc # 预期输出demo-app-service ClusterIP 10.96.x.x none 80/TCP # 查看 Ingress kubectl get ingress # 预期输出demo-app-ingress 主机IP demo-app.local 80 2m4.3 验证与访问应用由于我们使用了 Ingress 和自定义主机名demo-app.local需要配置本地 hosts 文件并将其指向 Minikube 的 IP。获取 Minikube IPminikube ip # 输出类似192.168.49.2修改本地 hosts 文件Linux/macOS:sudo vi /etc/hostsWindows:C:\Windows\System32\drivers\etc\hosts(用管理员权限编辑) 在文件末尾添加一行192.168.49.2 demo-app.local将192.168.49.2替换为你的minikube ip输出访问应用 打开浏览器访问http://demo-app.local。 或者使用curlcurl http://demo-app.local多次刷新你会发现返回的Hostname在变化这证明了 Service 在三个 Pod 之间做了负载均衡。至此你已经成功将一个本地应用通过 Docker 容器化并部署到了一个功能完整的 K8s 集群中实现了多副本运行、服务发现和外部访问。5. 深入核心操作体验 K8s 的强大能力部署成功只是开始。下面我们通过一系列命令亲身体验 K8s 如何简化运维。5.1 动态扩缩容Scaling手动将 Pod 副本数从 3 个扩展到 5 个kubectl scale deployment demo-app-deployment --replicas5 kubectl get pods # 很快你会看到 5 个 Running 的 Pod。再缩容回 2 个kubectl scale deployment demo-app-deployment --replicas2 kubectl get pods # 会看到多余的 Pod 被 Terminating 并最终消失。在生产中这可以通过Horizontal Pod Autoscaler (HPA)基于 CPU/内存等指标自动完成。5.2 滚动更新Rolling Update假设我们发布了新版本镜像my-python-app:2.0。构建并加载新镜像到 Minikubeminikube image load my-python-app:2.0触发更新kubectl set image deployment/demo-app-deployment demo-app-containermy-python-app:2.0观察更新过程kubectl rollout status deployment/demo-app-deploymentK8s 会逐步用新 Pod 替换旧 Pod确保服务始终可用。如果新版本有问题可以立即回滚。5.3 回滚Rollback如果2.0版本有问题一键回滚到上一个版本kubectl rollout undo deployment/demo-app-deployment查看更新历史kubectl rollout history deployment/demo-app-deployment5.4 故障模拟与自愈手动删除一个 Pod模拟容器崩溃# 获取一个 Pod 的名字 POD_NAME$(kubectl get pods -l appdemo-app -o jsonpath{.items[0].metadata.name}) echo $POD_NAME kubectl delete pod $POD_NAME # 立即查看 Pod 状态 kubectl get pods -w你会看到被删除的 Pod 状态变为Terminating同时 Deployment 控制器立即检测到副本数不足自动创建了一个新的 Pod来替换它。这就是 K8s 的“自愈”能力。5.5 查看日志与进入容器查看某个 Pod 的日志kubectl logs -f pod-name # -f 表示持续输出查看包含多个容器的 Pod 的指定容器日志kubectl logs -f pod-name -c demo-app-container进入容器内部进行调试就像docker execkubectl exec -it pod-name -- /bin/bash # 在容器内你可以执行命令例如查看进程、文件等6. 生产环境进阶配置、存储与网络前面的例子是“Hello World”。要用于真实项目必须考虑配置管理、数据持久化和网络策略。6.1 配置管理ConfigMap 与 Secret绝不将配置硬编码在镜像中。使用 ConfigMap 存储非敏感配置Secret 存储敏感信息密码、密钥。创建 ConfigMap# k8s-manifests/configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: app-config data: app.log.level: INFO app.feature.enabled: true在 Deployment 中通过环境变量或卷挂载使用# 在 deployment.yaml 的 containers 部分添加 env: - name: LOG_LEVEL valueFrom: configMapKeyRef: name: app-config key: app.log.level创建 Secret以数据库密码为例# 使用命令行创建密码是 base64 编码的 kubectl create secret generic db-secret \ --from-literalusernameadmin \ --from-literalpasswordMyS3cr3tPss在 Deployment 中引用env: - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password6.2 数据持久化PersistentVolume (PV) 与 PersistentVolumeClaim (PVC)容器内的文件是临时的Pod 重启会丢失。需要持久化的数据如数据库文件、上传目录必须使用存储卷。创建 PVC申请存储# k8s-manifests/pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: app-data-pvc spec: accessModes: - ReadWriteOnce # 单节点读写 resources: requests: storage: 1Gi # 申请 1GB 空间在 Deployment 中使用 PVC# 在 deployment.yaml 的 spec.template.spec 部分添加 volumes: - name:># k8s-manifests/networkpolicy.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-app-to-db spec: podSelector: matchLabels: app: demo-app # 此策略应用于 demo-app Pod policyTypes: - Ingress # 定义入站规则 ingress: - from: - podSelector: matchLabels: role: db # 只允许来自标签为 role: db 的 Pod 的流量 ports: - protocol: TCP port: 5432 # 只允许访问 5432 端口假设是 PostgreSQL这实现了简单的微服务间网络隔离。7. 常见问题与排查思路QA在实际操作中你一定会遇到问题。以下是高频问题及排查路径。问题现象可能原因排查命令/步骤解决方案ImagePullBackOff或ErrImagePull1. 镜像名称或标签错误。2. 私有镜像未配置拉取密钥。3. 网络问题无法访问镜像仓库。kubectl describe pod pod-name查看 Events 部分。1. 检查deployment.yaml中的image字段。2. 对于 Minikube确保已执行minikube image load。3. 创建imagePullSecrets。CrashLoopBackOff1. 应用启动失败端口冲突、配置错误。2. 启动探针livenessProbe失败。3. 资源CPU/内存不足。kubectl logs pod-name查看应用日志。kubectl describe pod pod-name查看退出码和事件。1. 检查应用日志修正代码或配置。2. 调整livenessProbe的initialDelaySeconds或检查健康检查接口。3. 调整resources.requests/limits。Pod 一直处于Pending状态1. 集群资源不足CPU/内存。2. 没有满足条件的节点如节点选择器、污点容忍。3. PVC 无法绑定 PV。kubectl describe pod pod-name1.kubectl get nodes查看节点资源。2. 检查nodeSelector、tolerations配置。3.kubectl get pv,pvc查看存储状态。Service 无法访问1. Service 的selector与 Pod 的labels不匹配。2. Pod 的containerPort与 Service 的targetPort不一致。3. Pod 本身没有监听对应端口。kubectl describe svc service-namekubectl get endpoints service-name(检查 Endpoints 列表是否为空)1. 确保 Deployment 中 Pod 的标签与 Service 的选择器一致。2. 检查端口映射。3. 进入 Pod (kubectl exec) 使用netstat -tlnp确认进程监听。Ingress 无法访问1. Ingress 控制器未正确安装或运行。2.hosts文件配置错误或 DNS 问题。3. Ingress 规则配置错误。kubectl get pods -n ingress-nginxkubectl describe ingress ingress-name1. 确保 Minikube Ingress 插件已启用minikube addons enable ingress。2. 确认minikube ip和/etc/hosts配置。3. 检查 Ingress YAML 中的host和service名称。kubectl命令无响应或报错1.kubeconfig配置错误或上下文不对。2. K8s API Server 不可用。kubectl config viewkubectl config current-contextminikube status1. 重置配置minikube update-context。2. 重启集群minikube stop minikube start。通用排查三板斧看资源状态kubectl get pod,svc,deploy,ingress看详细描述kubectl describe resource-type resource-name看日志kubectl logs pod-name8. 最佳实践与工程建议将技术用于生产必须遵循规范。以下是从无数“踩坑”经验中总结出的要点。镜像规范使用特定版本标签不要用latest。使用my-app:v1.2.3、my-app:sha-abc123。选择小巧的基础镜像优先选择-alpine、-slim变体减少漏洞面和安全扫描时间。多阶段构建如本文所示将构建环境和运行环境分离确保最终镜像只包含运行时必需的文件。非 root 用户运行在 Dockerfile 中创建并使用非 root 用户增强安全性。资源配置必须设置资源请求和限制resources.requests和resources.limits是稳定性基石。防止单个 Pod 耗尽节点资源。设置健康检查livenessProbe和readinessProbe必须配置这是 K8s 进行自愈和流量管理的前提。部署策略使用 Deployment而非直接管理 Pod。配置滚动更新策略在 Deployment 中定义strategy控制更新时的最大不可用 Pod 数和最大超出副本数。spec: strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 # 更新时最多可以比期望副本数多出1个 maxUnavailable: 0 # 更新时最多允许0个Pod不可用保证全时可用配置与密钥管理配置分离所有环境相关配置数据库地址、API密钥必须通过 ConfigMap 和 Secret 管理。Secret 加密在生产集群中启用并配置SealedSecret或使用云厂商的密钥管理服务避免明文存储。日志与监控日志标准输出应用日志应打印到标准输出stdout和标准错误stderr由 Docker 和 K8s 自动收集。集成监控体系部署Prometheus收集指标Grafana进行可视化并设置Alertmanager进行告警。安全最小权限原则为 ServiceAccount 分配最小必要的 RBAC 权限。Pod 安全上下文在 Pod 规范中设置securityContext限制权限。网络策略如非必要默认拒绝所有 Pod 间通信按需开放。9. 总结从入门到精通的路径通过这篇长文我们完成了一次从零到一的完整穿越从在本地编写一个简单的 Web 应用到用 Docker 将其封装成标准镜像最后在功能齐全的 K8s 集群中部署、管理、扩缩容和更新。我们刻意避开了复杂的理论堆砌而是通过一个可运行的示例让你直观地感受到Docker如何通过Dockerfile实现“一次构建处处运行”。Kubernetes如何通过Deployment、Service、Ingress等声明式 API将复杂的运维操作简化为kubectl apply一个命令。现代基础设施的核心价值声明期望状态让系统自动收敛和维护这个状态。接下来的学习方向深入 K8s 核心概念深入学习StatefulSet有状态应用、DaemonSet每个节点运行一个 Pod、Job/CronJob批处理任务。服务网格了解Istio或Linkerd它们提供了更细粒度的流量管理、安全性和可观测性。GitOps学习使用Argo CD或Flux将你的 K8s 清单文件用 Git 仓库管理实现自动化的持续部署。云原生生态探索Prometheus监控、EFK/ELK日志、Harbor镜像仓库等周边工具。认证与安全深入研究RBAC、Pod Security Policies或替代品Pod Security Standards、Network Policies。技术的学习永无止境但最好的起点就是动手实践。建议你将本文的示例代码和配置保存下来作为你自己的“K8s 实验室”模板。之后每学一个新概念比如 ConfigMap、PersistentVolume都可以在这个模板上添加和实验。记住在云原生时代Docker 和 Kubernetes 不是选择题而是现代软件开发和运维的必修课。现在你已经拿到了这门课的入场券并且亲手搭建了第一个实验环境。接下来的路就是不断实践将这套方法论应用到更复杂、更真实的项目中去。 30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度