编程技术分享平台

网站首页 > 技术教程 正文

Kubernetes中如何转发请求到集群外?

xnh888 2024-09-14 15:22:35 技术教程 25 ℃ 0 评论

公司的服务目前大都使用Kubernetes承载,但一些外购的服务没有部署在集群中,如何使用配置在Kubernetes中的域名访问集群外的服务?这篇文章,介绍如何解决这个问题。为了说明白这个问题,先在集群外的一台IP为10.0.11.104的服务器上部署一个服务,代码如下,

from flask import Flask
# -*- coding: utf-8 -*-
# 创建 Flask 应用程序实例
app = Flask(__name__)

# 定义指定路由处理函数
@app.route('/hello')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(host='0.0.0.0', debug=True)

访问链接http://10.0.11.104/hello,输出“Hello, World!”

我们在Kubernetes集群中已经通过Ingress资源对象配置了一个域名“test.example.com”,使用指定路径“/hello”访问上面的服务。

应用下面的Kubernetes资源配置文件,

apiVersion: v1
kind: Endpoints
metadata:
  name: portredirect 
  namespace: test 
subsets:
- addresses:
  - ip: 10.0.11.104
  ports:
  - name: http 
    port: 5000
---
apiVersion: v1
kind: Service
metadata:
  name: portredirect
  namespace: test 
spec:
  type: ClusterIP
  ports:
    - name: http 
      port: 80
      targetPort: 5000
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: finereport 
  namespace: test 
  annotations:
    nginx.ingress.kubernetes.io/proxy-request-buffering: "off"
spec:
  tls:
  - hosts:
    - '*.example.com'
    secretName: web-ssl
  rules:
  - host: test.example.com 
    http:
      paths:
      - path: /hello
        backend:
          serviceName: portredirect
          servicePort: 80

在Kubernetes中,Endpoints资源对象一般不用手动创建,它会跟着Service资源对象自动创建,Endpoints 对象会自动获取该 Service 所选择的所有 Pod 的 IP 地址和端口信息,并将其填充到 Endpoints 对象中。在本文的场景中,实际的Pod并不存在,我们需要手动创建一个Endpoints,只要保证Endpoints和Service的名字相同,它们会自动绑定,这样在集群内部访问服务名“portredirect”就可以访问到前面部署的Python服务。在集群外面访问链接“https://www.example.com/hello”也可以访问到Python服务。

这样的配置有两个好处:

  • 集群内服务使用服务名即可访问外部的服务
  • 可以依赖集群已有的统一域名访问

希望这篇文章能帮到你!

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表