Kubernetes是什么
一、Kubernetes 是什么?
Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。它由 Google 设计并捐赠给 CNCF(云原生计算基金会),现已成为容器编排的事实标准。
二、核心架构与组件
1. 集群架构
Kubernetes 集群由两类节点组成:
- Master 节点(控制平面):负责集群调度和决策。
- Worker 节点(数据平面):运行容器化应用。
2. Master 节点组件
组件 | 功能 |
---|---|
API Server | 集群操作的唯一入口,处理 REST 请求(如 kubectl 命令)。 |
etcd | 分布式键值存储,保存集群状态(如 Pod、Service 配置)。 |
Controller Manager | 运行控制器(如 Deployment、Node 控制器),确保集群状态符合预期。 |
Scheduler | 根据资源需求将 Pod 调度到合适的 Worker 节点。 |
3. Worker 节点组件
组件 | 功能 |
---|---|
kubelet | 与 Master 通信,管理节点上的 Pod 生命周期(启动/停止容器)。 |
kube-proxy | 维护网络规则,实现 Service 的负载均衡和流量转发。 |
容器运行时 | 执行容器(如 Docker、containerd)。 |
三、关键概念与资源对象
1. Pod
- 最小调度单元:一个或多个共享网络/存储的容器(通常为单容器)。
- 示例:运行 Node.js 应用的 Pod。
yaml
apiVersion: v1
kind: Pod
metadata:
name: nodejs-pod
spec:
containers:
- name: nodejs
image: node:18-alpine
ports:
- containerPort: 3000
2. Deployment
- 管理 Pod 副本:声明式定义 Pod 的副本数、更新策略。
- 支持滚动更新、回滚。
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nodejs
template:
metadata:
labels:
app: nodejs
spec:
containers:
- name: nodejs
image: node:18-alpine
3. Service
- 暴露服务:为一组 Pod 提供稳定的 IP 和 DNS 名称,支持负载均衡。
- 类型:ClusterIP(内部)、NodePort(节点端口)、LoadBalancer(云厂商 LB)。
yaml
apiVersion: v1
kind: Service
metadata:
name: nodejs-service
spec:
selector:
app: nodejs
ports:
- protocol: TCP
port: 80
targetPort: 3000
type: ClusterIP
4. Ingress
- 七层路由管理:通过规则将外部流量路由到 Service(如基于域名或路径)。
- 依赖 Ingress Controller(如 Nginx、Traefik)。
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nodejs-ingress
spec:
rules:
- host: example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: nodejs-service
port:
number: 80
四、核心功能特性
1. 自动化运维
- 自愈能力:自动重启故障容器、重新调度宕机节点上的 Pod。
- 滚动更新:逐步替换旧版本 Pod,确保零停机。
- 回滚机制:通过
kubectl rollout undo
回退到历史版本。
2. 弹性伸缩
- Horizontal Pod Autoscaler (HPA):根据 CPU/内存或自定义指标自动扩缩 Pod。
yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nodejs-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nodejs-deployment
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
3. 服务发现与负载均衡
- DNS 机制:通过
<service-name>.<namespace>.svc.cluster.local
访问服务。 - 流量分割:结合 Service 和 Ingress 实现金丝雀发布、A/B 测试。
4. 配置与存储管理
- ConfigMap:存储非敏感配置(如环境变量)。
- Secret:管理敏感数据(如数据库密码)。
- PersistentVolume (PV):提供持久化存储(如数据库数据)。
五、存储与网络
1. 存储
- Volume:Pod 级别的存储(临时或持久)。
- PersistentVolumeClaim (PVC):用户对存储资源的申请(如申请 10Gi 空间)。
yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
2. 网络
- CNI 插件:实现 Pod 跨节点通信(如 Calico、Flannel)。
- NetworkPolicy:控制 Pod 之间的网络流量(如允许前端 Pod 访问后端数据库)。
六、生态系统与工具
工具 | 用途 |
---|---|
Helm | 包管理器,简化应用部署(如 helm install )。 |
Prometheus | 监控集群和应用的性能指标。 |
Grafana | 可视化监控数据。 |
Argo CD | GitOps 持续交付工具。 |
Kustomize | 管理环境差异化的 YAML 配置。 |
七、典型应用场景
- 微服务架构:管理数百个服务的部署、通信和监控。
- 批处理任务:运行定时任务(通过
CronJob
)。 - 机器学习流水线:调度训练和推理任务。
- 高可用 Web 应用:通过多副本和 HPA 应对流量高峰。
八、最佳实践
- 资源限制:为容器设置 CPU/内存的
requests
和limits
。 - 健康检查:配置
livenessProbe
和readinessProbe
。 - 不可变基础设施:避免直接修改运行中的容器,通过更新镜像重新部署。
- 命名空间隔离:用
namespace
分隔开发、测试和生产环境。
九、学习路径建议
- 入门:通过
minikube
或kind
搭建本地集群。 - 动手实践:部署一个简单的 Web 应用(如 Nginx + Node.js + MySQL)。
- 深入理解:研究 Service Mesh(如 Istio)、Operator 模式等高级主题。
Kubernetes 的复杂性在于其丰富的功能模块,但掌握其核心逻辑(声明式 API + 控制器模式)后,可逐步构建高效的云原生架构。