如何使用入口控制器动态地允许IP



我的结构

  1. GKE上的Kubernetes集群
  2. 使用舵部署入口控制器
  3. 一个将返回IP范围列表的应用程序注意:它将定期更新
curl https://allowed.domain.com
172.30.1.210/32,172.30.2.60/32
  1. 不工作的安全应用程序

我想做什么

  1. 在我的API端点中拥有我的客户端IP,这已经完成
curl https://allowed.domain.com
172.30.1.210/32,172.30.2.60/32
  1. 使用ingress部署我的示例应用程序,这样它就可以从https://allowed.domain.com中提取并允许人们访问该应用程序

我尝试了什么但没有成功

  1. 使用nginx的include功能部署应用程序
nginx.ingress.kubernetes.io/configuration-snippet: |
include /tmp/allowed-ips.conf;
deny all;

是的,它有效,但问题是当/tmp/allowed-ips.conf更新时,入口配置没有

  1. 我尝试使用if条件从端点提取IP,并在用户不在列表中时拒绝
nginx.ingress.kubernetes.io/configuration-snippet: |
set $deny_access off;
if ($remote_addr !~ (https://2ce8-73-56-131-204.ngrok.io)) {
set $deny_access on;
}
  1. 我正在使用nginx.ingress.kubernetes.io/whitelist-source-range注释,但这不是我想要的

所有选项都不适合我。

来自ingress nginx控制器的官方文档:

这个Ingress控制器的目标是组装一个配置文件(nginx.conf(。这个要求的主要含义是在配置文件发生任何更改后需要重新加载nginx。尽管需要注意的是,我们不会在只影响上游配置的更改上重新加载Nginx(即部署应用程序时端点更改(

在最初创建nginxingress resource之后,ingress controller组装nginx.conf文件并将其用于路由流量。如果Nginx.conf和其他配置文件发生更改,Nginx web服务器不会自动重新加载其配置。

所以,你可以用几种方法来解决这个问题:

  • 用新的IP地址更新k8singress resource,然后对选项2和3的Kubernetes集群应用更改(kubectl apply/kubecctl patch/smth-else(/
  • 在ingress Pod中运行nginx -s reload,为选项1重新加载nginx configuration/,include是允许的列表文件。
    $ kubectl exec ingress-nginx-controller-xxx-xxx -n ingress-nginx -- nginx -s reload
    
  • 试着写一个Lua脚本(Nginx+Lua+Redis有一个很好的例子(。你应该对nginx和lua有很好的了解,以评估它是否值得尝试

分享我在工作场所实现的内容。我们有一个名为Site24x7的托管监控工具。该工具用动态IP从他们的虚拟机中ping我们的服务器,我们不得不在GKE自动执行IP的白名单。

nginx.ingress.kubernetes.io/configuration-snippet允许您设置任意的Nginx配置。

  1. 在特定命名空间上设置K8s CronJob资源
  2. CronJob运行一个shell脚本
  • 获取要允许的IP列表(curlgetent等(
  • 生成一组NGINX配置(=nginx.ingress.kubernetes.io/configuration-snippet的值(
  • 运行CCD_ 14命令,该命令覆盖目标入口的注释

shell/bash脚本示例:

#!/bin/bash
site24x7_ip_lookup_url="site24x7.enduserexp.com"
site247_ips=$(getent ahosts $site24x7_ip_lookup_url | awk '{print "allow "$1";"}' | sort -u)
ip_whitelist=$(cat <<-EOT
# ---------- Default whitelist (Static IPs) ----------
# Office
allow vv.xx.yyy.zzz;
# VPN
allow aa.bbb.ccc.ddd;
# ---------- Custom whitelist (Dynamic IPs) ----------
$site247_ips                            # Here! 
deny all;
EOT
)
for target_ingress in $TARGET_INGRESS_NAMES; do
kubectl -n $NAMESPACE annotate ingress/$target_ingress 
--overwrite 
nginx.ingress.kubernetes.io/satisfy="any" 
nginx.ingress.kubernetes.io/configuration-snippet="$ip_whitelist" 
description="*** $(date '+%Y/%m/%d %H:%M:%S') NGINX annotation 'configuration-snippet' updated by cronjob $CRONJOB_NAME ***"
done

shell/bash脚本可以存储为ConfigMap,以便安装在CronJob资源上。

相关内容

  • 没有找到相关文章

最新更新