教你几个部署多个nginx-ingress的注意事项
本文分享自华为云社区《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的注意事项的更多相关文章
- 手把手教你在Ubuntu上分别安装Nginx、PHP和Mysql
		手把手教你在Ubuntu上分别安装Nginx.PHP和Mysql 
- 初次部署django+gunicorn+nginx
		初次部署django+gunicorn+nginx 博客详细地址 https://www.cnblogs.com/nanrou/p/7026802.html 写在前面,这只是我所遇到的情况,如果有 ... 
- kubernetes nginx ingress controller部署
		Kubernetes nginx ingress controller部署 1.下载kubernetes nginx的yaml文件 Wget https://raw.githubusercontent ... 
- 使用Docker快速部署ELK分析Nginx日志实践(二)
		Kibana汉化使用中文界面实践 一.背景 笔者在上一篇文章使用Docker快速部署ELK分析Nginx日志实践当中有提到如何快速搭建ELK分析Nginx日志,但是这只是第一步,后面还有很多仪表盘需要 ... 
- 使用Docker快速部署ELK分析Nginx日志实践
		原文:使用Docker快速部署ELK分析Nginx日志实践 一.背景 笔者所在项目组的项目由多个子项目所组成,每一个子项目都存在一定的日志,有时候想排查一些问题,需要到各个地方去查看,极为不方便,此前 ... 
- 见异思迁:K8s 部署 Nginx Ingress Controller 之 kubernetes/ingress-nginx
		前天才发现,区区一个 nginx ingress controller 竟然2个不同的实现.一个叫 kubernetes/ingress-nginx ,是由 kubernetes 社区维护的,对应的容 ... 
- Kubernetes 部署 Nginx Ingress Controller 之 nginxinc/kubernetes-ingress
		更新:这里用的是 nginxinc/kubernetes-ingress ,还有个 kubernetes/ingress-nginx ,它们的区别见 Differences Between nginx ... 
- Nginx Ingress on TKE 部署最佳实践
		概述 开源的 Ingress Controller 的实现使用量最大的莫过于 Nginx Ingress 了,功能强大且性能极高.Nginx Ingress 有多种部署方式,本文将介绍 Nginx I ... 
- 手把手教你使用 Nginx Ingress 实现金丝雀发布
		概述 本文将介绍如何使用 Nginx Ingress 实现金丝雀发布,从使用场景分析,到用法详解,再到上手实践. 前提条件 集群中需要部署 Nginx Ingress 作为 Ingress Contr ... 
- (已经成功部署)配置vue+nginx+uwsgi  luffy项目
		2019-9-16 21:16:17 由于超哥视频翻车,应该是先改api.js中的IP 再打包 然后按照原来一步一步部署vue uwsgi Nginx 然后就可以直接访问了!!! 昨天其实就完成,只 ... 
随机推荐
- 软件开发人员 Kubernetes 入门指南|Part 1
			Kubernetes 是一个用于部署和管理容器的编排系统.使用 Kubernetes,用户可以通过自动执行管理任务(例如在跨节点间扩展容器并在容器停止时重新启动任务),在不同环境中可靠地运行容器. K ... 
- python---简单最大类间方差法(OTSU)算法
			from matplotlib import pyplot as plt # cv2.imread()用于读取图片文件 # imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形 ... 
- 使用PasteSpider把你的代码升级到服务器的Docker/Podman上,K8S太庞大,PasteSpider极易上手!
			如果你的服务器的内存小于16GB,那么K8S就和你无缘了,但是你可以使用PasteSpider来实现发布你的项目到服务器上! PasteSpider是一个运维工具,使用NET编写的,部署于服务器的Do ... 
- 01-linux - kvm
			配置linux kvm 逻辑卷 # df -h # fdisk -l | grep dev # pvs # pvcreate /dev/sdg # pvs # vgcreate oradata /de ... 
- java实现朴素rpc
			五层协议中,RPC在第几层? 五层协议 应用层 传输层 网络层 链路层 物理层 我不知道,我要去大气层! 远程过程调用(RPC),比较朴素的说法就是,从某台机器调用另一台机器的一段代码,并获取返回结果 ... 
- MPL协议原文
			MPL协议原文 原文参考链接 中文翻译有一个,但是只翻译了两条 原文 Mozilla Public License Version 2.0 1. Definitions 1.1. "Cont ... 
- 概率期望 DP 题解合集
			期望这东西学了一次忘了,再学一次过了两天又不会了.我是鱼. 故写此博客以便加深记忆及日后复习. NOIP 前恶补期望(? 希望有用,RP++() 经典问题 1 某事件发生概率为 \(p\),则该事件首 ... 
- Hooks的核心原理梳理
			我们前端都在诟病专业版,它的组件,它的耦合嵌套之深,它的性能. 我们希望改善,我们认为,如果--就好了. 如果重构就好了,如果技术栈统一就好了,如果有规范就好了. 其实,不用等,我们只要在写代码,就可 ... 
- SNN_文献阅读_Recent Advances and New Frontiers in Spiking Neural Networks
			Recent Advances and New Frontiers in Spiking Neural Networks 基本要素:包括神经元模型.神经元中脉冲序列的编码方法.神经网络中每个基本层的拓 ... 
- P5318 查阅文献
			题意大概意思就是分别用dfs与bfs遍历一个图,特殊要求是从编号小的点开始遍历. 用邻接表存图,至今我也没想明白怎么才可以从编号小的点开始遍历,明白是排序,但是不知道如何排序,题解中的排序方法是:按照 ... 
