其他服务网格技术之 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
-
安装 Consul CLI
:
-
MacOS
:
- 安装 HashiCorp tap:
-
MacOS
:
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
- 启动 minikube :
minikube start --profile dc1 --memory 4096 --kubernetes-version=v1.24.0
-
使用 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
- 检查命名空间中的 Consul Pods :
kubectl get po -n consul
-
配置 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
- 访问 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 服务发现链的三个阶段,从客户端请求开始,经过路由、拆分和解析,最终请求到达目标服务。
超级会员免费看
45

被折叠的 条评论
为什么被折叠?



