Kubernetes
Kubernetes(K8s)是 Google 开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。Kubernetes 提供服务发现、负载均衡、存储编排、自动扩缩容、自愈等功能,是云原生的事实标准。
Kubernetes 的架构
控制平面
控制平面负责集群的决策和响应,管理集群的状态。
API Server:集群的统一入口,处理 REST 请求,验证和配置数据。
Etcd:高可用的键值存储,存储集群的配置和状态数据。
Scheduler:负责调度 Pod 到合适的节点。
Controller Manager:运行控制器,维护集群的期望状态。
Cloud Controller Manager:与云服务商 API 交互,管理云资源。
数据平面
数据平面负责运行容器,由多个节点组成。
Kubelet:节点代理,负责管理 Pod、与 API Server 通信、汇报节点状态。
Kube-proxy:网络代理,负责 Service 的负载均衡和网络代理。
Container Runtime:容器运行时,负责运行容器(containerd、CRI-O)。
Kubernetes 的核心概念
Pod
Pod 是 Kubernetes 的最小调度单位,包含一个或多个容器,共享网络和存储。Pod 内的容器可以通过 localhost 通信,共享存储卷。
Pod 的生命周期:Pending(待调度)、Running(运行中)、Succeeded(成功终止)、Failed(失败终止)、Unknown(状态未知)。
Pod 的重启策略:Always(总是重启)、OnFailure(失败时重启)、Never(不重启)。
Node
Node 是集群的工作节点,运行 Pod。Node 的状态:Ready(就绪)、NotReady(未就绪)、OutOfDisk(磁盘不足)、MemoryPressure(内存压力)、DiskPressure(磁盘压力)、PIDPressure(进程数压力)。
Node 的调度:根据 Pod 的资源请求、节点选择器、亲和性、污点和容忍度,选择合适的节点运行 Pod。
Namespace
Namespace 是集群的虚拟分区,用于隔离资源。默认命名空间:default(默认)、kube-system(系统组件)、kube-public(公共资源)、kube-node-lease(节点租约)。
Label 和 Selector
Label 是键值对,用于标识资源。Selector 根据 Label 选择资源,用于 Pod 选择器、Service 选择器。
Label 和 Selector 实现资源间的松耦合,Service 通过 Selector 选择 Pod,Deployment 通过 Selector 管理 Pod。
Deployment
Deployment 管理 Pod 的副本数和版本,支持滚动更新、回滚。Deployment 创建 ReplicaSet,ReplicaSet 管理 Pod。
Deployment 的更新策略:RollingUpdate(滚动更新)、Recreate(重建)。
滚动更新:逐个替换 Pod,确保服务不中断。可以配置 maxSurge(最大新增 Pod 数)和 maxUnavailable(最大不可用 Pod 数)。
Service
Service 是 Pod 的稳定网络入口,提供负载均衡和服务发现。Service 通过 Selector 选择 Pod,将请求负载均衡到后端 Pod。
Service 的类型:ClusterIP(集群内部访问)、NodePort(通过节点端口访问)、LoadBalancer(通过负载均衡器访问)、ExternalName(外部名称映射)。
Service 的负载均衡策略:kube-proxy 支持 iptables 和 IPVS 模式,IPVS 性能更好。
Ingress
Ingress 是 HTTP/HTTPS 路由规则,将外部流量路由到 Service。Ingress 由 Ingress Controller 实现,如 Nginx Ingress Controller、Traefik Ingress Controller。
Ingress 支持基于主机名、路径的路由,支持 TLS 终止、WebSocket、gRPC。
ConfigMap 和 Secret
ConfigMap 存储配置数据,以环境变量或挂载文件的方式注入 Pod。
Secret 存储敏感数据(如密码、Token),Secret 数据以 Base64 编码存储,可以挂载为文件或环境变量。
PersistentVolume 和 PersistentVolumeClaim
PersistentVolume(PV)是集群的存储资源,由管理员或 StorageClass 动态创建。
PersistentVolumeClaim(PVC)是对存储的请求,Pod 通过 PVC 挂载存储。
StorageClass:存储类,定义存储的类型和参数,支持动态创建 PV。
PV 的访问模式:ReadWriteOnce(单节点读写)、ReadOnlyMany(多节点只读)、ReadWriteMany(多节点读写)。
Kubernetes 的调度
资源请求和限制
resources.requests:Pod 调度所需的最小资源,用于调度决策。
resources.limits:Pod 可用的最大资源,用于运行时限制。
CPU 资源:单位为 millicore(1 CPU = 1000m),可压缩,超过限制时被限流。
内存资源:单位为字节,不可压缩,超过限制时被 OOM Kill。
节点选择器
nodeSelector:通过 Label 选择节点,简单但功能有限。
nodeAffinity:节点亲和性,支持 required(必须满足)和 preferred(优先满足)。
podAffinity 和 podAntiAffinity:Pod 亲和性和反亲和性,控制 Pod 的调度位置。
污点和容忍度
Taint(污点):标记节点,拒绝不匹配的 Pod 调度。
Toleration(容忍度):Pod 可以容忍污点,即使节点有污点也可以调度。
常见污点:NoSchedule(不调度)、PreferNoSchedule(尽量不调度)、NoExecute(不调度且驱逐现有 Pod)。
Kubernetes 的自愈
健康检查
livenessProbe:存活探针,探测容器是否存活,失败时重启容器。
readinessProbe:就绪探针,探测容器是否就绪,失败时从 Service 移除。
startupProbe:启动探针,探测容器是否启动,用于慢启动容器。
探针类型:HTTP GET、TCP Socket、Exec(执行命令)。
自动重启
Kubernetes 通过 ReplicaSet 确保 Pod 的副本数,Pod 故障时自动重启。
自动调度
节点故障时,Kubernetes 自动将 Pod 调度到其他节点。
自动扩缩容
Horizontal Pod Autoscaler(HPA):根据 CPU、内存或自定义指标自动调整 Pod 副本数。
Vertical Pod Autoscaler(VPA):根据资源使用情况自动调整 Pod 的资源请求和限制。
Cluster Autoscaler:根据 Pod 调度失败情况自动调整节点数量。
Kubernetes 的网络
Pod 网络
Pod 有独立的 IP 地址,Pod 间可以直接通信,跨节点 Pod 通信通过 Overlay 网络(如 VXLAN)。
Service 网络
Service 有虚拟 IP(ClusterIP),kube-proxy 通过 iptables 或 IPVS 实现 ClusterIP 的负载均衡。
Ingress 网络
Ingress 提供 HTTP/HTTPS 路由,Ingress Controller 实现 Ingress 规则。
Kubernetes 的最佳实践
使用标签:为资源添加 Label,便于选择和管理。
使用命名空间:使用 Namespace 隔离不同环境、不同团队的资源。
设置资源限制:为 Pod 设置资源请求和限制,避免资源争抢。
使用健康检查:配置 livenessProbe 和 readinessProbe,确保 Pod 健康。
使用 ConfigMap 和 Secret:将配置和敏感信息存储在 ConfigMap 和 Secret,不要打包在镜像中。
使用 HPA:配置 HPA 自动扩缩容,提高资源利用率。
使用 RBAC:配置 Role-Based Access Control,限制访问权限。
定期备份 etcd:etcd 存储集群状态,定期备份 etcd 数据。
Kubernetes 是云原生的事实标准,理解 Kubernetes 的核心概念和最佳实践,有助于构建可扩展、高可用的云原生应用。