24、其他服务网格技术之 Consul Connect 详解

其他服务网格技术之 Consul Connect 详解

在当今的微服务架构中,服务网格(Service Mesh)技术扮演着至关重要的角色,它能够帮助我们更好地管理和控制微服务之间的通信。除了广为人知的 Istio 之外,还有许多其他优秀的服务网格实现,本文将重点介绍 HashiCorp 提供的 Consul Connect 服务网格。

1. 认识 Consul Connect

Consul Connect,也被称为 Consul Service Mesh,是基于 Consul 构建的服务网格解决方案。Consul 是一个广受欢迎且历史悠久的服务发现解决方案,同时也是一个键值存储系统。它为各种类型的工作负载提供并管理服务身份,这些身份随后被服务网格用于管理 Kubernetes 中服务之间的流量。Consul Connect 支持使用访问控制列表(ACLs)来实现零信任网络,并提供对网格中流量流的精细控制。

Consul 使用 Envoy 作为其数据平面,并将其作为边车注入到工作负载 Pod 中。注入可以基于注解以及全局配置,从而自动将边车代理注入到指定命名空间中的所有工作负载中。

2. 安装 Consul Connect

以下是在本地工作站上安装 Consul Service Mesh 的详细步骤:
1. 克隆 Consul 仓库

git clone https://github.com/hashicorp-education/learn-consul-get-started-kubernetes.git
  1. 安装 Consul CLI
    • MacOS
      • 安装 HashiCorp tap:
brew tap hashicorp/tap
    - 安装 Consul Kubernetes CLI:
brew install hashicorp/tap/consul-k8s
    - 检查 consul-k8s 的版本:
consul-k8s version
- **Linux Ubuntu/Debian**:
    - 添加 HashiCorp GPG 密钥:
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add –
    - 添加 HashiCorp apt 仓库:
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
    - 运行 apt-get install 安装 consul-k8s CLI:
sudo apt-get update && sudo apt-get install consul-k8s
- **CentOS/RHEL**:
    - 安装 yum-config-manager 来管理仓库:
sudo yum install -y yum-utils
    - 使用 yum-config-manager 添加官方 HashiCorp Linux 仓库:
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
    - 安装 consul-k8s CLI:
sudo yum -y install consul-k8s
  1. 启动 minikube
minikube start --profile dc1 --memory 4096 --kubernetes-version=v1.24.0
  1. 使用 Consul CLI 在 minikube 上安装 Consul
    learn-consul-get-started-kubernetes/local 目录下运行以下命令:
consul-k8s install -config-file=helm/values-v1.yaml -set global.image=hashicorp/consul:1.14.0
  1. 检查命名空间中的 Consul Pods
kubectl get po -n consul
  1. 配置 Consul CLI 以与 Consul 通信
    设置环境变量,使 Consul CLI 能够与 Consul 集群通信:
export CONSUL_HTTP_TOKEN=$(kubectl get --namespace consul secrets/consul-bootstrap-acl-token --template={{.data.token}} | base64 -d)
export CONSUL_HTTP_ADDR=https://127.0.0.1:8501
export CONSUL_HTTP_SSL_VERIFY=false
  1. 访问 Consul 仪表板
kubectl port-forward pods/consul-server-0 8501:8501 --namespace consul

在浏览器中打开 localhost:8501 即可访问 Consul 仪表板。

3. 部署示例应用程序

接下来,我们将部署 envoydummy 以及一个 curl 应用程序。示例配置文件位于 AppendixA/envoy-proxy-01.yaml 中。在配置文件中,你会注意到以下注解:

annotations:
  consul.hashicorp.com/connect-inject: "true"

这个注解允许 Consul 自动为每个服务注入代理。代理根据 Consul 的配置创建一个数据平面,以处理服务之间的请求。

应用配置以创建 envoydummy curl Pods:

kubectl create -f AppendixA/Consul/envoy-proxy-01.yaml -n appendix-consul

几秒后,你会发现 Consul 自动将边车注入到 Pods 中:

kubectl get po -n appendix-consul

为了了解更多关于边车的信息,你可以使用以下命令检查 envoydummy Pod:

kubectl get po/envoydummy-77dfb5d494-pcqs7 -n appendix-consul -o json | jq '.spec.containers[].image'
kubectl get po/envoydummy-77dfb5d494-pcqs7 -n appendix-consul -o json | jq '.spec.containers[].name'

现在,让我们尝试从 curl Pod 访问 envoydummy

kubectl exec -it pod/curl -n appendix-consul -- curl http://envoydummy:80

你会发现,尽管 curl Pod 和 envoydummy Pod 部署在同一命名空间中,但 curl Pod 无法访问 envoydummy Pod,这体现了 Consul Service Mesh 的安全性。

4. 零信任网络

Consul 使用名为 intentions 的 Consul 构造来管理服务间的授权。使用 Consul CRDs,你需要定义意图,规定哪些服务允许相互通信。意图是 Consul 中零信任网络的基石。

意图由边车代理在入站连接上强制执行。边车代理使用其 TLS 客户端证书识别入站服务,然后检查是否存在允许客户端与目标服务通信的意图。

以下是定义一个意图,允许从 curl 服务到 envoydummy 服务的流量的示例:

apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceIntentions
metadata:
  name: curl-to-envoydummy-api
  namespace: appendix-consul
spec:
  destination:
    name: envoydummy
  sources:
    - name: curl
      action: allow

在上述配置中,我们指定了目标服务和源服务的名称,并在 action 中指定了 allow 以允许从源到目标的流量。另一个可能的值是 deny ,用于拒绝从源到目标的流量。如果不想指定服务名称,可以使用 *

应用意图:

kubectl create -f AppendixA/Consul/curl-to-envoy-dummy-intentions.yaml

你可以在 Consul 仪表板中验证创建的意图。现在,再次测试 curl Pod 是否能够与 envoydummy Pod 通信:

kubectl exec -it pod/curl -n appendix-consul -- curl http://envoydummy

通过使用意图,我们可以定义规则来控制服务之间的流量,而无需配置防火墙或对集群进行任何更改。

5. 流量管理和路由

Consul 提供了一套全面的服务发现和流量管理功能。服务发现包括三个阶段:路由、拆分和解析,这三个阶段也被称为服务发现链,可以用于基于 HTTP 头、路径、查询字符串和工作负载版本实现流量控制。

5.1 路由

路由是服务发现链的第一阶段,用于使用第 7 层构造(如 HTTP 头和路径)拦截流量。这通过 service-router 配置项实现,你可以使用各种标准控制流量路由。

例如,对于 envoydummy ,我们希望将发送到 envoydummy 版本 v1 且 URI 中包含 /latest 的任何请求路由到 envoydummy 版本 v2,将发送到 envoydummy 版本 v2 且路径中包含 /old 的任何请求路由到 envoydummy 版本 v1。可以使用以下 ServiceRouter 配置实现:

apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceRouter
metadata:
  name: envoydummy
spec:
  routes:
    - match:
        http:
          pathPrefix: '/latest'
      destination:
        service: 'envoydummy2'
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceRouter
metadata:
  name: envoydummy2
spec:
  routes:
    - match:
        http:
          pathPrefix: '/old'
      destination:
        service: 'envoydummy'

这两个 ServiceRouter 配置保存在 AppendixA/Consul/routing-to-envoy-dummy.yaml 中。 envoydummy 版本 v2 的部署描述符以及允许从 curl Pod 进行流量的意图也可以在 GitHub 上的 AppendixA/Consul/envoy-proxy-02.yaml 中找到。

部署 envoydummy 版本 v2 以及 ServiceRouter 配置:

kubectl apply -f AppendixA/Consul/envoy-proxy-02.yaml
kubectl apply -f AppendixA/Consul/routing-to-envoy-dummy.yaml -n appendix-consul

你可以在 Consul 仪表板中检查配置。现在,测试路由行为:
1. 向 envoydummy 版本 v1 发送 URI 不是 /latest 的任何请求:

kubectl exec -it pod/curl -n appendix-consul -- curl http://envoydummy/new

输出应符合预期,请求应路由到 envoydummy 版本 v1。
2. 向 envoydummy 版本 v1 发送 URI 是 /latest 的请求:

kubectl exec -it pod/curl -n appendix-consul -- curl http://envoydummy/latest

输出应符合预期,尽管请求指向 envoydummy 版本 v1,但会路由到 envoydummy 版本 v2。
3. 向 envoydummy 版本 v2 发送 URI 不是 /old 的任何请求:

kubectl exec -it pod/curl -n appendix-consul -- curl http://envoydummy2/new

输出应符合预期,请求应路由到 envoydummy 版本 v2。
4. 向 envoydummy 版本 v2 发送 URI 是 /old 的请求:

kubectl exec -it pod/curl -n appendix-consul -- curl http://envoydummy2/old

输出应符合预期,尽管请求指向 envoydummy 版本 v2,但会路由到 envoydummy 版本 v1。

除了路径前缀,还可以使用查询参数和 HTTP 头作为路由标准。 ServiceRouter 还支持重试逻辑,可以添加到目标配置中。

5.2 拆分

服务拆分是 Consul 服务发现链的第二阶段,通过 ServiceSplitter 配置进行配置。 ServiceSplitter 允许将对服务的请求拆分为多个子集工作负载。使用此配置,还可以执行金丝雀部署。

例如,将 envoydummy 服务的流量以 20:80 的比例路由到 envoydummy 应用程序的版本 v1 和 v2:

apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceSplitter
metadata:
  name: envoydummy
spec:
  splits:
    - weight: 20
      service: envoydummy
    - weight: 80
      service: envoydummy2

该配置保存在 AppendixA/Consul/splitter.yaml 中。应用配置:

kubectl apply -f AppendixA/Consul/splitter.yaml -n appendix-consul

应用配置后,可以在 Consul 仪表板中查看路由配置。现在,测试流量是否按照配置文件中指定的比例进行路由:

for ((i=0;i<10;i++)); do kubectl exec -it pod/curl -n appendix-consul -- curl http://envoydummy/new ;done

你会观察到流量在两个服务之间以 20:80 的比例进行路由。 ServiceSplitter 是一个强大的功能,可用于 A/B 测试、金丝雀和蓝绿部署。

5.3 解析

Consul 还有一种名为 ServiceResolver 的配置类型,用于定义服务的哪些实例映射到客户端请求的服务名称。它们控制服务发现并决定请求最终路由到何处。使用 ServiceResolver ,可以通过将请求路由到健康的上游来控制系统的弹性。 ServiceResolver 在服务分布在多个数据中心时对服务进行负载分配,并在服务出现故障时提供故障转移。

6. 网关

Consul Service Mesh 提供了三种类型的网关来管理来自网格外部的流量:
- Mesh 网关 :用于启用和保护数据中心之间的通信。它作为代理为服务网格提供入口,同时使用 mTLS 保护流量。Mesh 网关用于在不同数据中心和/或 Kubernetes 集群中部署的 Consul Service Mesh 实例之间进行通信。
- Ingress 网关 :用于向网格外部的客户端提供对网格中服务的访问。客户端可以在网格外部但在同一 Kubernetes 集群中,也可以完全在集群外部但在组织的网络边界内或之外。
- Terminating 网关 :类似于 Istio 中的 ServiceEntry ,用于允许网格内的工作负载访问网格外的服务。要使用终止网关,用户还需要使用名为 ServiceDefault 的配置,其中定义了有关外部服务的详细信息,并由终止网关引用。

7. 可观测性

Consul Service Mesh 提供了对网格的全面可观测性。边车代理收集并公开有关穿越网格的流量的数据。边车代理公开的指标数据随后由 Prometheus 收集。这些数据包括第 7 层指标,如 HTTP 状态码、请求延迟和吞吐量。Consul 控制平面还提供一些指标,如配置同步状态、异常和错误,类似于 Istio 控制平面。其可观测性技术栈也与 Istio 类似,Consul 同样支持与各种其他可观测性工具(如 Datadog)集成,以深入了解 Consul Service Mesh 的健康状况和性能。

8. 卸载 Consul Service Mesh

如果你想卸载 Consul Service Mesh,可以使用以下命令:

consul-k8s uninstall -auto-approve=true -wipe-data=true

在 macOS 上,可以使用 Brew 卸载 consul-k8s CLI:

brew uninstall consul-k8s

总结

Consul Connect 是一个功能强大的服务网格解决方案,与 Istio 有许多相似之处,如都使用 Envoy 作为边车代理,服务发现链与 Istio 的虚拟服务和目标规则相似,网关也与 Istio 网关非常相似。主要区别在于控制平面的实现方式以及在集群的每个节点上使用代理。Consul Service Mesh 可以在虚拟机上运行,为遗留工作负载提供服务网格的好处。它由 HashiCorp 支持,并与 HashiCorp 的其他产品(包括 HashiCorp Vault)紧密集成,还提供免费增值产品、企业版以及 SaaS 产品 HCP Consul,为需要一键式网格部署的客户提供完全托管的云服务。

通过本文的介绍,相信你对 Consul Connect 服务网格有了更深入的了解,希望这些信息能帮助你在实际项目中更好地应用 Consul Connect。

其他服务网格技术之 Consul Connect 详解(续)

9. Consul Connect 与 Istio 的对比分析

虽然前面已经提及 Consul Connect 与 Istio 有诸多相似之处,但为了能让读者更清晰地做出技术选型,下面将通过表格的形式详细对比二者:
| 对比项 | Consul Connect | Istio |
| — | — | — |
| 控制平面实现 | 基于 Consul,在集群每个节点使用代理 | 独立的控制平面组件,如 Pilot、Galley 等 |
| 数据平面代理 | 使用 Envoy 作为边车代理 | 同样使用 Envoy 作为边车代理 |
| 服务发现链 | 包括路由、拆分和解析三个阶段 | 有虚拟服务和目标规则实现类似功能 |
| 网关类型 | 支持 Mesh 网关、Ingress 网关、Terminating 网关 | 有 Gateway、VirtualService、ServiceEntry 等类似概念 |
| 运行环境 | 可在 VMs 上运行,支持遗留工作负载 | 主要运行在 Kubernetes 集群 |
| 集成性 | 与 HashiCorp 其他产品紧密集成,如 HashiCorp Vault | 有丰富的生态系统,可与 Prometheus、Grafana 等集成 |
| 产品形态 | 提供免费增值产品、企业版和 SaaS 产品 HCP Consul | 开源项目,社区支持丰富 |

从这个对比表格可以看出,如果你所在的团队已经广泛使用 HashiCorp 的其他产品,或者有大量遗留工作负载需要使用服务网格,那么 Consul Connect 可能是一个更好的选择;而如果你的项目主要基于 Kubernetes 集群,并且希望利用丰富的开源生态系统,Istio 可能更适合。

10. Consul Connect 的应用场景

Consul Connect 由于其自身的特点,适用于多种不同的应用场景,下面为你详细介绍:
- 多数据中心和多集群通信 :Consul Connect 的 Mesh 网关功能使得在不同数据中心和 Kubernetes 集群之间部署的服务能够安全地进行通信。例如,一家跨国公司在不同地区的数据中心部署了 Consul Service Mesh 实例,通过 Mesh 网关可以实现这些实例之间的安全通信,确保数据的安全性和可靠性。
- 零信任网络架构 :通过使用 Consul 的意图(Intentions)来管理服务间的授权,能够轻松实现零信任网络架构。在金融行业,对数据安全和访问控制要求极高,使用 Consul Connect 可以严格控制服务之间的通信,只有经过授权的服务才能相互访问,大大提高了系统的安全性。
- 金丝雀和蓝绿部署 :ServiceSplitter 功能允许将流量按照一定比例分配到不同版本的服务上,非常适合进行金丝雀和蓝绿部署。在软件开发过程中,开发团队可以先将少量流量导向新版本的服务进行测试,如果没有问题再逐步增加流量,降低了部署风险。

11. 实际案例分析

为了更好地说明 Consul Connect 在实际项目中的应用,下面以一个电商平台为例进行分析。该电商平台采用微服务架构,包含多个服务,如商品服务、订单服务、用户服务等。为了提高服务之间的通信效率和安全性,决定引入 Consul Connect 服务网格。

11.1 安装和部署

按照前面介绍的安装步骤,在 Kubernetes 集群上安装 Consul Connect。通过以下命令完成安装:

git clone https://github.com/hashicorp-education/learn-consul-get-started-kubernetes.git
# 根据不同操作系统安装 consul-k8s CLI
minikube start --profile dc1 --memory 4096 --kubernetes-version=v1.24.0
consul-k8s install -config-file=helm/values-v1.yaml -set global.image=hashicorp/consul:1.14.0
11.2 服务部署和配置

部署商品服务和订单服务,并使用注解自动注入边车代理:

annotations:
  consul.hashicorp.com/connect-inject: "true"

应用配置创建 Pods:

kubectl create -f AppendixA/Consul/service-config.yaml -n ecommerce
11.3 零信任网络配置

定义意图,允许订单服务访问商品服务:

apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceIntentions
metadata:
  name: order-to-product-api
  namespace: ecommerce
spec:
  destination:
    name: product-service
  sources:
    - name: order-service
      action: allow

应用意图:

kubectl create -f AppendixA/Consul/order-to-product-intentions.yaml
11.4 流量管理和路由

使用 ServiceRouter 配置流量路由,将特定请求路由到不同版本的商品服务:

apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceRouter
metadata:
  name: product-service
spec:
  routes:
    - match:
        http:
          pathPrefix: '/new-product'
      destination:
        service: 'product-service-v2'

应用配置:

kubectl apply -f AppendixA/Consul/routing-to-product-service.yaml -n ecommerce

通过以上步骤,电商平台成功引入了 Consul Connect 服务网格,实现了服务之间的安全通信和灵活的流量管理。

12. 未来发展趋势

随着微服务架构的不断发展,服务网格技术也将不断演进。Consul Connect 作为其中的重要一员,未来可能会在以下几个方面有所发展:
- 增强与云原生生态的集成 :进一步加强与云原生生态系统中其他工具和平台的集成,如与更多的云服务提供商、容器编排工具等进行深度集成,提供更便捷的使用体验。
- 智能化的流量管理 :利用人工智能和机器学习技术,实现更智能化的流量管理和路由策略。例如,根据实时的流量数据和服务性能自动调整流量分配,提高系统的性能和稳定性。
- 简化运维和管理 :不断优化控制平面的设计,简化运维和管理工作。提供更多的可视化工具和自动化脚本,降低使用门槛,让更多的开发者和运维人员能够轻松上手。

总结回顾

本文全面介绍了 Consul Connect 服务网格,从其基本概念、安装部署、应用配置到与 Istio 的对比分析,再到实际案例和未来发展趋势。通过深入了解 Consul Connect,我们可以看到它在微服务架构中具有重要的应用价值。

Consul Connect 以其丰富的功能、灵活的配置和良好的兼容性,为企业提供了一个强大的服务网格解决方案。无论是在多数据中心通信、零信任网络架构还是金丝雀部署等方面,都能发挥出重要作用。希望本文能帮助读者更好地理解和应用 Consul Connect,在实际项目中取得更好的效果。

下面是 Consul Connect 服务发现链的 mermaid 流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A([客户端请求]):::startend --> B(路由):::process
    B --> C(拆分):::process
    C --> D(解析):::process
    D --> E([请求到达目标服务]):::startend

这个流程图清晰地展示了 Consul Connect 服务发现链的三个阶段,从客户端请求开始,经过路由、拆分和解析,最终请求到达目标服务。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值