Kubernetes(K8s)
什么是 Kubernetes
Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它能让你以声明式方式管理大规模集群中的应用,保证高可用、负载均衡与自动恢复。
Kubernetes 的基本架构组件
- etcd: 一个分布式键值存储,用于保存集群状态数据。
- kube-apiserver: 集群的控制中心,所有组件通过 API 进行交互。
- kube-scheduler: 根据资源需求与调度策略,将 Pod 分配到合适的节点上。
- kube-controller-manager: 负责管理集群状态,运行各种控制器来保持预期状态。
- kubelet: 每个节点上的代理,负责与 API Server 交互并管理本机容器。
- kube-proxy: 处理网络代理和负载均衡,确保服务之间的通信畅通。
什么是 Pod
Pod 是 Kubernetes 中最小的部署单元,它封装了一个或多个紧密关联的容器,这些容器共享网络、存储和运行环境。Pod 内的容器通常协同工作,共享同一个 IP 地址和端口空间。
什么是 Deployment
Deployment 是一种用于声明式管理 Pod 副本集的资源对象。它的主要作用包括:
- 自动化部署与更新: 支持滚动更新与回滚,确保无缝版本切换。
- 扩缩容: 通过调整副本数量,满足业务负载需求。
- 高可用性: 自动检测失败的 Pod 并进行重建,保持系统稳定。
解释 Pod 和 Deployment 的关系
- Pod:最小调度单元(就像单个快递盒,里面可以装多个容器)
- Deployment:管理 Pod 的副本和更新策略(像物流中心管理多个快递盒)
yaml
# 前端 Deployment 示例(管理 3 个 React Pod)
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend
spec:
replicas: 3
template:
spec:
containers:
- name: react-app
image: my-react:latest
ports:
- containerPort: 3000
记忆点:Pod = 单个盒子,Deployment = 盒子管理员
什么是 Service?它在 Kubernetes 中起什么作用
Service 是对外提供稳定访问接口的抽象层,用于解决 Pod IP 动态变化带来的问题。主要作用:
- 服务发现: 为客户端提供固定的访问入口。
- 负载均衡: 自动将流量分配到多个 Pod 上,保证请求均衡。
常见类型有 ClusterIP(集群内访问)、NodePort(外部访问节点端口)、LoadBalancer(云环境中分配外部负载均衡器)等。
什么是 ConfigMap 和 Secret?
- ConfigMap: 用于存储非敏感配置信息,如配置文件或环境变量。
- Secret: 用于存储敏感数据(如密码、令牌),会进行 Base64 编码处理。
两者都可以在 Pod 中挂载或以环境变量形式使用,但 Secret 针对安全性做了特殊设计,避免敏感信息明文暴露。
前端项目如何通过 ConfigMap 管理环境变量
- 创建 ConfigMap:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: frontend-config
data:
API_ENDPOINT: "https://api.example.com"
ENV: "production"
- Pod 中使用:
yaml
env:
- name: REACT_APP_API_URL
valueFrom:
configMapKeyRef:
name: frontend-config
key: API_ENDPOINT
场景:不同环境(开发/生产)使用不同接口地址
如何实现 Kubernetes 的水平扩展(Scale)
可以通过两种方式实现:
- 手动扩缩容: 修改 Deployment 中的
replicas
数量,调整 Pod 数量。 - 自动扩缩容: 使用 Horizontal Pod Autoscaler (HPA),根据 CPU、内存或自定义指标自动增加或减少 Pod 数量,确保资源利用最优化。
什么是 StatefulSet?它与 Deployment 有何不同
StatefulSet 用于部署有状态应用,它能保证每个 Pod 拥有唯一标识、稳定的网络标识和有序部署与更新。与 Deployment 不同,StatefulSet 主要用于需要保持持久状态的数据服务,如数据库,而 Deployment 则适合无状态的应用。
如何实现 Kubernetes 的滚动更新与回滚
- 滚动更新: 通过 Deployment 的更新策略,逐步替换旧版本 Pod 为新版本,确保在更新过程中服务不中断。
- 回滚: 如果更新出现问题,可以使用 Kubernetes 提供的回滚命令(如
kubectl rollout undo deployment <deployment-name>
)恢复到先前稳定的版本,保证系统快速恢复。
什么是 Ingress?它如何帮助管理外部访问
Ingress 是一种 API 对象,用于管理外部用户对集群内服务的访问。它通过配置路由规则、SSL 终止和负载均衡等功能,将外部请求转发到正确的 Service。使用 Ingress Controller(如 Nginx Ingress Controller)来实现具体流量的路由和管理,有效降低集群外部暴露的复杂度。
Ingress 在前端部署中的作用
- 路由管理:根据域名/path 分发流量
- SSL 终止:统一管理 HTTPS 证书
- 灰度发布:按权重分流(金丝雀发布)
yaml
# 前端 Ingress 示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: frontend-ingress
spec:
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend-service
port:
number: 80
记忆点:智能路由器 + SSL 证书管理器
如何实现前端滚动更新和回滚?
- 滚动更新(默认策略):
bash
kubectl set image deployment/frontend react-app=my-react:v2
- 查看状态:
bash
kubectl rollout status deployment/frontend
- 回滚操作:
bash
kubectl rollout undo deployment/frontend
策略参数:
yaml
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 25% # 最多新增 Pod 数
maxUnavailable: 25% # 最大不可用比例
如何限制前端容器的资源使用
yaml
resources:
requests: # 最低保障
memory: "256Mi"
cpu: "100m"
limits: # 硬限制
memory: "512Mi"
cpu: "500m"
解释:
100m
= 0.1 核 CPU- 内存超过 limit 会被 OOMKill
- 前端建议:合理设置 limit 防止单页应用内存泄漏影响集群
如何通过 HPA 实现前端自动扩缩容?
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: frontend-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: frontend
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
场景:电商大促期间自动扩容前端实例
前端如何安全地管理敏感信息
- 使用 Secret:
bash
# 创建 Secret
kubectl create secret generic frontend-secret \
--from-literal=API_KEY=supersecret123
- 挂载使用:
yaml
env:
- name: API_KEY
valueFrom:
secretKeyRef:
name: frontend-secret
key: API_KEY
安全实践:
- 加密存储(etcd 加密)
- 最小权限访问
- 定期轮换(前端对接的第三方密钥)
解释 PV 和 PVC 在前端的应用场景
- PV (PersistentVolume):集群存储资源(如 NAS)
- PVC (PersistentVolumeClaim):应用存储需求声明
yaml
# 前端日志收集场景示例
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: frontend-logs-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
使用场景:
- 前端 SSR 日志持久化
- 文件上传临时存储
如何快速排查前端 Pod 故障?
bash
# 查看 Pod 状态
kubectl get pods -l app=frontend
# 查看日志
kubectl logs <pod-name> -f
# 进入容器调试
kubectl exec -it <pod-name> -- sh
# 查看事件记录
kubectl describe pod <pod-name>
常见问题:
- CrashLoopBackOff:容器启动失败(检查镜像/启动命令)
- ImagePullBackOff:镜像拉取失败(检查镜像权限)
- Pending:资源不足(检查 requests/limits)
记忆地图:
K8s 核心概念四层结构:
POD → Deployment → Service → Ingress
(容器盒) (副本管理) (网络暴露) (智能路由)
前端重点关注:
1. 部署(Deployment)
2. 配置(ConfigMap/Secret)
3. 暴露(Service/Ingress)
4. 扩缩(HPA)
5. 安全(非 root 用户)
实战技巧:
- 使用
kubectl apply -f
代替 create - 给资源打标签:
app: frontend
- 开发环境使用
minikube
或kind
本地测试 - 生产环境配合 CI/CD 实现自动发布(如 ArgoCD)