文章目录
补充
Service 的作用
- 对集群内部:
- 跟踪 Pod 的变化,更新 Endpoint。
- 提供服务发现机制,解决 Pod IP 动态变化的问题。
- 对集群外部:
- 类似负载均衡器,支持集群内外访问 Pod。
- 提供统一的访问入口。
Kubernetes 外部访问方案
-
NodePort:
- 将 Service 暴露在节点网络上。
- 通过节点的 IP 和端口访问服务。
- 缺点:
- 端口范围有限(默认 30000-32767)。
- 管理复杂,不适合大规模集群。
-
LoadBalancer:
- 使用外部负载均衡器分发流量。
- 需要云环境支持(如 AWS、GCP)。
- 缺点:
- 依赖云服务商。
- 成本较高。
-
ExternalIPs:
- 为 Service 分配外部 IP。
- 外部 IP 路由到集群节点,流量转发到 Service 的 Endpoint。
- 缺点:
- 需要手动管理外部 IP。
-
Ingress:
- 提供七层代理(HTTP/HTTPS)。
- 基于域名或 URL 路径转发请求。
- 优点:
- 只需少量公网 IP 和负载均衡器。
- 支持多服务暴露,灵活配置。
Kubernetes Ingress
Ingress 概述
- 作用:作为 Kubernetes 集群的接入层,接收外部请求并根据规则(域名或 URL 路径)将请求转发到相应的 Service 和 Pod。
- 特点:
- 支持七层代理(HTTP/HTTPS)。
- 提供灵活的流量管理(如基于域名、路径的转发)。
- 支持 TLS 加密、认证、重写路径等高级功能。
Kubernetes 外部访问方案对比
方案 | 特点 | 适用场景 |
---|---|---|
NodePort | 通过节点端口暴露服务,仅支持四层代理。 | 简单测试环境 |
LoadBalancer | 通过云服务商的负载均衡器暴露服务,支持四层代理。 | 云环境生产部署 |
ExternalIPs | 通过指定节点的外部 IP 暴露服务,仅支持四层代理。 | 特定节点 IP 的场景 |
Ingress | 支持七层代理,基于域名或路径转发请求,功能强大且灵活。 | 生产环境,复杂流量管理 |
Ingress 的组成
-
Ingress 对象:
- 定义转发规则(如域名、路径)。
- 告诉 Ingress 控制器如何将请求转发到后端 Service。
- 功能:
- 提供外部 URL。
- 支持负载均衡。
- 提供 SSL/TLS 能力。
- 实现基于域名的反向代理。
- 配置方式:通过 YAML 文件定义。
-
Ingress 控制器:
- 实际处理请求转发的组件。
- 常见实现:Nginx Ingress Controller、Traefik、HAProxy 等。
- 通常以 Pod 形式运行。
- 功能:
- 监控集群变化,动态更新配置。
- 根据 Ingress 规则生成代理配置(如 Nginx 配置)。
- 应用配置并重载代理服务。
Ingress-Nginx 工作原理
-
监控集群变化:
- Ingress Controller 通过 Kubernetes API Server 动态感知 Ingress 规则的变化。
-
生成配置:
- 根据 Ingress 规则生成 Nginx 配置。
- 配置包括域名、路径与 Service 的映射关系。
-
写入配置:
- 将生成的 Nginx 配置写入
/etc/nginx/nginx.conf
。
- 将生成的 Nginx 配置写入
-
重载服务:
- 重载 Nginx 服务,使新配置生效。
Ingress 控制器的部署方式
1. DaemonSet + Host 网络模式
- 特点:
- 每个节点运行一个 Ingress 控制器 Pod。
- 使用节点的 80/443 端口直接接收外部请求。
- 数据流:
客户端 -> 节点 -> 80/443 端口 -> Ingress 控制器 -> 后端 Pod
2. Deployment + NodePort/LoadBalancer Service
- 特点:
- 集中部署 Ingress 控制器。
- 通过 NodePort 或 LoadBalancer 暴露服务。
- 数据流:
客户端 -> 节点 -> NodePort -> Ingress 控制器 -> 后端 Pod
创建 Ingress 资源
部署 Ingress-Nginx
- 官方 GitHub:Ingress-Nginx
- 官方文档:Ingress-Nginx 文档
陈述式命令
kubectl create ingress <ingress-name> \
--rule=<域名>/<路径>=<service-name>:<service-port> \
--class=<ingress-class>
YAML 配置
- YAML 示例:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: www.example.com http: paths: - path: /app pathType: Prefix backend: service: name: app-service port: number: 80 tls: - hosts: - www.example.com secretName: tls-secret
高级功能
1. 基于域名的代理转发
rules:
- host: www.example.com
http:
paths:
- path: /app
backend:
service:
name: app-service
port: 80
- host: api.example.com
http:
paths:
- path: /api
backend:
service:
name: api-service
port: 8080
2. 基于路径的代理转发
rules:
- host: www.example.com
http:
paths:
- path: /app
backend:
service:
name: app-service
port: 80
- path: /api
backend:
service:
name: api-service
port: 8080
3. HTTPS 支持
- 创建 TLS Secret:
kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key
- 配置 Ingress:
tls: - hosts: - www.example.com secretName: tls-secret
4. Basic Auth 认证
- 创建认证文件:
htpasswd -c auth admin
- 创建 Secret:
kubectl create secret generic basic-auth --from-file=auth
- 配置 Ingress:
metadata: annotations: nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
5. 路径重写
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
rules:
- host: www.example.com
http:
paths:
- path: /old/(.*)
backend:
service:
name: new-service
port: 80
6. 金丝雀发布(Canary)
metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "50"
spec:
rules:
- host: www.example.com
http:
paths:
- path: /
backend:
service:
name: canary-service
port: 80
部署 nginx-ingress-controller
- 创建目录并下载部署文件
mkdir /opt/ingress cd /opt/ingress wget https://gitee.com/mirrors/ingress-nginx/raw/controller-v1.3.0/deploy/static/provider/cloud/deploy.yaml
- 修改镜像地址
编辑deploy.yaml
文件,找到image
字段,并将其修改为阿里云镜像