本文分享自华为云社区《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. 软件开发人员 Kubernetes 入门指南|Part 1

    Kubernetes 是一个用于部署和管理容器的编排系统.使用 Kubernetes,用户可以通过自动执行管理任务(例如在跨节点间扩展容器并在容器停止时重新启动任务),在不同环境中可靠地运行容器. K ...

  2. python---简单最大类间方差法(OTSU)算法

    from matplotlib import pyplot as plt # cv2.imread()用于读取图片文件 # imread函数有两个参数,第一个参数是图片路径,第二个参数表示读取图片的形 ...

  3. 使用PasteSpider把你的代码升级到服务器的Docker/Podman上,K8S太庞大,PasteSpider极易上手!

    如果你的服务器的内存小于16GB,那么K8S就和你无缘了,但是你可以使用PasteSpider来实现发布你的项目到服务器上! PasteSpider是一个运维工具,使用NET编写的,部署于服务器的Do ...

  4. 01-linux - kvm

    配置linux kvm 逻辑卷 # df -h # fdisk -l | grep dev # pvs # pvcreate /dev/sdg # pvs # vgcreate oradata /de ...

  5. java实现朴素rpc

    五层协议中,RPC在第几层? 五层协议 应用层 传输层 网络层 链路层 物理层 我不知道,我要去大气层! 远程过程调用(RPC),比较朴素的说法就是,从某台机器调用另一台机器的一段代码,并获取返回结果 ...

  6. MPL协议原文

    MPL协议原文 原文参考链接 中文翻译有一个,但是只翻译了两条 原文 Mozilla Public License Version 2.0 1. Definitions 1.1. "Cont ...

  7. 概率期望 DP 题解合集

    期望这东西学了一次忘了,再学一次过了两天又不会了.我是鱼. 故写此博客以便加深记忆及日后复习. NOIP 前恶补期望(? 希望有用,RP++() 经典问题 1 某事件发生概率为 \(p\),则该事件首 ...

  8. Hooks的核心原理梳理

    我们前端都在诟病专业版,它的组件,它的耦合嵌套之深,它的性能. 我们希望改善,我们认为,如果--就好了. 如果重构就好了,如果技术栈统一就好了,如果有规范就好了. 其实,不用等,我们只要在写代码,就可 ...

  9. SNN_文献阅读_Recent Advances and New Frontiers in Spiking Neural Networks

    Recent Advances and New Frontiers in Spiking Neural Networks 基本要素:包括神经元模型.神经元中脉冲序列的编码方法.神经网络中每个基本层的拓 ...

  10. P5318 查阅文献

    题意大概意思就是分别用dfs与bfs遍历一个图,特殊要求是从编号小的点开始遍历. 用邻接表存图,至今我也没想明白怎么才可以从编号小的点开始遍历,明白是排序,但是不知道如何排序,题解中的排序方法是:按照 ...