官方站点 nginx-configuration

https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/

一、环境准备

采用前面课程中的java应用:

#定义资源文件
[root@master01 ~]# cd /root/6
[root@master01 6]# vim java.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: springboot
spec:
  replicas: 2
  selector:
    matchLabels:
      app: springboot
  template:
    metadata:
      labels:
        app: springboot
    spec:
      containers:
      - name: springboot
        image: registry.cn-hangzhou.aliyuncs.com/abroad_images/springboot:v1-aming
        resources:
          limits:
            memory: "1Gi"
            cpu: "1"
          requests:
            memory: "128Mi"
            cpu: "100m"
        ports:
          - containerPort: 8080
            name: web
        livenessProbe:
          httpGet:
            port: web
            path: /apptwo
          timeoutSeconds: 2
          periodSeconds: 30
        readinessProbe:
          tcpSocket:
            port: web
          initialDelaySeconds: 10
---
apiVersion: v1
kind: Service
metadata:
  name: springboot
spec:
  type: ClusterIP
  selector:
    app: springboot
  ports:
  - name: http
    port: 8080
    protocol: TCP
    targetPort: 8080

#应用
[root@master01 6]# kaf java.yaml

二、ingress-nginx 之 rewrite

官方示例:Rewrite - NGINX Ingress Controller (kubernetes.github.io)

rewrite可以使用下面的anntations进行控制:

名称 描述
nginx.ingress.kubernetes.io/rewrite- target 将匹配到的url重定向到rewrite-target注解指定的路径 string
nginx.ingress.kubernetes.io/ssl- redirect 表示位置部分是否可访问SSL(当Ingress包含证书时默认为 True) bool
nginx.ingress.kubernetes.io/force-ssl-redirect 强制重定向到HTTPS,即使入口没有启用TLS bool
nginx.ingress.kubernetes.io/app-root 访问主域名的时候会自动跳转到app-root注解指定的路径 string
nginx.ingress.kubernetes.io/use-regex 表示Ingress上定义的路径是否使用正则表达式 bool

2.1 rewrite的一般应用场景

  • 调整用户浏览的URL,看起来更规范;
  • 网站更换新域名后,为了不影响SEO,让用户体验更好;
  • 根据特殊的变量、目录、客户端信息进行跳转;

2.2 JAVA-ing示例

创建ingress

[root@master01 ~]# cd /root/6
[root@master01 6]# vim springboot-ingress-rewrite.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: java-ingress-nginx
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  ingressClassName: nginx
  rules:
    - host: java.zhang-qing.com
      http:
        paths:
          - pathType: Prefix
            backend:
              service:
                name: springboot
                port:
                  number: 8080
            path: /appone(/|$)(.*)

#应用
[root@master01 6]# kaf springboot-ingress-rewrite.yaml

在这个 ingress 的定义中,通过在 annotations 中指定了nginx.ingress.kubernetes.io/rewrite-target: /$2 来进行重定向,(.\*) 捕获的任何字符都将被分配给占位符$2,然后在 rewrite-target 中用作参数。

例如,上面的入口定义将导致以下重写:

  • java.zhang-qing.com/appone 重写为 java.zhang-qing.com/
  • java.zhang-qing.com/appone/ 重写为 java.zhang-qing.com/
  • java.zhang-qing.com/appone/apptwo 重写为 java.zhang-qing.com/apptwo

2.3 验证

测试验证

#测试访问java.zhang-qing.com/appone
[root@master01 6]# curl -k -i java.zhang-qing.com/appone
HTTP/1.1 404
Date: Mon, 07 Apr 2025 04:55:43 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers

{"timestamp":"2025-04-07T04:55:43.062+00:00","status":404,"error":"Not Found","path":"/"}

#测试访问java.zhang-qing.com/appone/
[root@master01 6]# curl -k -i java.zhang-qing.com/appone/
HTTP/1.1 404
Date: Mon, 07 Apr 2025 04:56:24 GMT
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers

{"timestamp":"2025-04-07T04:56:24.222+00:00","status":404,"error":"Not Found","path":"/"}

#测试访问java.zhang-qing.com/appone/appone
[root@master01 6]# curl -k -i java.zhang-qing.com/appone/appone
HTTP/1.1 200
Date: Mon, 07 Apr 2025 04:56:48 GMT
Content-Type: application/json
Content-Length: 6
Connection: keep-alive

appOne

环境清理

[root@master01 6]# k delete -f springboot-ingress-rewrite.yaml  -f java.yaml

2.4 permanent-redirect

创建ingress

主要增加如下配置内容

# 当访问java.zhang-qing.com域名,会重定向到新的域名
annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: 'https://gitee.com/jeckjohn/k8s-ha-install'

在这个 ingress 的定义中,通过在 annotations 中指定了

# 编写ingress
[root@master01 6]# vim springboot-ingress-redirect.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: java-ingress-nginx
  namespace: default
  annotations:
    nginx.ingress.kubernetes.io/permanent-redirect: 'https://baidu.com/'
spec:
  ingressClassName: nginx
  rules:
    - host: java.zhang-qing.com
      http:
        paths:
          - pathType: Prefix
            backend:
              service:
                name: springboot
                port:
                  number: 8080
            path: /appone(/|$)(.*)

# 应用
[root@master01 ~]# kaf springboot-ingress-redirect.yaml

测试验证

[root@master01 6]# curl -i -k http://java.zhang-qing.com/appone
HTTP/1.1 301 Moved Permanently
Date: Mon, 07 Apr 2025 05:05:53 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
Location: https://baidu.com/

<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

环境清理

[root@master01 ~]# k delete -f springboot-ingress-redirect.yaml  -f java.yaml