分布式追踪与Istio多集群部署实践
1. 分布式追踪与Jaeger的使用
在分布式系统中,了解请求的处理过程至关重要。Jaeger作为一款开源的分布式追踪软件,最初由Uber开发,后捐赠给CNCF,可用于监控和排查基于微服务的系统问题。其主要用途包括:
- 分布式上下文传播和事务监控
- 微服务依赖分析和故障排查
- 理解分布式架构中的瓶颈
1.1 安装和配置Jaeger
在Istio中安装Jaeger,可使用以下命令:
% kubectl apply -f samples/addons/jaeger.yaml
deployment.apps/jaeger created
service/tracing created
service/zipkin created
service/jaeger-collector created
此命令将在
istio-system
命名空间中安装Jaeger。可使用以下命令打开其仪表盘:
$ istioctl dashboard jaeger
1.2 理解Istio注入的B3头
由于sockshop应用未设计传播头信息,我们以httpbin应用为例,部署httpbin应用:
% kubectl apply -f Chapter7/01-httpbin-deployment.yaml
向httpbin发送请求并检查响应头:
% curl -H "Host:httpbin.com" http://a858beb9fccb444f48185da8fce35019-1967243973.us-east-1.elb.amazonaws.com/headers
{
"headers": {
"Accept": "*/*",
"Host": "httpbin.com",
"User-Agent": "curl/7.79.1",
"X-B3-Parentspanid": "5c0572d9e4ed5415",
"X-B3-Sampled": "1",
"X-B3-Spanid": "743b39197aaca61f",
"X-B3-Traceid": "73665fec31eb46795c0572d9e4ed5415",
"X-Envoy-Attempt-Count": "1",
"X-Envoy-Internal": "true",
"X-Forwarded-Client-Cert": "By=spiffe://cluster.local/ns/Chapter7/sa/default;Hash=5c4dfe997d5ae7c853efb8b81624f1ae5e4472f1cabeb36a7cec38c9a4807832;Subject=\"\";URI=spiffe://cluster.local/ns/istio-system/sa/istio-ingressgateway-service-account"
}
}
响应中,Istio注入的
x-b3-parentspanid
、
x-b3-sampled
、
x-b3-spanid
和
x-b3-traceid
被称为B3头,用于跨服务边界的跟踪上下文传播:
| 头信息 | 说明 |
| ---- | ---- |
|
x-b3-sampled
| 表示请求是否应被跟踪,值为1表示是,0表示禁止 |
|
x-b3-traceid
| 长度为8或16字节,指示跟踪的整体ID |
|
x-b3-parentspanid
| 长度为8字节,代表跟踪树中父操作的位置 |
|
x-b3-spanid
| 长度为8字节,代表跟踪树中当前操作的位置 |
在上述例子中,请求先到达Ingress网关,再到httpbin。Ingress网关生成的
span ID
为
5c0572d9e4ed5415
,是httpbin
span ID
为
743b39197aaca61f
的父级,二者具有相同的跟踪ID。
1.3 部署bookinfo应用并查看跟踪信息
部署bookinfo应用并配置Ingress:
% kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n Chapter7
% kubectl apply -f Chapter7/bookinfo-gateway.yaml
访问bookinfo应用,向其发送请求后,可在Jaeger仪表盘选择
productpage.Chapter7
服务,点击
Find Traces
查看详细跟踪信息。
在Jaeger中,跟踪表示请求执行过程,由多个
span
组成,每个
span
代表一个工作单元。例如一个有八个
span
的跟踪示例,可观察到请求在不同服务中的处理时间和流程。
1.4 控制跟踪采样率
跟踪会带来性能开销,并非所有请求都需要跟踪。可通过以下配置控制采样率:
% kubectl get cm/istio -n istio-system -o yaml
修改配置中的
tracing
部分:
apiVersion: v1
data:
mesh: |-
...
tracing:
sampling: 10
zipkin:
address: zipkin.istio-system:9411
enablePrometheusMerge: true
...
kind: ConfigMap
也可在部署级别控制,如在
bookinfo.yaml
中添加以下内容,使
productpage
仅采样1%的请求:
template:
metadata:
annotations:
proxy.istio.io/config: |
tracing:
sampling: 1
zipkin:
address: zipkin.istio-system:9411
2. Istio多集群部署
在生产环境中,应用通常部署在多个Kubernetes集群中,因此需要将Istio部署到多集群并进行联合。
2.1 技术要求
- Google Cloud账户 :首次使用可能有免费额度,需安装Google CLI并初始化。
- Kubernetes集群 :使用Google Kubernetes Engine创建两个集群。
- OpenSSL :版本需3.0或更高,用于生成根证书和中间证书颁发机构(CA)。
2.2 设置Kubernetes集群
- 创建集群1:
% gcloud beta container --project "istio-book-370122" clusters create "cluster1" --zone "australia-southeast1-a" --no-enable-basic-auth --cluster-version "1.23.12-gke.100" --release-channel "regular" --machine-type "e2-medium" --image-type "COS_CONTAINERD" --disk-type "pd-standard" --disk-size "30" --num-nodes "3"
- 创建集群2:
% gcloud beta container --project "istio-book-370122" clusters create "cluster2" --zone "australia-southeast2-a" --no-enable-basic-auth --cluster-version "1.23.12-gke.100" --release-channel "regular" --machine-type "e2-medium" --image-type "COS_CONTAINERD" --disk-type "pd-standard" --disk-size "30" --max-pods-per-node "110" --num-nodes "3"
- 设置环境变量:
% kubectl config view -o json | jq '.clusters[].name'
"gke_istio-book-370122_australia-southeast1-a_primary-cluster"
"gke_istio-book-370122_australia-southeast2-a_primary2-cluster"
"minikube"
export CTX_CLUSTER1="gke_istio-book-370122_australia-southeast1-a_primary-cluster"
export CTX_CLUSTER2="gke_istio-book-370122_australia-southeast2-a_primary2-cluster"
2.3 设置OpenSSL
Mac用户可按以下步骤操作:
% brew install openssl@3
openssl@3 is keg-only, which means it was not symlinked into /opt/homebrew,
because macOS provides LibreSSL.
% export PATH="/opt/homebrew/opt/openssl@3/bin:$PATH"
% openssl version
OpenSSL 3.0.7 1
2.4 额外的Google Cloud步骤
- 计算集群的CIDR块:
% function join_by { local IFS="$1"; shift; echo "$*"; }
ALL_CLUSTER_CIDRS=$(gcloud container clusters list –format='value(clusterIpv4Cidr)' | sort | uniq)
ALL_CLUSTER_CIDRS=$(join_by , $(echo "${ALL_CLUSTER_CIDRS}"))
- 获取集群的NETTAGS:
% ALL_CLUSTER_NETTAGS=$(gcloud compute instances list –format='value(tags.items.[0])' | sort | uniq)
ALL_CLUSTER_NETTAGS=$(join_by , $(echo "${ALL_CLUSTER_NETTAGS}"))
- 创建防火墙规则:
% gcloud compute firewall-rules create primary-remote-shared-network \
--allow=tcp,udp,icmp,esp,ah,sctp \
--direction=INGRESS \
--priority=900 \
--source-ranges="${ALL_CLUSTER_CIDRS}" \
--target-tags="${ALL_CLUSTER_NETTAGS}" –quiet
- 删除集群和防火墙规则:
% gcloud compute firewall-rules delete primary-remote-shared-network
% gcloud container clusters delete cluster1 –zone "australia-southeast1-a"
% gcloud container clusters delete cluster2 –zone "australia-southeast2-a"
2.5 建立多集群部署的相互信任
在多集群部署中,需建立集群间的信任。Istio基于零信任模型,通过mTLS进行服务间通信。有两种实现方式:
-
插件CA证书
:在Istio外部创建根证书和中间证书,配置Istio使用中间证书。
-
Istio外部CA
:使用外部CA签署证书,避免在Kubernetes集群中存储私钥。如使用cert-manager,Istio批准服务工作负载的CSR请求并转发给cert-manager签署,再将证书传递给istio-agent。
在后续章节中,我们将使用插件CA证书选项,专注于Istio的多集群设置。
以下是多集群部署的流程mermaid图:
graph LR;
A[设置Google Cloud账户] --> B[创建Kubernetes集群];
B --> C[设置OpenSSL];
C --> D[计算CIDR和NETTAGS];
D --> E[创建防火墙规则];
E --> F[建立集群间信任];
F --> G[部署Istio到多集群];
通过以上步骤,我们可以实现分布式追踪和Istio的多集群部署,更好地监控和管理分布式系统。
分布式追踪与Istio多集群部署实践(续)
3. 不同集群配置下的Istio设置
在建立了多集群部署的基础和相互信任之后,接下来将探讨在不同集群配置下如何设置Istio。
3.1 多网络环境下的主 - 远程模式
在多网络环境中,主集群和远程集群可能位于不同的网络中,需要确保它们之间的通信安全和可靠。
-
配置主集群
:
- 首先,使用插件CA证书选项,在主集群中部署Istio控制平面。确保中间CA证书和密钥正确配置,以便为工作负载分配可被信任的身份。
- 配置主集群的Ingress网关,使其能够接收来自远程集群的请求。可以使用以下命令部署主集群的Ingress网关:
% kubectl apply -f samples/istio-ingressgateway.yaml -n istio-system
-
配置远程集群
:
- 在远程集群中,部署Istio的数据平面,确保其与主集群的控制平面进行通信。可以通过设置环境变量来指定主集群的控制平面地址:
export ISTIO_CONTROL_PLANE_ADDRESS=主集群控制平面地址
- 部署远程集群的Ingress网关,使其能够将请求转发到主集群。
3.2 同一网络环境下的主 - 远程模式
在同一网络环境中,主集群和远程集群的通信相对简单,但仍需要进行适当的配置。
-
配置主集群
:
- 同样使用插件CA证书选项部署Istio控制平面。
- 配置主集群的服务发现机制,使其能够发现远程集群中的服务。可以通过修改Istio的配置文件来实现:
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
meshConfig:
defaultConfig:
discoverySelectors:
- matchLabels:
istio: remote-cluster
-
配置远程集群
:
- 部署Istio的数据平面,并将其连接到主集群的控制平面。
- 确保远程集群的服务能够正确注册到主集群的服务发现机制中。
3.3 不同网络环境下的多主模式
在不同网络环境下的多主模式中,多个主集群可能位于不同的网络中,需要更复杂的配置来确保它们之间的协调和通信。
-
配置多个主集群
:
- 每个主集群都需要独立部署Istio控制平面,并使用插件CA证书选项确保工作负载的身份可被相互信任。
- 配置主集群之间的通信,例如通过VPN或其他安全通道。可以使用以下命令创建VPN连接:
% gcloud compute target-vpn-gateways create vpn-gateway --network=网络名称 --region=区域名称
-
配置数据平面
:
- 在各个集群中部署Istio的数据平面,并确保它们能够正确地与相应的主集群控制平面进行通信。
3.4 同一网络环境下的多主模式
在同一网络环境下的多主模式中,多个主集群位于同一网络中,通信相对容易,但仍需要进行适当的协调。
-
配置多个主集群
:
- 每个主集群独立部署Istio控制平面,并确保中间CA证书和密钥的一致性。
- 配置主集群之间的服务发现和负载均衡,以确保请求能够正确地分发到各个集群中的服务。
-
配置数据平面
:
- 在各个集群中部署Istio的数据平面,并确保它们能够正确地与相应的主集群控制平面进行通信。
4. 多集群部署的优势和挑战
4.1 优势
| 优势 | 说明 |
|---|---|
| 弹性扩展 | 可以根据业务需求在不同的集群中扩展服务,提高系统的弹性和可用性。 |
| 地域分布 | 可以将服务部署在不同的地理位置,满足不同地区用户的需求,提高响应速度。 |
| 资源隔离 | 不同的集群可以隔离资源,避免相互影响,提高系统的稳定性。 |
4.2 挑战
| 挑战 | 说明 |
|---|---|
| 网络复杂性 | 多集群部署可能涉及不同的网络环境,需要处理网络通信和安全问题。 |
| 配置管理 | 多个集群的配置需要进行统一管理,确保一致性和正确性。 |
| 服务发现 | 需要确保各个集群中的服务能够正确地发现和通信。 |
5. 总结与展望
通过以上介绍,我们了解了如何使用Jaeger进行分布式追踪,以及如何在不同的集群配置下部署Istio。分布式追踪可以帮助我们更好地理解请求在分布式系统中的执行过程,而Istio的多集群部署可以满足生产环境中复杂的应用部署需求。
在实际应用中,我们需要根据具体的业务需求和网络环境选择合适的集群配置和部署方式。同时,要注意处理好多集群部署带来的挑战,如网络复杂性、配置管理和服务发现等问题。
未来,随着分布式系统的不断发展,分布式追踪和服务网格技术将变得越来越重要。我们可以进一步探索如何优化分布式追踪的性能,以及如何更好地管理和扩展Istio的多集群部署。例如,可以研究如何使用更高效的追踪算法,以及如何实现自动化的集群配置和管理。
以下是整个分布式追踪和Istio多集群部署的流程总结mermaid图:
graph LR;
A[了解分布式追踪和Jaeger] --> B[安装和配置Jaeger];
B --> C[理解B3头和部署bookinfo应用];
C --> D[控制跟踪采样率];
D --> E[设置Istio多集群部署的技术环境];
E --> F[建立多集群间的相互信任];
F --> G[不同集群配置下的Istio设置];
G --> H[分析多集群部署的优势和挑战];
H --> I[总结与展望未来发展];
通过遵循这些步骤和方法,我们可以构建一个高效、可靠的分布式系统,实现更好的监控和管理。

2714

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



