如何通过Kubernetes Nginx ingress controller禁用服务的HTTP访问
配置方案
以下配置基于Nginx Ingress Controller(K8s环境最常用的Ingress实现),通过单Ingress专属注解覆盖全局规则,既满足当前API服务的HTTP直接返回错误的要求,也不会影响集群内其他服务默认的HTTP转HTTPS 308重定向逻辑。
完整ingress.yaml示例
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: api-service-ingress annotations: # 关闭当前Ingress默认的HTTP自动重定向HTTPS逻辑,不影响其他服务 nginx.ingress.kubernetes.io/ssl-redirect: "false" # 自定义规则:HTTP请求直接返回错误,不重定向 nginx.ingress.kubernetes.io/configuration-snippet: | if ($scheme = http) { return 426 "Please use HTTPS protocol to access this API service"; } spec: tls: - hosts: - your-api-domain.com secretName: your-tls-secret rules: - host: your-api-domain.com http: paths: - path: / pathType: Prefix backend: service: name: your-api-service port: number: 80
配置说明
- 状态码可根据业务需要调整:如果不想用426(Upgrade Required),也可以换成403(Forbidden)、400(Bad Request)等自定义错误码,直接修改return后面的状态码和提示内容即可
- 全局默认的308重定向规则是集群层面的Ingress Controller启动参数配置,上述仅针对当前服务的Ingress做了规则覆盖,不会修改全局配置,其他服务不受任何影响
验证方式
配置生效后执行测试:
- 访问HTTP协议的API地址:
curl -i http://your-api-domain.com,应直接返回你设置的错误码,不会出现308重定向响应 - 访问HTTPS协议的API地址:
curl -i https://your-api-domain.com,业务响应正常 - 访问集群内其他服务的HTTP地址:
curl -i http://other-service-domain.com,依然返回308重定向到HTTPS,符合预期
内容的提问来源于stack exchange,提问作者David Tinker
相关产品推荐
相关产品推荐

