前言

ingress是一种可以暴露k8s集群内部service的方式,用户编辑配置文件定义一个ingress资源即可实现外部网络访问内网service。

ingress controller是来管理所有的Ingress的对象,ingress controller内部其实是一个nginx的容器,当ingress controll 通过与 Kubernetes API 交互,感知集群中Ingress规则变化时会按照模板文件生成nginx.conf文件,然后reload该配置文件。

相对于kubernetes通过nodePort方式暴露服务来说,可以提供更加高级的特性,尤其对于HTTP服务来说,他可以实现负载均衡,SSL,虚拟主机等,并且ingress是直接将数据包转发至pod,不会在经过kube-proxy,相对来说更加高效。

搭建环境

用户可以参照官方文档Deployment 进行环境搭建。

  • 首先得设置一个default-backend service。 如果未匹配到所有的Ingress对象,则会将所有的请求都转发至这个默认的ingress对象,在这里可以返回一些错误信息等;
  • 然后是设置集群的RBAC,由于ingress controller要访问api server,所以需要给他配置资源访问权限;
  • 安装ingress controller, 一般是以DaemonSet形式在每个node上创建一个资源,然后以hostNetwork的方式开放一个端口
  • 最后就是创建想要暴露的服务的ingress对象

经过上面的几步就可以在集群外访问该service了, 但是访问的时候注意ingress controller内部其实是一个nginx服务器,它也是通过配置文件中的虚拟主机server_name来分辨该转发到后端哪个service上的,对于http请求必须在请求的header中加上Host字段,所以如果没有配置DNS域名解析,在浏览器里访问时可以修改/etc/hosts文件,也可以用curl -H "Host: xxxxx.com" nodeIp来实现。

对于需要自定义default-backend的同学可以根据Custom errors 自定义后端的实现,

ingress controller reload

上面讲到当我们创建ingress的时候,Ingress controller会进行relaod,这期间nginx需要替换nginx worker进程, 这将导致服务出现短暂的异常。使用Jmeter进行分布式压测一个服务中,观察到的情况是qps无影响,但是会出现0.01%的错误返回结果,在一些小并发的情况下这可以接收,但是如果是高并发的场景,并且后端服务的service ingress对象较多,此时reload的也会比较频繁,对于一些服务是无法接受的。

有一个解决方式就是在集群里里定义多个Ingress controller对象,然后根据ingress的情况分别注册到不同的ingress controller之上,这样就可以实现分组的概念,一个组里添加ingress不会导致另一个组进行reload, 使用时需要在ingress controller 的yaml定义文件中指定--ingress-class选项,然后在Ingress 的yaml 定义文件中添加 annotation : kubernetes.io/ingress.class 关联对应的controll class。

注意如果是在同一台主机之上启动多个ingress controller则需要改变默认配置的端口号,否则会发生端口冲突,需要在镜像的启动参数中添加 --http-port,--https-port, --status-port, --healthz-port这几个选项来改变端口。

nginx ingress的配置

nginx是个功能强大的负载均衡,反向代理服务器,如果仅仅通过默认的模板生成的nginx.conf文件可能不能满足我们的需求,并且可能存在坑,所以需要自定义配置的话可以通过三种方式实现:

  • 通过configMap,具体参见NGINX Ingress controller configuration ConfigMap,他是全局的设置,直接配置nginx.conf的生成,影响管理的全部Ingress,但是需要指定-configmap=$(POD_NAMESPACE)/nginx-configuration选项;
  • 通过Annotations是对单独的某个service的ingress进行配置;
  • 高级玩家是直接自定义template来控制nginx controll 生成nginx.conf文件

nginx ingress的四层代理

nginx支持四层代理,引用到ingress中也同样支持,表现形式与nodePort差不多,都需要在主机上开放一个端口,但是支持一些Nginx的功能,感觉比较鸡肋,参见Exposing TCP and UDP services, 实现方式是通过一个configMap 来指定主机端口和内网service的对应关系。

kubernetes nginx ingress 使用记录的更多相关文章

  1. kubernetes nginx ingress controller部署

    Kubernetes nginx ingress controller部署 1.下载kubernetes nginx的yaml文件 Wget https://raw.githubusercontent ...

  2. [经验交流] Kubernetes Nginx Ingress 安装与使用

    Ingress 介绍 Kubernetes 上部署的微服务运行在它的私有网络中, 通过Pod实例的hostPort或Service实例的NodePort可以暴露到主机端口上,便于用户访问.但这样的方法 ...

  3. Kubernetes 服务入口管理与 Nginx Ingress Controller

    Kubernetes 具有强大的副本,动态扩容等特性,每一次 Pod 的变化 IP 地址都会发生变化,所以 Kubernetes 引进了 Service 的概念.Kubernetes 中使用 Serv ...

  4. 见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx

    前天才发现,区区一个 nginx ingress controller 竟然2个不同的实现.一个叫 kubernetes/ingress-nginx ,是由 kubernetes 社区维护的,对应的容 ...

  5. Kubernetes 部署 Nginx Ingress Controller 之 nginxinc/kubernetes-ingress

    更新:这里用的是 nginxinc/kubernetes-ingress ,还有个 kubernetes/ingress-nginx ,它们的区别见 Differences Between nginx ...

  6. kubernetes Traefik ingress配置详解

    理解Ingress 简单的说,ingress就是从kubernetes集群外访问集群的入口,将用户的URL请求转发到不同的service上.Ingress相当于nginx.apache等负载均衡方向代 ...

  7. Helm 安装Nginx Ingress

    为了便于将集群中的服务暴露到集群外部,需要使用Ingress.接下来使用Helm将Nginx Ingress部署到Kubernetes上. Nginx Ingress Controller被部署在Ku ...

  8. Kubernetes: NGINX/PHP-FPM 502错误和优雅结束

    我们有一个运行在Kubernetes上的PHP应用,每个POD由两个独立的容器组成 - Nginx和PHP-FPM. 在我们对应用进行缩容时,遇到了502错误,例如,当一个POD在结束中时,POD里面 ...

  9. kubernetes之ingress及ingress controller

    什么是ingress Ingress是授权入站连接到达集群服务的规则集合. 从外部流量调度到nodeprot上的service 从service调度到ingress-controller ingres ...

随机推荐

  1. Ant 基本语法的使用示列

    ant -f build.xml  执行你的build.xml文件   <?xml version = "1.0"?> <project name = " ...

  2. TinyXML2的使用

    -----------------------------------------------------------------2015年7月21日16:37:53----------------- ...

  3. Hibernate的基础入门(一)

    一Java三层结构 1 web层:struts框架 2 service层:Spring框架 3  dao层 :hibernate框架 相当于MVC的思想 1 M:模型èhibernate框架 2 V: ...

  4. AngularJS学习篇(十四)

    AngularJS 事件 ng-click 指令 ng-click 指令定义了 AngularJS 点击事件. <!DOCTYPE html> <html> <head& ...

  5. JavaScript Function.call() 函数详解

    语法 functionObject.call( [ thisObj [, arg1 [, arg2 [, args...]]]] ) call()函数用于调用当前函数functionObject,并可 ...

  6. Java面试题-2

    程序员面试之九阴真经 谈谈final, finally, finalize的区别: final:::修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承.因此 ...

  7. 都说 WebP 厉害,究竟厉害在哪里?

    之前在< WebP 的前世今生 >一文中,介绍了 WebP 图片格式是由 Google 基于 VP8 视频编码格式研发的,同时提供有损压缩和无损压缩两种格式,那么今天就来看看 WebP 有 ...

  8. C#对话框的使用

    [函数] <整型> MessageBox(<字符串> Text, <字符串> Title, <整型> nType,MessageBoxIcon);[函数 ...

  9. c# asp.net 多数组索引的解决方法

    本人今天做了一个功能 需要在一个类里用多个数组, 数组需要索引器来调用  一个数组 我查了msdn 一个类里面只能有一个this 索引器 那这么多数组如何构造索引呢 我在坛子里找到了解决之道 view ...

  10. [转载] Java集合框架之小结

    转载自http://jiangzhengjun.iteye.com/blog/553191 1.Java容器类库的简化图,下面是集合类库更加完备的图.包括抽象类和遗留构件(不包括Queue的实现): ...