应用 (Application)
- 定义:应用是业务逻辑的实现,非 K8S 中的官方的概念,但容器中运行的实际程序通常就被认为是应用
- 层级关系:Application ∈ Container。Pod 是运行应用的载体,应用通是和容器一一对应,多个容器可以组合成一个复杂的应用
容器 (Container)
- 定义:容器是运行应用程序的最小单元,它打包了应用程序及其所有依赖环境,确保应用在任何环境中可以一致地运行
- 层级关系:Container ∈ Pod ,一个 Pod 可以包含一个或多个容器,它们共享网络、存储等资源
Pod
- 定义
- 功能:提供了容器之间的通信和协作
- 层级关系:一个 Pod 通常仅含一个Container(一对一)。但在需要多个容器协作运行的复杂应用中,一个 Pod 也可以包含多个容器
- 生命周期:Pod 是不是稳定的实体,非常容易被创建或销毁,发生故障时 K8S 会自动创建新的 Pod 来替代它(而不是修复旧的 Pod,并且 IP 也会重新分配)
Service(服务)
- 定义:Service 是一种服务抽象,它将一组 Pod 封装成单个服务,并为这些 Pod 提供统一的访问入口
- 功能
- 解决 Pod IP 不稳定问题:为 Pod 提供固定的访问方式(通常是一个稳定的 IP 地址或 DNS 名称)
- 应用可以使用 DNS 名称(而不是直接使用 Pod 的 IP 地址),从而提供服务发现和负载均衡功能
- 层级关系:Service 管理多个 Pod,一个 Node 上可以运行多个 Service
- 分类
- 外部服务:供外部或集群内的客户端调用的服务,提供一个稳定的访问接口(Service IP 和端口不随后端的 Pod 变化)
- 内部服务:不能或者不需要暴露给外部的服务,仅供内部服务调用的服务
- 主要类型
- ClusterIP:默认类型,仅在集群内部暴露服务
- NodePort:常用类型,将服务暴露在每个 Node 的特定端口上,可以通过该端口从外部访问
- LoadBalancer:在支持的云环境中创建一个外部负载均衡器,并将流量路由到服务上
- ExternalName:将服务映射到一个外部的 DNS 名称
- Headless:无头类型,主要用于 DNS 解析和服务发现
- 示例
-
目标:通过 NodePort 服务将一个应用程序(MyApp)暴露给外部访问,使外部用户可以通过节点的 IP 地址和端口号(30080)访问该应用
-
工作流程
- 将 myApp-service 服务通过 30080 端口暴露给外部,供外部访问
- Kube Proxy 监听 30080 端口请求,并将请求转发到 myApp-service 对应的端口 80
- Service 根据 selector 选择 app=MyApp 的 Pod ,并通过负载均衡策略选择一个 Pod 处理请求
- Service 将请求转发到后端 Pod 的端口(targetPort: 8080)
- Pod 处理请求并返回响应给 Service
- Service 将响应返回给 Kube Proxy
- Kube Proxy 将响应返回给用户
-
代码实现
apiVersion: v1 # 声明 API 版本(如何同 API Server 进行交互),v1 最常用 kind: Service # 声明资源类型为 Service metadata: # 声明服务的元数据 name: myApp-service # 声明服务的名字,Kubernetes 内部和外部引用该服务时将使用这个名字 spec: # specification: 声明资源对象的配置信息 type: NodePort # 声明该服务为节点端口类型的 (向外暴露的服务) selector: # 选择器,用来选择对应的 Pod,服务会将流量转发到符合条件的 Pod app: MyApp # 选择 pod 的 Label 中 app=nginx 的资源 ports: - protocol: TCP # 指定服务使用的协议是 TCP port: 80 # 服务对集群内部公开的端口 targetPort: 8080 # 服务后方 pod 的端口 nodePort: 30080 # 声明向外提供服务的端口号, 必须在30000~32767之间
-
Node(节点)
- 定义:Kubernetes 集群中的一个物理机或虚拟机,是运行 Pod 的工作单元
- 组成部分(核心组件)
- 层级关系:Pod ∈ Service ∈ Node,节点的资源(如 CPU、内存等)分配给运行在其上的 Pod 使用
Cluster(集群)
- 定义:由多个节点组成的集合,它是 Kubernetes 用来管理和调度容器化应用的基础架构
- 层级关系:Node ∈ Cluster,Kubernetes 的控制平面负责调度任务到不同的节点上运行
Ingress
-
定义:一种 API 对象,集群外部访问集群内部服务的入口和方式,用于管理从集群外部访问 Kubernetes 服务的 HTTP 和 HTTPS 路由
-
功能:提供多种的路由方法
- 基于路径的路由:可以根据请求的 URL 路径将流量转发到不同的服务
- 基于域名的路由:根据请求的主机头(域名)将流量路由到不同的服务
- 负载均衡:根据不同的规则来访问不同的 Service 以及 Service 所对应的 Pod
- TLS 支持:可以为入口流量配置 SSL/TLS 终止,从而提供安全的 HTTPS 访问
-
组成部分
- Ingress 资源:定义路由规则的配置对象,包含域名、路径、后端服务等信息
- Ingress 规则:定义如何将外部请求路由到集群内服务的规则集合,可以基于 域名(Host)或者 URL 路径
- Ingress Controller:实现 Ingress 功能的控制器,负责监听 Ingress 资源并实现相应的路由规则
- 常见实现:Nginx Ingress Controller、Traefik、HAProxy
- 处理负载均衡、SSL 终止、路由规则等具体功能
-
配置实例
- 目标: my-app.example.com 的流量转发到 my-service 上的 80 端口
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: my-app.example.com http: paths: - path: / pathType: Prefix backend: service: name: my-service port: number: 80
ConfigMap
- 功能:公共配置文件,避免配置文件数据和 Pod 耦合
- 注意:ConfigMap 中的配置信息是明文的,避免使用 ConfigMap 存储敏感信息
Secret
- 定义:用于封装敏感信息,会将配置信息 Base64 编码(也不完全安全,Base64 编码容易解码)
Volume
- 定义:一个抽象的存储接口,为容器提供持久化存储能力,使数据能够在 Pod 重启或迁移后仍然保持
- 功能:将需要持久化存储的资源挂载到集群中的本地磁盘上,或者挂载到集群外部的远程存储上(比如 OSS)
Deployment(部署)
- 定义:一个声明式的应用程序管理对象,用于管理无状态应用的 Pod 副本、更新策略和部署方式
- 功能
- 自动扩缩容:根据配置自动调整 Pod 副本数量,确保应用程序的高可用性
- 滚动更新:通过逐步替换的方式更新应用程序,确保服务不中断
- 副本控制:维持期望的 Pod 副本数量,当 Pod 失效时自动创建新的副本。例如,配置副本数为 3 时,系统会始终确保有 3 个健康的 Pod 在运行
StatefulSet
- 定义:有状态服务管理组件,数据库、缓存、消息队列等有状态的应用以及保留了会话状态的应用一般都需要使用 StatefulSet 而不是 Deployment
- 功能
- 自动扩缩容:按照固定的顺序进行扩容和缩容,确保数据一致性和服务可用性
- 副本控制:为每个 Pod 维护一个固定的标识符,即使 Pod 被重新调度,也会保持相同的网络标识和存储
- 状态存储:每个副本都有自己稳定的网络标识符(通过 Headless Service)和持久化存储(通过 PVC),确保数据的持久性和一致性
- 有序部署:按照编号顺序(0,1,2...)创建 Pod,确保前一个 Pod 完全就绪后才会创建下一个
Namespace
- 定义:一种逻辑上的资源隔离机制,用于在同一个物理集群中创建多个虚拟的集群环境
- 功能:用于将集群中的资源划分为多个虚拟集群。不同的 Namespace 可以拥有独立的资源配额、访问控制策略等