Skip to content

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开发。

路由匹配类型

  1. Prefix:前缀匹配,路径以指定字符串开头
  2. Exact:精确匹配,路径必须完全一致
  3. 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/内存)来应对负载变化,适用于无法水平扩展的应用
  • 工作原理
    1. 指标采集:通过Metrics API查询目标工作负载(如Deployment)的当前指标
    2. 决策计算:计算当前指标值与目标值的比率
    3. 执行扩缩容:根据比率调整Pod副本数量

RBAC

基于角色的访问控制,通过 Role/ClusterRole 定义权限,RoleBinding/ClusterRoleBinding 绑定角色

  • Subject(主体)User/ Group/ ServiceAccount
  • Role(角色):定义权限规则(rules
  • ClusterRole(集群角色):非命名空间作用域的Role
  • Binding(绑定):将角色与主体关联

Helm

  • Kubernetes 的包管理工具

  • 通过 Chart、Release 和 Repository 简化应用部署

基础命令

集群管理

bash
kubectl cluster-info     									# 查看集群信息 
kubectl api-resources    									# 列出集群支持的 API 资源 
kubectl config current-context     							# 查看当前上下文 
kubectl explain <资源类>									 # 资源字段说明文档

命名空间操作

bash
kubectl create namespace <name>    							# 创建命名空间 
kubectl get namespaces    			  						# 查看命名空间 (缩写  kubectl get ns )
kubectl config set-context --curre nt --namespace=<name>     # 切换默认命名空间

资源操作

bash
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管理

bash
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> [其他参数]			# 创建pod

Deployment操作

bash
kubectl scale deployment/<name> -- replicas=<num>    		# 扩缩容 
kubectl rollout status deployment/ <name>    				# 查看更新状态 
kubectl rollout undo deployment/<n ame>    					# 回滚到上一版本

服务暴露

bash
kubectl expose deployment <name> - -port=<port> --type=NodePort    # 创建 Service
kubectl get services     									# 查看服务	(缩写  kubectl get svc )

调试与维护

bash
kubectl top pods     										# 查看资源使用情况(需 metrics-server) 
kubectl drain <node-name>    								# 优雅驱逐节点 Pod 
kubectl cordon/uncordon <node-name >     					# 标记节点不可调度/恢复调度

高级功能

bash
kubectl autoscale deployment <name > --cpu-percent=50 --min=1 --max=10     # 配置 HPA 自动扩缩容 
kubectl create secret generic <nam e> --from-literal=<key>=<value>     		# 创建 Secret