매칭되는 Host가 없을 경우.

Custom 404 에러페이지를 설정해보자.

 

 

 

1. 현재 설정

/aaa URL로 호출이 되면 my-nginx 서비스로 포워딩

/bbb URL로 호출이 되면 my-nginx2 서비스로 포워딩

 

 

2. 목표

/aaa, /bbb 이외의 URL로 호출되는 기본 ingress-nginx 404 페이지 변경.

 

 

3. Ken형이 샘플을 만들어 놓은것을 사용

# git clone https://github.com/kenmoini/custom-nginx-ingress-errors

 

 

4. 아래 경로에 내가 사용할 html 페이지지 넣기. 404.html

# cd ~/custom-nginx-ingress-errors/www

 

5. Docker 이미지 생성

#root@ubuntu-k8s-master01:/opt/custom-nginx-ingress-errors# docker build -t brightforest:1.0 .

Dockerfile
FROM quay.io/kubernetes-ingress-controller/custom-error-pages-amd64:0.4

COPY www /www

 

 

6. 이미지 Tag 변경

# docker tag brightforest:1.0 brightforest/ingress-custom-error:1.0

 

 

7. Docker Hub Registry에 Push

# docker push brightforest/ingress-custom-error:1.0

 

 

8. yml 파일로 deployment, svc 생성

# kubectl apply -f k8s-deployment.yaml

k8s-deployment.yml
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-errors
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: nginx-errors
    app.kubernetes.io/part-of: ingress-nginx
spec:
  selector:
    app.kubernetes.io/name: nginx-errors
    app.kubernetes.io/part-of: ingress-nginx
  ports:
  - port: 80
    targetPort: 8080
    name: http
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-errors
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: nginx-errors
    app.kubernetes.io/part-of: ingress-nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: nginx-errors
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: nginx-errors
        app.kubernetes.io/part-of: ingress-nginx
    spec:
      containers:
      - name: nginx-error-server
        image: brightforest/ingress-custom-error:1.0    #이미지 수정
        #image: kenmoini/custom-nginx-ingress-errors:latest
        ports:
        - containerPort: 8080
        # Setting the environment variable DEBUG we can see the headers sent
        # by the ingress controller to the backend in the client response.
        # env:
        # - name: DEBUG
        #   value: "true"

 

 

9. 생성된 nginx-error 서비스 확인

root@ubuntu-k8s-master01:/opt/custom-nginx-ingress-errors# kubectl get all -n ingress-nginx | grep error
pod/nginx-errors-7dcc84df95-wl9qd               1/1     Running     0          81m
service/nginx-errors                         ClusterIP   10.233.51.243   <none>        80/TCP                       81m
deployment.apps/nginx-errors               1/1     1            1           81m
replicaset.apps/nginx-errors-7dcc84df95               1         1         1       81m

 

 

 

10. 에러페이지 연결

참고 사이트에서는 정석 방법대로 ConfigMap으로 nginx의 custom-http-errors 옵션을 사용하여 해당 에러 발생시 service/nginx-errors 를 호출하도록 함.

 

지금은 404 페이지만 적용하면 되니까 /aaa, /bbb가 아닌 모든 경로(/)로 호출이 될 경우만 ingress에 추가

ingress-sample.yml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress-sample
  namespace: ingress-nginx
  annotations:
  #nginx.ingress.kubernetes.io/custom-http-errors: "404"
  #nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  #- host: brightforest.com
  - http:
      paths:
      - path: /aaa
        backend:
          serviceName: my-nginx
          servicePort: 80
      - path: /bbb
        backend:
          serviceName: my-nginx2
          servicePort: 80
      - path: /
        backend:
          serviceName: nginx-errors
          servicePort: 80

 

 

11. 호출 확인

/aaa, /bbb가 아닌 url 호출로 제대로 적용이 되었는지 확인.

 

 

 

 

 

 

 

 

*nginx의 custom-http-errors 옵션 사용방법

1. ingress에 /aaa, /bbb 경로만 설정 된 경우. nginx-errors 서비스까지 동일하게 생성


2. ingress deployment 수정
root@ubuntu-k8s-master01:~# kubectl edit deployment.apps/ingress-nginx-controller -n ingress-nginx
...
containers:
- args:
  ...
  - --default-backend-service=$(POD_NAMESPACE)/nginx-errors #라인 추가
...


3. nginx 설정 변경하는 configmap 생성
root@ubuntu-k8s-master01:~# cat nginx-configuration.yaml
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-configuration
  namespace: ingress-nginx
data:
  custom-http-errors: "404,500,503"


3. configmap 적용
root@ubuntu-k8s-master01:~# kubectl apply -f nginx-configuration.yaml


4. 호출 확인

*nginx-controller에 수정하면 10~20초뒤에 반영이 됨.
*테스트 구조는 ingress-nginx -> nginx 구조
   - custom-http-errors: "404"으로 설정할 경우 503페이지는 nginx의 기본 페이지가 리턴
   - custom-http-errors: "404,500,503" 으로 설정할 경우 ingress의 503 custom error 페이지가 리턴

 

 

참고.

https://dev.to/kenmoini/custom-kubernetes-ingress-default-backend-and-error-pages-3alh

+ Recent posts