一、Kubernetes 核心原理
1. Kubernetes 设计哲学
Kubernetes(k8s)是一个开源的容器编排平台,旨在自动化容器化应用的部署、扩展和管理。其核心设计围绕以下目标:
- 声明式配置:用户描述期望状态(如 YAML 文件),系统自动驱动实际状态匹配期望状态。
- 自愈能力:自动重启故障容器、替换不可用节点、动态扩展副本等。
- 松耦合架构:组件模块化,通过 API 交互,支持灵活扩展。
2. Kubernetes 架构概览
Kubernetes 集群由 Master 节点(控制平面)和 Worker 节点(计算节点)组成:
二、Master 节点组件原理
1. API Server
- 功能:Kubernetes 的前端接口,接收并处理所有 REST 请求(如
kubectl
命令)。 - 原理:
- 验证请求合法性(Authentication)。
- 鉴权(Authorization)与准入控制(Admission Control)。
- 将资源状态持久化到 etcd。
- 高可用:多实例部署,通过负载均衡对外服务。
2. etcd
- 功能:分布式键值存储,保存集群所有配置数据(如 Pod、Service 状态)。
- 原理:
- 基于 Raft 算法实现强一致性。
- 监听机制(Watch)支持组件实时感知状态变更。
- 优化:定期备份数据,分离 Kubernetes 数据与其他业务数据。
3. Scheduler
- 功能:将未调度的 Pod 分配到合适的 Worker 节点。
- 调度流程:
- 过滤(Predicate):排除不满足条件的节点(如资源不足)。
- 打分(Priority):对剩余节点评分(如 CPU 空闲率最高者优先)。
- 扩展性:支持自定义调度策略(如 GPU 亲和性)。
4. Controller Manager
- 功能:运行控制器循环,确保系统实际状态匹配期望状态。
- 核心控制器:
- Deployment Controller:管理 ReplicaSet 的副本数。
- Node Controller:监控节点状态,驱逐不可用节点上的 Pod。
- Service Controller:为 Service 配置负载均衡器(如 AWS ELB)。
三、Worker 节点组件原理
1. kubelet
- 功能:节点代理,管理 Pod 生命周期(创建/销毁容器)。
- 核心职责:
- 监听 API Server 分配的 Pod 清单。
- 调用容器运行时(如 Docker、Containerd)启动容器。
- 定期上报节点状态(CPU、内存使用率)到 API Server。
2. kube-proxy
- 功能:实现 Service 的负载均衡和网络规则。
- 实现模式:
- iptables(默认):为每个 Service 生成 iptables 规则。
- IPVS:基于内核级负载均衡,性能更优。
- 原理:将访问 Service VIP 的流量转发到后端 Pod。
3. 容器运行时
- 功能:执行容器生命周期操作(如 Docker、Containerd、CRI-O)。
- CRI(Container Runtime Interface):Kubernetes 定义的容器运行时标准接口。
四、核心对象与资源模型
1. Pod
- 最小调度单元:包含一个或多个共享网络/存储的容器。
- 生命周期:Pending → Running → Succeeded/Failed。
- 设计模式:
- Sidecar:辅助容器(如日志收集)。
- Init Container:在主容器前运行初始化任务。
2. Deployment
- 功能:管理 Pod 副本集,支持滚动更新和回滚。
- 示例 YAML:
apiVersion: apps/v1 kind: Deployment metadata:name: nginx-deployment spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.19ports:- containerPort: 80
3. Service
- 功能:为一组 Pod 提供稳定的访问入口(VIP 或 DNS)。
- 类型:
- ClusterIP(默认):集群内部访问。
- NodePort:通过节点端口暴露服务。
- LoadBalancer:云平台负载均衡器集成。
五、实践指南:从零部署应用
1. 环境准备
安装 Minikube(本地单节点集群)
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
minikube start --driver=docker
验证集群状态
kubectl get nodes
kubectl cluster-info
2. 部署 Nginx 应用
创建 Deployment
kubectl create deployment nginx --image=nginx:1.19
kubectl get pods -l app=nginx
暴露 Service
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
访问应用
minikube service nginx --url # 获取访问URL
curl http://<NodeIP>:<NodePort>
3. 应用扩展与更新
水平扩展副本
kubectl scale deployment nginx --replicas=5
kubectl get pods -l app=nginx
滚动更新版本
kubectl set image deployment/nginx nginx=nginx:1.21
kubectl rollout status deployment/nginx
回滚到旧版本
kubectl rollout undo deployment/nginx
六、高级实践:持久化存储与配置管理
1. PersistentVolume (PV) 与 PersistentVolumeClaim (PVC)
创建 PV 和 PVC
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:name: my-pv
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncehostPath:path: /data/pv
---
# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: my-pvc
spec:accessModes:- ReadWriteOnceresources:requests:storage: 3Gi
挂载到 Pod
apiVersion: v1
kind: Pod
metadata:name: my-pod
spec:containers:- name: appimage: nginxvolumeMounts:- name: datamountPath: /usr/share/nginx/htmlvolumes:- name: datapersistentVolumeClaim:claimName: my-pvc
2. ConfigMap 与 Secret
管理配置
# 创建 ConfigMap
kubectl create configmap app-config --from-file=config.properties# 创建 Secret
kubectl create secret generic db-secret --from-literal=username=admin --from-literal=password=123456
在 Pod 中使用
apiVersion: v1
kind: Pod
metadata:name: config-demo
spec:containers:- name: appimage: busyboxcommand: ["/bin/sh", "-c", "env"]envFrom:- configMapRef:name: app-config- secretRef:name: db-secret
七、监控与日志
1. 部署 Prometheus + Grafana
安装监控组件
kubectl create namespace monitoring
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/setup/prometheus-operator-0servicemonitorCustomResourceDefinition.yaml
kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/kube-prometheus/main/manifests/
访问 Grafana
kubectl port-forward -n monitoring svc/grafana 3000:3000
访问 http://localhost:3000
,使用默认账号 admin/admin
。
2. 集中日志(EFK 栈)
部署 Elasticsearch、Fluentd、Kibana
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/fluentd-elasticsearch/
八、总结与最佳实践
1. 核心原则
- 声明式配置:所有资源通过 YAML 文件管理,纳入版本控制。
- 资源限制:为 Pod 设置 CPU/内存请求与上限(
requests
/limits
)。 - 滚动更新策略:配置
maxUnavailable
和maxSurge
确保服务可用性。
2. 生产环境建议
- 集群高可用:多 Master 节点 + 负载均衡。
- 网络策略:使用 Calico 或 Cilium 实现网络隔离。
- 安全加固:启用 RBAC、Pod 安全策略(PSP)。
通过掌握 Kubernetes 的核心原理与实践技巧,您将能够构建高效、稳定的容器化应用平台,应对从开发到生产的全流程挑战。
扩展阅读:
- Kubernetes 官方文档
- Kubernetes 网络模型详解
- 生产环境 Kubernetes 集群设计指南