概述
在 Kubernetes 中,Pod 是短暂的,它们的 IP 地址可能随时变化。Service 提供了一种抽象方式,定义了一组 Pod 的访问策略。Ingress 则提供了从集群外部访问集群内服务的 HTTP/HTTPS 路由。Service
Service 是一种将运行在一组 Pod 上的应用程序公开为网络服务的抽象方法。Service 类型
Kubernetes 提供了四种 Service 类型:| 类型 | 说明 | 使用场景 |
|---|---|---|
| ClusterIP | 默认类型,集群内部访问 | 内部服务通信 |
| NodePort | 通过节点端口暴露服务 | 开发测试环境 |
| LoadBalancer | 使用云平台负载均衡器 | 生产环境外部访问 |
| ExternalName | 映射到外部 DNS 名称 | 访问集群外部服务 |
ClusterIP Service
ClusterIP 是默认的 Service 类型,只能在集群内部访问。NodePort Service
NodePort 在每个节点上开放一个端口,外部可以通过<NodeIP>:<NodePort> 访问。
LoadBalancer Service
LoadBalancer 类型会自动创建云平台的负载均衡器(如 AWS ELB、GCP LB)。ExternalName Service
ExternalName 将 Service 映射到外部 DNS 名称。- 访问集群外部的数据库
- 逐步迁移服务到 Kubernetes
Headless Service
当不需要负载均衡和单一 Service IP 时,可以创建 Headless Service。- 不分配 ClusterIP
- DNS 直接返回所有 Pod 的 IP
- 适用于 StatefulSet
多端口 Service
Service 会话保持
Endpoints
Service 通过 Endpoints 关联 Pod。当 Pod 创建或删除时,Endpoints 自动更新。手动创建 Endpoints
可以创建没有选择器的 Service,手动管理 Endpoints:Ingress
Ingress 是对集群中服务的外部访问进行管理的 API 对象,提供 HTTP/HTTPS 路由。Ingress 的优势
相比于每个服务都使用 LoadBalancer:- 节省公网 IP 和负载均衡器成本
- 提供统一的入口点
- 支持基于路径和主机名的路由
- 支持 SSL/TLS 终止
Ingress Controller
Ingress 资源本身不生效,需要安装 Ingress Controller:- Nginx Ingress Controller:最流行
- Traefik:云原生
- HAProxy:高性能
- Kong:API 网关功能
基本 Ingress
多路径 Ingress
多主机 Ingress
TLS/HTTPS 配置
首先创建 TLS Secret:Ingress 注解
Nginx Ingress Controller 支持丰富的注解:Path 类型
Ingress 支持三种 Path 类型:| pathType | 说明 | 示例 |
|---|---|---|
| Exact | 精确匹配 | /foo 只匹配 /foo |
| Prefix | 前缀匹配 | /foo 匹配 /foo、/foo/bar |
| ImplementationSpecific | 由 Ingress Controller 决定 | 取决于具体实现 |
服务发现
DNS 服务发现
Kubernetes 集群内置 DNS 服务(CoreDNS),Pod 可以通过 DNS 名称发现服务:环境变量
Kubernetes 自动为每个 Service 注入环境变量:网络策略(NetworkPolicy)
NetworkPolicy 用于控制 Pod 之间的网络流量。实战示例
完整的微服务暴露
总结
| 组件 | 作用 | 访问范围 |
|---|---|---|
| ClusterIP | 集群内部负载均衡 | 集群内部 |
| NodePort | 节点端口暴露 | 集群外部(节点 IP) |
| LoadBalancer | 云平台负载均衡器 | 集群外部(公网) |
| Ingress | HTTP/HTTPS 路由 | 集群外部(域名) |
- 内部服务使用 ClusterIP
- 开发测试环境使用 NodePort
- 生产环境使用 LoadBalancer 或 Ingress
- HTTP/HTTPS 服务优先使用 Ingress,节省资源
- 配置 NetworkPolicy 增强安全性