容器编排入门
这页适合作为“从单机容器走向多实例部署”的入门入口。容器编排真正要解决的,不只是把多个容器启动起来,而是统一调度、滚动更新、服务发现、配置管理和故障恢复。
什么时候该上编排
下面这些情况往往值得开始考虑编排:
- 服务实例不止一个
- 需要滚动更新和回滚
- 需要把配置、密钥和服务发现统一管理
- 需要更稳定地扩缩容
如果你现在只有一台机器、几项服务,先把 docker compose 用顺往往更划算,不必一开始就上 Kubernetes。
Docker Swarm
Docker 内置的编排工具,适合小规模部署。
初始化
docker swarm init
部署服务
# 创建服务
docker service create --name web --replicas 3 -p 80:80 nginx:alpine
# 查看服务
docker service ls
docker service ps web
# 扩缩容
docker service scale web=5
# 更新镜像
docker service update --image nginx:latest web
# 删除服务
docker service rm web
Stack 部署
# stack.yml
version: "3.8"
services:
web:
image: nginx:alpine
deploy:
replicas: 3
restart_policy:
condition: on-failure
ports:
- "80:80"
api:
image: myapp:latest
deploy:
replicas: 2
environment:
- NODE_ENV=production
docker stack deploy -c stack.yml myapp
docker stack ls
docker stack services myapp
docker stack rm myapp
推荐学习顺序
建议按这个顺序理解:
- 先会用
docker compose - 再理解服务、实例、网络、卷和配置
- 再看 Swarm 这类较轻量的编排
- 最后再上 Kubernetes 的 Deployment、Service、ConfigMap、Secret
先把容器基础概念理顺,再学编排会轻松很多。
Kubernetes 基础
本地环境
# minikube
scoop install minikube
minikube start
# 或使用 Docker Desktop 内置 K8s
# Settings → Kubernetes → Enable
kubectl 常用命令
# 集群信息
kubectl cluster-info
kubectl get nodes
# Pod 操作
kubectl get pods
kubectl get pods -A # 所有命名空间
kubectl describe pod <name>
kubectl logs <pod-name>
kubectl logs <pod-name> -f # 实时日志
kubectl exec -it <pod-name> -- sh # 进入容器
# 部署
kubectl apply -f deployment.yaml
kubectl get deployments
kubectl rollout status deployment/web
kubectl rollout undo deployment/web # 回滚
# 服务
kubectl get services
kubectl expose deployment web --port=80 --type=LoadBalancer
# 删除
kubectl delete -f deployment.yaml
Deployment 示例
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: nginx:alpine
ports:
- containerPort: 80
resources:
limits:
memory: "128Mi"
cpu: "250m"
---
apiVersion: v1
kind: Service
metadata:
name: web
spec:
selector:
app: web
ports:
- port: 80
targetPort: 80
type: ClusterIP
ConfigMap 与 Secret
# ConfigMap
kubectl create configmap app-config --from-literal=ENV=production
kubectl create configmap app-config --from-file=config.yaml
# Secret
kubectl create secret generic db-creds \
--from-literal=username=admin \
--from-literal=password=secret
# 在 Pod 中使用
env:
- name: ENV
valueFrom:
configMapKeyRef:
name: app-config
key: ENV
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-creds
key: password
常见问题
Docker Compose 用得好好的,为什么还要上编排
当你开始需要:
- 多副本
- 滚动更新
- 自动恢复
- 更清晰的集群资源管理
编排的价值就会越来越明显。
Kubernetes 太复杂,值不值得学
如果你会长期接触云原生、团队交付或多服务系统,值得;如果只是个人项目和小型部署,先掌握 Compose 和基础容器运维更实用。
一开始该选 Swarm 还是 Kubernetes
- 小规模、学习成本优先:Swarm
- 生态、通用性、长期能力优先:Kubernetes
风险提醒
- 不要为了“技术先进”强行上复杂编排
- 配置和 Secret 进入集群前要先规划权限边界
- 集群问题通常比单机问题更隐蔽,监控和日志必须跟上
延伸阅读
参考链接
- Kubernetes 文档 — 官方中文文档
- minikube — 本地 K8s
- Docker Swarm — 官方文档
- K9s — 终端 K8s 管理工具