
1) 【一句话结论】
在360云服务中,通过Docker多阶段构建轻量镜像封装应用,Kubernetes定义含资源限制的Deployment管理容器,Service(如ClusterIP)提供访问入口,结合多Master控制平面(etcd集群)、多节点数据平面及持久化存储(PV/PVC),实现弹性伸缩(CPU阈值触发)与高可用。
2) 【原理/概念讲解】
老师口吻:容器化是将应用及其依赖打包成独立容器,实现环境隔离。Docker镜像构建中,多阶段构建(如从编译环境到运行环境的分离)可大幅减少镜像体积(例如从golang编译应用,再复制到nginx镜像)。Kubernetes核心分为控制平面(API Server、Scheduler、Controller Manager、etcd集群,负责资源管理)和数据平面(Kubelet、Kube Proxy、容器运行时,负责执行操作)。资源对象中:
3) 【对比与适用场景】
| 对比项 | Deployment (v1) | ReplicaSet (v1) | Service类型 | ClusterIP | NodePort | LoadBalancer |
|---|---|---|---|---|---|---|
| 定义 | 现代化资源,管理Pod副本 | 管理Pod副本的旧资源 | 负载均衡资源 | 内部服务 | 节点端口 | 云服务商负载均衡 |
| 特性 | 支持滚动更新、回滚、自动扩缩容 | 仅管理副本数量,不支持更新 | 提供稳定访问入口 | 内部集群IP | 节点IP+节点端口 | 云服务商分配的负载均衡器 |
| 使用场景 | 大多数应用,需要弹性伸缩 | 过渡期,或旧系统 | 内部服务(ClusterIP) | 应用内部通信 | 需要外部访问(如本地测试) | 云环境(如阿里云、腾讯云)的负载均衡 |
| 注意点 | 需配合Selector匹配Pod | 会被Deployment继承,不建议直接用 | 类型选择影响访问 | 默认类型 | 需节点端口范围(30000-32767) | 需云服务商负载均衡服务,成本较高 |
4) 【示例】
# 第一阶段:编译应用
FROM golang:1.18-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o web-app .
# 第二阶段:构建最终镜像
FROM nginx:alpine
COPY --from=builder /app/web-app /usr/local/bin/
COPY static/index.html /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web-container
image: my-web-image:latest
ports:
- containerPort: 80
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
apiVersion: v1
kind: Service
metadata:
name: web-service
labels:
app: web
spec:
type: ClusterIP
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 80
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db-statefulset
labels:
app: db
spec:
serviceName: "db-service"
replicas: 3
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- name: db-container
image: mysql:5.7
ports:
- containerPort: 3306
volumeMounts:
- name: db-pv
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: db-pv
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-hpa
labels:
app: web
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-deployment
minReplicas: 3
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
5) 【面试口播版答案】
在360云服务中,容器化部署Web服务端应用通常分三步:首先用多阶段Dockerfile构建轻量镜像(如从golang编译应用,再复制到nginx镜像),推送到镜像仓库。接着在K8s中定义Deployment,指定3个副本,并设置CPU/内存资源限制(requests和limits),自动管理Pod扩缩容。再定义ClusterIP类型的Service,通过Kube Proxy实现内部负载均衡。高可用设计上,控制平面用3个Master节点组成的etcd集群(避免单点故障),数据平面Pod分布在多节点,节点故障时自动重新调度。对于有状态数据库,用StatefulSet结合PersistentVolumeClaim(PVC)绑定云存储(如ECS云盘),确保数据持久化。弹性伸缩通过Horizontal Pod Autoscaler,当CPU使用率超过70%时自动增加副本数,实现弹性伸缩。整个过程结合K8s的自动扩缩容和负载均衡,实现Web服务的高可用。
6) 【追问清单】
docker save -o 镜像.tar 镜像再docker load -i 镜像.tar)。requests(最小资源需求)和limits(最大资源限制),如CPU请求100m,限制500m,防止容器占用过多资源导致系统崩溃。7) 【常见坑/雷区】
replicas设置为0,导致服务不可用,未考虑最小副本数。