OpenShift 4.3中Ingress生成的Route无HTTPS,如何配置安全路由?
我之前帮不少团队处理过OpenShift 3.11到4.x的Ingress/Route迁移问题,你的情况其实是因为4.x里Ingress和Route的映射逻辑有了一些调整,下面给你几个可行的解决方案:
首先明确核心问题:你当前的Ingress配置里只指定了tls.hosts,但没关联证书Secret,OpenShift的Ingress Controller不知道该用哪个证书来生成HTTPS Route,所以默认生成了HTTP的Route。
方案一:补全Ingress的TLS配置(推荐,保持K8s标准Ingress格式)
OpenShift 4.x的Ingress依然支持指定证书Secret,但注意证书Secret必须和Ingress在同一个namespace(K8s Secret是命名空间隔离的)。如果想继续使用default命名空间的默认证书,你需要先把它复制到test命名空间:
# 复制default命名空间的默认证书到test命名空间 oc get secret default-cert -n default -o yaml | sed 's/namespace: default/namespace: test/' | oc create -f -
然后修改你的Ingress配置,添加secretName字段:
kind: Ingress apiVersion: networking.k8s.io/v1beta1 metadata: name: ingress namespace: test spec: tls: - hosts: - XXXXXXXXXX secretName: default-cert # 填写复制后的证书Secret名称 rules: - host: >- XXXXXXXXXX http: paths: - path: /abc-ui/ backend: serviceName: abc-test-service servicePort: 8080
应用这个配置后,Ingress Controller会生成带TLS的Route,自动使用你指定的证书。
方案二:使用OpenShift集群默认Ingress证书(无需复制Secret)
如果你不想复制证书,可以利用OpenShift 4.x自带的集群默认Ingress证书,给Ingress添加特定注解,让Controller自动关联默认证书:
kind: Ingress apiVersion: networking.k8s.io/v1beta1 metadata: name: ingress namespace: test annotations: route.openshift.io/termination: edge # 指定Edge终止模式,使用默认证书 route.openshift.io/insecure-policy: Redirect # 自动把HTTP请求重定向到HTTPS spec: tls: - hosts: - XXXXXXXXXX rules: - host: >- XXXXXXXXXX http: paths: - path: /abc-ui/ backend: serviceName: abc-test-service servicePort: 8080
这个注解会告诉OpenShift的Ingress Controller生成一个Edge类型的Route,自动使用集群默认的Ingress证书,并且强制HTTPS访问。
方案三:直接使用OpenShift Route资源(原生方式,功能更完整)
如果Ingress的限制让你觉得麻烦,直接使用OpenShift原生的Route资源是最直接的方式,毕竟Route是OpenShift特有的资源,支持更多自定义配置:
kind: Route apiVersion: route.openshift.io/v1 metadata: name: abc-ui-route namespace: test spec: host: XXXXXXXXXX path: /abc-ui/ to: kind: Service name: abc-test-service weight: 100 port: targetPort: 8080 tls: termination: edge insecureEdgeTerminationPolicy: Redirect # HTTP转HTTPS
这个Route配置会自动使用集群默认证书(如果没指定secretName的话),生成的就是HTTPS的访问地址,而且你可以更灵活地配置会话亲和性、路径重写等OpenShift特有的功能。
总结
- 不是必须用Route资源,用Ingress也能实现HTTPS,只要补全TLS配置或者添加正确的注解;
- 如果要跨namespace引用证书,必须先复制Secret到目标namespace;
- 直接用Route的话,能获得更丰富的OpenShift专属特性,适合复杂场景。
内容的提问来源于stack exchange,提问作者Mansi

