我已经配置了我的入口支持SSL:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: "service"
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "x.x.x.x/xx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
tls:
- hosts:
- "example.com"
secretName: example.name
rules:
- host: "example.com"
http:
paths:
- path: /
backend:
serviceName: service
servicePort: 80
在我上面的配置中,只有白名单中的IP可以访问HTTP和HTTPS的域。但是我想配置所有IP地址都可以访问https://example.com
(HTTPS),并且白名单中的某些IP地址可以在没有SSL -http://example.com
的情况下访问。
我已经通过使用注释向nginx位置添加更多配置(收听http和https)来解决nginx.ingress.kubernetes.io/configuration-snippet
问题。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: "service"
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
# The configs to allow all IPs access via https and allow some IPs in
# security whitelist access via http
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($https) {
set $allow_ip true;
}
if ($remote_addr ~ (x.x.x.x|y.y.y.y) {
set $allow_ip true;
}
if ($allow_ip != true) {
return 403;
}
spec:
tls:
- hosts:
- "example.com"
secretName: example.name
rules:
- host: "example.com"
http:
paths:
- path: /
backend:
serviceName: service
servicePort: 80
whitelist-source-range
注释将始终影响整个入口资源。但是,您可以(未经测试!)尝试使用两个单独的入口资源:一个用于HTTP访问(使用源白名单且没有tls
配置),另一个用于HTTPS(使用kubernetes.io/ingress.allow-http
注释禁用纯HTTP):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: service-https
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
kubernetes.io/ingress.allow-http: "false"
spec:
tls:
- hosts:
- "example.com"
secretName: example.name
rules:
- host: "example.com"
http:
paths:
- path: /
backend:
serviceName: service
servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: service-http
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "x.x.x.x/xx"
spec:
rules:
- host: "example.com"
http:
paths:
- path: /
backend:
serviceName: service
servicePort: 80
我相信目前仅使用nginx-ingress是不可能的。
为入口设置 HTTPS 方案时,它将开始侦听端口 443,并继续侦听端口 80。
但是,您可以通过使用本地 Nginx 实例作为外部负载均衡器来执行此操作。
点击此链接获取详细说明:"内部部署(非云)上的 Kubernetes TCP 负载均衡器服务">
作为另一种选择,您可能想尝试 Istio Ingress