1. 首页 > Kubernetes教程 > 正文

Kubernetes教程FG043-Kubernetes Ingress配置与HTTP-HTTPS实战

本文档风哥主要介绍Kubernetes Ingress配置与HTTP/HTTPS实战,包括Ingress概述、Ingress控制器、HTTPS概述、Ingress规划、HTTPS规划、最佳实践规划、Ingress实现、HTTPS实现、Ingress控制器实现、基础Ingress案例、HTTPS Ingress案例、多域名Ingress案例等内容,风哥教程参考Kubernetes官方文档和Ingress相关文档,适合想使用和理解Kubernetes Ingress的开发人员和运维人员。

Part01-基础概念与理论知识

1.1 Ingress概述

Ingress是Kubernetes中用于管理外部访问集群服务的API对象,它提供了HTTP和HTTPS路由规则,可以将外部请求映射到集群内部的服务。

Ingress的主要功能包括:

  • HTTP路由:根据URL路径和主机名将请求路由到不同的服务
  • HTTPS终止:在Ingress控制器处终止HTTPS连接,内部使用HTTP
  • 负载均衡:在多个后端服务之间分发流量
  • SSL/TLS证书管理:管理HTTPS所需的证书
  • 路径重写:重写请求路径
  • 会话亲和性:确保同一客户端的请求始终发送到同一后端Pod

1.2 Ingress控制器

Ingress控制器是实现Ingress功能的组件,它负责监听Ingress资源的变化,并根据配置规则转发流量。常见的Ingress控制器包括:

  • NGINX Ingress Controller:基于NGINX的Ingress控制器,功能丰富,使用广泛
  • Traefik:现代化的Ingress控制器,支持自动发现和配置
  • HAProxy Ingress:基于HAProxy的Ingress控制器,性能优异
  • Contour:基于Envoy的Ingress控制器,支持高级特性
  • Gateway API:Kubernetes官方的新一代网关API,提供更灵活的路由规则

1.3 HTTPS概述

HTTPS(Hypertext Transfer Protocol Secure)是HTTP的安全版本,通过SSL/TLS加密保护数据传输。在Kubernetes中,HTTPS可以通过以下方式实现:

  • Ingress控制器终止:在Ingress控制器处终止HTTPS连接,内部使用HTTP
  • 后端服务终止:由后端服务直接处理HTTPS连接
  • SSL passthrough:Ingress控制器不终止HTTPS连接,直接透传到后端服务

Part02-生产环境规划与建议

2.1 Ingress规划

Kubernetes Ingress的规划:

# Ingress规划
– 目标:
– 实现外部访问集群服务
– 提供HTTP和HTTPS路由
– 确保高可用性
– 确保安全性
– 确保性能
– 范围:
– Ingress控制器选择
– Ingress规则设计
– 域名规划
– 路径规划
– 负载均衡配置
– 工具选择:
– Ingress控制器:NGINX Ingress Controller
– 证书管理:Cert-Manager
– 监控:Prometheus、Grafana
– 日志:ELK Stack
– 流程设计:
– Ingress控制器部署:部署Ingress控制器到集群
– 域名配置:配置DNS记录指向Ingress控制器
– Ingress规则配置:配置Ingress资源
– 测试验证:测试Ingress规则是否生效
– 监控告警:配置监控和告警
– 资源分配:
– 人力资源:Ingress设计人员、运维人员
– 时间资源:Ingress设计时间、部署时间、测试时间
– 基础设施:Ingress控制器资源、网络资源

2.2 HTTPS规划

Kubernetes HTTPS的规划:

# HTTPS规划
– 目标:
– 实现HTTPS加密
– 管理SSL/TLS证书
– 确保证书安全
– 自动证书续期
– 范围:
– 证书类型选择
– 证书颁发机构选择
– 证书管理策略
– 证书续期策略
– 工具选择:
– 证书管理:Cert-Manager
– 证书颁发机构:Let’s Encrypt、自签名证书
– 证书监控:Prometheus、Grafana
– 流程设计:
– 证书申请:向证书颁发机构申请证书
– 证书存储:将证书存储在Secret中
– 证书配置:在Ingress资源中配置证书
– 证书续期:自动或手动续期证书
– 证书监控:监控证书过期时间
– 资源分配:
– 人力资源:证书管理人员
– 时间资源:证书申请时间、配置时间
– 基础设施:证书存储资源

2.3 最佳实践规划

Kubernetes Ingress和HTTPS的最佳实践规划:

# 最佳实践规划
– Ingress最佳实践:
– 使用命名空间:为不同的应用或环境创建不同的Ingress资源
– 合理设计规则:避免过于复杂的Ingress规则
– 使用路径前缀:使用一致的路径前缀,便于管理
– 配置健康检查:为后端服务配置健康检查
– 启用会话亲和性:根据应用需求配置会话亲和性
– 优化负载均衡:配置合适的负载均衡策略
– HTTPS最佳实践:
– 使用Let’s Encrypt:使用Let’s Encrypt获取免费证书
– 自动证书续期:使用Cert-Manager自动管理证书续期
– 安全的证书存储:使用Secret存储证书,确保安全
– 强加密算法:使用强加密算法和协议
– 证书监控:监控证书过期时间,及时续期
– 避免自签名证书:在生产环境中避免使用自签名证书
– 性能最佳实践:
– 启用缓存:为静态资源启用缓存
– 压缩内容:启用Gzip压缩
– 合理配置超时:配置合适的超时时间
– 限制请求大小:限制请求体大小
– 优化连接数:配置合适的连接数限制
– 安全最佳实践:
– 启用HTTPS:为所有服务启用HTTPS
– 配置CORS:合理配置CORS策略
– 启用WAF:集成Web应用防火墙
– 限制访问:使用网络策略限制Ingress控制器的访问
– 定期更新证书:定期更新SSL/TLS证书

Part03-生产环境项目实施方案

3.1 Ingress实现

Ingress实现的具体步骤:

# Ingress实现
1. 部署NGINX Ingress Controller:
# 使用Helm安装NGINX Ingress Controller
$ helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
$ helm repo update
$ helm install nginx-ingress ingress-nginx/ingress-nginx
# 查看Ingress控制器
$ kubectl get pods
# 输出
NAME READY STATUS RESTARTS AGE
nginx-ingress-ingress-nginx-12345-abcde 1/1 Running 0 1m
# 查看Ingress控制器服务
$ kubectl get services
# 输出
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-ingress-ingress-nginx-controller LoadBalancer 10.96.123.45 192.168.1.100 80:30080/TCP,443:30443/TCP 1m
2. 创建后端服务:
# 创建Deployment
$ cat > backend-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: backend spec: replicas: 3 selector: matchLabels: app: backend template: metadata: labels: app: backend spec: containers: - name: backend image: nginx:latest ports: - containerPort: 80 EOF $ kubectl apply -f backend-deployment.yaml # 创建服务 $ cat > backend-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: backend spec: selector: app: backend ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f backend-service.yaml 3. 创建Ingress资源: # 创建Ingress $ cat > ingress.yaml << 'EOF' apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: backend-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: backend.example.com http: paths: - path: / pathType: Prefix backend: service: name: backend port: number: 80 EOF $ kubectl apply -f ingress.yaml # 查看Ingress $ kubectl get ingresses # 输出 NAME CLASS HOSTS ADDRESS PORTS AGE backend-ingress backend.example.com 192.168.1.100 80 1m
4. 测试Ingress:
# 配置DNS或修改/etc/hosts
$ echo “192.168.1.100 backend.example.com” >> /etc/hosts
# 测试访问,风哥提示:。
$ curl http://backend.example.com
# 输出

Hello from App 1!

EOF
$ kubectl apply -f app1-config.yaml
$ kubectl apply -f app1-deployment.yaml
# 创建第一个应用服务
$ cat > app1-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: app1 spec: selector: app: app1 ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f app1-service.yaml # 创建第二个应用 $ cat > app2-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: app2 spec: replicas: 2 selector: matchLabels: app: app2 template: metadata: labels: app: app2 spec: containers: - name: app2 image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: config mountPath: /usr/share/nginx/html volumes: - name: config configMap: name: app2-config EOF $ cat > app2-config.yaml << 'EOF' apiVersion: v1 kind: ConfigMap metadata: name: app2-config data: index.html: |

Hello from App 2!

EOF
$ kubectl apply -f app2-config.yaml
$ kubectl apply -f app2-deployment.yaml
# 创建第二个应用服务
$ cat > app2-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata:,学习交流加群风哥QQ113257174。 name: app2 spec: selector: app: app2 ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f app2-service.yaml 2. 创建Ingress资源: # 创建Ingress $ cat > ingress-basic.yaml << 'EOF' apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: basic-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: apps.example.com http: paths: - path: /app1 pathType: Prefix backend: service: name: app1 port: number: 80 - path: /app2 pathType: Prefix backend: service: name: app2 port: number: 80 EOF $ kubectl apply -f ingress-basic.yaml 3. 测试Ingress: # 配置DNS或修改/etc/hosts $ echo "192.168.1.100 apps.example.com" >> /etc/hosts
# 测试访问App 1
$ curl http://apps.example.com/app1
# 输出

Hello from App 1!

# 测试访问App 2
$ curl http://apps.example.com/app2
# 输出

Hello from App 2!

4. 验证Ingress:
# 查看Ingress
$ kubectl get ingresses
# 输出
NAME CLASS HOSTS ADDRESS PORTS AGE
basic-ingress apps.example.com 192.168.1.100 80 1m
# 查看Ingress规则
$ kubectl describe ingress basic-ingress
# 输出
Name: basic-ingress
Namespace: default
Address: 192.168.1.100
Default backend: default-http-backend:80 ()
Rules:
Host Path Backends
—- —- ——–
apps.example.com
/app1 app1:80 (10.244.1.2:80,10.244.2.3:80)
/app2 app2:80 (10.244.3.4:80,10.244.4.5:80)
Annotations:
kubernetes.io/ingress.class: nginx
Events:
Type Reason Age From Message
—- —— —- —- ——-
Normal Sync 1m nginx-ingress-controller Scheduled for sync
# 输出结果:
# Ingress路由正常
# 应用访问正常
# 负载均衡工作正常

4.2 HTTPS Ingress案例

HTTPS Ingress的实战案例。

# 案例:使用Ingress实现HTTPS访问
# 场景:部署Web应用,需要使用HTTPS加密访问
# 问题:
– 需要为应用配置HTTPS
– 需要自动管理SSL/TLS证书
– 需要确保证书安全和自动续期
# 解决方案:
1. 部署Cert-Manager:
# 使用Helm安装Cert-Manager
$ helm repo add jetstack https://charts.jetstack.io
$ helm repo update
$ helm install cert-manager jetstack/cert-manager –namespace cert-manager –create-namespace –set installCRDs=true
# 等待Cert-Manager就绪
$ kubectl wait –for=condition=ready pod -l app=cert-manager -n cert-manager
2. 创建ClusterIssuer:
# 创建Let’s Encrypt ClusterIssuer
$ cat > cluster-issuer.yaml << 'EOF' apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-prod spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: admin@example.com privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: class: nginx EOF $ kubectl apply -f cluster-issuer.yaml 3. 部署后端服务: # 创建Deployment $ cat > web-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: web spec: replicas: 3 selector: matchLabels:,更多视频教程www.fgedu.net.cn。 app: web template: metadata: labels: app: web spec: containers: - name: web image: nginx:latest ports: - containerPort: 80 EOF $ kubectl apply -f web-deployment.yaml # 创建服务 $ cat > web-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: web spec: selector: app: web ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f web-service.yaml 4. 创建HTTPS Ingress: # 创建HTTPS Ingress $ cat > ingress-https.yaml << 'EOF' apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress-https annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - secure.example.com secretName: web-tls rules: - host: secure.example.com http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80 EOF $ kubectl apply -f ingress-https.yaml 5. 等待证书签发: # 查看Certificate状态 $ kubectl get certificates # 输出 NAME READY SECRET AGE web-tls True web-tls 1m 6. 测试HTTPS访问: # 配置DNS或修改/etc/hosts $ echo "192.168.1.100 secure.example.com" >> /etc/hosts
# 测试HTTPS访问
$ curl -k https://secure.example.com
# 输出

Hello from Frontend!

EOF
$ kubectl apply -f frontend-config.yaml
$ kubectl apply -f frontend-deployment.yaml
# 创建第一个应用服务
$ cat > frontend-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: frontend spec: selector: app: frontend ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f frontend-service.yaml # 创建第二个应用 $ cat > api-deployment.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: api spec: replicas: 2 selector: matchLabels: app: api template: metadata: labels: app: api spec: containers: - name: api image: nginx:latest ports: - containerPort: 80 volumeMounts: - name: config mountPath: /usr/share/nginx/html volumes: - name: config configMap: name: api-config EOF $ cat > api-config.yaml << 'EOF' apiVersion: v1 kind: ConfigMap metadata: name: api-config data: index.html: |

Hello from API!

EOF
$ kubectl apply -f api-config.yaml
$ kubectl apply -f api-deployment.yaml
# 创建第二个应用服务
$ cat > api-service.yaml << 'EOF' apiVersion: v1 kind: Service metadata: name: api spec: selector: app: api ports: - port: 80 targetPort: 80 EOF $ kubectl apply -f api-service.yaml 2. 创建多域名HTTPS Ingress: # 创建HTTPS Ingress $ cat > ingress-multi-domain.yaml << 'EOF' apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: multi-domain-ingress annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - frontend.example.com secretName: frontend-tls - hosts: - api.example.com secretName: api-tls rules: - host: frontend.example.com http: paths: - path: / pathType: Prefix backend: service: name: frontend port: number: 80 - host: api.example.com http: paths: - path: / pathType: Prefix backend: service:,from K8S+DB视频:www.itpux.com。 name: api port: number: 80 EOF $ kubectl apply -f ingress-multi-domain.yaml 3. 等待证书签发: # 查看Certificate状态 $ kubectl get certificates # 输出 NAME READY SECRET AGE frontend-tls True frontend-tls 1m。 api-tls True api-tls 1m 4. 测试多域名访问: # 配置DNS或修改/etc/hosts $ echo "192.168.1.100 frontend.example.com api.example.com" >> /etc/hosts
# 测试访问Frontend
$ curl -k https://frontend.example.com
# 输出

Hello from Frontend!

# 测试访问API
$ curl -k https://api.example.com
# 输出

Hello from API!

5. 验证Ingress:
# 查看Ingress
$ kubectl get ingresses
# 输出
NAME CLASS HOSTS ADDRESS PORTS AGE
multi-domain-ingress frontend.example.com,api.example.com 192.168.1.100 80, 443 1m
# 查看Ingress规则
$ kubectl describe ingress multi-domain-ingress
# 输出
Name: multi-domain-ingress
Namespace: default
Address: 192.168.1.100
Default backend: default-http-backend:80 ()
TLS:
frontend-tls terminates frontend.example.com
api-tls terminates api.example.com
Rules:
Host Path Backends
—- —- ——–
frontend.example.com
/ frontend:80 (10.244.1.2:80,10.244.2.3:80)
api.example.com
/ api:80 (10.244.3.4:80,10.244.4.5:80)
Annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
kubernetes.io/ingress.class: nginx
Events:
Type Reason Age From Message
—- —— —- —- ——-
Normal CreateCertificate 1m cert-manager Successfully created Certificate “frontend-tls”
Normal CreateCertificate 1m cert-manager Successfully created Certificate “api-tls”
Normal Sync 1m nginx-ingress-controller Scheduled for sync
# 输出结果:
# 多域名访问正常
# 每个域名都配置了HTTPS
# 证书签发成功

Part05-风哥经验总结与分享

5.1 Ingress使用技巧

Kubernetes Ingress使用的技巧。

  • 选择合适的Ingress控制器:根据应用需求选择合适的Ingress控制器,如NGINX Ingress Controller、Traefik等
  • 合理设计Ingress规则:避免过于复杂的Ingress规则,保持规则清晰简洁
  • 使用命名空间隔离:为不同的应用或环境创建不同的Ingress资源,便于管理
  • 配置健康检查:为后端服务配置健康检查,确保流量只分发到健康的Pod
  • 启用会话亲和性:根据应用需求配置会话亲和性,确保会话一致性
  • 优化负载均衡:配置合适的负载均衡策略,提高应用性能
  • 监控Ingress:定期监控Ingress控制器的运行状态,及时发现和解决问题
  • 使用Gateway API:考虑使用新一代的Gateway API,提供更灵活的路由规则

5.2 HTTPS配置技巧

Kubernetes HTTPS配置的技巧:

  • 使用Cert-Manager:使用Cert-Manager自动管理SSL/TLS证书,避免手动管理证书的麻烦
  • 使用Let’s Encrypt:使用Let’s Encrypt获取免费证书,降低证书成本
  • 配置自动续期:确保证书自动续期,避免证书过期导致服务中断
  • 使用强加密算法:配置强加密算法和协议,提高安全性
  • 监控证书状态:定期监控证书的过期时间,及时处理即将过期的证书
  • 使用Secret存储证书:使用Kubernetes Secret安全存储证书,避免证书泄露
  • 配置HTTP重定向:将HTTP请求重定向到HTTPS,确保所有流量都使用加密传输
  • 考虑使用SSL passthrough:对于需要后端处理HTTPS的场景,使用SSL passthrough

Kubernetes Ingress和HTTPS的未来趋势:

  • Gateway API的普及:Gateway API将成为Kubernetes中管理外部访问的标准API,提供更灵活的路由规则
  • 服务网格集成:Ingress将与服务网格深度集成,提供更高级的流量管理能力
  • 自动化配置:Ingress配置将更加自动化,减少人工干预
  • 智能路由:使用AI技术实现智能路由,根据流量模式自动调整路由策略
  • 边缘计算集成:Ingress将延伸到边缘节点,支持边缘计算场景
  • 安全增强:Ingress将集成更多安全功能,如WAF、DDoS防护等
  • 性能优化:Ingress性能将进一步优化,支持更高的并发和更低的延迟
  • 标准化:Ingress配置将更加标准化,便于跨云平台部署和管理

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息