Ingress——2

目录

[‌一. 域名重定向(HTTP→HTTPS/旧域名跳转)‌](#‌一. 域名重定向(HTTP→HTTPS/旧域名跳转)‌)

[‌二. 前后端分离Rewrite(路径改写)‌](#‌二. 前后端分离Rewrite(路径改写)‌)

[‌三. 混合配置示例(重定向+Rewrite)‌](#‌三. 混合配置示例(重定向+Rewrite)‌)

[‌四. SSL/TLS配置(HTTPS加密)‌](#‌四. SSL/TLS配置(HTTPS加密)‌)

[‌五. 基本认证(Basic Auth)‌](#‌五. 基本认证(Basic Auth)‌)


‌一**. 域名重定向(HTTP→HTTPS/旧域名跳转)**‌

https-redirect.yaml

复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: https-redirect
  annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: https://$host$request_uri
spec:
  rules:
  - host: old.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: dummy-service
            port:
              number: 80

逐行解释‌:

  • nginx.ingress.kubernetes.io/permanent-redirect:Nginx特有注解,返回301永久重定向
  • $host$request_uri:保留原始请求的域名和路径
  • dummy-service:虚拟服务(实际不会处理请求)

‌二**. 前后端分离Rewrite(路径改写)**‌

rewrite-frontend.yaml

复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: rewrite-demo
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /api(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: backend-service
            port:
              number: 8080

逐行解释‌:

  • rewrite-target: /$2:将捕获的(.*)部分拼接到根路径
  • path: /api(/|$)(.*):正则匹配/api开头的路径,$2对应第二个捕获组
  • backend-service:8080:实际处理请求的后端服务

‌三**. 混合配置示例(重定向+Rewrite)**‌

combined-ingress.yaml

复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: combined-ingress
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($host = 'deprecated.com') {
        return 301 https://new.example.com$request_uri;
      }
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host: new.example.com
    http:
      paths:
      - path: /static/(.*)
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80

关键点说明‌:

  • configuration-snippet:插入自定义Nginx代码片段实现复杂逻辑
  • 此配置同时完成旧域名跳转和静态资源路径改写

‌部署验证命令

复制代码
# 应用配置 
kubectl apply -f https-redirect.yaml 
kubectl apply -f rewrite-frontend.yaml 
# 检查注解是否生效 
kubectl describe ingress combined-ingress | grep Annotations 
# 测试重定向(返回301头) 
curl -I http://old.example.com 

注意事项‌:

  1. Rewrite规则需与后端服务路由规则匹配
  2. 生产环境建议使用cert-manager自动管理HTTPS证书
  3. 不同Ingress Controller(如Traefik)注解语法可能不同

‌四**. SSL/TLS配置(HTTPS加密)**‌

tls-secret.yaml

复制代码
apiVersion: v1
kind: Secret
metadata:
  name: example-tls
  namespace: default
type: kubernetes.io/tls
data:
  tls.crt: <base64编码的证书>
  tls.key: <base64编码的私钥>

证书需提前base64编码:cat cert.pem | base64 -w0

ssl-ingress.yaml

复制代码
Version: networking.k8s.io/v1
kind: Ingress
metadata:
  name: secure-ingress
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
  tls:
  - hosts:
    - secure.example.com
    secretName: example-tls
  rules:
  - host: secure.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: web-service
            port: 
              number: 80

关键参数说明:

  • ssl-redirect: "true" 强制HTTP跳转到HTTPS
  • tls块定义证书关联的域名和Secret

‌五**. 基本认证(Basic Auth)**‌

auth-secret.yaml

复制代码
apiVersion: v1
kind: Secret
metadata:
  name: basic-auth
  namespace: default
type: Opaque
data:
  auth: $(echo -n 'username:password' | openssl base64 -A)

生成命令:htpasswd -c auth foo 然后base64编码

auth-ingress.yaml

复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: auth-ingress
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
spec:
  rules:
  - host: private.example.com
    http:
      paths:
      - path: /
        backend:
          service:
            name: private-service
            port:
              number: 8080

核心注解说明:

  • auth-type 指定认证方式为basic
  • auth-secret 关联存储凭据的Secret
  • auth-realm 浏览器弹出的认证提示文本

‌部署验证命令

复制代码
# 应用配置 
kubectl apply -f tls-secret.yaml 
kubectl apply -f ssl-ingress.yaml 
# 检查证书状态 
kubectl describe ingress secure-ingress | grep -A3 'TLS' 
# 测试认证(返回401未授权) 
curl -v http://private.example.com 

注意事项:

  1. 生产环境建议使用Let's Encrypt通过cert-manager自动签发证书
  2. Basic Auth需配合HTTPS使用避免密码泄露
  3. 不同Controller可能使用不同注解(如Traefik的auth注解前缀为traefik.ingress)
相关推荐
博客园团队6 小时前
博客园出海记-组装集装箱:自建 Kubernetes 集群
k8s·出海记
虚伪的空想家8 小时前
K8S的dashboard部署与访问
云原生·容器·kubernetes·k8s·web·dashboard
一个向上的运维者14 小时前
详细解读k8s的kind中service与pod的区别
容器·k8s
感哥17 小时前
Kubernetes Pod
k8s
Elastic 中国社区官方博客2 天前
使用 cloud-native Elasticsearch 与 ECK 运行
大数据·数据库·elasticsearch·搜索引擎·kubernetes·k8s·全文检索
岚天start3 天前
K8s Ingress Annotations参数使用指南
nginx·kubernetes·k8s·ingress·ingress控制器
岚天start3 天前
在公用同一公网IP和端口的K8S环境中,不同域名实现不同访问需求的解决方案
kubernetes·k8s·白名单·访问控制·ingress·ingress控制器·annotations
方渐鸿4 天前
【2024】k8s集群 图文详细 部署安装使用(两万字)
java·运维·容器·kubernetes·k8s·运维开发·持续部署
明明跟你说过4 天前
【k8s】资源限制管理:Namespace、Deployment与Pod的实践
运维·docker·云原生·容器·kubernetes·k8s
赴前尘5 天前
k8s 部署 redis
k8s