前言

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. GCC(警告.优化以及调试选项)

    GCC(警告.优化以及调试选项) [介绍] gcc and g++分别是gnu的c & c++编译器   gcc/g++在执行编译工作的时候,总共需要4步   1.预处理,生成.i的文件 预处 ...

  2. 交换知识 VLAN VTP STP 单臂路由

    第1章 交换基础 1.1 园区网分层结构 层次 作用 出口层 广域网接入 出口策略 带宽控制 核心层 高速转发 服务器接入 路由选择 汇聚层 流量汇聚 链路冗余 设备冗余 路由选择 接入层 用户接入 ...

  3. C语言实现二叉树的基本操作

    二叉树是一种非常重要的数据结构.本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历.中序遍历.后序遍历.层次遍历),二叉搜索树的构造等. 1. 二叉树的构建 二叉树的基本 ...

  4. wx:for修改样式

    在获取文字识别数据之后,对数据进行wx:for循环加了边框如图效果: 需求:点击不同边框获取不同文字,再次点击取消选中:选中背景为#999: <view wx:for="{{img_d ...

  5. 浅谈字体小图标font awesome,iconfont,svg各自优缺点

    三种都是矢量图(即放大不失真),但是个自又有个自的优缺点, 1.font awesome: 优点:相对比较简单,查看官网看例子基本上都会用 (http://www.bootcss.com/p/font ...

  6. Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

    由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二 ...

  7. C#.NET 用程序画图,曲线图

    using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security ...

  8. 三:动态SQL

    :动态SQL 1.使用动态sql完成多条件查询 If:利用if实现简单的条件选择 Choose(when,otherwise):相当于java中的switch语句,通常与whenhe otherwis ...

  9. Bean property属性说明

                                  来自为知笔记(Wiz)

  10. 安装scrapy框架的常见问题及其解决方法

    下面小编讲一下自己在windows10安装及配置Scrapy中遇到的一些坑及其解决的方法,现在总结如下,希望对大家有所帮助. 常见问题一:pip版本需要升级 如果你的pip版本比较老,可能在安装的过程 ...