推广 热搜: page  关键词  数据分析  服务  获取  哪些  数据分析系统  搜索  小红  链接 

Ingress-Nginx服务暴露基础学习与实践

   日期:2025-01-03     作者:6r8oh    caijiyuan   评论:0    移动:https://sicmodule.kub2b.com/mobile/news/14933.html
核心提示:0x00 前言简述 Ingress 基础介绍Ingress 实现原理补充说明0x01 Ingress 安装配置 1.利用Ingress访问后端的Nginx Web和
  • 0x00 前言简述

    • Ingress 基础介绍

    • Ingress 实现原理

    • 补充说明

  • 0x01 Ingress 安装配置

    • 1.利用Ingress访问后端的Nginx Web和Tomcat后端综合实践。

    • 示例1.Ingress 常规使用方案

    • 示例2.Ingress HTTPS 代理访问

    • 示例3.Ingress Rewrite 重写重定向访问

    • 示例4.Ingress VirtualHost 虚拟主机访问

    • 示例5.Ingress BasicAuth(基础认证)功能

    • 示例6.Ingress Redirect 域名重定向功能

    • 示例7.Ingress 黑白名单访问限制

    • 示例8.Ingress Header 请求头匹配

    • 示例9.Ingress 灰度金丝雀发布

    • 示例10.Ingress 相关配置补充

    • 配置指南

    • 安装部署

    • 基础示例

    • 企业实战

  • 0x02 入坑出坑

    • 问题1.K8s Nginx Ingress Controller 转发 X-Forwarded-Proto 请求头的问题

    • 问题2:extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress

    • 问题3.Error from server (InternalError): error when applying patch:

    • 问题4.查看ingress规则时提示警告

描述: 到目前为止我们了解了kubernetes常用的三种暴露服务的方式:LoadBlancer Service、 NodePort Service、Ingress

  • LoadBlancer Service 是kubernetes结合云平台的组件,如国外的GCE,AWS,国内阿里云等等。使用它项使用的底层云平台申请创建负载均衡器来实现,对使用云平台的集群比较方便,但有局限,费用高。

  • NodePort Service 是kubernetes在每个节点上暴露一个相同的端口(默认:30000-32000)但是由于安全和易用方面(服务多了就乱了还有端口冲突问题)且对主机安全性存在一定风险(内网环境,问题不大,所以实际使用并不多,当然对于小规模的集群服务,还是比较不错的。

  • Ingress 是 kubernetes 中使用Nginx进行反代应用来实现,其特点是安全以及方便统一管理等。

Ingress 基础介绍

Q: 什么是负载均衡Ingress?
描述:Ingress 其实就是集群外部访问的一个入口(在kubernetes v1.1时加入),将外部的请求转发到不同的 Server 上,其实就相当于  等负载均衡器。
即: Nginx-Ingress 是 Kubernetes 使用 NGINX 作为反向代理和负载平衡器的入口控制器。

Tips : 对于k8s传统的svc来说它仅支持4层代理, 如果需要做七层代理就需要使用k8s官方在1.11中推出了ingress api接口,通过ingress达到7层代理的效果我对于ingress来说必须要绑定一个域名因为它是基于7层代理的

NGINX 配置
描述: Ingress 控制器的目标是组装一个配置文件(nginx.conf), 当修改配置文件发生任何更改后需要重新加载 NGINX。

NGINX 模型与构建
描述: Kubernetes 控制器使用同步循环模式来检查控制器中的所需状态是否已更新或是否需要更改。为此,我们需要使用集群中的不同对象构建模型,特别是(无特殊顺序) 以生成反映集群状态的时间点配置文件.

描述: 建立模型是一项昂贵的操作,因此必须使用同步循环。通过使用工作队列,可以不丢失更改并删除使用sync.Mutex来强制同步循环的单次执行,此外还可以在同步循环的开始和结束之间创建一个时间窗口,允许我们丢弃不必要的更新。

Tips: NGINX 配置的最终表示是从Go 模板生成的,使用新模型作为模板所需变量的输入。

Q: ingress-nginx解决了生产环境中哪些问题?

  • 1)动态配置服务:如果按照传统方式,当新增加一个服务时,我们可能需要在流量入口加一个反向代理指向我们新的服务,而使用ingress,只需要配置好ingress,当服务启动时,会自动注册到ingress当中,不需要额外的操作。

  • 2)减少不必要的Port暴露(安全,端口容易管理): 我们知道部署k8s时,是需要关闭防火墙的,主要原因是k8s的很多服务会以nodeport方式映射出去,这样对于宿主机来说是非常的不安全的,而ingress可以避免这个问题,只需要将ingress自身服务映射出去,就可代理后端所有的服务,则后端服务不需要映射出去。

Q: ingress-Nginx和ingress-Nginx-Controller的区别?

  • ingress-Nginx: 是每个服务自己创建的ingress,就是nginx的转发规则,生成Nginx的配置文件

  • ingress-Nginx-Controller: 相当于Nginx的服务,监听API Server,根据用户编写的ingress-nginx规则(ingress.yaml文件),动态的去更改Nginx服务的配置文件,并且reload使其生效,此过程是自动化的通过lua实现

Ingress 实现原理

描述: Ingress 实际上是通过服务发现的功能进行实现,通过Ingress controller来提供路由信息的刷新, 可以理解为一个监视器,不断监听  实时感知service、Pod的变化,其再结合Ingress的配置,更新反向代理负载均衡器,达到服务发现的作用。

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。
流量路由由 Ingress 资源上定义的规则控制, 可以将 Ingress 配置为服务提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及提供基于名称的虚拟主机访问。
Ingress 控制器通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量,并且ingress不暴露任何端口或协议。

组件组成
描述: 从下图可以看出一般由三个组件组成

  • 1)反向代理负载均衡器:通常以service的port方式运行,接收并按照ingress定义的规则进行转发,常用的有nginx,Haproxy,Traefik等,本文中使用的就是nginx。

  • 2)ingress-nginx-Controller: 监听APIServer,根据用户编写的ingress规则(编写ingress的yaml文件,动态地去更改nginx服务的配置文件,并且reload重载使其生效,此过程是自动化的(通过lua脚本来实现)。

  • 3)Ingress:将nginx的配置抽象成一个Ingress对象,当用户每添加一个新的服务,只需要编写一个新的ingress的yaml文件即可。

工作流程

  • 1)ingress controller通过和kubernetes api交互,动态的去感知集群中ingress规则变化。

  • 2)然后读取它,按照自定义的规则,规则就是写明了那个域名对应哪个service,生成一段nginx配置。

  • 3)在写到nginx-ingress-controller的pod里,这个Ingress controller的pod里运行着一个Nginx服务,控制器会把生成的nginx配置写入/etc/nginx.conf文件中。

  • 4)然后reload一下使配置生效,以此达到分配和动态更新问题。

Tips : 目前可以提供Ingress controller有很多比如等。

Tips : 目前常见的负载均衡有和等。

Tips: 如果多个 Ingress 为同一主机定义了路径,则 Ingress 控制器会合并这些定义。

Tips: 入口控制器第一次启动时,两个作业创建了准入 Webhook 使用的 SSL 证书。因此,在可以创建和验证 Ingress 定义之前,会有最多两分钟的初始延迟。

Tips: admission webhook 需要Kubernetes API服务器和入口控制器之间的连接,请保证防火墙允许8443端口通信。

补充说明

  • 节点: Kubernetes 集群中的服务器

  • 集群: Kubernetes 管理的一组服务器集合

  • 边界路由器: 为局域网和 Internet 路由数据包的路由器,执行防火墙保护局域网络

  • 集群网络: 遵循 Kubernetes 网络模型实现集群内的通信的具体实现,比如 Flannel 和 Calico

  • 服务: Kubernetes 的服务 (Service) 是使用标签选择器标识的一组 Pod Service (Deployment)。 除非另有说明,否则服务的虚拟 IP 仅可在集群内部访问

  • NodePort: 服务是引导外部流量到你的服务的最原始方式。

  • LoadBalancer: 服务是暴露服务到 Internet 的标准方式。

  • Ingress: 事实上不是一种服务类型。Ingress 可能是暴露服务的最强大方式,但同时也是最复杂的。Ingress 控制器有各种类型,包括 Google Cloud Load Balancer,Nginx,Contour,Istio等等。


描述: Ingress-Nginx本质上是创建了一个Nginx的Node pod,只不过这个无需手写Nginx的配置文件而是通过自动生成的方式实现;

帮助参考
Ingress-Nginx 官方网站:https://kubernetes.github.io/ingress-nginx/
Ingress-Nginx Github地址:https://github.com/kubernetes/ingress-nginx
版本查看: https://github.com/kubernetes/ingress-nginx/releases

版本支持说明: https://github.com/kubernetes/ingress-nginx/#support-versions-table

配置指南

描述: 默认配置监视来自所有命名空间的Ingress 对象。要更改此行为,请使用标志将范围限制为特定命名空间。

定制NGINX有三种方式: 参考地址(https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/)

  • ConfigMap: 使用ConfigMap在NGINX中设置全局配置。

  • Annotations: 如果您需要特定入口规则的特定配置,请使用此选项。

  • Custom template: 当需要更具体的设置(如打开文件缓存)时,将侦听选项调整为rcvbuf或当无法通过ConfigMap更改配置时。

sysctl 调优
描述: 在演示使用 Init Container 来调整 sysctl 默认值 kubectl patch, 

安装部署

Ingress-Nginx 基础环境部署流程

  • (1) 使用 NodePort : https://kubernetes.github.io/ingress-nginx/deploy/

  • (2) 镜像拉取

  • (3) 更改Tag上传到私有仓库中

  • (4) 部署清单修改与部署

  • (5) 验证查看

  • (6) 运行的Pod过程查看

基础示例

官方示例参考: https://kubernetes.github.io/ingress-nginx/examples/

示例1.Ingress 常规使用方案

Ingress HTTP 代理访问资源清单的编写

操作流程:

示例2.Ingress HTTPS 代理访问

描述: TLS 证书配置参考地址(https://kubernetes.github.io/ingress-nginx/user-guide/tls/),注意创建自建证书(主:浏览器不认可的)。默认得Ingress-nginx配置了SSL会自动跳转到https网页。

资源清单示例:

操作流程

PS : 实际上我们通过Ingress资源清单添加的域名绑定主机时被写入到  Pod 中的nginx.conf 文件之中,这才能让我们通过自定义域名的方式访问虚拟主机;

Ingress-Nginx-Https配置示例:

示例3.Ingress Rewrite 重写重定向访问

描述: 以下是Ingress-Nginx 重写的相关属性

Ingress Rewrite 资源清单示例:

操作流程:

补充说明: Ingress-nginx 的前后端分离演示

  • 资源清单

  • 部署验证


示例4.Ingress VirtualHost 虚拟主机访问

描述: 我们知道Ingress-Nginx是基于Nginx的所以其也支持虚拟主机进行绑定访问,实现以不同的域名访问同一个web界面;

Ingress 资源清单示例:

操作流程

示例5.Ingress BasicAuth(基础认证)功能

描述:因为Ingress的实现方案采用的是Nginx的软件,所以Nginx的相关特性Ingress都支持, 下面我们利用 Nginx 的 BasicAuth 实现基础认证演示

Ingress 资源清单:

操作流程:

示例6.Ingress Redirect 域名重定向功能

描述: 我们可以利用Ingress中的域名重定向注解来实现访问重定向。

Ingress 规则配置清单示例:

部署资源清单以及查看

示例7.Ingress 黑白名单访问限制

描述: 某些内部系统可能只允许某些IP地址访问时,可利用 Ingress-nginx 的黑白名单,其实现的方式有如下两个。

  • Annotations(注解) :只对指定的ingress生效

  • ConfigMap(配置文件) :全局生效

Tips: 建议黑名单可以使用ConfigMap去配置,白名单建议使用Annotations去配置。

  • Step 1.添加白名单的方式可以直接写也可以配置在ConfigMap中。

  • Step 2.黑名单的方式也可以在annotations与ConfigMap中配置。
    描述: 我们可以在注解中加入则可以加入自定义片段。

示例8.Ingress Header 请求头匹配

描述: Ingress-nginx 的 匹配请求头,可以采用注解。

示例9.Ingress 灰度金丝雀发布

描述: 在某些情况下,您可能希望通过向与生产服务不同的服务发送少量请求来“金丝雀”一组新的更改。金丝雀注解使 Ingress 规范能够根据应用的规则充当路由请求的替代服务,在设置后可以启用以下用于配置金丝雀的注释:。

Nginx Annotations 支持以下 4 种 Canary 规则:

Tips : 金丝雀规则是按优先顺序计算的。优先级如下

Tips : 注意当您将入口标记为 Canary 时,除之外的所有其他非 Canary 注释都将被忽略(从相应的主入口继承)。`

资源配置清单:

示例10.Ingress 相关配置补充

  • (1) 自定义错误页面
    参考地址: https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/customization/custom-errors/custom-default-backend.yaml

描述: 可以修改 deploy.yaml 中指定 nginx-ingress-controller 运行的参数,在此处添加参数

  • (2) 连接和传输速率限制
    描述: 下述注释定义了对连接和传输速率的限制,这些可以用来减轻DDoS攻击。

示例说明:

企业实战

1.利用Ingress访问后端的Nginx Web和Tomcat后端综合实践。

实验目标:

  1. 在腾讯云创建以及证书以供Ingress使用。

  1. 分别在kubernetes集群中创建与应用。

  1. 分别使用Ingress控制器创建以SSL访问为NginxWeb而Tomcat 后端需要BasicAuth(基础认证)访问功能

详细流程:

  • Step 1.在腾讯云中申请免费的SSL证书(TrustAsia TLS)有效期一年,验证时需要设置域名的TXT解析, 申请地址:https://console.cloud.tencent.com/ssl。

  • Step 2.分别在kubernetes集群中创建与应用以及创建名称空间。

  • Step 3.验证SVC服务负载均衡和请求查看创建的应用

  • Step 4.采用 secrets 存储我们创建的证书, 参考地址:https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/PREREQUISITES.md#tls-certificates

  • Step 4.创建Ingress控制器的配置清单文件及Ingress对应规则。

  • Step 5.创建Ingress并查看相关信息

  • Step 6.验证Ingress规则配置的应用分别访问  与  站点。


问题1.K8s Nginx Ingress Controller 转发 X-Forwarded-Proto 请求头的问题

问题说明: 在 Kubernetes 集群上部署了 Nginx Ingress Controller 最前端用的是阿里云七层负载均衡,部署后发现不能正确转发 X-Forwarded-Proto 请求头,造成 http 重定向到 https 无法正常工作,请问如何解决

问题解决: 终于在 Nginx Ingress Controller 的官方帮助文档 Advanced Configuration with Annotations 中找到一个注解(annotation)解决了这个问题,它就是 

操作步骤
1)在 cnblogs-ingress.yaml 中 annotations 下面添加 nginx.org/redirect-to-https: "true"

  1. 更新 ingress 配置

  1. 更新 nginx-ingress

4)查看 inginx 容器中的配置

nginx-ingress 自己完成了基于 的 http 重定向到 https 的操作,应用都不需要自己处理了。

Tips :建议采用 kubernetes/ingress-nginx 而非 nginxinc/kubernetes-ingress : https://github.com/kubernetes/ingress-nginx

问题2:extensions/v1beta1 Ingress is deprecated in v1.14+, unavailable in v1.22+; use networking.k8s.io/v1 Ingress

解决办法:根据当前 Kubernetes 版本中资源组与版本进行选择即可;

问题3.Error from server (InternalError): error when applying patch:

错误信息:

解决办法: Webhook 删除后重新构建 ingress-nginx-http-v1.yaml 资源清单即可

问题4.查看ingress规则时提示警告

  • 问题信息:

  • 问题原因: 注意:根据您正在使用的Ingress控制器,您可能需要创建一个default-http-backend服务。没有规则的入口将所有流量发送到一个默认后端。默认后端通常是Ingress控制器的一个配置选项,在您的Ingress资源中没有指定。如果Ingress对象中的主机或路径都不匹配HTTP请求,则流量将被路由到默认后端。

  • 解决办法:

欢迎关注:


历史文章

1.Containerd容器运行时初识与尝试

本文地址:https://sicmodule.kub2b.com/news/14933.html     企库往 https://sicmodule.kub2b.com/ , 查看更多

特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。

 
 
更多>同类最新资讯
0相关评论

文章列表
相关文章
最新动态
推荐图文
最新资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  使用协议  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号