一、为什么需要Kubernetes?
在Docker容器化时代,每个应用像独立的集装箱:
- 一个电商系统需要部署10个容器(用户服务、订单服务、数据库等)
- 手动管理这些容器如同在港口调度船只:
- 如何保证每个容器有足够资源?
- 某个容器挂掉后如何自动重启?
- 流量突然增加时如何快速扩容?
**Kubernetes(K8s)**就是容器世界的"智能港口调度系统",实现:
- 自动部署与扩缩容
- 故障自愈与负载均衡
- 资源优化与服务发现
二、核心概念:K8s的三大基石
1. Pod:最小的部署单元
- 定义:一个或多个容器的集合,共享网络和存储
- 类比:运输货物的"集装箱",可能包含多个包裹(容器)
- 特点:
- 容器间通过localhost通信
- 共享Volume存储
- 作为一个整体调度
2. Service:服务访问入口
- 定义:一组Pod的抽象,提供稳定的访问地址
- 类比:快递包裹的"收件地址",不管包裹如何移动,地址不变
- 类型:
- ClusterIP:集群内部访问
- NodePort:暴露到物理机端口
- LoadBalancer:云服务商负载均衡
3. Deployment:应用控制器
- 定义:管理Pod的生命周期
- 类比:快递公司的"包裹追踪系统",确保包裹数量和状态正确
- 功能:
- 滚动更新与回滚
- 自动修复失效Pod
- 水平扩展(HPA)
三、架构组成:K8s的大脑与四肢
1. Master节点(控制平面)
- API Server:所有操作的入口(类似港口调度中心)
- Scheduler:资源调度器(决定Pod运行在哪个节点)
- Controller Manager:自动修复失效资源
- etcd:分布式键值存储(保存集群状态)
2. Worker节点(数据平面)
- kubelet:管理节点上的Pod(类似港口装卸工人)
- kube-proxy:实现服务发现和负载均衡
- 容器运行时:Docker/ containerd(实际运行容器)
四、快速上手:5分钟部署一个Web应用
1. 创建Deployment
# web-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec:
replicas: 3
selector:
matchLabels:
app: web-app
template:
metadata:
labels:
app: web-app
spec:
containers:
- name: web-container
image: nginx:latest
ports:
- containerPort: 80
kubectl apply -f web-deployment.yaml
2. 暴露服务
# web-service.yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web-app
ports:
- port: 80
targetPort: 80
type: NodePort
kubectl expose deployment web-deployment --type=NodePort --port=80
3. 验证部署
kubectl get pods
# 输出:
NAME READY STATUS RESTARTS AGE
web-deployment-76c6c8d5d6-5z7kq 1/1 Running 0 2m
web-deployment-76c6c8d5d6-j9w2k 1/1 Running 0 2m
web-deployment-76c6c8d5d6-x8z8g 1/1 Running 0 2m
kubectl get services
# 输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
web-service NodePort 10.100.100.10 <none> 80:30080/TCP 2m
五、高级概念:应对复杂场景
1. Namespace:资源隔离
- 作用:类似文件夹,隔离不同项目的资源
- 使用场景:
kubectl create namespace dev kubectl apply -f app.yaml --namespace=dev
2. ConfigMap/Secret:配置管理
# 配置文件
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database.url: jdbc:mysql://db:3306/test
log.level: INFO
# 敏感信息
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
type: Opaque
data:
username: YWRtaW4=
password: cGFzc3dvcmQ=
3. Horizontal Pod Autoscaler(HPA)
kubectl autoscale deployment web-deployment \
--min=3 \
--max=10 \
--cpu-percent=80
六、最佳实践建议
-
标签管理:
metadata: labels: app: web-app environment: production
-
健康检查:
livenessProbe: httpGet: path: /health port: 80 initialDelaySeconds: 30 periodSeconds: 10
-
资源限制:
resources: limits: cpu: "1" memory: "512Mi" requests: cpu: "0.5" memory: "256Mi"
七、对比传统部署方式
特性 | 传统部署 | Kubernetes |
---|---|---|
扩缩容 | 手动操作 | 自动(HPA) |
故障恢复 | 人工重启 | 自动自愈 |
资源利用率 | 低(固定分配) | 高(动态调度) |
服务发现 | 硬编码IP | DNS自动解析 |
八、总结
Kubernetes通过自动化和标准化,成为云原生时代的基础设施:
- 开发人员:专注代码,无需关心部署细节
- 运维人员:从手动操作转向策略配置
- 企业:降低成本,提升系统稳定性和扩展性
九、推荐学习资源
- Kubernetes官方文档
- K8s入门教程
- 《Kubernetes权威指南》
- K8s实战课程
现在就开始用Kubernetes部署你的第一个容器化应用吧!你会发现,原来管理成百上千的容器也可以如此轻松。🚀