Kubernetes-汇总
核心概念与架构
Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用,提供高可用性、弹性扩展和跨平台支持。其核心架构由控制平面(如 API Server、etcd、Controller Manager、Scheduler)和工作节点组件(如 Kubelet、Kube Proxy)组成。
核心组件
控制平面组件
API Server:集群统一入口,提供RESTful API接口
etcd:分布式键值存储数据库,保存集群状态和配置数据
Controller Manager:运行各种控制器,确保集群实际状态与期望状态一致
Scheduler:负责Pod调度,根据资源需求选择合适节点
kubelet:节点代理,管理Pod生命周期并与容器运行时交互
kube-proxy:实现Service的负载均衡和网络代理功能
工作节点组件
kubelet:管理本节点上的Pod生命周期
kube-proxy:实现Service的负载均衡和网络代理
扩展组件
CoreDNS: Kubernetes集群的默认DNS服务器,负责服务发现(将服务名称解析为ClusterIP或Pod IP)、Pod域名解析、外部域名解析、负载均衡(轮询策略)和反向DNS解析。
Calico: Kubernetes网络插件,采用纯三层网络模型,提供Pod IP分配、路由传播(通过BGP协议)、跨节点通信(支持BGP/IPIP/VXLAN模式)和网络策略实施(通过iptables/eBPF规则)。
Ingress Controller: Kubernetes组件,用于管理外部HTTP/HTTPS流量进入集群,提供路由规则(基于域名或路径)、负载均衡、SSL终止和高级功能(如路径重写、会话保持);常见实现包括Nginx、Traefik和HAProxy。
组件协作流程
1. 用户提交请求
- 用户通过 kubectl 或API向API Server提交资源定义(如YAML文件),声明应用的期望状态。
2. 存储与协调
API Server验证请求后,将资源状态持久化到etcd(集群的分布式数据库)。
Controller Manager监听etcd中的资源变更,对比实际状态与期望状态,生成调整指令(如扩缩容Pod)。
3. 调度与执行
Scheduler选择符合条件的Node,将Pod绑定到目标节点(基于资源、亲和性等策略)。
kubelet在目标Node上调用容器运行时(如containerd)启动Pod,并持续上报状态至API Server。
4. 服务与网络
kube-proxy维护Service的负载均衡规则(iptables/IPVS),将流量路由到后端Pod。
CNI插件(如Calico)为Pod分配IP并管理跨节点网络通信。
5. 自愈与扩展
各组件持续监控集群状态(如Pod故障),自动触发重建、调度或扩缩容,确保系统收敛于期望状态
工作负载管理
Pod
- 最小部署单元,代表一组共享网络和存储的容器
- 支持单容器、Sidecar、适配器和大使等多种使用模式
- 生命周期:
- Pending:Pod 已被系统接受,但容器尚未创建
- Running:Pod 已绑定到节点,所有容器已创建
- Succeeded:所有容器成功终止
- Failed:至少一个容器异常终止
- Unknown:无法获取 Pod 状态
Deployment
用于管理无状态应用的核心工作负载控制器
通过 ReplicaSet 实现 Pod 的声明式部署、自动扩缩容、滚动更新及版本回滚
支持 Pod 模板定义、副本数量控制、多种更新策略和健康检查
StatefulSet
专为管理有状态应用设计的控制器
提供稳定的网络标识、有序部署、持久化存储及与 Headless Service 的紧密集成
适用于数据库、消息队列等有状态服务
DaemonSet
确保在集群中每个(或指定)节点上运行一个 Pod 副本
常用于部署日志收集、监控代理、网络插件等系统级守护进程
Job/CronJob
Job 是专为管理一次性批处理任务设计的控制器
CronJob 在 Job 基础上增加了基于 cron 表达式的定时调度功能
网络与服务
Service
四层负载,适用于TCP/UDP协议。为动态变化的 Pod 提供稳定的访问入口,实现服务发现、负载均衡和网络抽象
类型:
- ClusterIP:集群内部的虚拟 IP(VIP),只能在 Kubernetes 集群内部访问
- NodePort:它在 ClusterIP 基础上扩展了外部访问能力,在每个节点上开放一个静态端口(默认范围 30000-32767)
- LoadBalancer:在 NodePort 基础上,集成云提供商的负载均衡器(如AWS ELB、GCP LB等)
- ExternalName:将 Service 映射到外部 DNS 域名,而不是集群内部的 Pod
无头模式:
- 无选择器 Service:Service 对象中不定义
.spec.selector字段 - 手动创建 Endpoints:用户自行创建与 Service 同名的 Endpoints 对象,明确指定后端端点
- 负载均衡机制:kube-proxy 仍然会为这种 Service 创建负载均衡规则,但后端由用户完全控制
Ingress
七层负载适用于HTTP(80)/HTTPS(443)协议。通过一个统一的入口暴露多个服务,支持基于域名、路径、HTTP 头部等条件的复杂路由规则,可以在集群边缘处理 SSL/TLS 加密解密,减轻后端服务负担。底层基于Nginx开发。
路由匹配类型:
- Prefix:前缀匹配,路径以指定字符串开头
- Exact:精确匹配,路径必须完全一致
- ImplementationSpecific:由具体 Ingress 控制器实现决定
annotations注解:
- 负载均衡:
- 轮询(默认):nginx.ingress.kubernetes.io/load-balance: "round_robin"
- 最少连接:nginx.ingress.kubernetes.io/load-balance: "least_conn"
- IP 哈希:nginx.ingress.kubernetes.io/ip-hash: "true"
- 重定向
- 路径重写:通过正则匹配进行路径跳转
- 跨域(CORS)
- 流量控制:并发限制与令牌桶限制
- 超时控制:连接超时、请求超时等
NetworkPolicy
基于标签的声明式网络安全机制,精细控制 Pod 之间的入站(Ingress)和出站(Egress)流量
选择器类型:
- podSelector:匹配当前命名空间中的特定 Pod
- namespaceSelector:匹配特定命名空间中的所有 Pod
- ipBlock:匹配特定的 CIDR 范围
存储管理
ConfigMap
用于存储非敏感配置数据的键值对对象
支持通过环境变量和卷挂载两种方式供 Pod 使用
Secret
用于安全存储和管理敏感信息(如密码、令牌、密钥)
支持通过环境变量或卷挂载方式注入到 Pod 中
PV/PVC
PV(持久卷)和 PVC(持久卷声明)共同实现容器数据的持久化存储,通过 StorageClass 支持动态存储供应
PV:PV 独立于 Pod 生命周期存在,支持多种存储类型包括本地存储(HostPath)、网络存储(NFS、iSCSI、Ceph)以及云存储(AWS EBS、Azure Disk 等)
PVC:是用户对存储资源的声明(申请),描述应用所需的存储特性(容量、访问模式等),不关心底层实现细节
StorageClass:
- 静态模式:管理员预先创建许多各种各样的PV,等待PVC申请使用。
- 动态模式:管理员无须预先创建PV,而是通过StorageClass自动完成PV的创建以及与PVC的绑定。
生命周期:
- Provisioning(配置):静态或者动态配置
- Binding(绑定):匹配 PVC 与符合条件的 PV,绑定后形成一对一独占关系,PV 状态变为 Bound
- Using(使用):Pod 通过 volumes 字段引用 PVC,存储卷被挂载到容器指定路径
- Releasing(释放):Pod 删除后,PVC 被释放,PV 根据回收策略进入 Released 或 Failed 状态
- Recycling(回收)
Retain:保留 PV 和数据,需手动清理(生产环境推荐)
Delete:自动删除 PV 及底层存储(需存储插件支持)
Recycle(已弃用):删除数据后重置 PV 为 Available
临时存储
emptyDir:与 Pod 生命周期绑定的临时存储卷
hostPath:将节点本地文件系统挂载到 Pod 中
配置与资源管理
对象描述文件
YAML/JSON 格式定义集群中的各类资源
常见资源类型包括 Pod、Deployment、Service、ConfigMap 等
资源管理
ResourceQuota:命名空间级别的资源配额
计算资源配额:计算资源(CPU/内存)总和的限制
存储资源配额:存储资源(PVC)总和限制
对象数量配额:对象资源数量控制,如Pod(非停止状态)、Service、Secret 、ConfigMap、Deployment
LimitRange:约束命名空间内的资源限制
设置默认值:为未指定资源需求的 Pod 或容器自动注入合理的资源请求(request)和限制(limit)值
设置最大资源上限:约束 Pod 或容器能够使用的资源最大值
设置最小请求值:约束 Pod 或容器能够使用的资源最小值
节点亲和性控制 Pod 调度
- NodeSelector:基于节点标签(Labels)实现,将Pod强制调度特定节点,将不同服务调度到不同节点
- NodeAffinity:指定 Pod 应该(或不应该)调度到哪些节点上
- 硬性要求:调度时必须满足的条件,不满足则处于Pending状态
- 软性偏好:调度时优选考虑的条件,不满足时仍可调度
Pod亲和性:基于节点拓扑域和Pod标签,定义新Pod与现有Pod之间的部署关系
- 亲和:使Pod倾向于与特定标签的Pod部署在同一拓扑域
- 反亲和:使Pod避免与特定标签的Pod部署在同一拓扑域
污点与容忍:
- 污点:污点是节点(Node)上的属性,用于排斥不符合条件的Pod被调度到该节点
- 容忍:容忍是Pod上的配置,允许(但不强制)Pod被调度到带有特定污点的节点上
QoS资源分配策略
- 根据 Pod 的资源请求和限制配置划分 QoS 等级
- 评分范围-1000到+1000,分越大优先被删除
- 分类:
- Guaranteed (最高保障):Pod 中所有容器都必须设置Requests 和 Limits,且两者的值必须完全相同
- Burstable (可突增资源):Requests 和 Limits 不一致,容器可获得最低保障但也能在资源充足时突发使用更多资源
- BestEffort (尽力而为):未设置任何requests和limits,资源紧张时,优先被终止
运维与扩展
探针
控制应用初始化、检测异常容器以及管理流量路由
探针类型:
- Startup(启动):判断容器内应用程序是否启动,会先禁止其他的探针,直到它成功为止,成功后将不再进行探测
- Liveness(存活):判断容器内的应用程序是否正常,若不正常,根据 Pod 的restartPolicy 重启策略操作,如果没有配置该探针,默认就是success
- Readiness(就绪):判断容器是否已经就绪,若未就绪,容器将会处于未就绪,未就绪的容器,不会进行流量的调度。 Kubernetes 会把 Pod 从 service endpoints 中剔除。
探针方法:
exec:通过在容器内执行指定命令,来判断命令退出时返回的状态码,返回状态码是0表示正常。
httpGet:通过对容器的 IP 地址、端口和 URL 路径来发送 GET 请求;如果响应的状态码在 200 ~399 间,表示正常。
tcpSocket:通过对容器的 IP 地址和指定端口,进行 TCP 检查,如果端口打开,发起 TCPSocket 建立成功,表示正常。
探针配置项:
- initialDelaySeconds:延迟多少秒开始探测
- periodSeconds:检查间隔时间单位秒,默认10s最少1s
- timeoutSeconds:超时时间单位秒
- failureThreshold:连续失败次数,默认3最少1
- successThreshold:连续成功次数,默认1,且只能是1
HPA
通过监控资源指标动态调整 Pod 副本数量,实现应用负载的自动扩缩容
- 水平扩缩(Horizontal Scaling):通过增减Pod数量来应对负载变化,这是云原生应用更推荐的扩缩方式,因为它提供了更好的弹性和故障隔离能力
- 垂直扩缩(Vertical Scaling):通过调整单个Pod的资源配额(CPU/内存)来应对负载变化,适用于无法水平扩展的应用
- 工作原理:
- 指标采集:通过Metrics API查询目标工作负载(如Deployment)的当前指标
- 决策计算:计算当前指标值与目标值的比率
- 执行扩缩容:根据比率调整Pod副本数量
RBAC
基于角色的访问控制,通过 Role/ClusterRole 定义权限,RoleBinding/ClusterRoleBinding 绑定角色
- Subject(主体):
User/Group/ServiceAccount - Role(角色):定义权限规则(
rules) - ClusterRole(集群角色):非命名空间作用域的Role
- Binding(绑定):将角色与主体关联
Helm
Kubernetes 的包管理工具
通过 Chart、Release 和 Repository 简化应用部署
基础命令
集群管理
kubectl cluster-info # 查看集群信息
kubectl api-resources # 列出集群支持的 API 资源
kubectl config current-context # 查看当前上下文
kubectl explain <资源类型> # 资源字段说明文档命名空间操作
kubectl create namespace <name> # 创建命名空间
kubectl get namespaces # 查看命名空间 (缩写 kubectl get ns )
kubectl config set-context --curre nt --namespace=<name> # 切换默认命名空间资源操作
kubectl apply -f <file.yaml> # 声明式创建/更新资源
kubectl create RESOURCE [NAME] [--flags] # 创建资源
kubectl delete -f <file.yaml> # 删除资源
kubectl get <resource> # 查看资源列表 (如 pods , deployments )
kubectl describe <resource>/<name> # 查看资源详情
kubectl edit <资源类型> <资源名称> [-n <命名空间>] # 直接编辑Kubernetes集群资源
kubectl patch -p PATCH [--type=<策略类型>] # 部分更新Kubernetes资源字段
kubectl rollout history (TYPE NAME | TYPE/NAME) [flags] # 查看Kubernetes资源部署历史记录Pod管理
kubectl logs <pod-name> [-c contai ner] # 查看容器日志
kubectl exec -it <pod-name> -- /bi n/sh # 进入容器交互终端
kubectl port-forward <pod-name> <l ocal-port>:<pod-port> # 端口转发
kubectl run <POD_NAME> --image=<IMAGE> [其他参数] # 创建podDeployment操作
kubectl scale deployment/<name> -- replicas=<num> # 扩缩容
kubectl rollout status deployment/ <name> # 查看更新状态
kubectl rollout undo deployment/<n ame> # 回滚到上一版本服务暴露
kubectl expose deployment <name> - -port=<port> --type=NodePort # 创建 Service
kubectl get services # 查看服务 (缩写 kubectl get svc )调试与维护
kubectl top pods # 查看资源使用情况(需 metrics-server)
kubectl drain <node-name> # 优雅驱逐节点 Pod
kubectl cordon/uncordon <node-name > # 标记节点不可调度/恢复调度高级功能
kubectl autoscale deployment <name > --cpu-percent=50 --min=1 --max=10 # 配置 HPA 自动扩缩容
kubectl create secret generic <nam e> --from-literal=<key>=<value> # 创建 Secret