Kubernetes下定制服务器503以及其他的403消息

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/ 

Kubernetes下nginx Ingress的限制
Backblaze类S3免费免备案对象存储
comments powered by Disqus