我的结构
- GKE上的Kubernetes集群
- 使用舵部署入口控制器
- 一个将返回IP范围列表的应用程序注意:它将定期更新
curl https://allowed.domain.com
172.30.1.210/32,172.30.2.60/32
- 不工作的安全应用程序
我想做什么
- 在我的API端点中拥有我的客户端IP,这已经完成
curl https://allowed.domain.com
172.30.1.210/32,172.30.2.60/32
- 使用ingress部署我的示例应用程序,这样它就可以从
https://allowed.domain.com
中提取并允许人们访问该应用程序
我尝试了什么但没有成功
- 使用nginx的
include
功能部署应用程序
nginx.ingress.kubernetes.io/configuration-snippet: |
include /tmp/allowed-ips.conf;
deny all;
是的,它有效,但问题是当/tmp/allowed-ips.conf
更新时,入口配置没有
- 我尝试使用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;
}
- 我正在使用
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地址更新k8s
ingress 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配置。
- 在特定命名空间上设置K8s CronJob资源
- CronJob运行一个shell脚本
- 获取要允许的IP列表(
curl
、getent
等( - 生成一组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资源上。