前言
想象一下,你开发了一个 Web 应用,需要部署到生产环境。传统方式下,你可能需要手动配置服务器、安装依赖、处理负载均衡、监控服务健康状态等等。当应用需要扩容时,又要重复这些繁琐的操作。
Kubernetes(简称 K8S)就是为了解决这些问题而诞生的容器编排平台。它可以自动化应用的部署、扩缩容、负载均衡和故障恢复,让你专注于业务逻辑而不是基础设施管理。
核心概念
在开始实战之前,我们需要理解几个核心概念:
Pod(豆荚):K8S 中最小的部署单元,通常包含一个或多个紧密相关的容器。可以把 Pod 想象成一个”虚拟机”,里面运行着你的应用。
Deployment(部署):管理 Pod 副本的控制器,负责确保指定数量的 Pod 始终运行。当某个 Pod 出现故障时,Deployment 会自动创建新的 Pod 替换它。
Service(服务):为 Pod 提供稳定的网络访问入口。由于 Pod 的 IP 地址可能随时变化,Service 提供了一个固定的访问点。
Namespace(命名空间):用于隔离不同的应用或环境,比如开发环境、测试环境和生产环境。
实战演练
让我们通过部署一个简单的 Nginx Web 服务器来体验 K8S 的魅力。
第一步:创建 Deployment
我们首先创建一个 Deployment 来管理 Nginx Pod:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| apiVersion: apps/v1 kind:Deployment metadata: name:nginx-deployment namespace:default spec: replicas:3 selector: matchLabels: app:nginx template: metadata: labels: app:nginx spec: containers: -name:nginx image:nginx:1.20 ports: -containerPort:80 resources: requests: memory:"64Mi" cpu:"250m" limits: memory:"128Mi" cpu:"500m"
|
这个配置文件告诉 K8S:
- 创建 3 个 Nginx Pod 副本(replicas: 3)
- 每个 Pod 使用 nginx:1.20 镜像
- 容器监听 80 端口
- 设置资源限制,避免单个 Pod 消耗过多资源
第二步:暴露服务
仅有 Pod 还不够,我们需要创建 Service 来暴露服务:
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: v1 kind:Service metadata: name:nginx-service spec: selector: app:nginx ports: -protocol:TCP port:80 targetPort:80 type:LoadBalancer
|
这个 Service 配置:
- 将流量路由到标签为 app: nginx 的 Pod
- 在 80 端口接收外部请求
- 使用 LoadBalancer 类型,可以从集群外部访问
第三步:部署和验证
使用 kubectl 命令部署应用:
1 2 3 4 5 6 7 8 9 10 11
| kubectl apply -f nginx-deployment.yaml kubectl apply -f nginx-service.yaml
kubectl get deployments kubectl get pods kubectl get services
kubectl describe pod <pod-name>
|
进阶操作:让你的应用更健壮
健康检查
为确保应用正常运行,我们可以添加健康检查:
1 2 3 4 5 6 7 8 9 10 11 12 13
| livenessProbe: httpGet: path:/ port:80 initialDelaySeconds:30 periodSeconds:10
readinessProbe: httpGet: path:/ port:80 initialDelaySeconds:5 periodSeconds:5
|
滚动更新
当需要更新应用版本时,K8S 支持滚动更新,确保服务不中断:
1 2 3 4 5 6 7 8
| kubectl set image deployment/nginx-deployment nginx=nginx:1.21
kubectl rollout status deployment/nginx-deployment
kubectl rollout undo deployment/nginx-deployment
|
水平自动伸缩
配置 HPA(Horizontal Pod Autoscaler)实现自动扩缩容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| apiVersion: autoscaling/v2 kind:HorizontalPodAutoscaler metadata: name:nginx-hpa spec: scaleTargetRef: apiVersion:apps/v1 kind:Deployment name:nginx-deployment minReplicas:2 maxReplicas:10 metrics: -type:Resource resource: name:cpu target: type:Utilization averageUtilization:70
|
监控和故障排查
日志查看
1 2 3 4 5 6 7 8
| kubectl logs <pod-name>
kubectl logs -f <pod-name>
kubectl logs <pod-name> --previous
|
调试技巧
1 2 3 4 5 6 7 8
| kubectl exec -it <pod-name>
kubectl get events
kubectl describe deployment nginx-deployment
|
配置管理最佳实践
ConfigMap 管理配置
1 2 3 4 5 6 7 8 9 10 11 12
| apiVersion: v1 kind: ConfigMap metadata: name: nginx-config data: nginx.conf: | server { listen 80; location / { return 200 "Hello from Kubernetes!"; } }
|
Secret 管理敏感信息
1 2 3 4
| kubectl create secret generic db-secret \ --from-literal=username=admin \ --from-literal=password=secretpassword
|
生产环境考虑
资源配额
为命名空间设置资源配额,防止资源滥用:
1 2 3 4 5 6 7 8 9 10 11
| apiVersion: v1 kind:ResourceQuota metadata: name:compute-quota spec: hard: requests.cpu:"4" requests.memory:8Gi limits.cpu:"8" limits.memory:16Gi pods:"10"
|
网络策略
实施网络安全策略,控制 Pod 间通信:
1 2 3 4 5 6 7 8 9
| apiVersion: networking.k8s.io/v1 kind:NetworkPolicy metadata: name:deny-all spec: podSelector:{} policyTypes: -Ingress -Egress
|
常见错误和解决方案
ImagePullBackOff 错误:通常是镜像不存在或权限问题,检查镜像名称和仓库访问权限。
CrashLoopBackOff 错误:Pod 不断重启,查看日志找出应用启动失败的原因。
服务无法访问:检查 Service 选择器是否正确匹配 Pod 标签,以及端口配置是否正确。
资源不足:节点资源不够时,Pod 会处于 Pending 状态,需要扩容节点或调整资源请求。
总结
通过这个实战教程,你已经掌握了 K8S 的核心概念和基本操作。从简单的 Nginx 部署开始,我们学会了如何创建 Deployment 和 Service,如何进行健康检查、滚动更新和自动伸缩,以及如何进行监控和故障排查。
K8S 的强大之处在于其声明式配置和自动化能力。你只需要描述期望的状态,K8S 会自动确保系统始终维持这个状态。这种设计理念极大地简化了复杂应用的运维工作。
继续深入学习 K8S,你会发现更多高级特性,如 Ingress 控制器、持久化存储、ServiceMesh 等。每一项技术都会让你的容器化应用更加健壮和高效。
记住,实践是最好的老师。多动手操作,在遇到问题时积极查阅文档和社区资源,你很快就能成为 K8S 专家。

京东购书链接:https://item.jd.com/10162369416065.html