#kubernetes #kubernetes-ingress #nginx-ingress
Вопрос:
Я пытаюсь подключить ingress на kubernetes к внешней службе, например google.com
, чей ip- 172.217.21.14
адрес .
Поэтому, когда я иду туда service.test.ai
, он посылает меня туда google.com
, но это не работает.
Вот манифесты:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
#kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ingress.class: "nginx"
name: external-service
spec:
rules:
- host: service.test.ai
http:
paths:
- backend:
serviceName: external-ip
servicePort: 80
path: /
apiVersion: v1
kind: Service
metadata:
name: external-ip
spec:
ports:
- name: app
port: 80
protocol: TCP
targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-ip
subsets:
- addresses:
- ip: 172.217.21.14
ports:
- name: app
port: 80
protocol: TCP
Комментарии:
1. Что вы подразумеваете под «посылает» меня? Вы хотите перенаправить запрос на веб-сайт (например google.com) или просто перенаправить его?
2. @томас, я имею в виду просто перенаправление
Ответ №1:
если у вашей внешней службы есть домен с DNS-именем, вы можете использовать внешнюю службу в kubernetes.
таким образом, поток будет чем-то вроде :
ingress > service > external service
apiVersion: v1
kind: Service
metadata:
name: external-service
spec:
type: ExternalName
externalName: google.com
теперь вход будет чем-то вроде
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: externalNameservice
spec:
rules:
- host: service.example.com
http:
paths:
- backend:
serviceName: my-service
servicePort: 80
path: /
если вы хотите использовать IP-адрес, вы можете использовать только свой подход
apiVersion: v1
kind: Service
metadata:
name: external-ip
spec:
ports:
- name: app
port: 80
protocol: TCP
targetPort: 5678
clusterIP: None
type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
name: external-ip
subsets:
- addresses:
- ip: 172.217.21.14
ports:
- name: app
port: 80
protocol: TCP
проверьте службу clusterIP
также проверьте наличие аннотации SSL
nginx.ingress.kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
Обновить :
как вы упомянули, если вы хотите перенаправить или переписать трафик, я просто делюсь небольшим примером для обоих
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
cert-manager.io/cluster-issuer: wordpress-prod
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($host = 'www.example.io' ) {
rewrite ^ https://example.io$request_uri permanent;
}
if ($scheme = http) {
return 301 https://exmple.io$request_uri;
}
if ($scheme = 'http') {
return 301 https://example.io$request_uri;
}
nginx.ingress.kubernetes.io/force-ssl-redirect: "True"
nginx.ingress.kubernetes.io/from-to-www-redirect: "True"
nginx.ingress.kubernetes.io/server-snippet: |
location ~ /test-check {
rewrite /test-check https://app.example.io$uri permanent;
}
location = /login {
rewrite / https://app.example.io/login permanent;
}
name: wordpress-prod-ingress
namespace: default
spec:
rules:
- host: example.io
http:
paths:
- backend:
serviceName: wordpress-site
servicePort: 80
path: /
- host: www.example.io
http:
paths:
- backend:
serviceName: wordpress-site
servicePort: 80
path: /
tls:
- hosts:
- example.io
- www.example.io
secretName: www-ssl-certificate
Комментарии:
1. я просто попробовал это как есть, но это не работает
2. просто хотите перенаправить ?
3. @AhmedNageh я обновил анализатор, пожалуйста, проверьте обновление раздела. в нем есть пример перенаправления и перезаписи в ingress.
Ответ №2:
Службы предназначены для балансировки нагрузки трафика на модули в вашем кластере. Я не думаю, что у вас может быть служба, указывающая на внешнюю конечную точку. Если вы хотите это сделать, установите его в своем входе.
Ответ №3:
Если это redirect
вам нужно, то контроллер входа nginx имеет аннотацию под названием постоянное перенаправление:
Эта аннотация позволяет возвращать постоянное перенаправление (Код возврата 301) вместо отправки данных в восходящий поток. Например
nginx.ingress.kubernetes.io/permanent-redirect: https://www.google.com
, перенаправил бы все в Google.
Таким образом, ваш вход должен выглядеть так:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/permanent-redirect: "www.google.com"
name: external-service
spec:
rules:
- host: service.test.ai
http:
paths:
- backend:
serviceName: external-ip
servicePort: 80
path: /
И вот тест:
➜ ~ curl -H "Host: service.test.ai" 192.168.49.2/test -v
* Trying 192.168.49.2...
* TCP_NODELAY set
* Connected to 192.168.49.2 (192.168.49.2) port 80 (#0)
> GET /test HTTP/1.1
> Host: service.test.ai
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Date: Sun, 30 May 2021 19:27:52 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Location: www.google.com
Приведенный ниже пример входа, если вы хотите перенаправить запрос вместе с некоторыми параметрами после /
. В этом случае вам понадобится
configuration-snippet
или server-snippet
:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
#kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/server-snippet: |
return 301 http://www.google.com$request_uri;
name: external-service
spec:
rules:
- host: service.test.ai
http:
paths:
- backend:
serviceName: external-ip
servicePort: 80
path: /
При этом, если я сверну свой вход, он будет перенаправлен вместе с путем:
➜ ~ curl -H "Host: service.test.ai" 192.168.49.2/service-query-ai -v
* Trying 192.168.49.2...
* TCP_NODELAY set
* Connected to 192.168.49.2 (192.168.49.2) port 80 (#0)
> GET /service-query-ai HTTP/1.1
> Host: service.test.ai
> User-Agent: curl/7.52.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Date: Sun, 30 May 2021 19:31:57 GMT
< Content-Type: text/html
< Content-Length: 162
< Connection: keep-alive
< Location: http://www.google.com/service-query-ai
Комментарии:
1. так что это просто входной файл, или мне нужно развернуть что-нибудь еще
2. я имею в виду, нужен ли мне вид:обслуживание и вид:конечные точки при вашем подходе
3. В прошлый раз, когда я проверял, эта конечная точка службы не требовалась. Мне придется перепроверить это завтра.
4. я попытался развернуть его, используя только вид:введите тот же yaml, который вы указали в своем ответе, и я получил «<ошибка: конечные точки «по умолчанию-http-серверная часть» не найдена>»
5. Я только что проверил это без какой-либо службы, которая поддерживает вход и перенаправление, работает.