kubernetes nginx ingress 使用记录

时间:2022-09-18 23:24:21

前言

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. ZooKeeper测试笔记

    1. 下载ZooKeeper.官网:http://zookeeper.apache.org 下载后解压,假定zookeeper程序目录为/home/test/zookeeper,为陈述方便此目录记为 ...

  2. java培训第一天--画板

    package day1; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt ...

  3. linux spi 设备节点 读写

    本文记录spi设备节点的操作方法. SPI总线设备文件名通常为/dev/spidevN.P(N=0.1.2--,P=0.1.2--), 其中N表示第几路SPI总线,而P表示在该路SPI总线中使用哪个C ...

  4. hdu 2052 Picture(java)

    问题: 開始直接用输入的数作为宽和高,但实际上要多出两行边框,所以要加一个2. 还有题目要求最后要输出一个空行没有注意到. Picture Time Limit: 1000/1000 MS (Java ...

  5. 【PHP代码审计】 那些年我们一起挖掘SQL注入 - 4.全局防护Bypass之二次注入

    0x01 背景 现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号.二次注入也是 ...

  6. ANDROID_MARS学习笔记_S02_002_Date\TimePicker

    一.文档用法 1.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

  7. Engineer Economic

    1.选择题 10.下列哪项不属于总成本费用() A.生产成本    B.机会成本    C.管理费用    D.财务费用 第1章 11.下列哪项关于自有资金的表述是错误的(D) A.自有资金包括资本金 ...

  8. angular&period;isString&lpar;&rpar;

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. CR--同事分享学习

    1.持续发布是什么? 频繁地将软件的新版本,交付给质量团队或者用户,以供评审. 2.对接持续发布需要具备什么条件? 1)  测试自动化程度较高,持续发布的终态是不需要人工介入 2)  做到持续集成,持 ...

  10. You Don&&num;39&semi;t Know JS&colon; this &amp&semi; Object Prototypes (第6章 Behavior Delegation)附加的ES6 class未读

    本章深挖原型机制. [[Prototype]]比类更直接和简单! https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%2 ...