Add example of custom error pages in nginx ingress controller
This commit is contained in:
parent
7e8c051e2c
commit
2e5e341ef0
4 changed files with 158 additions and 1 deletions
|
@ -208,7 +208,7 @@ In case of an error in a request the body of the response is obtained from the `
|
||||||
- `X-Code` indicates the HTTP code
|
- `X-Code` indicates the HTTP code
|
||||||
- `X-Format` the value of the `Accept` header
|
- `X-Format` the value of the `Accept` header
|
||||||
|
|
||||||
Using this two headers is possible to use a custom backend service like [this one](https://github.com/aledbf/contrib/tree/nginx-debug-server/Ingress/images/nginx-error-server) that inspect each request and returns a custom error page with the format expected by the client. This images handles `html` and `json` responses.
|
Using this two headers is possible to use a custom backend service like [this one](https://github.com/aledbf/contrib/tree/nginx-debug-server/Ingress/images/nginx-error-server) that inspect each request and returns a custom error page with the format expected by the client. Please check the example [custom-errors](examples/custom-errors/README.md)
|
||||||
|
|
||||||
|
|
||||||
## Troubleshooting
|
## Troubleshooting
|
||||||
|
|
80
controllers/nginx/examples/custom-errors/README.md
Normal file
80
controllers/nginx/examples/custom-errors/README.md
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
|
||||||
|
This example shows how is possible to use a custom backend to render custom error pages. The code of this example is located here [nginx-debug-server](https://github.com/aledbf/contrib/tree/nginx-debug-server)
|
||||||
|
|
||||||
|
|
||||||
|
The idea is to use the headers `X-Code` and `X-Format` that NGINX pass to the backend in case of an error to find out the best existent representation of the response to be returned. i.e. if the request contains an `Accept` header of type `json` the error should be in that format and not in `html` (the default in NGINX).
|
||||||
|
|
||||||
|
First create the custom backend to use in the Ingress controller
|
||||||
|
|
||||||
|
```$ kubectl create -f custom-default-backend.yaml
|
||||||
|
service "nginx-errors" created
|
||||||
|
replicationcontroller "nginx-errors" created
|
||||||
|
```
|
||||||
|
|
||||||
|
```$ kubectl get svc
|
||||||
|
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
|
||||||
|
echoheaders 10.3.0.7 nodes 80/TCP 23d
|
||||||
|
kubernetes 10.3.0.1 <none> 443/TCP 34d
|
||||||
|
nginx-errors 10.3.0.102 <none> 80/TCP 11s
|
||||||
|
```
|
||||||
|
|
||||||
|
```$ kubectl get rc
|
||||||
|
CONTROLLER REPLICAS AGE
|
||||||
|
echoheaders 1 19d
|
||||||
|
nginx-errors 1 19s
|
||||||
|
```
|
||||||
|
|
||||||
|
Next create the Ingress controller executing
|
||||||
|
```
|
||||||
|
$ kubectl create -f rc-custom-errors.yaml
|
||||||
|
```
|
||||||
|
|
||||||
|
Now to check if this is working we use curl:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ curl -v http://172.17.4.99/
|
||||||
|
* Trying 172.17.4.99...
|
||||||
|
* Connected to 172.17.4.99 (172.17.4.99) port 80 (#0)
|
||||||
|
> GET / HTTP/1.1
|
||||||
|
> Host: 172.17.4.99
|
||||||
|
> User-Agent: curl/7.43.0
|
||||||
|
> Accept: */*
|
||||||
|
>
|
||||||
|
< HTTP/1.1 404 Not Found
|
||||||
|
< Server: nginx/1.10.0
|
||||||
|
< Date: Wed, 04 May 2016 02:53:45 GMT
|
||||||
|
< Content-Type: text/html
|
||||||
|
< Transfer-Encoding: chunked
|
||||||
|
< Connection: keep-alive
|
||||||
|
< Vary: Accept-Encoding
|
||||||
|
<
|
||||||
|
<span>The page you're looking for could not be found.</span>
|
||||||
|
|
||||||
|
* Connection #0 to host 172.17.4.99 left intact
|
||||||
|
```
|
||||||
|
|
||||||
|
Specifying json as expected format:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ curl -v http://172.17.4.99/ -H 'Accept: application/json'
|
||||||
|
* Trying 172.17.4.99...
|
||||||
|
* Connected to 172.17.4.99 (172.17.4.99) port 80 (#0)
|
||||||
|
> GET / HTTP/1.1
|
||||||
|
> Host: 172.17.4.99
|
||||||
|
> User-Agent: curl/7.43.0
|
||||||
|
> Accept: application/json
|
||||||
|
>
|
||||||
|
< HTTP/1.1 404 Not Found
|
||||||
|
< Server: nginx/1.10.0
|
||||||
|
< Date: Wed, 04 May 2016 02:54:00 GMT
|
||||||
|
< Content-Type: text/html
|
||||||
|
< Transfer-Encoding: chunked
|
||||||
|
< Connection: keep-alive
|
||||||
|
< Vary: Accept-Encoding
|
||||||
|
<
|
||||||
|
{ "message": "The page you're looking for could not be found" }
|
||||||
|
|
||||||
|
* Connection #0 to host 172.17.4.99 left intact
|
||||||
|
```
|
||||||
|
|
||||||
|
By default the Ingress controller provides support for `html`, `json` and `XML`.
|
|
@ -0,0 +1,31 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: nginx-errors
|
||||||
|
labels:
|
||||||
|
app: nginx-errors
|
||||||
|
spec:
|
||||||
|
ports:
|
||||||
|
- port: 80
|
||||||
|
targetPort: 80
|
||||||
|
protocol: TCP
|
||||||
|
name: http
|
||||||
|
selector:
|
||||||
|
app: nginx-errors
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ReplicationController
|
||||||
|
metadata:
|
||||||
|
name: nginx-errors
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx-errors
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx-errors
|
||||||
|
image: aledbf/nginx-error-server:0.1
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
|
@ -0,0 +1,46 @@
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ReplicationController
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-controller
|
||||||
|
labels:
|
||||||
|
k8s-app: nginx-ingress-lb
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
selector:
|
||||||
|
k8s-app: nginx-ingress-lb
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
k8s-app: nginx-ingress-lb
|
||||||
|
name: nginx-ingress-lb
|
||||||
|
spec:
|
||||||
|
terminationGracePeriodSeconds: 60
|
||||||
|
containers:
|
||||||
|
- image: gcr.io/google_containers/nginx-ingress-controller:0.6
|
||||||
|
name: nginx-ingress-lb
|
||||||
|
imagePullPolicy: Always
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 10249
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 30
|
||||||
|
timeoutSeconds: 5
|
||||||
|
# use downward API
|
||||||
|
env:
|
||||||
|
- name: POD_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: POD_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
||||||
|
hostPort: 80
|
||||||
|
- containerPort: 443
|
||||||
|
hostPort: 443
|
||||||
|
args:
|
||||||
|
- /nginx-ingress-controller
|
||||||
|
- --default-backend-service=default/nginx-errors
|
Loading…
Reference in a new issue