服务 - Pod https通信

时间:2017-05-05 11:51:23

标签: ssl https kubernetes

通常,我有一个托管在具有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对象中。但服务如何获得对此的引用?

2 个答案:

答案 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的权限。