托管网格使用Demo
1.创建托管服务网格
进入百度智能云控制台 -> 选择服务网格 CSM -> 创建网格(选择实例类型为托管网格、填写必要的信息、选择托管实例所属的网络信息)-> 确认创建即可。
2.添加用户集群
添加需要使用服务网格的业务集群,以便 CSM 托管网格实例可以管理用户集群上的微服务应用。
因此需要提前准备一个百度智能云容器引擎 CCE 集群,用于部署示例应用程序。具体创建集群步骤可参考文档:创建集群。
注意:
- 托管网格纳管的CCE集群,如果选择vpc-eni网络模式,需要确保选择的安全组出站规则配置了能访问托管网格实例vpc的网段
- CCE集群创建worker节点时,镜像推荐选择unbuntu
- Baidulinux 操作系统请开启相关内核模块
CCE 集群准备完成后,可在 CSM 中添加用户集群,路径:进入百度智能云控制台 -> 选择服务网格 CSM -> 点击对应的网格实例 -> 集群管理 -> 添加集群 -> 确认。
3.开启Sidecar注入
开启自动注入功能,可实现业务的无感注入 Sidecar 代理,该 Sidecar 代理用于实现服务网格中各项能力。开启对应命名空间自动注入功能后,重启或重新部署对应命名空间下的工作负载,可实现该命名空间下的 Pod 自动被注入了 Sidecar 容器。
路径:进入百度智能云控制台 -> 选择服务网格 CSM -> 点击对应的网格实例 -> 注入配置 -> 添加集群 -> 开启对应命名空间自动注入开关。
4.部署应用程序
在 CCE 容器引擎上可通过页面配置 或 YAML 的方式部署工作负载和服务。
路径:进入百度智能云控制台 -> 选择容器引擎 CCE -> 点击对应的集群 -> 工作负载 -> 无状态服务部署 -> 新建无状态部署/使用 YAML 创建。
以本文以 YAML 创建为例,consumer-demo的K8S deployment YAML 定义如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: consumer-demo-deployment
labels:
app: consumer-demo
name: consumer-demo
spec:
replicas: 1
selector:
matchLabels:
app: consumer-demo
template:
metadata:
labels:
app: consumer-demo
spec:
restartPolicy: Always
schedulerName: volcano
containers:
- name: consumer-demo
image: registry.baidubce.com/csm-offline/bms-orignal-consumer:dev
imagePullPolicy: Always
ports:
- containerPort: 9999
为演示的演示服务网格的功能,需要为provider-demo定义不同的版本,即v1和v2。
provider-demo v1版本K8S deployment YAML 定义如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: provider-demo-deployment-v1
labels:
app: provider-demo
name: provider-demo
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: provider-demo
version: v1
template:
metadata:
labels:
app: provider-demo
version: v1
spec:
restartPolicy: Always
containers:
- name: provider-demo
image: registry.baidubce.com/csm-offline/bms-orignal-provider:dev
imagePullPolicy: Always
ports:
- containerPort: 10001
provider-demo v2版本K8S deployment YAML 定义如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: provider-demo-deployment-v2
labels:
app: provider-demo
name: provider-demo
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: provider-demo
version: v2
template:
metadata:
labels:
app: provider-demo
version: v2
spec:
restartPolicy: Always
containers:
- name: provider-demo
image: registry.baidubce.com/csm-offline/bms-orignal-provider:dev
imagePullPolicy: Always
ports:
- containerPort: 10001
接下来进入百度智能云控制台 -> 选择容器引擎 CCE -> 点击对应的集群 -> 流量接入 -> 服务 -> 新建服务。
provider-demo Service YAML 定义如下:
apiVersion: v1
kind: Service
metadata:
name: provider-demo
annotations:
prometheus.io/scrape: "true"
spec:
selector:
app: provider-demo
type: ClusterIP
sessionAffinity: None
ports:
- protocol: TCP
port: 80
targetPort: 10001
name: http-port
验证流量
在本文的示例中 Consumer Demo 访问 Provider Demo 时通过 K8S Service 轮询访问后端服务,即轮询访问 V1 和 V2 版本 Provider Demo Pod,而无法精准控制流量。
进入consumer-demo的pod容器中,访问接口:
while true; do curl http://127.0.0.1:9999/echo-rest/hello && echo && sleep 1; done;
while true; do curl -H 'x-b3-user: admin' http://127.0.0.1:9999/echo-rest/hello && echo && sleep 1; done;
5.服务治理策略下发
现所有准备工作都已完成,即可快速使用 CSM 提供的服务网格微服务治理能力。
一个例子,通过服务网格服务治理能力可实现 Consumer Demo 访问 Provider Demo 的流量 100% 发往Provider Demo V1版本,而不再将流量发往 Provider Demo V2 版本,如下图所示: 进入百度智能云控制台 -> 选择服务网格 CSM -> 点击对应网格实例 -> Istio 资源管理 -> 创建 Istio 资源。
Istio 资源 YAML 定义如下:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: dr-provider-demo
spec:
host: provider-demo.default.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: vs-provider-demo
spec:
hosts:
- provider-demo.default.svc.cluster.local
http:
- route:
- destination:
host: provider-demo.default.svc.cluster.local
subset: v1
weight: 100
- destination:
host: provider-demo.default.svc.cluster.local
subset: v2
weight: 0
验证流量
在本文的示例中 Consumer Demo 访问 Provider Demo 时 流量只会访问 V1 版本,而不再访问V2 版本,通过 CSM 可实现精准控制流量走向的目的。
同样可以进入consumer-demo的pod容器中,访问接口:
while true; do curl http://127.0.0.1:9999/echo-rest/hello && echo && sleep 1; done;
while true; do curl -H 'x-b3-user: admin' http://127.0.0.1:9999/echo-rest/hello && echo && sleep 1; done;
另一个例子,服务网格也支持istio原生的envoyfilter资源
进入百度智能云控制台 -> 选择服务网格 CSM -> 点击对应网格实例 -> Istio 资源管理 -> 创建 Istio 资源。
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: add-baibu-header
namespace: istio-system
spec:
workloadSelector:
labels:
istio: ingressgateway # 可以根据需要更改为特定的工作负载选择器
configPatches:
- applyTo: HTTP_FILTER
match:
context: SIDECAR_OUTBOUND
patch:
operation: INSERT_BEFORE
value:
name: envoy.lua
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
inlineCode: |
function envoy_on_request(request_handle)
request_handle:headers():add("baidu", "some-value")
end
6.托管网格控制面监控
具体可参考:对接Cprom实现监控告警
7.查看托管网格访问凭证
进入CSM控制台——>托管网格实例——>基本信息——>查看网格凭证,同时支持VPC访问凭证和公网访问凭证,您可以进行下载或者复制。您可利用访问凭证通过 kubectl 命令等方式提交 Istio 相关 CRD 资源(如 Envoyfilter、VirtualService、DestinationRule等)。