Kubernetes容器编排完全指南:从单机到分布式集群
·
前言
今年我们的微服务架构从Docker Compose升级到Kubernetes,集群自动扩展能力让我们轻松应对10倍流量增长。
Kubernetes虽然复杂,但掌握它是现代DevOps工程师的必修课。这篇文章将帮你快速上手K8s核心概念和生产实践。
一、为什么需要Kubernetes?
1.1 Docker Compose的局限
单机部署:
✗ 服务器宕机?全部完蛋
✗ 流量突增?无法自动扩展
✗ 应用崩溃?需要手动重启
✗ 滚动更新?停机时间长
Kubernetes解决方案:
✓ 多机部署 - 高可用
✓ 自动扩缩容 - 应对流量变化
✓ 自愈机制 - 故障自动恢复
✓ 无损更新 - 用户无感知
✓ 负载均衡 - 流量智能分配
二、核心概念速览
2.1 五个基本对象
Pod:
最小部署单位,包含一个或多个容器
Service:
网络抽象,为Pod组提供稳定访问地址
Deployment:
管理Pod副本,支持滚动更新
ConfigMap:
存储非敏感配置数据
Secret:
存储敏感信息(密码、token等)
2.2 架构层级
集群 (Cluster)
├── 控制平面 (Master)
│ ├── API Server
│ ├── etcd(状态存储)
│ ├── Scheduler(调度器)
│ └── Controller Manager
│
└── 工作节点 (Node)
├── Node 1
│ └── Pod 1, Pod 2
├── Node 2
│ └── Pod 3, Pod 4
└── Node 3
└── Pod 5, Pod 6
三、快速安装与体验
3.1 本地开发环境
bash
# 安装minikube(本地单节点K8s)
curl -Lo minikube https://github.com/kubernetes/minikube/releases/latest/download/minikube-linux-amd64chmod +x minikube && sudo mv minikube /usr/local/bin/
# 启动Kubernetes集群
minikube start --cpus=4 --memory=4096
# 安装kubectl(K8s命令行工具)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
kubectl cluster-info
3.2 第一个Pod
bash
# 运行Pod
kubectl run nginx-pod --image=nginx:latest
# 查看Pod
kubectl get pods
# 查看Pod详情
kubectl describe pod nginx-pod
# 查看日志
kubectl logs nginx-pod
# 进入Pod
kubectl exec -it nginx-pod -- bash
# 删除Pod
kubectl delete pod nginx-pod
四、Deployment声明式部署
4.1 创建Deployment
deployment.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3 # 3个副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "200m"
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 5
periodSeconds: 5
4.2 部署和管理
bash
# 部署应用
kubectl apply -f deployment.yaml
# 查看Deployment
kubectl get deployments
# 查看Pod(自动创建3个)
kubectl get pods
# 查看详情
kubectl describe deployment nginx-deployment
# 扩容
kubectl scale deployment nginx-deployment --replicas=5
# 更新镜像
kubectl set image deployment/nginx-deployment \
nginx=nginx:1.22 --record
# 查看更新历史
kubectl rollout history deployment/nginx-deployment
# 回滚到上个版本
kubectl rollout undo deployment/nginx-deployment
# 删除Deployment
kubectl delete deployment nginx-deployment
五、Service网络暴露
5.1 Service类型
service.yaml:
yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: LoadBalancer # ClusterIP | NodePort | LoadBalancer
selector:
app: nginx
ports:
- protocol: TCP
port: 80 # Service端口
targetPort: 80 # Pod端口
bash
# 部署Service
kubectl apply -f service.yaml
# 查看Service
kubectl get svc
# 获取外部IP(LoadBalancer)
kubectl get svc nginx-service -w
# 访问服务
curl http://EXTERNAL-IP
# 端口转发(本地访问)
kubectl port-forward svc/nginx-service 8080:80
# 访问:curl http://localhost:8080
5.2 三种Service类型对比
ClusterIP(默认):
- 仅在集群内部访问
- 适合微服务间通信
NodePort:
- 在每个Node暴露端口
- 外部可通过
NodeIP:NodePort 访问
LoadBalancer:
- 云环境使用
- 自动分配外部负载均衡器
- 推荐生产环境使用
六、配置管理
6.1 ConfigMap和Secret
config.yaml:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
database_host: "postgres.default.svc.cluster.local"
database_port: "5432"
log_level: "info"
---
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
stringData:
database_user: "admin"
database_password: "secure-password"
jwt_secret: "jwt-secret-key"
pod-with-config.yaml:
yaml
apiVersion: v1
kind: Pod
metadata:
name: app-pod
spec: containers:
- name: app
image: my-app:latest
env:
# 从ConfigMap注入
- name: DB_HOST
valueFrom:
configMapKeyRef:
name: app-config
key: database_host
# 从Secret注入
- name: DB_USER
valueFrom:
secretKeyRef:
name: app-secret
key: database_user
# 挂载ConfigMap为文件
volumeMounts:
- name: config-volume
mountPath: /etc/config
volumes:
- name: config-volume
configMap:
name: app-config
6.2 部署和验证
bash
# 创建ConfigMap和Secret
kubectl apply -f config.yaml
# 查看ConfigMap
kubectl get configmap
kubectl describe configmap app-config
# 查看Secret(内容被隐藏)
kubectl get secret
kubectl describe secret app-secret
# 获取Secret明文(谨慎使用)
kubectl get secret app-secret -o jsonpath='{.data.database_password}' | base64 -d
七、完整应用栈部署
mysql-deployment.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: root_password
volumeMounts:
- name: mysql-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-storage
persistentVolumeClaim:
claimName: mysql-pvc
---
apiVersion: v1
kind: Service
metadata:
name:
mysqlspec:
selector:
app:
mysql
ports:
- port: 3306
targetPort: 3306
clusterIP: None
# Headless Service
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name:
mysql-pvcspec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
app-deployment.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: my-web-app:1.0
ports:
- containerPort: 8000
env:
- name: DATABASE_URL
value: "mysql://root@mysql:3306/myapp"
- name: LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: log_level
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
livenessProbe:
httpGet:
path: /health
port: 8000
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /ready
port: 8000
initialDelaySeconds: 5
periodSeconds: 5
---
apiVersion: v1
kind: Service
metadata:
name: web-app
spec:
type: LoadBalancer
selector:
app: web
ports:
- port: 80
targetPort: 8000
7.1 部署完整应用
bash
# 创建Secretkubectl
create secret generic mysql-secret \
--from-literal=root_password=your-password
# 部署应用
kubectl apply -f
mysql-deployment.yaml
kubectl apply -f
app-deployment.yaml
# 查看所有资源
kubectl get all
# 查看Pod状态
kubectl get pods -o wide
# 查看Service
kubectl get svc
# 查看PVCkubectl get pvc
八、自动扩缩容
8.1 HPA(Horizontal Pod Autoscaler)
yaml
apiVersion: autoscaling/v2kind: HorizontalPodAutoscalermetadata: name: web-app-hpaspec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: web-app minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80 behavior: scaleDown: stabilizationWindowSeconds: 300 policies: - type: Percent value: 50 periodSeconds: 15 scaleUp: stabilizationWindowSeconds: 0 policies: - type: Percent value: 100 periodSeconds: 15
8.2 部署和监控
bash
# 部署HPAkubectl apply -f hpa.yaml# 查看HPA状态kubectl get hpa# 监听HPA自动扩缩kubectl get hpa web-app-hpa -w# 生成负载测试kubectl run -i --tty load-generator --rm --image=busybox /bin/sh# 在容器中运行:# while sleep 0.01; do wget -q -O- http://web-app; done
九、滚动更新与金丝雀发布
9.1 滚动更新
bash
# 更新镜像
kubectl set image deployment/web-app \
web=my-web-app:2.0 --record
# 查看更新进度
kubectl rollout status deployment/web-app
# 查看历史版本
kubectl rollout history deployment/web-app
# 查看某个版本详情
kubectl rollout history deployment/web-app --revision=2
# 回滚到上个版本
kubectl rollout undo deployment/web-app
# 回滚到指定版本
kubectl rollout undo deployment/web-app --to-revision=1
9.2 金丝雀发布
canary-deployment.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
-canaryspec:
replicas: 1
# 1个金丝雀副本
selector:
matchLabels:
app: web
version: canary
template:
metadata:
labels:
app: web
version: canary
spec:
containers:
- name: web
image: my-web-app:2.0
# 新版本
ports:
- containerPort: 8000
bash
# 部署金丝雀
kubectl apply
-f canary
-deployment.yaml
# 观察金丝雀运行情况
# 如果无问题,逐步增加金丝雀副本
kubectl scale deployment web-app-canary --replicas=2
# 最后删除旧版本
kubectl delete deployment web-app
十、团队协作
我们的Kubernetes集群由分布在北京、上海两地的DevOps团队共同维护。在进行集群升级和故障排查时,团队成员需要实时沟通,但由于语言背景不同,技术细节的表达常常产生理解偏差。我们通过同言翻译(Transync AI)进行实时翻译和会议记录,确保每位工程师都能准确理解集群配置和应急方案。
十一、生产常用命令
bash
# === 查看资源 ===
kubectl get nodes # 查看节点
kubectl get pods -A # 查看所有Pod
kubectl get svc -n kube-system # 指定命名空间
kubectl get all -o wide # 详细信息
# === 调试排查 ===
kubectl describe pod POD_NAME # 查看Pod详情
kubectl logs POD_NAME # 查看日志
kubectl logs -f POD_NAME # 持续查看日志
kubectl exec -it POD_NAME -- bash # 进入容器
kubectl port-forward svc/SVC 8080:80 # 端口转发
# === 资源管理 ===
kubectl apply -f file.yaml # 部署
kubectl delete -f file.yaml # 删除
kubectl edit deployment NAME # 编辑配置
kubectl patch deployment NAME ... # 打补丁
kubectl rollout restart deployment # 滚动重启
# === 集群管理 ===
kubectl cluster-info # 集群信息
kubectl top nodes # 节点资源使用
kubectl top pods # Pod资源使用
kubectl get events -A --sort-by=.metadata.creationTimestamp
十二、常见问题
Q1:Pod无法启动?
A:kubectl describe pod | kubectl logs
Q2:镜像拉取超时?
A:修改镜像源或增加超时时间
Q3:PVC一直Pending?
A:检查存储类和网络存储可用性
Q4:Service无法访问?
A:检查Endpoint和网络策略
Q5:如何限制资源?
A:使用resources字段配置requests和limits
十三、学习路线
第1步:基础概念
└─ Pod、Deployment、Service
第2步:配置管理
└─ ConfigMap、Secret、资源限制
第3步:存储和网络
└─ PVC、Ingress、网络策略
第4步:高级特性
└─ StatefulSet、DaemonSet、Job
第5步:生产实践
└─ 监控告警、日志收集、备份恢复
第6步:进阶方案
└─ Service Mesh、GitOps、多集群管理
总结
Kubernetes是容器编排的事实标准,虽然学习曲线陡峭,但掌握它能让你:
✅ 构建高可用分布式系统 ✅ 实现自动化运维 ✅ 快速扩展应用 ✅ 降低运维成本
核心要点:
- Pod是最小单位
- Deployment管理副本和更新
- Service提供网络抽象
- 声明式配置即基础设施
从今天开始,让Kubernetes成为你的超级武器!

推荐资源:
- Kubernetes官方文档:https://kubernetes.io/docs
- 在线练习环境:https://killercoda.com
- minikube快速体验:https://minikube.sigs.k8s.io
点赞、收藏、关注,欢迎在评论区分享K8s实践经验!💪
更多推荐

所有评论(0)