在 Kubernetes Ingress 中针对特定IP禁用HTTP基本认证

81次阅读
没有评论

问题描述

目前拥有一个网页,只允许来自某些网络的请求无需HTTP基本认证,其他情况下需要进行认证。此行为在Nginx配置中实现,大致如下:

geo $authentication {
    default "Authentication required";
    SOME-IP "off";
    SOME-NETWORK1 "off";
    SOME-NETWORK2 "off";
}
auth_basic $authentication;

现在,用户想将这个网页迁移到一个Kubernetes集群下的ingress-nginx ingress控制器中。根据文档,ingress-nginx支持基本认证,但没有提供从特定IP/网络允许访问的方法。是否有其他方法或其它ingress控制器/工具可以配置这种行为?

解决方案

在尝试以下解决方案之前,请确保你已备份关键数据,并且注意版本差异和安全性。

方案1:使用external-auth实现

使用ingress-nginx中的external-auth功能,你可以实现从特定IP免除HTTP基本认证的需求。以下是实现步骤:

  1. 创建一个用于处理认证逻辑的Node.js服务。你可以使用这个服务来代替Nginx的基本认证逻辑。
  2. 在Kubernetes集群中创建该Node.js服务的Deployment和Service。
  3. 使用Kubernetes Ingress来指定需要进行认证的资源,并在annotations中使用nginx.ingress.kubernetes.io/auth-url指定之前创建的Node.js服务的地址。

下面是一个示例的annotations部分:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: your-ingress-name
  annotations:
    nginx.ingress.kubernetes.io/auth-url: http://service-name.default.svc.cluster.local:3000/auth
spec:
  # Ingress规则和后端服务配置

在这个示例中,auth-url的值是之前创建的Node.js服务的地址。这个服务将处理认证逻辑,从特定IP免除认证。

方案2:尝试其他Ingress控制器

如果ingress-nginx无法满足你的特定需求,你可以尝试使用其他Ingress控制器。一些其他的Ingress控制器可能提供更灵活的配置选项,可能能够满足你的需求。

总结

通过使用ingress-nginx的external-auth功能,你可以实现在Kubernetes Ingress中针对特定IP禁用HTTP基本认证的需求。另外,你还可以考虑尝试其他的Ingress控制器,以寻找更适合你需求的解决方案。在操作之前,务必做好备份并考虑版本差异和安全性。

正文完