本文分享自华为云社区《nginx-ingress工作原理以及多nginx-ingress部署注意事项》,作者: 可以交个朋友。

一、nginx-ingress工作原理

nginx-ingress对应的容器中有两个核心组件:nginx-ingress-controller和nginx。其中nginx-ingress-controller负责list-watch kube-apiserver监听ingress、service、endpoint、configmap资源的状态变化,转变为nginx配置,刷新给容器中nginx进程,再由nginx对外保留服务提供转发能力,大致工作流程如下:

  • nginx-ingress实例运行,nginx-ingress-controller list-watch kube-apiserver,获取相关资源变化;
  • 当用户创建ingress资源时,当nginx-ingress-controller开启webhook能力时,kube-apiserver根据对应的AdmissionWebhook描述调用nginx-ingress的8443端口,校验ingress资源合法性,通过后写入ETCD;
  • nginx-ingress watch到ingress资源变化(创建新的ingress资源),获取对应的service、endpoint、configmap(如果涉及证书),转为为nginx配置,重写nginx.conf配置;
  • 当请求访问到nginx-ingress 80或者443端口时,nginx开始处理转发请求,如果满足nginx.conf规则,nginx的lua脚本会调用kube-apiserver接口获取转发到真实后端podip;

理解nginx-ingress原理后,那么部署多个nginx-ingress的关键注意事项也就出来了:

  • 创建多个nginx-ingress,多个nginx-ingress如何标识自己?
  • 创建一个ingress资源后,在有多个nginx-ingress都在watch ingress的情况下,希望哪一个或者几个nginx-ingress““捕获”并作用?
  • 当部署了多个nginx-ingress,如果部分开启了webhook能力,当创建ingress资源后,kube-apiserver会调用哪个nginx-ingress的webhook去校验?

二、多nginx-ingress安装注意事项

2.1 多个nginx-ingress启动参数中–controller-class均不相同

nginx-ingress-a实例启动参数

nginx-ingress-b实例启动参数

2.2 通过ingress资源中spec.ingressClassName指定相关联nginx-ingress

kubernetes 1.23.x以下版本对应的apiVersion:networking.k8s.io/v1beta1

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-a
namespace: nginx-a
annotations:
kubernetes.io/ingress.class: custom-nginx-a
spec:
rules:
- http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: ImplementationSpecific
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITHSTARTS_WITH

kubernetes v1.23版本及以上apiVersion 是networking.k8s.io/v1

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test-a
namespace: nginx-a
spec:
ingressClassName: custom-nginx-a
rules:
- http:
paths:
- backend:
service:
name: nginx
port:
number: 80
path: /
pathType: ImplementationSpecific
property:
ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH

2.3 多nginx-ingress场景下,通过admissionwebhook作用域限制单个nginx-ingress webhook作用范围

admission webhook作用域默认是全局的,如果一个集群中有多个nginx-ingress组件(通过ingressClass区域),由于有多个ValidatingAdmissionWebhook,当某个ingress资源创建时,kube-apiserver会调用多个nginx-ingress webhok能力进行校验,当某个nginx-ingress出现故障(可能与该ingress资源并不关联),将会阻塞所有的ingress的写入。

多nginx-ingress场景下建议通过admissionwebhook 自带的namespaceSelector控制每个nginx-ingress的作用域,使其作用到指定的命名空间,只教验作用域命名空间下的ingresses资源。

 admissionwebhook:
namespaceSelector:
matchExpressions:
- key: kubernetes.io/metadata.name #需要教验的namespace含有的标签key
operator: In
values: ["${namespace}"] # namespace含有的标签value(默认命名空间本身)
rules:
- operations: ["CREATE","UPDATE"]
apiGroups: ["*"]
apiVersions: ["*"]
resources: ["ingresses"] #限制作用资源
scope: "*" #由于限制了作用资源ingresses,无需配置
objectSelector: {}

如果集群版本在1.28及以上,可以通过matchConditions匹配请求,直接筛选ingressClassName字段,官网详情

三、安装部署多个nginx-ingress

登录到集群,将ingress-controller helm包下载到集群

wget https://github.com/kubernetes/ingress-nginx/releases/download/helm-chart-4.3.0/ingress-nginx-4.3.0.tgz

新建myvalue.yaml文件,内容如下;安装时指定此配置文件,其它未进行指定的参数会使用安装包中value.yaml默认配置值。

imagePullSecrets: {}   #若仓库开启认证需要配置该字段
controller:
name: controller #自定义controller名称,不可重复
image:
repository: swr.cn-north-4.myhuaweicloud.com/hwofficial/nginx-ingress # controller镜像地址设定
tag: "v1.2.1"
ingressClass: custom-nginx # 设定ingress-class值,不可重复
ingressClassResource:
name: custom-nginx #设定ingressClass资源名称,不可重复
controllerValue: k8s.io/custom-nginx #设定监测ingressClass资源的controller,不可重复
# 设定controller要使用的loadbalancer service,本例中使用的是独享型ELB
service:
annotations: {
# kubernetes.io/elb.class: performance #开启后turbo集群直通pod(仅限独享型elb)
kubernetes.io/elb.id: 3660aa3c-xxxx-xxxx-xxxx-xxxxff97xxxx #ELB ID,不可重复
}
# 设定controller的资源限制
resources:
requests:
cpu: 200m
memory: 200Mi
# 挂载节点上的/etc/localtime文件,进行时区同步
extraVolumeMounts:
- name: localtime
mountPath: /etc/localtime
readOnly: true
extraVolumes:
- name: localtime
hostPath:
path: /etc/localtime
admissionWebhooks:
enabled: true
failurePolicy: Fail
port: 8443
certificate: "/usr/local/certificates/cert"
key: "/usr/local/certificates/key"
namespaceSelector:
matchExpressions:
- key: kubernetes.io/metadata.name
operator: In
values: ["${namespace}"] # ${namespace}修改为业务负载所在的命名空间,逗号分割
rules:
- operations: ["CREATE","UPDATE"]
apiGroups: ["*"]
apiVersions: ["*"]
resources: ["ingresses"]
scope: "*"
networkPolicyEnabled: false
service:
servicePort: 443
type: ClusterIP
createSecretJob:
resources:
limits:
cpu: 20m
memory: 40Mi
requests:
cpu: 10m
memory: 20Mi
patch:
enabled: true
image:
registry: registry.k8s.io # registry.k8s.io,webhook官网镜像仓库需要替换成自己镜像所在仓库地址
image: ingress-nginx/kube-webhook-certgen # ingress-nginx/kube-webhook-certgen
tag: v1.1.1 # v20220916-gd32f8c343
pullPolicy: IfNotPresent
nodeSelector:
kubernetes.io/os: linux
securityContext:
runAsNonRoot: true
runAsUser: 2000
fsGroup: 2000
defaultBackend:
enabled: false # 关闭defaultBackend

value配置文件注解如下:

  • 部署多个nginx-ingress场景下,不可重复字段的值需配置不同
  • 文件中开启admissionWebhooks功能,通过配置admissionwebhook,避免了因配置错误导致ingress-controller不必要的reload。开启此特性后,如需卸载重装ingress-controller,会有webhook对应的secret残留,如果再部署同名的ingress-controller有可能造成controller不可用,需要注意手动清理。
  • 将ingress-controller部署到指定的命名空间${namespace}

helm install ingress-nginx-controller -f myvalue.yaml ./ingress-nginx-a -n ${namespace}
  • 部署多套nginx-ingress重复以上2-3即可

效果展示

查看controller实例是否部署成功

ingressclasses资源

查看访问入口ELB地址

创建测试工作负载、service和ingress资源

访问测试

点击关注,第一时间了解华为云新鲜技术~

教你几个部署多个nginx-ingress的注意事项的更多相关文章

  1. 手把手教你在Ubuntu上分别安装Nginx、PHP和Mysql

    手把手教你在Ubuntu上分别安装Nginx.PHP和Mysql

  2. 初次部署django+gunicorn+nginx

    初次部署django+gunicorn+nginx  博客详细地址  https://www.cnblogs.com/nanrou/p/7026802.html 写在前面,这只是我所遇到的情况,如果有 ...

  3. kubernetes nginx ingress controller部署

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

  4. 使用Docker快速部署ELK分析Nginx日志实践(二)

    Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ...

  5. 使用Docker快速部署ELK分析Nginx日志实践

    原文:使用Docker快速部署ELK分析Nginx日志实践 一.背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前 ...

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

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

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

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

  8. Nginx Ingress on TKE 部署最佳实践

    概述 开源的 Ingress Controller 的实现使用量最大的莫过于 Nginx Ingress 了,功能强大且性能极高.Nginx Ingress 有多种部署方式,本文将介绍 Nginx I ...

  9. 手把手教你使用 Nginx Ingress 实现金丝雀发布

    概述 本文将介绍如何使用 Nginx Ingress 实现金丝雀发布,从使用场景分析,到用法详解,再到上手实践. 前提条件 集群中需要部署 Nginx Ingress 作为 Ingress Contr ...

  10. (已经成功部署)配置vue+nginx+uwsgi luffy项目

    2019-9-16 21:16:17 由于超哥视频翻车,应该是先改api.js中的IP 再打包 然后按照原来一步一步部署vue uwsgi  Nginx 然后就可以直接访问了!!! 昨天其实就完成,只 ...

随机推荐

  1. OpenSSL 生成 RootCA (根证书)并自签署证书(支持 IP 地址)

    背景 某机房内部访问需要配置 HTTPS,网上找的一些证书教程都不是特别好,有些直接生成证书,没有根 CA 的证书导致信任不了 Ubuntu 机器,有些教程只有域名生成,没有 IP 生成,有些甚至报错 ...

  2. WSL2 中访问 Windows 的代理的最简易方案

    前言 学校的网卡不允许运行虚拟机,所以必须将 WSL 的流量变成主机的流量,但从百度查的方案都是设置 Windows 主机的 IP,都忽视了 Windows 的默认功能,即 mdns 或 Window ...

  3. EMC ndmp NAS

    NAS 是带存储系统的专用高性能文件服务器.它可提供文件级数据访问和共享. NAS 使用网络和文件共享协议,包括用于数据传输的 TCP/IP 以及用于远程文件服务的 CIFS 和 NFS. 最简单的备 ...

  4. ABC322 A-F 题解

    前言 为什么 ABC 天天出原题. 为什么 D 题这么答辩. A 直接找. 赛时代码 B 模拟. 赛时代码 C 对于每一个节日从后往前扫到上一个节日. 赛时代码 D 搜索,不需要任何剪枝,直接爆搜. ...

  5. 17.2 实现无管道正向CMD

    WSASocket 无管道正向CMD,使用WSASocket函数创建一个TCP套接字,并绑定到一个本地地址和端口上.然后使用CreateProcess函数创建一个新的CMD进程,并将标准输入.输出和错 ...

  6. ansible平台

    1.ansible概念: 1)ansible和saltstck是目前互联网IT运维人员使用最多的自动化运维管理工具,主要用于对批量(并行)Linux服务器:安装.部署.配置.指令操作.任务计划.参数调 ...

  7. WebSocket connection to 'ws://127.0.0.1:8089/websocket/0,1,10,admin' failed:

    WebSocket连接失败 背景: 相同项目数据库从mysql变更到sqlite,代码层面基本没有变更,但是WebSocket连接失败,查找多方原因,未找到问题,最后发现新项目JDK为OpenJDK, ...

  8. QT中级(2)QTableView自定义委托(二)实现QProgressBar委托

    同系列文章 QT中级(1)QTableView自定义委托(一)实现QSpinBox.QDoubleSpinBox委托 QT中级(2)QTableView自定义委托(二)实现QProgressBar委托 ...

  9. 管道channel

    管道 go语言中管道底层是一个环形队列(先进先出),写入(send)和 取出(recv)都是从同一个位置按照同一方向顺序执行. sendx表示最后一次插入元素位置,recvx表示最后一次取出元素的位置 ...

  10. python3使用sqlite3构建本地持久化缓存

    环境:Windows 10_x64 python版本:3.9.2 sqlite3版本:3.34.0 日常python开发中会遇到数据持久化的问题,今天记录下如何使用sqlite3进行数据持久化,并提供 ...