Как настроить пользовательскую ошибку HTTP в Kubernetes - PullRequest
7 голосов
/ 05 февраля 2020

Я хочу создать пользовательскую страницу ошибки 403. В настоящее время у меня уже есть Ingress, и в аннотациях у меня есть что-то вроде этого:

"nginx.ingress.kubernetes.io/whitelist-source-range": "100.01.128.0/20,88.100.01.01"

Так что любая попытка получить доступ к моему веб-приложению за пределами этого диапазона IP-адресов получает ошибку 403.

In Чтобы создать пользовательскую страницу, я попытался добавить следующие аннотации:

"nginx.ingress.kubernetes.io/custom-http-errors": "403",
"nginx.ingress.kubernetes.io/default-backend": "default-http-backend"

, где default-http-backend - это имя уже развернутого приложения. Pod details

вход имеет следующее:

{
  "kind": "Ingress",
  "apiVersion": "extensions/v1beta1",
  "metadata": {
    "name": "my-app-ingress",
    "namespace": "my-app-test",
    "selfLink": "/apis/extensions/v1beta1/namespaces/my-app-test/ingresses/my-app-ingress",
    "uid": "8f31f2b4-428d-11ea-b15a-ee0dcf00d5a8",
    "resourceVersion": "129105581",
    "generation": 3,
    "creationTimestamp": "2020-01-29T11:50:34Z",
    "annotations": {
      "kubernetes.io/ingress.class": "nginx",
      "nginx.ingress.kubernetes.io/custom-http-errors": "403",
      "nginx.ingress.kubernetes.io/default-backend": "default-http-backend",
      "nginx.ingress.kubernetes.io/rewrite-target": "/",
      "nginx.ingress.kubernetes.io/whitelist-source-range": "100.01.128.0/20,90.108.01.012"
    }
  },
  "spec": {
    "tls": [
      {
        "hosts": [
          "my-app-test.retail-azure.js-devops.co.uk"
        ],
        "secretName": "ssl-secret"
      }
    ],
    "rules": [
      {
        "host": "my-app-test.retail-azure.js-devops.co.uk",
        "http": {
          "paths": [
            {
              "path": "/api",
              "backend": {
                "serviceName": "my-app-backend",
                "servicePort": 80
              }
            },
            {
              "path": "/",
              "backend": {
                "serviceName": "my-app-frontend",
                "servicePort": 80
              }
            }
          ]
        }
      }
    ]
  },
  "status": {
    "loadBalancer": {
      "ingress": [
        {}
      ]
    }
  }
}

И все же я всегда получаю значение по умолчанию 403. Чего мне не хватает?

Ответы [ 3 ]

5 голосов
/ 13 февраля 2020

Я воспроизвел твой сценарий, и это сработало для меня. Я постараюсь показать вам шаги, которым я следовал.

Облачный провайдер : GKE Kubernetes Версия : v1.15.3 Пространство имен : default

Я использую 2 развертывания по 2 образа с сервисом для каждого.

Сервис 1 : default-http-backend - с nginx образом, оно будет нашим бэкэндом по умолчанию.

Сервис 2 : custom-http-backend - с неодушевленным образом / изображением эхо-сервера эта служба будет отображаться, если запрос получен из белого списка ip.

Вход : Nginx вход с аннотациями.

Ожидаемое поведение: Вход будет настроен для использования default-backend , custom-http-errors и whitelist-source-range аннотации. Если запрос был сделан из белого списка IP-адресов, вход будет перенаправлен на custom-http-backend , если нет, он будет перенаправлен на default-http-backend .

Развертывание 1: default-http-backend

Создание файла default-http-backend.yaml с таким содержимым:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: default-http-backend
spec:
  selector:
    matchLabels:
      app: default-http-backend
  template:
    metadata:
      labels:
        app: default-http-backend
    spec:
      containers:
      - name: default-http-backend
        image: nginx
        ports:
        - name: http
          containerPort: 80
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
spec:
  selector:
    app: default-http-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

Применение файла yaml: k apply -f default-http-backend.yaml

Развертывание 2 : custom-http-backend

Создайте файл custom-http-backend.yaml с этим содержимым:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-http-backend
spec:
  selector:
    matchLabels:
      app: custom-http-backend
  template:
    metadata:
      labels:
        app: custom-http-backend
    spec:
      containers:
      - name: custom-http-backend
        image: inanimate/echo-server
        ports:
        - name: http
          containerPort: 8080
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: custom-http-backend
spec:
  selector:
    app: custom-http-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

Примените файл yaml: k apply -f custom-http-backend.yaml

Проверьте, работают ли службы и работает

Я использую псевдоним k для kubectl

➜  ~ k get svc                                 
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
custom-http-backend    ClusterIP   10.125.5.227   <none>        80/TCP    73s
default-http-backend   ClusterIP   10.125.9.218   <none>        80/TCP    5m41s
...
➜  ~ k get pods
NAME                                    READY   STATUS    RESTARTS   AGE
custom-http-backend-67844fb65d-k2mwl    1/1     Running   0          2m10s
default-http-backend-5485f569bd-fkd6f   1/1     Running   0          6m39s
...

Вы можете протестировать службу, используя port- вперед :

default-http-backend k port-forward svc/default-http-backend 8080:80 Попробуйте получить доступ к http://localhost: 8080 в своем обзоре, чтобы увидеть страницу nginx по умолчанию .

custom-http-backend k port-forward svc/custom-http-backend 8080:80 Попробуйте получить доступ к http://localhost: 8080 в своем обзоре, чтобы увидеть пользовательскую страницу, предоставленную изображением эхо-сервера .

Входная конфигурация

* 10 91 * На данный момент у нас есть и запущены обе службы, нам нужно установить и настроить вход nginx. Вы можете следовать официальной документации , здесь это не рассматривается.

После установки давайте развернем вход, основываясь на коде, который вы опубликовали, я сделал некоторые изменения: удалил tls, добавил другой домен и удалил путь /api только для целей тестирования и добавил мой домашний ip в белый список.

Создайте файл my-app-ingress.yaml с содержанием:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-app-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: "/"
    nginx.ingress.kubernetes.io/custom-http-errors: '403'
    nginx.ingress.kubernetes.io/default-backend: default-http-backend
    nginx.ingress.kubernetes.io/whitelist-source-range: 207.34.xxx.xx/32
spec:
  rules:
  - host: myapp.rabello.me
    http:
      paths:
      - path: "/"
        backend:
          serviceName: custom-http-backend
          servicePort: 80

Примените spe c: k apply -f my-app-ingress.yaml

Проверьте вход с помощью команды:

➜  ~ k get ing
NAME             HOSTS              ADDRESS          PORTS   AGE
my-app-ingress   myapp.rabello.me   146.148.xx.xxx   80      36m

Вот и все!

Если я проверю из дома мой ip из белого списка, отображается пользовательская страница, но если я пытаюсь получить доступ с помощью своего мобильного телефона в сети 4G, отображается страница nginx по умолчанию.

Примечание. Я использую вход и службы в одном и том же пространстве имен, если вам нужно Для работы с другим пространством имен вам необходимо использовать ExternalName .

Надеюсь, это поможет!

Ссылки: kubernetes deployings

сервис kubernetes

nginx вход

nginx аннотации

0 голосов
/ 17 апреля 2020

Я хочу создать пользовательскую страницу ошибки 403. В настоящее время у меня уже есть Ingress и аннотации. Поэтому любая попытка получить доступ к моему веб-приложению за пределами этого диапазона IP-адресов получает ошибку 403. Чтобы создать пользовательскую страницу, я попытался добавить следующие аннотации:

kind: Ingress
metadata:
  name: my-app-ingress
  namespace: default
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/rewrite-target: "/"
    nginx.ingress.kubernetes.io/custom-http-errors: '403'
    nginx.ingress.kubernetes.io/default-backend: default-http-backend
    nginx.ingress.kubernetes.io/whitelist-source-range: 125.10.156.36/32
spec:
  rules:
  - host: venkat.dev.vboffice.com
    http:
      paths:
      - path: "/"
        backend:
          serviceName: custom-http-backend
          servicePort: 80

, где default-http-backend - это имя приложения, уже развернутого со страницей по умолчанию nginx.

Если я тестирую из дома с моим ip из белого списка, отображается пользовательская страница, но если я пытаюсь получить доступ с помощью моего мобильного телефона в сети 4G, он отображает бэкэнд по умолчанию 404

, мне нужно добавить любую nginx конфигурацию изменить пользовательский модуль http-backend ????

Развертывание 1: default-http-backend

apiVersion: apps/v1
kind: Deployment
metadata:
  name: default-http-backend
spec:
  selector:
    matchLabels:
      app: default-http-backend
  template:
    metadata:
      labels:
        app: default-http-backend
    spec:
      containers:
      - name: default-http-backend
        image: nginx
        ports:
        - name: http
          containerPort: 80
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
spec:
  selector:
    app: default-http-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

Развертывание 2: custom-http-backend

apiVersion: apps/v1
kind: Deployment
metadata:
  name: custom-http-backend
spec:
  selector:
    matchLabels:
      app: custom-http-backend
  template:
    metadata:
      labels:
        app: custom-http-backend
    spec:
      containers:
      - name: custom-http-backend
        image: inanimate/echo-server
        ports:
        - name: http
          containerPort: 8080
        imagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Service
metadata:
  name: custom-http-backend
spec:
  selector:
    app: custom-http-backend
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080
0 голосов
/ 05 февраля 2020

Вам необходимо создать и развернуть пользовательский бэкэнд по умолчанию, который будет возвращать пользовательскую страницу ошибки. Следуйте do c, чтобы развернуть пользовательский бэкэнд по умолчанию и настроить входной контроллер nginx, изменив yaml развертывания. использовать этот пользовательский бэкэнд по умолчанию.

Ямл развертывания для пользовательского бэкэнда по умолчанию: здесь , а исходный код здесь .

...