kubernetes下定制 http 50x 以及 40x 服务器返回信息的话,如果用 Nginx 做 ingress,大家会很自然想到直接用 nginx 来定制:
1 error_page 500 502 503 504 /50x.html;
2 location = /50x.html {
3 root /export/html;
4 }
这样做是不行的,因为 Nginx 作为 ingress 来使用,就不能落地,只能做转发;如果你落地了,访问了本地文件,就违背了初衷。而且在 ingress 的 pod 上放页面,会导致 ingress 的配置错乱。
那么正确 50x 重定位的方法如下:首先建立一个 deploy 和对应的 svc,就是建立一个 web 服务器,能提供服务返回 50x 和 40x 的定制页面;然后在 ingress
内指定 custom-http-errors 和 default-backend 指向它就可以了。
一、建立miniserve的deploy和svc
我们选用 rust 的 miniserve 作为 web 服务器,准备好定制好的 index.html,写个 Dockerfile
网址:https://github.com/svenstaro/miniserve
1FROM alpine:3.12
2RUN apk add --update bash && rm -rf /var/cache/apk/*
3
4COPY . /data/
5
6RUN rm -rf /data/Dockerfile
7
8WORKDIR /data
9EXPOSE 8080
10
11CMD ["/data/miniserve","--index","index.html"]
12#CMD /bin/sh -c "while true; do echo hi; sleep 10; done"
作出镜像后推送到阿里镜像:registry.cn-shanghai.aliyuncs.com/rendoumi/miniserve:lastest
然后准备好 deploy和 svc,部署到 kubernetes 里
1---
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: miniserve-deploy
6 labels:
7 app: miniserve
8spec:
9 replicas: 1
10 selector:
11 matchLabels:
12 app: miniserve
13 template:
14 metadata:
15 labels:
16 app: miniserve
17 spec:
18 containers:
19 - name: miniserve
20 image: registry.cn-shanghai.aliyuncs.com/rendoumi/miniserve:lastest
21 imagePullPolicy: Always
22 ports:
23 - containerPort: 8080
24---
25apiVersion: v1
26kind: Service
27metadata:
28 name: miniserve-svc
29 labels:
30 app: miniserve
31spec:
32 ports:
33 - name: http
34 protocol: TCP
35 port: 80
36 targetPort: 8080
37 selector:
38 app: miniserve
39 type: ClusterIP
二、修改ingress
修改的地方就是 annotations 的最后两行:
1apiVersion: networking.k8s.io/v1beta1
2kind: Ingress
3metadata:
4 name: kala-com-ingress
5 annotations:
6 kubernetes.io/ingress.class: "nginx"
7 nginx.ingress.kubernetes.io/limit-connections: "2"
8 nginx.ingress.kubernetes.io/limit-rpm: "2"
9 nginx.ingress.kubernetes.io/limit-rps: "1"
10 nginx.ingress.kubernetes.io/app-root: "/webui/"
11 nginx.ingress.kubernetes.io/auth-type: basic
12 nginx.ingress.kubernetes.io/auth-secret: kala-auth
13 nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - Kala'
14 nginx.ingress.kubernetes.io/default-backend: "miniserve-svc"
15 nginx.ingress.kubernetes.io/custom-http-errors: "403,404,500,502,503,504"
16spec:
17 rules:
18 - host: kala.rendoumi.com
19 http:
20 paths:
21 - path: /
22 backend:
23 serviceName: kala-svc
24 servicePort: 80
测试的话用 wrk 压住,然后curl再测就503转到miniserve-svc
1wrk -c 3 -t 3 -d 10 http://kala.rendoumi.com/webui/ --latency
2
3curl -v -H "Host: kala.rendoumi.com" http://kala.rendoumi.com/webui/