前提

阅读本篇文章之前,需要您有一个EKS集群,并且里面安装了ALB 控制器。
EKS集群和ALB安装可以查看这一篇文章:

EKS部署ALB负载均衡

什么是重写?

URL重写是指将一个URL请求重新写成网站可以处理的另一个URL的过程。这样说可能不是很好理解,举个例子来说明一下,在开发中可能经常遇到这样的需求,比如通过浏览器请求的http://localhost:8080/getUser?id=1,但是需要通过SEO优化等等原因,需要把请求的地址重写为http://localhost:8080/getUser/1这样的URL,从而符合需求或者更好的被网站阅读。

当遇到这种请求的时候,就需要使用到UrlRewrite重写或者使用一些网关路由,如SpringCloud的Gateway,Zuul,又或者是Nginx来实现这个功能。

和apache等web服务软件一样,rewrite的主要功能是实现URL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持。

rewrite和location的功能有点相像,都能实现跳转,主要区别在于rewrite常用于同一域名内更改获取资源的路径,而location是对一类路径做控制访问和反向代理,可以proxy_pass到其他服务器。

Nginx提供的全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向。 rewrite只能放在server{},location{},if{}中, 并且只能对域名后边的除去传递的参数外的字符串起作用。

Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库。 通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。

参考文章:https://www.cnblogs.com/Nicholas0707/p/12210551.html


ALB转发

测试域名:http://alb-test-289778010.cn-northwest-1.elb.amazonaws.com.cn

ALB配置

规则

目标组配置

测试

测试一:单独请求ALB转发到/

测试二:请求ALB下面的/app

在主机上面请求查看

思考一下?为何配置了路径转发,这里还是Not Found呢?因为的你的后端应用没有/app的这个路径。因此出现这个问题。也就是说ALB转发后端路径的时候,会携带这个后缀

可以这样做一个测试,我们在后端应用写一个/app应用。然后你再去观察效果。

这里是使用的httpd服务。配置路径在/etc/httpd/conf/httpd.conf

上面的配置是说:在服务端把这个/app的请求给重定向到 /。如果这个时候 再去访问alb后面的/app路径,理论上会帮我们转发至后端的/app的路径,然后重定向到对应的:/

<VirtualHost *:80>
    ServerName localhost
    DocumentRoot /var/www/html

    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/app(/.*)?$ [NC]
    RewriteRule ^/app(/.*)?$ /$1 [L,R=301]
</VirtualHost>

重启服务:systemctl restart httpd


结论:ALB在转发的时候,会携带路径



如何实现重写呢

方法一:重定向
就是在alb的配置界面,去把不同的路径给重定向到不同的域名或者其他服务中

方法二:后面加一个Nginx服务做重写

这种方法就是需要把ALB的流量转发至一台ec2上。在这个EC2上面去安装对应的nginx,然后在nginx进行重写。类似于这样

这种写法就会把你的/app给去掉了。而直接转发至后端的服务

http {
    server {
        listen 80;
        server_name your-server-name; # 替换为您的服务器名称或域名

        location ~ ^/app(/|$)(.*) {
            rewrite ^/app(/|$)(.*) /$2 break;
            proxy_pass http://myapp-svc-ingress;
        }

        location ~ ^/lemon(/|$)(.*) {
            rewrite ^/lemon(/|$)(.*) /$2 break;
            proxy_pass http://httpd-svc;
        }

        # 添加其他服务器块和配置,如果需要的话
    }
}


EKS中重定向和Nginx-Controller实现

ALB-Ingress重定向案例参考

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "rabbitmq-alb"
  annotations:
    alb.ingress.kubernetes.io/backend-protocol: HTTP
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/subnets: "subnet-0d39cf7fa068068d6,subnet-03b9a49ae5a83d4f1,subnet-0b14171a994548af5"
    alb.ingress.kubernetes.io/actions.redirect-to-app: '{"type":"redirect","redirectConfig":{"path":"/","port":"80","protocol":"HTTP","statusCode":"HTTP_302"}}'
    alb.ingress.kubernetes.io/actions.redirect-to-eks: '{"Type": "redirect", "RedirectConfig": { "path":"/","Protocol": "HTTP", "Host":"alb-test-289778010.cn-northwest-1.elb.amazonaws.com.cn", "StatusCode": "HTTP_302"}}'

spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - backend:
              service:
                port:
                  number: 15672
                name: hello-world
            path: /
            pathType: Prefix
          - path: /app
            pathType: Exact
            backend:
              service:
                name: redirect-to-app
                port:
                  name: use-annotation
          - path: /lemon
            pathType: Exact
            backend:
              service:
                name: redirect-to-eks
                port:
                  name: use-annotation

Nginx-Controller实现

参考文章: https://repost.aws/zh-Hans/knowledge-center/eks-kubernetes-dashboard-custom-path

Nginx-Controller安装

###创建名称空间
kubectl create ns ingress-nginx


###Helm安装
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --set controller.service.type=NodePort

###可选(如果是国内集群,可以使用以下Yaml进行安装)wget https://image-auto-scaleing.s3.cn-north-1.amazonaws.com.cn/nginx-controller_1.8.2.yaml  && kubectl apply -f nginx-controller_1.8.2.yaml


创建ALB-Ingress

创建一个ALb-Ingress,然后把流量转发至后端

###创建一个ALB—Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "alb-ingress"
  namespace: "ingress-nginx"
  annotations:
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/certificate-arn: arn:aws-cn:acm:cn-northwest-1:297669174308:certificate/b0061175-32f3-43a3-b2b0-1d8915582db6 
    alb.ingress.kubernetes.io/healthcheck-path: /dashboard/
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
    alb.ingress.kubernetes.io/subnets: "subnet-0d39cf7fa068068d6,subnet-03b9a49ae5a83d4f1,subnet-0b14171a994548af5"
  labels:
    app: dashboard
spec:
  ingressClassName: alb
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ssl-redirect
            port:
              name: use-annotation
      - path: /
        pathType: Prefix
        backend:
          service:
            name: "nginx-ingress-nginx-controller"
            port:
              number: 80


###创建Nginx-Ingress来实现转发请求
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^(/app)$ $1/ redirect;
      rewrite ^(/lemon)$ $1/ redirect;
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /app(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: myapp-svc-ingress
            port:
              number: 80
      - path: /lemon(/|$)(.*)
        pathType: ImplementationSpecific
        backend:
          service:
            name: httpd-svc
            port:
              number: 80

然后就能看到对应的ingress地址

这个时候,再去使用ALB地址/app的时候,就可以实现转发请求了

测试


自我判定

#

判定描述

自我判定(是/否)

1在各搜索引擎中是否能找到知识信息(包括但不限于Google、百度、Bing)
2是否需要代码集成开发