内容大纲
- 1. 服务网格概述
- 2. 服务网格架构
- 3. Istio 服务网格
- 4. Linkerd 服务网格
- 5. Consul Connect
- 6. 服务网格部署
- 7. 流量管理
- 8. 服务网格安全
- 9. 服务网格监控
- 10. 服务网格最佳实践
1. 服务网格概述
服务网格是一种专门用于处理服务间通信的基础设施层。它通过在每个服务实例旁边部署一个轻量级的代理(称为边车),来管理服务间的通信、监控、安全和流量控制。
服务网格的核心功能包括:
- 服务发现和负载均衡
- 流量管理(路由、分流、重试、超时)
- 服务间安全通信(mTLS)
- 可观测性(监控、追踪、日志)
- 策略执行(访问控制、速率限制)
学习交流加群风哥微信: itpux-com
2. 服务网格架构
2.1 数据平面
数据平面由部署在每个服务实例旁边的边车代理组成,负责处理服务间的实际通信。边车代理拦截所有进出服务的流量,并根据控制平面的配置执行相应的操作。
2.2 控制平面
控制平面负责管理和配置数据平面的边车代理,提供服务发现、流量管理、安全策略等功能。控制平面不直接处理服务间的通信,而是通过配置边车代理来实现这些功能。
2.3 主要组件
- 边车代理:拦截和处理服务间通信
- 服务发现:维护服务实例的地址信息
- 流量管理:控制服务间的流量路由
- 安全管理:实现服务间的安全通信
- 监控系统:收集和分析服务运行数据
风哥风哥提示:服务网格通过将服务间通信的复杂性从应用代码中分离出来,使得开发者可以专注于业务逻辑的开发,而将通信、安全和监控等关注点交给服务网格处理。
3. Istio 服务网格
3.1 Istio 架构
Istio是最流行的服务网格解决方案之一,它由以下组件组成:
- Envoy:边车代理,负责处理服务间通信
- Istiod:控制平面,负责配置和管理Envoy代理
- Pilot:负责服务发现和流量管理
- Galley:负责配置验证
- Mixer:负责策略执行和遥测数据收集
3.2 Istio 安装
$ curl -L https://istio.io/downloadIstio | sh –
$ cd istio-1.11.0
$ export PATH=$PWD/bin:$PATH
# 安装Istio(使用demo配置)
$ istioctl install –set profile=demo -y
# 验证Istio安装
$ kubectl get pods -n istio-system
istio-egressgateway-7c6658949d-6z7z9 1/1 Running 0 1m
istio-ingressgateway-765c659c4d-2x7c5 1/1 Running 0 1m
istiod-7f9b9f9b9b-4x4x4 1/1 Running 0 1m
3.3 部署应用到Istio
$ kubectl label namespace default istio-injection=enabled
# 部署示例应用
$ kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml
# 查看应用部署状态
$ kubectl get pods
details-v1-558b8b4b76-7x7x7 2/2 Running 0 2m
productpage-v1-6987489c74-8x8x8 2/2 Running 0 2m
ratings-v1-7dc98c7588-9x9x9 2/2 Running 0 2m
reviews-v1-7f9b9f9b9b-5x5x5 2/2 Running 0 2m
reviews-v2-7d7d7d7d7d-6x6x6 2/2 Running 0 2m
reviews-v3-8f8f8f8f8f-7x7x7 2/2 Running 0 2m
更多学习教程www.fgedu.net.cn
4. Linkerd 服务网格
4.1 Linkerd 架构
Linkerd是一个轻量级的服务网格解决方案,它由以下组件组成:
- Linkerd Proxy:基于Rust的边车代理,负责处理服务间通信
- Linkerd Control Plane:负责配置和管理代理
- Linkerd CLI:命令行工具,用于管理Linkerd
4.2 Linkerd 安装
$ curl -sL https://run.linkerd.io/install | sh
$ export PATH=$HOME/.linkerd2/bin:$PATH
# 验证CLI安装
$ linkerd version
# 检查集群是否满足安装要求
$ linkerd check –pre
# 安装Linkerd控制平面
$ linkerd install | kubectl apply -f –
# 验证Linkerd安装
$ kubectl get pods -n linkerd
Server version: unavailable
kubernetes-api
————–
√ can initialize the client
√ can query the Kubernetes API
kubernetes-version
——————
√ is running the minimum Kubernetes API version
√ is running the minimum kubectl version
pre-kubernetes-setup
——————–
√ control plane namespace does not already exist
√ can create Namespaces
√ can create ClusterRoles
√ can create ClusterRoleBindings
√ can create CustomResourceDefinitions
√ can create PodSecurityPolicies
√ can create Roles
√ can create RoleBindings
√ can create ServiceAccounts
√ can create Services
√ can create Deployments
√ can create CronJobs
√ can create ConfigMaps
√ can create Secrets
√ can read Secrets
√ can read extension-apiserver-authentication configmap
√ no clock skew detected
linkerd-version
—————
√ can determine the latest version
√ cli is up-to-date
Status check results are √
NAME READY STATUS RESTARTS AGE
linkerd-identity-7f9b9f9b9b-4x4x4 2/2 Running 0 1m
linkerd-proxy-injector-6655885f54-7x7x7 2/2 Running 0 1m
linkerd-sp-validator-7d7d7d7d7d-6x6x6 2/2 Running 0 1m
linkerd-web-7c6658949d-6z7z9 2/2 Running 0 1m
4.3 部署应用到Linkerd
$ kubectl apply -f https://run.linkerd.io/emojivoto.yml
# 注入边车代理
$ kubectl get deploy -n emojivoto -o yaml | linkerd inject – | kubectl apply -f –
# 查看应用部署状态
$ kubectl get pods -n emojivoto
deployment.apps/vote-bot created
deployment.apps/voting created
deployment.apps/web created
serviceaccount/emoji created
serviceaccount/vote-bot created
serviceaccount/voting created
serviceaccount/web created
service/emoji-svc created
service/voting-svc created
service/web-svc created
deployment.apps/emoji injected
deployment.apps/vote-bot injected
deployment.apps/voting injected
deployment.apps/web injected
serviceaccount/emoji unchanged
serviceaccount/vote-bot unchanged
serviceaccount/voting unchanged
serviceaccount/web unchanged
service/emoji-svc unchanged
service/voting-svc unchanged
service/web-svc unchanged
NAME READY STATUS RESTARTS AGE
emoji-558b8b4b76-7x7x7 2/2 Running 0 2m
vote-bot-7f9b9f9b9b-4x4x4 2/2 Running 0 2m
voting-7d7d7d7d7d-6x6x6 2/2 Running 0 2m
web-7c6658949d-6z7z9 2/2 Running 0 2m
author:www.itpux.com
5. Consul Connect
5.1 Consul Connect 概述
Consul Connect是HashiCorp Consul的服务网格功能,它提供服务发现、健康检查、服务间安全通信等功能。
5.2 Consul Connect 安装
$ wget https://releases.hashicorp.com/consul/1.10.0/consul_1.10.0_linux_amd64.zip
$ unzip consul_1.10.0_linux_amd64.zip
$ sudo mv consul /usr/local/bin/
# 启动Consul代理
$ consul agent -dev -enable-script-checks -config-dir=/etc/consul.d
# 启用Consul Connect
$ consul connect envoy -sidecar-for web -admin-bind fgedudb:19000
5.3 Consul Connect 配置
# web-service.json
{
“service”: {
“name”: “web”,
“port”: 8080,
“connect”: {
“sidecar_service”: {}
},
“checks”: [
{
“http”: “http://fgedudb:8080/health”,
“interval”: “10s”
}
]
}
}
# 注册服务
$ consul services register web-service.json
更多学习教程公众号风哥教程itpux_com
6. 服务网格部署
6.1 部署策略
- 渐进式部署:先在非关键服务上部署,然后逐步扩展
- 金丝雀部署:将流量逐步转移到新的服务网格
- 蓝绿部署:同时运行旧版本和新版本,然后切换流量
6.2 部署注意事项
- 资源消耗:服务网格会增加一定的资源消耗,需要合理规划
- 网络延迟:边车代理会增加一定的网络延迟,需要评估影响
- 配置复杂性:服务网格的配置较为复杂,需要专业知识
- 兼容性:需要确保应用与服务网格兼容
7. 流量管理
7.1 路由规则
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
– reviews
http:
– route:
– destination:
host: reviews
subset: v1
weight: 90
– destination:
host: reviews
subset: v2
weight: 10
—
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
namespace: default
spec:
host: reviews
subsets:
– name: v1
labels:
version: v1
– name: v2
labels:
version: v2
7.2 故障注入
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
– reviews
http:
– fault:
delay:
percentage:
value: 50.0
fixedDelay: 5s
route:
– destination:
host: reviews
subset: v1
7.3 超时和重试
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: default
spec:
hosts:
– reviews
http:
– route:
– destination:
host: reviews
subset: v1
timeout: 10s
retries:
attempts: 3
perTryTimeout: 2s
retryOn: 5xx
风哥风哥提示:流量管理是服务网格的核心功能之一,它可以帮助实现更灵活、更可靠的服务间通信。
8. 服务网格安全
8.1 mTLS 配置
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
8.2 访问控制
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: reviews-access
namespace: default
spec:
selector:
matchLabels:
app: reviews
rules:
– from:
– source:
principals: [“cluster.local/ns/default/sa/productpage”]
to:
– operation:
methods: [“GET”]
8.3 密钥管理
- 自动生成和轮换密钥
- 使用Kubernetes Secrets存储密钥
- 集成外部密钥管理系统
学习交流加群风哥QQ113257174
9. 服务网格监控
9.1 指标收集
$ kubectl port-forward -n istio-system svc/prometheus 9090:9090
# 访问Prometheus UI
# http://fgedudb:9090
# 查看Linkerd指标
$ linkerd dashboard
# 访问Linkerd UI
# http://fgedudb:50750
9.2 分布式追踪
$ kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/addons/jaeger.yaml
# 查看Jaeger UI
$ kubectl port-forward -n istio-system svc/jaeger-query 16686:16686
# 访问Jaeger UI
# http://fgedudb:16686
9.3 日志管理
$ kubectl logs -l app=reviews -c istio-proxy
# 配置日志收集
apiVersion: telemetry.istio.io/v1alpha1
kind: Telemetry
metadata:
name: default
namespace: default
spec:
logs:
– providers:
– name: otel
randomSamplingPercentage: 100.0
10. 服务网格最佳实践
10.1 设计最佳实践
- 合理规划服务边界,避免服务过多
- 使用统一的服务命名规范
- 设计弹性的服务通信模式
- 避免服务间的循环依赖
10.2 部署最佳实践
- 从小规模开始,逐步扩展
- 使用自动化工具部署和管理服务网格
- 实施CI/CD流水线,自动化服务部署
- 定期备份服务网格配置
10.3 运维最佳实践
- 建立完善的监控和告警系统
- 定期检查服务网格健康状态
- 制定故障应急预案
- 定期更新服务网格版本
10.4 性能优化最佳实践
- 合理配置边车代理资源限制
- 优化流量管理规则,减少不必要的转发
- 使用合适的负载均衡策略
- 定期清理无用的配置和资源
- 在生产环境部署服务网格前,进行充分的测试和评估
- 选择适合自己业务场景的服务网格解决方案
- 建立服务网格运维团队,确保专业的管理和维护
- 定期培训开发和运维人员,提高服务网格使用技能
- 持续优化服务网格配置,提高系统性能和可靠性
author:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
