k8s诊断之如何在ingress里面使用geoip2

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 某用户由于某些原因,需要在ACK上使用geoip2来限制国家级别的ip访问限制,如只允许中国访问,ingress 已经默认集成了geoip,但是geoip已经很久不维护了,信息不准确,因此促使了本篇文档的产生

Geo是geographic的缩写,意思是地理的,GeoIP即为IP地理位置数据库,可以根据IP获得地理位置信息。GeoLite2是GeoIP2的免费版本,与GeoIP2数据库相比准确性较差。  GeoIP库可以根据IP地址(支持IPv4 和 IPv6), 定位该IP所在的 洲、经纬度、国家、省市、ASN 等信息。

背景信息:

      某用户由于某些原因,需要在ACK上使用geoip2来限制国家级别的ip访问限制,如只允许中国访问,ingress 已经默认集成了geoip,但是geoip已经很久不维护了,信息不准确,因此促使了本篇文档的产生

1,下载geoip2的库文件(这个是我当时测试找的三方地址,仅供参考)

https://github.com/P3TERX/GeoLite.mmdb

2,开启geoip2,需要在configmap里面设置

坑点1:

这里走文件的方式去使用新的数据库,生产环境走volume去挂载,注意了,需要三个文件 如ASN,city,country都放进去

坑点2:

注意缩进,yaml的缩进差一个括号都不行

use-geoip2: "true" http-snippet:
     geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb {
$geoip2_data_country_iso_code country iso_code;
     }
     map $geoip2_data_country_iso_code$is_ch_country {
       default no;
       CN yes;  
     }
     use-geoip2: "true" http-snippet:
     geoip2 /etc/nginx/geoip/GeoLite2-Country.mmdb {
$geoip2_data_country_iso_code country iso_code;
     }
     map $geoip2_data_country_iso_code$is_ch_country {
       default no; 默认所有国家都不允许访问
       CN yes;  中国打开,即只有中国的ip能访问
     }

3,设置ingress的geoip设置


/

# cat geoip.yaml apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/server-snippet: |
if ($is_ch_country= no) {
         return 403; 如果不是中国的ip,返回403
      }
  name: my-geo
  namespace: default
spec:
  rules:
- host: mygeo.cf406d8459c2c4f63855b2165c77601cb.cn-beijing.alicontainer.com
      http:
        paths:
- backend:
              serviceName: my-geo
              servicePort: 80            path: /
            pathType: ImplementationSpecific

4,设置完成后,ingress controller pod内的配置变化

module的加载

http段的geoip库加载

server段的判断条件

5,海内外访问测试:

国内:

国外:

return 444的时候,nginx识别不了,就给reset了,但是改成403就可以返回403了

关闭geo判断,试试海外是否ok了

可以访问了


PS:

必须是4层的lb +local模式的流量策略才能获取真实ip,这个geoip依赖的是建联ip,如果前端有7层代理如经过CDN WAF 等,geoip的判断可能存在失效问题。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
Kubernetes 负载均衡 应用服务中间件
k8s学习--ingress详细解释与应用(nginx ingress controller))
k8s学习--ingress详细解释与应用(nginx ingress controller))
169 0
|
2月前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
158 7
|
1月前
|
缓存 Kubernetes 负载均衡
在K8S中,ingress 有何作用?
在K8S中,ingress 有何作用?
|
3月前
|
Kubernetes 应用服务中间件 API
【Ingress 秘籍】集群进出流量的总管:揭秘 Kubernetes 中 Ingress 的终极奥秘!
【8月更文挑战第25天】Ingress是Kubernetes中用于管理HTTP与HTTPS流量进入集群的核心功能。作为集群内外通信的桥梁,Ingress通过定义规则将外部请求导向内部服务。本文详细介绍了Ingress的基本概念、配置方法及其实现方式。通过使用不同的Ingress控制器(如Nginx、Traefik等),用户可以根据需要选择最适合的方案。文中还提供了示例代码展示如何创建服务、部署应用及配置Ingress规则。
148 6
|
3月前
|
Kubernetes 负载均衡 应用服务中间件
在k8S中,ingress是什么?
在k8S中,ingress是什么?
|
3月前
|
API UED 开发者
超实用技巧大放送:彻底革新你的WinForms应用,从流畅动画到丝滑交互设计,全面解析如何在保证性能的同时大幅提升用户体验,让软件操作变得赏心悦目不再是梦!
【8月更文挑战第31天】在Windows平台上,使用WinForms框架开发应用程序时,如何在保持性能的同时提升用户界面的吸引力和响应性是一个常见挑战。本文探讨了在不牺牲性能的前提下实现流畅动画与交互设计的最佳实践,包括使用BackgroundWorker处理耗时任务、利用Timer控件创建简单动画,以及使用Graphics类绘制自定义图形。通过具体示例代码展示了这些技术的应用,帮助开发者显著改善用户体验,使应用程序更加吸引人和易于使用。
72 0
|
3月前
|
Kubernetes API 网络安全
在K8S中,ingress该如何使用?
在K8S中,ingress该如何使用?
|
Kubernetes 容器
《基于Kubernetes的互联网Ingress实践》电子版地址
基于Kubernetes的互联网Ingress实践
130 0
《基于Kubernetes的互联网Ingress实践》电子版地址
|
23天前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
25天前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。