网关管理
概述
本节介绍服务网格CSM下的托管网关实例的创建、查看、删除等相关操作。
使用前提
目前的托管网关能力依托于托管网格作为控制面,在使用前需先创建一个服务网格CSM-托管网格实例,且一个托管网格下只允许创建一个托管网关。
创建托管网关
按以下步骤在控制台上创建托管网关:
- 登录百度智能云控制台,选择“产品服务 > 云原生 > 服务网格 CSM”。
- 在服务网格控制台,对应地域的“网格列表”中找到要操作的托管类型的服务网格实例,点击实例名称可在左侧边栏看到“网关管理”。
- 点击“网关管理”->“创建网关”:
“基础配置”页配置项说明:
配置项 描述 备注 网关名称 托管网关名称(注意命名规则) 部署方式 托管网关(默认) 网关类型 入口网关(默认) 实例规格 托管网关对应Pod的资源配额,目前有“2核4G”和“4核8G”两种规格可以选择 暂不支持用户自定义修改 副本数 托管网关工作负载对应的k8s副本数 扩缩容HPA HPA(Horizontal Pod Autoscaling),自动扩缩容工作负载 目前仅支持1-3的扩缩容范围
- 点击下一步,进入BLB配置页面,托管网关要求绑定一个BLB实例作为流量入口进行访问:
列表中会展示当前“网络类型”VPC下的BLB实例,如果当前VPC下不存在BLB实例,则需点击“新建BLB”,跳转至BLB产品页面创建一个BLB实例,注意“所在网络”要与上述“网络类型”保持一致,并且如果在此处打开了“公网访问”开关,则回到托管网关产品“BLB配置”页面“公网访问”会自动打开:
- 点击“下一步”,确认信息无误后点击“确认订单”开始进行实例创建,在网关管理页面,可以看到“部署中”的托管网关实例,大约几秒钟后会转为“运行中”。
域名管理
添加80端口下的HTTP协议的域名监听
点击“网关管理”,点击网关名称进入“网关详情页”,点击“域名管理”,“添加域名监听”
添加443端口下的HTTPS协议的域名监听
配置项说明:
配置项 描述 备注 域名 网关监听的访问域名,输入完整域名(例如:helloworld.example.com)或泛域名(例如:*.example.com)。在这个域名下,您可以独立管理该域名的协议及证书,路由配置可以通过域名实现相互隔离。 端口名称 用户自定义的端口名称 协议 选择HTTP协议或HTTPS协议(与端口强绑定),且HTTPS协议必须关联SSL证书。不同协议支持的端口号如下: HTTP:支持80端口。 HTTPS:支持443端口。 证书 选择HTTPS协议所关联的百度智能云SSL证书服务上的证书。相关内容,请参见SSL证书服务文档。 强制HTTPS 选中强制HTTPS,表示只生效HTTPS端口,正常HTTP端口将拒绝访问,请求将被重定向为HTTPS。
流量验证
假设用户在被纳管的集群A中的test命名空间下部署了一个helloworld服务。
用户接下来需要在“istio资源管理”页面编辑“gateway-vs”文件,补充如下配置,保证当前域名的路径下已配置可访问的路由:
1apiVersion: networking.istio.io/v1alpha3
2kind: Gateway
3metadata:
4 name: helloworld-gateway
5spec:
6 gateways:
7 - gateway-gw
8 hosts:
9 - '*'
10 http:
11 - match:
12 - uri:
13 exact: /hello
14 route:
15 - destination:
16 host: helloworld.test.svc.cluster.local
17 port:
18 number: 5000
然后在终端通过以下方式访问该托管网关实例对应BLB上绑定的EIP来访问到remote集群的helloworld服务:
- 如果您的域名公网解析已生效,直接可以浏览器访问验证。
-
如果您的域名还未配置DNS解析,则通过以下方式进行验证。
- 针对HTTP协议,使用
$ curl -v http://helloworld.example.com/hello --resolve "helloworld.example.com:80:{BLB绑定的公网IP}"
进行验证 - 针对HTTPS协议,使用
$ curl -v -HHost:helloworld.example.com --resolve "helloworld.example.com:443:{BLB绑定的公网IP}" \ --cacert example_certs1/example.com.crt "https://helloworld.example.com:443/hello"
- 针对HTTP协议,使用
如果需要配置更详细的治理策略可根据用户需要在“istio资源管理”页面下发相应Crd。下面以配置helloworld的v1、v2版本的访问权重作为简单例子说明:
- 修改gateway-vs文件,补充如下配置:
1apiVersion: networking.istio.io/v1alpha3
2kind: VirtualService
3metadata:
4 name: helloworld-vs
5 namespace: istio-system-csm-6gdec53e
6spec:
7 hosts:
8 - helloworld.test-hu.svc.cluster.local
9 http:
10 - match:
11 - uri:
12 exact: /hello
13 route:
14 - destination:
15 host: helloworld.test-hu.svc.cluster.local
16 port:
17 number: 5000
18 subset: v1
19 weight: 80
20 - destination:
21 host: helloworld.test-hu.svc.cluster.local
22 port:
23 number: 5000
24 subset: v2
25 weight: 20
- 下发helloworld-dr文件:
1apiVersion: networking.istio.io/v1alpha3
2kind: DestinationRule
3metadata:
4 name: helloworld-dr
5 namespace: istio-system-csm-6gdec53e
6spec:
7 host: helloworld.test-hu.svc.cluster.local
8 subsets:
9 - name: v1
10 labels:
11 version: v1
12 - name: v2
13 labels:
14 version: v2
- 按照上述方式进行流量比例验证。
查看托管网关详情
按以下步骤在控制台上查看托管网关详情:
- 登录百度智能云控制台,选择“产品服务 > 云原生 > 服务网格 CSM”。
- 在服务网格控制台,对应地域的“网格列表”中找到要操作的托管类型的服务网格实例,点击实例名称可在左侧边栏看到“网关管理”。
- 点击“网关管理”页面的托管网关实例名称,会跳转到网关详情页面,该页面展示内容如下:
开启日志投递
按以下步骤在控制台上查看托管网关详情:
- 登录百度智能云控制台,选择“产品服务 > 云原生 > 服务网格 CSM”。
- 在服务网格控制台,对应地域的“网格列表”中找到要操作的托管类型的服务网格实例,点击实例名称可在左侧边栏看到“网关管理”。
- 点击“网关管理”页面的托管网关实例名称,会跳转到网关详情页面,找到“日志服务”,点击编辑:
配置日志集,点击确认,开启网关日志投递服务,启用后,您可以在百度智能云日志服务BLS上的对应日志集中查看所有网关入口流量请求的日志信息:
点击右上角的“日志查询“进行更详细的查询:
开启Prometheus监控
按以下步骤在控制台上查看托管网关详情:
- 登录百度智能云控制台,选择“产品服务 > 云原生 > 服务网格 CSM”。
- 在服务网格控制台,对应地域的“网格列表”中找到要操作的托管类型的服务网格实例,点击实例名称可在左侧边栏看到“网关管理”。
- 点击“网关管理”页面的托管网关实例名称,会跳转到网关详情页面,找到“监控指标采集”,点击编辑:
选择符合标准的Prometheus实例,点击确认,开启网关监控信息采集服务。(选择Prometheus实例的标准:已关联网关VPC下的CCE集群并且该CCE集群已安装Prometheus Agent)
启用后,您可以在百度智能云Prometheus监控服务上对应Prometheus实例的采集配置中,查看到网关的配置采集项:
点击"Grafana服务"查看网关的监控数据:
选择CSM目录下Istio Gateway Dashboard模板。数据源选择对应的Prometheus实例
Ingress同步
除了标准的使用方式,如通过Gateway、VirtualService等CRD配置CSM网关外,CSM产品还为CCE用户提供了“Ingress同步”功能,使他们能够便捷地将CCE集群中的现有ingress接入CSM网关,并最大化利用CSM网关的优势。相较于传统的K8S Ingress,CSM网关在稳定性和性能上都实现了显著的提升。
1、开启ingress同步
点击“网关管理”页面的托管网关实例名称,会跳转到网关详情页面,找到“ingress同步”,点击编辑:
点击确定以后,界面如下图所示
用户CCE集群部署测试服务
1apiVersion: v1
2kind: Service
3metadata:
4 name: helloworld
5 labels:
6 app: helloworld
7 service: helloworld
8spec:
9 ports:
10 - port: 5000
11 name: http
12 selector:
13 app: helloworld
14---
15apiVersion: apps/v1
16kind: Deployment
17metadata:
18 name: helloworld-v1
19 labels:
20 app: helloworld
21 version: v1
22spec:
23 replicas: 1
24 selector:
25 matchLabels:
26 app: helloworld
27 version: v1
28 template:
29 metadata:
30 labels:
31 app: helloworld
32 version: v1
33 spec:
34 containers:
35 - name: helloworld
36 image: docker.io/istio/examples-helloworld-v1
37 resources:
38 requests:
39 cpu: "100m"
40 imagePullPolicy: IfNotPresent #Always
41 ports:
42 - containerPort: 5000
43---
44apiVersion: apps/v1
45kind: Deployment
46metadata:
47 name: helloworld-v2
48 labels:
49 app: helloworld
50 version: v2
51spec:
52 replicas: 1
53 selector:
54 matchLabels:
55 app: helloworld
56 version: v2
57 template:
58 metadata:
59 labels:
60 app: helloworld
61 version: v2
62 spec:
63 containers:
64 - name: helloworld
65 image: docker.io/istio/examples-helloworld-v2
66 resources:
67 requests:
68 cpu: "100m"
69 imagePullPolicy: IfNotPresent #Always
70 ports:
71 - containerPort: 5000
用户CCE集群部署ingress
1apiVersion: networking.k8s.io/v1
2kind: Ingress
3metadata:
4 name: helloworld
5spec:
6 rules:
7 - host: helloworld.com
8 http:
9 paths:
10 - path: /hello
11 pathType: Exact
12 backend:
13 service:
14 name: helloworld
15 port:
16 number: 5000
apply ingress.yaml之后稍等1分钟左右,执行下面命令,其中"公网IP"来源于网关入口中的公网地址。
1curl -v http://helloworld.com/hello --resolve "helloworld.com:80:{公网IP}"
预期结果如下
2、关闭ingress同步
稍等1分钟左右,再次执行命令
1curl -v http://helloworld.com/hello --resolve "helloworld.com:80:{公网IP}"
预期访问失败如下
3、适配大部分nginx标签,示例: 配置重试标签注解
1apiVersion: networking.k8s.io/v1
2kind: Ingress
3metadata:
4 name: helloworld
5 namespace: test-ywj
6 annotations:
7 nginx.ingress.kubernetes.io/proxy-next-upstream: http_502
8 nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
9 nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "10"
10spec:
11 rules:
12 - host: helloworld.exa12.com
13 http:
14 paths:
15 - path: /hello1
16 pathType: Exact
17 backend:
18 service:
19 name: helloworld
20 port:
21 number: 5000
删除托管网关
按以下步骤在控制台上删除托管网关:
- 登录百度智能云控制台,选择“产品服务 > 云原生 > 服务网格 CSM”。
- 在服务网格控制台,对应地域的“网格列表”中找到要操作的托管类型的服务网格实例,点击实例名称可在左侧边栏看到“网关管理”。
- 点击“网关管理”页面的托管网关实例后面的“删除”按钮,即可删除托管网关,同时会默认解绑BLB和与之绑定的EIP:
- 在删除托管网关实例之后,建议用户将之前创建下发的托管网关相关istio crd一并删除。