Сеть 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, его решение может иметь некоторые проблемы.