通常,我有一个托管在具有http和https监听器的TomEE上的应用程序。我想通过ELB调用https并将请求作为https请求路由到TomEE。
已经有效的是ELB正在接收来自公共请求的https呼叫,并使用http将其路由到Pod。这是通过服务清单中的一些注释实现的:
apiVersion: v1
kind: Service
metadata:
name: my-app-elb
labels:
elb: my-app-elb
annotations:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws...<MY_CERT>
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
spec:
ports:
- name: https
port: 443
targetPort: app-ssl-port
protocol: TCP
selector:
app: my-app
type: LoadBalancer
现在,服务和Pod之间的通信也应该使用https进行。
如何实现这一目标?是否还有一些注释,还是有另一种方式?
不幸的是,kubernetes Docs在这个主题上非常有限。
修改 与Symmetric建议一样,可以使用以下注释:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol=https
但这似乎只是中途。因为服务现在使用https与Pod进行通信。但是,服务如何知道用于握手的证书/密钥?
TomEE的证书与服务清单中指定的证书不同。所以基本上,有两个证书使用。一个AWS证书,用于与服务进行通信,另一个用于Pod。
Pod的证书可以存储在kubernetes的Secret对象中。但服务如何获得对此的引用?
答案 0 :(得分:2)
看起来这是您需要的注释:
service.beta.kubernetes.io/aws-load-balancer-backend-protocol
从source code开始,这里是对注释的描述:
// ServiceAnnotationLoadBalancerBEProtocol is the annotation used on the service
// to specify the protocol spoken by the backend (pod) behind a listener.
// If `http` (default) or `https`, an HTTPS listener that terminates the
// connection and parses headers is created.
// If set to `ssl` or `tcp`, a "raw" SSL listener is used.
// If set to `http` and `aws-load-balancer-ssl-cert` is not used then
// a HTTP listener is used.
答案 1 :(得分:0)
作为替代方法,您可以在ELB上禁用SSL终止,并在您的pod中完成所有解密。我在GCP中使用这种方法。它在技术上更安全,因为您不会在LB上使用未加密的数据信任云提供商。
它也是一种与平台无关的方法,如果您必须迁移到裸机或其他云提供商,它应该可以使用。
我使用https://github.com/PalmStoneGames/kube-cert-manager/使用Letsencrypt为我的证书创建一个秘密。这使用DNS质询方法,因此您可以授予证书管理员服务访问您的DNS的权限。