服务网格是一项热门技术,有时甚至被吹捧为微服务成功的必要条件。但是,与许多抽象一样,服务网格可以节省时间,但不会节省学习时间。事实上,许多小型平台团队对服务网格增加的复杂性感到不知所措,尤其是在涉及到长时间的操作时。
很自然地会问一个问题:额外的复杂性真的超过了好处吗?
在这篇文章中,我们提出了在投资服务网格之前要考虑的替代方案。服务网格最流行的好处是:
- 验证;
- 入口加密;
- 集群内网络加密;
- 通讯隔离。
对于这些好处中的每一个,我们将展示根据我们的经验更接近管理员已经熟悉的替代方案。对于专业知识或平台工程带宽稀缺的组织,这些可能更具吸引力。
在某些情况下,您将需要服务网格,例如当您需要跨多个 Kubernetes 集群的安全 Pod 到 Pod 通信时。通过排除不能满足您需求的解决方案,您将进一步说服自己为什么选择服务网格开始。
Service Mesh 优势 1 - 使用 OAuth2-proxy 进行身份验证
许多应用程序团队需要在他们的微服务前面添加一个身份验证层。例如,完全实现 OAuth2 或 OpenID 涉及相当多的跳转。与其编写大量样板代码(这与应用程序非特定和非业务差异化相比),团队更愿意“某物”只是将具有正确声明的 JWT 令牌交给他们的应用程序,以便专注于特定于应用程序的访问控制。
我们之前写过关于如何将 Istio 与 OAuth2-proxy 集成以实现这一目标的博客。但是,如果这是您从 Istio 中唯一需要的东西,那么采用它可能有点过头了。
服务网格的替代方案:Nginx Ingress Controller
让我举例说明一个我认为更简单的解决方案,尤其是对于已经使用 Nginx 的团队。如果你只需要一些好的 oauth2-proxy,Nginx Ingress Controller 很容易与之集成。只需使用 auth-url 注释,控制器将完成其余的工作。下图说明了这是如何工作的。
我认为这个解决方案更简单的原因是它只会影响流量进入 Kubernetes 集群的方式。Pod 到 Pod 的通信和以前一样工作。
如果您熟悉 Nginx,但害怕 Ingress Controller 在其周围添加的自动化,您可以通过键入以下内容直接检查 Nginx 的配置方式:
代码语言:javascript复制kubectl exec -ti
-n ingress-nginx
$(kubectl get pod
-n ingress-nginx
-l app.kubernetes.io/component=controller
-o name
| head -1
)
--
cat /etc/nginx/nginx.conf
默认情况下,您的应用程序不会获得 JWT 令牌。为了确保您的应用程序获得细粒度访问控制的声明,您必须做两件事:
- 首先,将--set-authorization-header命令行选项添加到 oauth2-proxy:这可确保 oauth2-proxy 生成 HTTP 授权标头。
- 其次,将以下注释添加到您的 Ingress:nginx.ingress.kubernetes.io/auth-response-headers: “authorization” 。这可确保 Nginx 入口控制器将 HTTP 授权标头从 oauth2-proxy 转发到您的应用程序。
如果您需要更多详细信息,可以在此处找到现成的代码片段。
代码语言:javascript复制https://github.com/elastisys/compliantkubernetes/blob/main/user-demo/deploy/oauth2-proxy.yaml
https://elastisys.io/compliantkubernetes/user-guide/network-model/#ingress
Service Mesh 好处二:入口加密
许多法规要求对不受信任网络上的网络流量进行加密。例如,PCI-DSS 要求 4 规定:“通过在开放的公共网络上加密来传输持卡人数据。” GDPR 和瑞典医疗保健(“Behandling av personuppgifter iöppna nät”“通过开放网络处理个人数据”)包含类似规定。
解决方案很简单:添加 TLS 终止。但是,TLS 终止不是业务差异化,也不是特定于应用程序的。理想情况下,平台应该“做它”。我经常看到团队仅针对这一功能采用服务网格,但还有一种更简单的替代方案。
服务网格的替代品:Cert-manager
您可以安装cert-manager,创建 ClusterIssuer 并通过注解使用该 ClusterIssuer 配置您的 Ingress。Cert-manager 将发挥与 LetsEncrypt 对话的魔力,提供 TLS 证书并在其到期前轮换它。
这在上图和相同的即用型代码片段中进行了说明。请参阅cert-manager.io/cluster-issuer
注释。
Service Mesh 好处三:集群内网络加密
为一些争议做好准备。