阅读本篇文章之前,需要您有一个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
测试域名:http://alb-test-289778010.cn-northwest-1.elb.amazonaws.com.cn





在主机上面请求查看

思考一下?为何配置了路径转发,这里还是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的流量转发至一台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;
}
# 添加其他服务器块和配置,如果需要的话
}
}
|
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 |
参考文章: 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
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 | 是否需要代码集成开发 | 是 |