Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google Kubernetes引擎:为服务类型启用HTTPS_Kubernetes_Google Cloud Platform_Devops - Fatal编程技术网

Google Kubernetes引擎:为服务类型启用HTTPS

Google Kubernetes引擎:为服务类型启用HTTPS,kubernetes,google-cloud-platform,devops,Kubernetes,Google Cloud Platform,Devops,我在GKE上有一个应用程序,我希望只能通过HTTPS访问,因此我获得了一个签名证书,以使用TLS保护该应用程序 我已经查阅了很多关于如何做到这一点的教程,但它们都提到使用入口并使用LetsEncrypt和KubeLego自动请求证书。但我希望继续使用外部负载平衡器(google提供给我的计算引擎实例),但我只希望我的应用程序可以通过https访问 如何将我的server.crt和server.key文件应用于启用https。如何将或应用于kubernetes群集。Ingress是最简单的方法。您

我在GKE上有一个应用程序,我希望只能通过HTTPS访问,因此我获得了一个签名证书,以使用TLS保护该应用程序

我已经查阅了很多关于如何做到这一点的教程,但它们都提到使用入口并使用LetsEncrypt和KubeLego自动请求证书。但我希望继续使用外部负载平衡器(google提供给我的计算引擎实例),但我只希望我的应用程序可以通过https访问


如何将我的server.crt和server.key文件应用于启用https。如何将或应用于kubernetes群集。

Ingress是最简单的方法。您不需要使用LetsEncrypt,您可以指定自己的证书


入口控制器只是一个NGINX代理。如果您不想使用入口(为什么?)。这基本上就是这一服务的入口。

当涉及到通过HTTPS公开应用程序时,入口可能是最好的选择。入口资源指定了一个后端服务,因此您需要继续将应用程序公开为Kubernetes服务,只需将类型设置为
ClusterIP
。这将产生一个服务,该服务是集群的“内部”服务,并且在您设置该服务后,可以通过入口从外部访问该服务

现在,特别是在Google Kubernetes Engine(GKE)中,集群中定义的任何入口资源都将由Google云负载平衡器提供服务,因此我认为您不必担心部署自己的入口控制器(例如Nginx入口控制器)

在TLS方面,如果您有自己的证书,您可以使用自己的证书。证书必须通过Kubernetes密钥上载到集群。一旦定义了该秘密,就可以在入口定义中引用该秘密。()

您可以使用以下命令创建机密:

kubectl create secret tls my-app-certs --key /tmp/tls.key --cert /tmp/tls.crt
一旦掌握了您的秘密,您可以在入口资源中引用它:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: my-app-ingress
spec:
  tls:
  - secretName: my-app-certs
  backend:
    serviceName: s1
    servicePort: 80
创建入口资源后,GKE将配置负载平衡器,并为您提供一个可通过以下方式获得的可公开访问的IP:

kubectl get ingress my-app-ingress
以下是一个很好的教程,指导您了解GKE的入门知识:
解决方案:

在运行时获取证书,许多人使用LetsEncrypt,因为它非常简单,但您可以将证书存储在实际安全的存储中,例如云平台的密钥管理存储,或者运行自己的Hashicorp Vault(我推荐Hashicorp Vault,它非常好!)然后在运行时安全地检索您的机密


您注意到,每个教程或指南都建议动态获取它们

但它们都指使用入口并使用LetsEncrypt和KubeLego自动请求证书

理由如下:

风险

在API服务器中,机密数据以明文形式存储在etcd中;因此: 管理员应限制管理员用户访问etcd API服务器中的机密数据位于etcd使用的磁盘上;当etcd不再使用时,管理员可能希望擦除/撕碎etcd使用的磁盘

可以创建使用秘密的pod的用户也可以看到该秘密的价值。即使apiserver策略不允许该用户读取机密对象,该用户也可以运行公开机密的pod

如果运行etcd的多个副本,则机密将在它们之间共享。默认情况下,etcd不保护使用SSL/TLS的对等通信,尽管这可以配置

目前,在任何节点上具有根的任何人都可以通过模拟kubelet从apiserver读取任何机密。计划中的功能是仅向实际需要的节点发送机密,以限制根攻击对单个节点的影响


因此,每个人都正确地建议您不要使用K8s SECRETS来存储有价值的证书,因为它不适合这份工作。

您可能想看看这个开源项目。使用ingress是否意味着我必须创建一个新的负载平衡器?LoadBalancer类型的每个服务(每个外部公开的服务)都会创建一个负载平衡器。我们的想法是只有一个ingress,所有其他服务都应该是内部的。非常感谢,我已经这样做了,并使用默认的nginx服务进行了测试,但我希望它能在地址栏中表明该站点是安全的,但它没有。这个过程是否表明该站点是安全的?@Ogbe通过这种通信方法很难弄清楚这一点。你是如何获得证书的?您的浏览器信任它吗?证书正在送达吗?DNS名称是否与证书中的名称(或SAN中的名称)匹配?注意:Kubernetes机密以明文形式存储在etcd上,任何可以访问APIserver的节点即使未分配也可以访问任何机密。小心!从Kubernetes 1.7开始,可以启用rest加密来加密机密:我对这个答案给予了奖励,我已经能够安装ssl证书,但我需要将所有http请求路由到https,将ssl_重定向注释设置为true并允许https注释设置为false无助于实现这一点这确实是另一种方法。但需要明确的是,从Kubernetes 1.7开始,可以启用静态加密来加密机密: