подключение входа к внешней службе

#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. Я только что проверил это без какой-либо службы, которая поддерживает вход и перенаправление, работает.