ingress nginx

一、Ingress-Nginx工作原理



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



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



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



4.然后reload一下使配置生效。以此达到域名分配置和动态更新的问题。

https://www.yisu.com/zixun/5846.html
https://my.oschina.net/u/4437985/blog/4425187
本文所讲的配置规则,都配置在 annotations(局部配置) 中,Ingress Nginx Deployment 必须配置 –annotations-prefix 参数,默认以 nginx.ingress.kubernetes.io 开头。
https://zhuanlan.zhihu.com/p/103245532



https://www.h3399.cn/202002/753324.html



重点看这个
https://kubernetes.github.io/ingress-nginx/examples/rewrite/
https://segmentfault.com/a/1190000024512206



https://mritd.com/2017/03/04/how-to-use-nginx-ingress/



https://kubernetes.io/docs/concepts/services-networking/ingress/



https://kubernetes.io/zh/docs/concepts/services-networking/ingress/



与所有其他 Kubernetes 资源一样,Ingress 需要使用 apiVersion、kind 和 metadata 字段。 Ingress 对象的命名必须是合法的 DNS 子域名名称。 有关使用配置文件的一般信息,请参见部署应用、 配置容器、 管理资源。 Ingress 经常使用注解(annotations)来配置一些选项,具体取决于 Ingress 控制器,例如 重写目标注解。 不同的 Ingress 控制器 支持不同的注解。查看文档以供你选择 Ingress 控制器,以了解支持哪些注解。



Ingress 规则
每个 HTTP 规则都包含以下信息:



可选的 host。在此示例中,未指定 host,因此该规则适用于通过指定 IP 地址的所有入站 HTTP 通信。 如果提供了 host(例如 foo.bar.com),则 rules 适用于该 host。
路径列表 paths(例如,/testpath),每个路径都有一个由 serviceName 和 servicePort 定义的关联后端。 在负载均衡器将流量定向到引用的服务之前,主机和路径都必须匹配传入请求的内容。
backend(后端)是 Service 文档中所述的服务和端口名称的组合。 与规则的 host 和 path 匹配的对 Ingress 的 HTTP(和 HTTPS )请求将发送到列出的 backend。
通常在 Ingress 控制器中会配置 defaultBackend(默认后端),以服务于任何不符合规约中 path 的请求。



DefaultBackend
没有 rules 的 Ingress 将所有流量发送到同一个默认后端。 defaultBackend 通常是 Ingress 控制器 的配置选项,而非在 Ingress 资源中指定。



如果 hosts 或 paths 都没有与 Ingress 对象中的 HTTP 请求匹配,则流量将路由到默认后端。



资源后端
Resource 后端是一个 ObjectRef,指向同一名字空间中的另一个 Kubernetes,将其作为 Ingress 对象。Resource 与 Service 配置是互斥的,在 二者均被设置时会无法通过合法性检查。 Resource 后端的一种常见用法是将所有入站数据导向带有静态资产的对象存储后端。



路径类型
Ingress 中的每个路径都需要有对应的路径类型(Path Type)。未明确设置 pathType 的路径无法通过合法性检查。当前支持的路径类型有三种:



ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的 pathType 处理或者与 Prefix 或 Exact 类型作相同处理。



Exact:精确匹配 URL 路径,且区分大小写。



Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 / 分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。



说明: 如果路径的最后一个元素是请求路径中最后一个元素的子字符串,则不会匹配 (例如:/foo/bar 匹配 /foo/bar/baz, 但不匹配 /foo/barbaz)。



https://kubernetes.io/zh/docs/concepts/overview/working-with-objects/names/#dns-subdomain-names



https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md



DNS
你可以(几乎总是应该)使用附加组件 为 Kubernetes 集群设置 DNS 服务。



支持集群的 DNS 服务器(例如 CoreDNS)监视 Kubernetes API 中的新服务,并为每个服务创建一组 DNS 记录。 如果在整个集群中都启用了 DNS,则所有 Pod 都应该能够通过其 DNS 名称自动解析服务。



例如,如果你在 Kubernetes 命名空间 my-ns 中有一个名为 my-service 的服务, 则控制平面和 DNS 服务共同为 my-service.my-ns 创建 DNS 记录。 my-ns 命名空间中的 Pod 应该能够通过简单地按名检索 my-service 来找到它 (my-service.my-ns 也可以工作)。



其他命名空间中的 Pod 必须将名称限定为 my-service.my-ns。 这些名称将解析为为服务分配的集群 IP。



Kubernetes 还支持命名端口的 DNS SRV(服务)记录。 如果 my-service.my-ns 服务具有名为 http 的端口,且协议设置为 TCP, 则可以对 _http._tcp.my-service.my-ns 执行 DNS SRV 查询查询以发现该端口号, “http” 以及 IP 地址。



Kubernetes DNS 服务器是唯一的一种能够访问 ExternalName 类型的 Service 的方式。 更多关于 ExternalName 信息可以查看 DNS Pod 和 Service。



https://kubernetes.io/zh/docs/concepts/services-networking/service/



https://kubernetes.io/zh/docs/concepts/services-networking/ingress-controllers/



https://kubernetes.io/docs/concepts/services-networking/ingress/


Category k8s