云原生
Kubernetes基础
容器技术介绍
Docker快速入门
Containerd快速入门
K8S主要资源罗列
认识YAML
API资源对象
Kubernetes安全掌控
Kubernetes网络
Kubernetes高级调度
Kubernetes 存储
Kubernetes集群维护
Skywalking全链路监控
ConfigMap&Secret场景应用
Kubernetes基础概念及核心组件
水平自动扩容和缩容HPA
Jenkins
k8s中部署jenkins并利用master-slave模式实现CICD
Jenkins构建过程中常见问题排查与解决
Jenkins部署在k8s集群之外使用动态slave模式
Jenkins基于Helm的应用发布
Jenkins Pipeline语法
EFKStack
EFK日志平台部署管理
海量数据下的EFK架构优化升级
基于Loki的日志收集系统
Ingress
基于Kubernetes的Ingress-Nginx解决方案
Ingress-Nginx高级配置
使用 Ingress-Nginx 进行灰度(金丝雀)发布
Ingress-nginx优化配置
APM
Skywalking全链路监控
基于Helm部署Skywalking
应用接入Skywalking
服务网格
Istio
基于Istio的微服务可观察性
基于Istio的微服务Gateway实战
Kubernetes高可用集群部署
Kuberntes部署MetalLB负载均衡器
Ceph
使用cephadm部署ceph集群
使用Rook部署Ceph存储集群
openstack
glance上传镜像失败
mariadb运行不起来
创建域和项目错误_1
创建域和项目错误_2
安装计算节点
时钟源
网络创建失败
本文档使用 MrDoc 发布
-
+
首页
Ingress-Nginx高级配置
**官方站点** **nginx-configuration**: [Annotations - NGINX Ingress Controller(kubernetes.github.io)](https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/) # 1、ingress-nginx 之 rewrite **官方示例: ** [Rewrite - NGINX Ingress Controller (kubernetes.github.io)](https://kubernetes.github.io/ingress-nginx/examples/rewrite/) `rewrite`**可以使用下面的` annotations`进行控制:** | 名称 | 描述 | 值 | | ----------------------------------------------- | ---------------------------------------------------------- | ------ | | nginx.ingress.kubernetes.io/rewrite- target | 将匹配到的url重定向到 rewrite-target 注解指定的路径 | string | | nginx.ingress.kubernetes.io/ssl- redirect | 表示位置部分是否可访问SSL (当Ingress包含证书时默认为 True) | bool | | nginx.ingress.kubernetes.io/force- ssl-redirect | 强制重定向到HTTPS,即使入 口没有启用TLS | bool | | nginx.ingress.kubernetes.io/app- root | 访问主域名的时候会自动跳转 到 app-root 注解指定的路径 | string | | nginx.ingress.kubernetes.io/use- regex | 表示Ingress上定义的路径是否 使用正则表达式 | bool | **1、`rewrite`的一般应用场景** - 调整用户浏览的URL,看起来更规范; - 网站更换新域名后,为了不影响SEO,让用户体验更好; - 根据特殊的变量、目录、客户端信息进行跳转; **2、JAVA-ing示例** ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: java-ingress-nginx namespace: default annotations: nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: ingressClassName: nginx rules: - host: java.kubernets.cn http: paths: - pathType: Prefix backend: service: name: springboot port: number: 8080 path: /appone(/|$)(.*) ``` 在这个 ingress 的定义中,通过在`annotations`中指定了`nginx.ingress.kubernetes.io/rewrite-target: /$2`来进行重定向,`(.*)`捕获 的任何字符都将被分配给占位符`$2`,然后在`rewrite-target`中用作参数。 例如,上面的入口定义将导致以下重写: - `java.kubernets.cn/appone`重写为`java.kubernets.cn/` - `java.kubernets.cn/appone/`重写为`java.kubernets.cn/` - `java.kubernets.cn/appone/apptwo`重写为`java.kubernets.cn/apptwo` **3、验证** ```bash $ curl -i -k http://java.kubernets.cn/appone/ HTTP/1.1 404 $ curl -i -k http://java.kubernets.cn/appone/apptwo HTTP/1.1 200 appTwo ``` **4、permanent-redirect** 当访问`java.kubernets.cn 域名`,会重定向到新的域名 ```yaml annotations: nginx.ingress.kubernetes.io/permanent-redirect: 'https://zhdya.gitee.io' ``` 测试验证: ```bash $ curl -i -k http://java.kubernets.cn/appone HTTP/1.1 301 Moved Permanently ``` # 2、Ingress-nginx 黑白名单 **场景:** - 1、对外暴露的核心接口只允许特定的IP地址访问(对公合作); - 2、财务应用只允许特定IP段访问(内网限制); **注意点:** - Annotations:只对指定svc的Ingress生效; - ConfigMap:全局生效; - 黑名单可以使用ConfigMap去配置,白名单建议使用Annotations去配置。 - 白名单是默认是拒绝所有,只允许一个地址去访问; - 黑名单是不允许该地址去访问所有; - 若是同时配置了Annotations和configmap,一般都是annotations生效,configmap不生效,因为annotations优先级比configmap高; **1、白名单** ```yaml $ cat ingress-nginx-whitelist.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: java-ingress-nginx namespace: default annotations: nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.0.100 spec: ingressClassName: nginx rules: - host: java.kubernets.cn http: paths: - pathType: Prefix backend: service: name: springboot port: number: 8080 path: / ``` 测试: ```bash $ curl -i -k http://java.kubernets.cn/appone HTTP/1.1 403 Forbidden ``` 针对 **网段** 进行白名单操作: ```yaml annotations: nginx.ingress.kubernetes.io/whitelist-source-range: 192.10.0.0/16,192.168.0.100 ``` 测试: ```bash $ curl -i -k http://java.kubernets.cn/appone HTTP/1.1 200 ``` 配置到ConfigMap中(操作前,先将当前的configmap备份): ```yaml ## 备份 $ kubectl get cm -ningress-nginx ingress-nginx-controller -oyaml >ingress-nginx-controller.yaml ## 配置白名单 apiVersion: v1 data: allow-snippet-annotations: "true" kind: ConfigMap metadata: annotations: meta.helm.sh/release-name: ingress-nginx meta.helm.sh/release-namespace: ingress-nginx labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.7.0 helm.sh/chart: ingress-nginx-4.6.0 name: ingress-nginx-controller namespace: ingress-nginx data: whitelist-source-range: 10.1.10.0/24 ``` 问题: 一旦应用如上规则,再次访问 http://java.kubernets.cn/appone 是200还是 403? 200,annotations优先级比configmap高; **2、黑名单** **annotation配置:** ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: java-ingress-nginx namespace: default annotations: nginx.ingress.kubernetes.io/server-snippet: |- deny 192.10.192.158; deny 192.168.0.100; allow all; spec: ingressClassName: nginx rules: - host: java.kubernets.cn http: paths: - pathType: Prefix backend: service: name: springboot port: number: 8080 path: / ``` 测试: ```bash $ curl -i -k http://java.kubernets.cn/appone HTTP/1.1 403 Forbidden 更换节点访问: $ curl -i -k http://java.kubernets.cn/appone HTTP/1.1 200 ``` **ConfigMap**配置如下: ```yaml apiVersion: v1 data: allow-snippet-annotations: "true" kind: ConfigMap metadata: annotations: meta.helm.sh/release-name: ingress-nginx meta.helm.sh/release-namespace: ingress-nginx labels: app.kubernetes.io/component: controller app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/managed-by: Helm app.kubernetes.io/name: ingress-nginx app.kubernetes.io/part-of: ingress-nginx app.kubernetes.io/version: 1.7.0 helm.sh/chart: ingress-nginx-4.6.0 name: ingress-nginx-controller namespace: ingress-nginx data: whitelist-source-range: 10.1.10.0/24 block-cidrs: 10.1.10.100 ``` # 3、Ingress-nginx 速率限制 **1、为什么要限速?** - 1、限速的本质是保证公平。 - 2、在带宽资源有限的情况下,尽可能地保障每个用户能被合理的分配足够的带宽值,服务更多的用户。 - 3、限速还可以大大缓解分布式拒绝服务攻击(DDOS)带来的影响。 这里的 **速率** 可以是: - 单个用户在单位时间内访问资源的频率; - 也可以是单个ip在单位时间内访问资源的频率; - 还可以是单位时间内指定连接的传输速率; **策略标准:** (线上环境不要轻易去测试!一定要在非正式环境做验证) ```bash nginx.ingress.kubernetes.io/limit-connections: 单个IP地址允许的并发连接数。 超出此限制时,将返回503错误。 nginx.ingress.kubernetes.io/limit-rps: 每秒从给定IP接受的请求数。突发限制设置为此限制乘以突发乘数,默认乘数为5。 当客户端超过此限制时,将返回limit-req-status-code默认值: 503。 nginx.ingress.kubernetes.io/limit-rpm: 每分钟从给定IP接受的请求数。突发限制设置为此限制乘以突发乘数,默认乘数为5。 当客户端超过此限制时,将返回limit-req-status-code默认值: 503。 nginx.ingress.kubernetes.io/limit-burst-multiplier: 突发大小限制速率的倍数。默认的脉冲串乘数为5,此注释将覆盖默认的乘数。当客户端超过此限制时,将返回 limit-req-status-code默认值: 503。 nginx.ingress.kubernetes.io/limit-rate-after: 最初的千字节数,在此之后,对给定连接的响应的进一步传输将受到速率的限制。必须在启用代理缓冲的情况下使用此功能。 nginx.ingress.kubernetes.io/limit-rate: 每秒允许发送到给定连接的千字节数。零值禁用速率限制。必须在启用代理缓冲的情况下使用此功能。 nginx.ingress.kubernetes.io/limit-whitelist: 客户端IP源范围要从速率限制中排除。该值是逗号分隔的CIDR列表。 ``` **2、ingress-nginx配置** ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: java-ingress-nginx namespace: default annotations: nginx.ingress.kubernetes.io/limit-rate: 100K nginx.ingress.kubernetes.io/limit-whitelist: 10.1.10.100 nginx.ingress.kubernetes.io/limit-rps: "1" nginx.ingress.kubernetes.io/limit-rpm: "30" nginx.ingress.kubernetes.io/limit-connections: "10" spec: ingressClassName: nginx rules: - host: java.kubernets.cn http: paths: - pathType: Prefix backend: service: name: springboot port: number: 8080 path: / ``` 备注: ```bash nginx.ingress.kubernetes.io/limit-rate:限制客户端每秒传输的字节数 nginx.ingress.kubernetes.io/limit-whitelist:白名单中的IP不限速 nginx.ingress.kubernetes.io/limit-rps:单个IP每秒的连接数 nginx.ingress.kubernetes.io/limit-rpm:单个IP每分钟的连接数 nginx.ingress.kubernetes.io/limit-connections:连接数被限制为10 ``` 测试验证:(偶发 503 异常) ```bash $ for i in `seq 1 30`; do curl http://java.kubernets.cn/appone -I;done ``` # 4、Ingress-nginx 基本认证 有些访问是需要认证访问的,比如运管平台:skywalking,默认平台不需要输入任何用户名或密码。 需求:利用ingress-nginx实现,访问的时候输入用户名和密码。 **1、工具生成秘钥:** ```bash ## 用http的命令工具来生成 $ yum -y install httpd-tools $ htpasswd -c auth admin New password: Re-type new password: ## 查看密文 $ cat auth ``` **2、创建secret** 需要将secret认证文件和pod放在同一个 **名称空间** 下 ```bash $ kubectl create secret generic basic-auth --from-file=auth -n default secret/basic-auth created ``` **3、配置Ingress** 需要在annotations下添加三条配置 ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: java-ingress-nginx namespace: default annotations: nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - admin' spec: ingressClassName: nginx rules: - host: java.kubernets.cn http: paths: - pathType: Prefix backend: service: name: springboot port: number: 8080 path: / ``` 备注: ```bash # 认证类型 nginx.ingress.kubernetes.io/auth-type: basic # 包含账号密码的secret nginx.ingress.kubernetes.io/auth-secret: basic-auth # 认证提示信息 nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - admin' ``` 测试验证: ``` $ curl -i -k http://java.kubernets.cn/appone HTTP/1.1 401 Unauthorized ``` web访问测试:  # 5、其余annotations参数 **1、禁用https强制跳转** ```yaml annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" ``` **2、Ingress-nginx的匹配请求头** 需求:针对手机用户,匹配header头信息,将请求转发至手机端app。 ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: java-ingress-nginx namespace: default annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/server-snippet: |- set $agentflag 0; if ($http_user_agent ~* "(iPhone|iPod|android)" ){ set $agentflag 1; } if ( $agentflag = 1 ) { return 301 https://m.baidu.com; } spec: ingressClassName: nginx rules: - host: java.kubernets.cn http: paths: - pathType: Prefix backend: service: name: springboot port: number: 8080 path: / ``` 测试验证: ```bash $ curl --user-agent "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7" http://java.kubernets.cn/appone -i HTTP/1.1 301 Moved Permanently Date: Sat, 06 May 2023 03:53:04 GMT Content-Type: text/html Content-Length: 162 Connection: keep-alive Location: https://m.baidu.com ``` # 6、总结 - **rewrite**: 重定向是在Nginx中转发请求前修改请求URI的过程,可以根据不同的规则对请求进行重定向,例如:将HTTP请求改为HTTPS请求。 - **黑白名单**: 黑白名单是管理访问授权的一种方式,可以允许或禁止某些IP地址或者特定的请求。 - **速率限制**: 限速是针对某些请求进行限制,例如:限制同一IP的请求速率,以减轻服务器压力。 - **基本认证**: 认证是通过设置用户名和密码以确保只有输入正确的用户可以访问特定 资源。
阿星
2024年1月27日 19:15
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码