`
can_do
  • 浏览: 266321 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

K8S中Nginx ingress或者Openresty ingress插入原生代码

阅读更多
一、场景
K8S中nginx ingress一般负载的是pod的service,但如何代理到一个外部服务A?

二、前提

K8S的docker中可以访问外部服务A,即网络上是打通的,可以事先测试确认好;

三、解决方案

1> 通过ingress yaml语法代理,简单的反向代理是可以的,但涉及附加参数的调整的话,

该方案不适用;
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: yourdomain
  namespace: yournamespace
spec:
  rules:
  - host: yourdomain.cnd.com
    http:
      paths:
      - path: /
        backend:
          serviceName: yourdomain
          servicePort: 18306
	  - path: /yourown
        backend:
          serviceName: yourdomain-cnd
          servicePort: 8888


注意:
1> 此处servicename的写法上,仅支持,英文字母开头和结束的,可以有连字符【-】,其他字符不支持,比如子域名中的dot【.】,因此此写法不能直接路由到外部域名的服务A
2> 如果要附加调整一些请求header参数,比如:host,此写法不好支持,暂没有发现;

2> 通过ingress 使用snippet注入类原生代码;
nginx-ingress中可以使用以下snippet annotion,

一个成功使用configuration的snippet,如下:
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: yourfromdomain
  namespace: your-custom-namespace
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      if ($request_uri ~ "^\/backendbac|\/backenddef|\/backendxyz") {
          more_set_input_headers "Host: youregateway.cnd.com";
          proxy_pass http://youregateway.cnd.com:8888;
          break;
      }
spec:
  rules:
  - host: yourfromdomain.cnd.com
    http:
      paths:
      - path: /
        backend:
          serviceName: yourfromdomain
          servicePort: 18306

## more_set_headers "Host: youregateway.responsecnd.com";


注意:
1> 此处对原生的nginx proxy_set_header不适用,而要使用:more_set_input_headers来设置request header参数;
2> 另外,more_set_headers可以设置response中header参数;

另一个通过rewrite而不是反向代理实现的例子如下:

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: yourfromdomain
  namespace: your-custom-namespace
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite /yourbackendapi/(.*)  /yoursecondapi/$1 break;
spec:
  rules:
  - host: yourfromdomain.cnd.com
    http:
      paths:
      - path: /
        backend:
          serviceName: yourfromdomain
          servicePort: 28206



四、同步循环模式【synchronization loop pattern】
Avoiding outage from wrong configuration
Because the ingress controller works using the synchronization loop pattern, it is applying the configuration for all matching objects. In case some Ingress objects have a broken configuration, for example a syntax error in the nginx.ingress.kubernetes.io/configuration-snippet annotation, the generated configuration becomes invalid, does not reload and hence no more ingresses will be taken into account.

这就是为什么ingress yaml文件中annotation的注解部分代码,有语法错误时,其配置不会同步到nginx.conf,而是采用旧文件,遵循既有规则优先的原则。




五、参考官方
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#custom-nginx-upstream-vhost

https://kubernetes.github.io/ingress-nginx/how-it-works/


分享到:
评论

相关推荐

    openresty-ingress

    3. **Nginx 配置**: OpenResty-ingress 使用 Nginx 配置模板,动态生成 Nginx 配置文件,根据 Kubernetes 中的 Ingress 资源进行更新。 **功能特性** 1. **动态配置**: 当 Kubernetes 中的 Ingress 资源发生变化时...

    微服务动态路由实现:openresty+kubernetes

    #### 如何在 K8s 上部署 OpenResty 1. **安装 Redis**:作为 OpenResty 与 Kubernetes 之间的数据存储媒介。可以通过 ConfigMap 配置 Redis 的启动参数。 - **Redis 配置**:创建 ConfigMap 用于存储 Redis 的...

    OpenResty在又拍云容器平台中的应用.pdf

    OpenResty是一个基于Nginx和LuaJIT的高性能Web平台,它集成了大量精心设计的Nginx模块以及Lua语言,用于构建动态的、高性能的Web应用和API服务。在又拍云容器平台中,OpenResty被应用于解决大规模、高复杂度和高性能...

    微服务动态路由技术方案.pptx

    微服务动态路由技术方案 微服务架构下,动态路由技术方案是实现高可用、可扩展、高性能的关键。OpenResty是一个基于Nginx与Lua...OpenResty和K8s Ingress Controller可以实现高性能、高可用性和高扩展性的微服务架构。

    Nginx高性能Web服务器详解

    Nginx拥有丰富的第三方模块,如modsecurity用于Web应用防火墙,lua-nginx-module实现Lua脚本支持,openresty整合Nginx与LuaJIT,增强功能性和灵活性。 总结,Nginx的高性能、高并发处理能力和灵活的配置,使其成为...

    1-4+DataVisor风控架构设计&OpenResty实战.pdf

    并且没有Stop-the-World (STW)现象,因此在业界常被用来作为流量接入网关,如K8S Ingress和知名的API网关Kong、APISIX等都是基于OpenResty构建的。 在风控查询过程中,往往需要进行多次子查询并行处理,以满足100-...

    Kubernetes泛域名动态Service转发解决方案.docx

    apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-ingress spec: rules: - host: a.test.imroc.io http: paths: - path: / pathType: Prefix backend: service: name: my-svc-a port:...

    lua-resty-cookie:用于OpenRestyngx_lua的HTTP cookie操作的Lua库

    lua-resty-cookie-该库解析Nginx的HTTP Cookie头,并返回cookie中的每个字段。 目录 地位 该库已准备就绪。 概要 lua_package_path " /path/to/lua-resty-cookie/lib/?.lua;; " ; server { location / test { ...

    API网关(ApiSixV2.1)使用指南.docx

    Apache APISIX 可用于处理传统南北向流量以及服务间的东西向流量,也可以作为 K8s ingress controller 使用,为 Kubernetes 集群提供入口网关服务。 #### 架构设计 - **服务发现**:除了内置的 etcd 服务发现之外...

Global site tag (gtag.js) - Google Analytics