首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将入口连接到外部服务

将入口连接到外部服务
EN

Stack Overflow用户
提问于 2021-05-26 15:40:58
回答 3查看 1.7K关注 0票数 0

我试图将kubernetes上的入口连接到外部服务,例如ip为172.217.21.14172.217.21.14

所以当我去service.test.ai的时候,它会把我送到google.com,但是它不起作用。

以下是清单:

代码语言:javascript
复制
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: /
代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-05-26 18:23:48

如果外部服务具有DNS名称域,则可以在kubernetes中使用外部服务。

所以流动会是这样的:

代码语言:javascript
复制
ingress > service > external service 

apiVersion: v1
kind: Service
metadata:
  name: external-service
spec:
  type: ExternalName
  externalName: google.com

现在进场就像

代码语言:javascript
复制
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: externalNameservice
spec:
  rules:
  - host: service.example.com
    http:
      paths:
      - backend:
          serviceName: my-service
          servicePort: 80
        path: /

如果您想使用IP地址,则只能使用您的方法。

代码语言:javascript
复制
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注释

代码语言:javascript
复制
nginx.ingress.kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"

UPdate

正如您提到的,如果您想重定向或重写流量,我只是为两者提供一个小示例。

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-05-26 16:18:47

服务的目的是将流量平衡到集群中的豆荚中。我不认为您可以有指向外部端点的服务。如果你想这么做,把它放在你的入口处。

票数 0
EN

Stack Overflow用户

发布于 2021-05-27 14:02:07

如果是redirect,那么nginx入口控制器有一个名为永久重定向的注释

该注释允许返回永久重定向(返回代码301),而不是将数据发送到上游。例如,nginx.ingress.kubernetes.io/permanent-redirect: https://www.google.com会将所有内容都重定向到Google。

所以你的入口应该是这样的:

代码语言:javascript
复制
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: /

下面是测试:

代码语言:javascript
复制
➜  ~ 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-snippetserver-snippet

代码语言:javascript
复制
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: /

有了这个,如果我卷曲我的入口,它就会和路径一起被重定向:

代码语言:javascript
复制
➜  ~ 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67708284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档