Как исправить бэкэнд по умолчанию на ingress 404
Я начал использовать Kubernetes несколько месяцев назад и фактически перенес свои микроуслуги в кластер ранчо (RKE). Все работает хорошо, мои развертывания хорошие и сервисы тоже. Я хотел бы использовать вход.
Все выглядит хорошо, услуги находят во входе, а пакеты находят в службах. Однако, когда я пытаюсь зайти на сайт, у меня появляется страница ошибки 404 от входного контроллера.
Вы можете увидеть мою конфигурацию только для двух путей: один nginx и на графане. Кто-то знает, как я могу это исправить и использовать вход, чтобы сделать мой обратный прокси-сервер?
Спасибо большое за вашу помощь.
Я пытаюсь использовать rewrite-target без результата и add-base-url устарела.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
field.cattle.io/creatorId: user-cg5r7
field.cattle.io/ingressState: '{"bXktaW5ncmVzcy9kZWZhdWx0L3d3dy5zY29sLWVhLm92aC8vbmdpbngvNDI=":""}'
field.cattle.io/publicEndpoints: '[{"addresses":["51.68.226.21"],"port":80,"protocol":"HTTP","serviceName":"default:nginx-services","ingressName":"default:my-ingress","hostname":"www.scol-ea.ovh","path":"/nginx","allNodes":true}]'
creationTimestamp: "2019-08-31T10:54:25Z"
generation: 2
labels:
cattle.io/creator: or antoine
name: my-ingress
namespace: default
resourceVersion: "106239"
selfLink: /apis/extensions/v1beta1/namespaces/default/ingresses/my-ingress
uid: b27b7b20-cbdd-11e9-b16b-fa163ea73397
spec:
rules:
- host: www.scol-ea.ovh
http:
paths:
- backend:
serviceName: nginx-sample
servicePort: 80
path: /nginx
- backend:
serviceName: prometheus-grafana
servicePort: http
path : /grafana
------------------------
apiVersion: v1
kind: Service
metadata:
annotations:
field.cattle.io/targetWorkloadIds: '["deployment:default:nginx-sample"]'
workload.cattle.io/targetWorkloadIdNoop: "true"
workload.cattle.io/workloadPortBased: "true"
creationTimestamp: "2019-08-31T10:03:47Z"
labels:
cattle.io/creator: norman
name: nginx-sample
namespace: default
ownerReferences:
- apiVersion: apps/v1beta2
controller: true
kind: deployment
name: nginx-sample
uid: 57af9603-cb2a-11e9-b16b-fa163ea73397
resourceVersion: "102071"
selfLink: /api/v1/namespaces/default/services/nginx-sample
uid: 9fffe98c-cbd6-11e9-b16b-fa163ea73397
spec:
clusterIP: 10.43.183.187
ports:
- name: 80tcp02
port: 80
protocol: TCP
targetPort: 80
selector:
workload.user.cattle.io/workloadselector: deployment-default-nginx-sample
sessionAffinity: None
type: ClusterIP
----------------------------
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2019-08-30T13:44:00Z"
labels:
app: prometheus-grafana
chart: grafana-0.0.31
heritage: Tiller
io.cattle.field/appId: prometheus
release: prometheus
name: prometheus-grafana
namespace: default
resourceVersion: "2536"
selfLink: /api/v1/namespaces/default/services/prometheus-grafana
uid: 38ebd878-cb2c-11e9-b16b-fa163ea73397
spec:
clusterIP: 10.43.142.143
ports:
- name: http
port: 80
protocol: TCP
targetPort: 3000
selector:
app: prometheus-grafana
sessionAffinity: None
type: ClusterIP
4 ответа
Если вы используете nginx в качестве прокси-сервера развертывания в кубернетах и столкнулись с проблемой, то приведенная ниже конфигурация может решить проблему перенаправления.
Либо вы можете включить указанные ниже переменные в файл grafan.ini, либо предоставить их как переменные env, как показано ниже,
GF_SERVER_DOMAIN=abc.google.com
GF_SERVER_ROOT_URL=%(protocol)s://%(domain)s:/grafana
Таким образом, развертывание Grafana будет выглядеть так, как показано ниже.
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: monitoring
spec:
replicas: 1
selector:
matchLabels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:latest
env:
- name: GF_SERVER_DOMAIN
value: "abc.google.com"
- name: GF_SERVER_ROOT_URL
value: "%(protocol)s://%(domain)s:/grafana"
ports:
- name: grafana
containerPort: 3000
resources:
limits:
memory: "2Gi"
cpu: "1000m"
requests:
memory: "1Gi"
cpu: "500m"
volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-storage-volume
- mountPath: /etc/grafana/provisioning/datasources
name: grafana-datasources
readOnly: false
И вам нужно обновить блок местоположения сервера nginx, как показано ниже,
location /grafana {
proxy_pass http://grafana.monitoring.svc.cluster.local:3000;
rewrite ^/grafana/(.*) /$1 break;
proxy_set_header Host $host;
}
Фактически, Nginx Ingress Controller обрабатывает все запросы, которые не могут достичь целевого местоположения, и отправляет их в серверную часть по умолчанию, в результате чего каждый запросdefault backend - 404
страница.
Поскольку вы решили реализовать сценарий маршрутизации на основе пути, правило перезаписи может помочь с помощью nginx.ingress.kubernetes.io/rewrite-target
аннотация:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
labels:
cattle.io/creator: or antoine
name: my-ingress
namespace: default
spec:
rules:
- host: www.scol-ea.ovh
http:
paths:
- backend:
serviceName: nginx-sample
servicePort: 80
path: /nginx(/|$)(.*)
- backend:
serviceName: prometheus-grafana
servicePort: http
path : /grafana(/|$)(.*)
Как только вы подадите заявку выше Ingress
manifest, маршрутизация на основе пути может быть предоставлена в следующих примерах перезаписи:
www.scol-ea.ovh/nginx -> www.scol-ea.ovh/
www.scol-ea.ovh/grafana -> www.scol-ea.ovh/
Я бы не рекомендовал делиться какими-либо конфиденциальными данными пользователя в опубликованных манифестах или любых других объектах данных, таких как общедоступная конечная точка в вашем случае.
Я наткнулся на одну вещь: убедитесь, что в ваших правилах спецификации имена серверных служб верны.
Вместо этого:
- path: /app-ui
pathType: Prefix
backend:
service:
name: app-ui-service
port:
number: 8080
у меня было это:
- path: /app-ui
pathType: Prefix
backend:
service:
name: app-ui
port:
number: 8080
Еще одна вещь: убедитесь, что если вы используете Nginx Ingress, вы указываете имя входного класса.
spec:
ingressClassName: nginx
Я считаю, тебе следует использовать nginx.ingress.kubernetes.io/backend-protocol: HTTPS
аннотация в вашем yaml