Сеть Kubernetes Ingress отрицают некоторые пути

У меня есть простая входная сеть kubernetes.

Мне нужно запретить доступ к некоторым критическим путям, таким как / admin или т. Д.

Мой входной сетевой файл показан ниже.

 apiVersion: extensions/v1beta1
 kind: Ingress
 metadata:
 name: ingress-test
 spec:
   rules:
   - host: host.host.com
   http:
      paths:
        - path: /service-mapping
      backend:
         serviceName: /service-mapping
         servicePort: 9042

Как я могу отрицать пользовательский путь с помощью входящей сети kubernetes, с аннонациями nginx или другими методами.


Я решаю эту проблему с помощью аннотаций, показанных ниже.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
   name: nginx-configuration-snippet
   annotations:
      nginx.ingress.kubernetes.io/configuration-snippet: |

     server_tokens off;
     location DANGER-PATH {
    deny all;
    return 403;
  }

spec:
  rules:
   - host: api.myhost.com
   http:
  paths:
  - backend:
      serviceName: bookapi-2
      servicePort: 8080
    path: PATH 

3 ответа

Вы можете использовать аннотацию к фрагменту сервера. Это похоже на то, чего вы хотите достичь.

Скопируйте официальный способ Kubernetes и используйте defaultbackend контейнер, который всегда возвращает 404.

      apiVersion: apps/v1
kind: Deployment
metadata:
  name: defaultbackend
spec:
  selector:
    matchLabels:
      app: defaultbackend
  template:
    metadata:
      labels:
        app: defaultbackend
    spec:
      containers:
      - name: defaultbackend
        image: k8s.gcr.io/defaultbackend-amd64:1.5
        resources:
          requests:
            memory: 10M
            cpu: 5m
          limits:
            memory: 10M
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: defaultbackend
spec:
  selector:
    app: defaultbackend
  ports:
  - port: 80
    targetPort: 8080

Затем во входе добавьте paths Вход:

            paths:
      - path: /
        backend:
          serviceName: my-real-service
          servicePort: 3000
      - path: /admin
        backend:
          serviceName: defaultbackend
          servicePort: 80

Я столкнулся с той же проблемой и нашел решение на github. Чтобы достичь цели, вам нужно сначала создать два Ingresses по умолчанию без каких-либо ограничений:

apiVersion: extensions/v1beta1
 kind: Ingress
 metadata:
 name: ingress-test
 spec:
   rules:
   - host: host.host.com
   http:
      paths:
        - path: /service-mapping
      backend:
         serviceName: /service-mapping
         servicePort: 9042

Затем создайте secret для аутентификации, как описано в документе:

Создание htpasswd

$ htpasswd -c auth foo
New password: <bar>
New password:
Re-type new password:
Adding password for user foo

Создание secret:

$ kubectl create secret generic basic-auth --from-file=auth
secret "basic-auth" created

Второй вход с аутентификацией для путей, которые вам нужно ограничить:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-with-auth
  annotations:
    # type of authentication
    nginx.ingress.kubernetes.io/auth-type: basic
    # name of the secret that contains the user/password definitions
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    # message to display with an appropiate context why the authentication is required
    nginx.ingress.kubernetes.io/auth-realm: "Authentication Required - foo"
spec:
  rules:
  - host: host.host.com
    http:
      paths:
      - path: /admin
        backend:
          serviceName: service_name
          servicePort: 80

Согласно sedooe, его решение может иметь некоторые проблемы.

Другие вопросы по тегам