网关管理
概述
本节介绍服务网格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”文件,补充如下配置,保证当前域名的路径下已配置可访问的路由:
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: helloworld-gateway
spec:
gateways:
- gateway-gw
hosts:
- '*'
http:
- match:
- uri:
exact: /hello
route:
- destination:
host: helloworld.test.svc.cluster.local
port:
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文件,补充如下配置:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: helloworld-vs
namespace: istio-system-csm-6gdec53e
spec:
hosts:
- helloworld.test-hu.svc.cluster.local
http:
- match:
- uri:
exact: /hello
route:
- destination:
host: helloworld.test-hu.svc.cluster.local
port:
number: 5000
subset: v1
weight: 80
- destination:
host: helloworld.test-hu.svc.cluster.local
port:
number: 5000
subset: v2
weight: 20
- 下发helloworld-dr文件:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: helloworld-dr
namespace: istio-system-csm-6gdec53e
spec:
host: helloworld.test-hu.svc.cluster.local
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
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集群部署测试服务
apiVersion: v1
kind: Service
metadata:
name: helloworld
labels:
app: helloworld
service: helloworld
spec:
ports:
- port: 5000
name: http
selector:
app: helloworld
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-v1
labels:
app: helloworld
version: v1
spec:
replicas: 1
selector:
matchLabels:
app: helloworld
version: v1
template:
metadata:
labels:
app: helloworld
version: v1
spec:
containers:
- name: helloworld
image: docker.io/istio/examples-helloworld-v1
resources:
requests:
cpu: "100m"
imagePullPolicy: IfNotPresent #Always
ports:
- containerPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-v2
labels:
app: helloworld
version: v2
spec:
replicas: 1
selector:
matchLabels:
app: helloworld
version: v2
template:
metadata:
labels:
app: helloworld
version: v2
spec:
containers:
- name: helloworld
image: docker.io/istio/examples-helloworld-v2
resources:
requests:
cpu: "100m"
imagePullPolicy: IfNotPresent #Always
ports:
- containerPort: 5000
用户CCE集群部署ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: helloworld
spec:
rules:
- host: helloworld.com
http:
paths:
- path: /hello
pathType: Exact
backend:
service:
name: helloworld
port:
number: 5000
apply ingress.yaml之后稍等1分钟左右,执行下面命令,其中"公网IP"来源于网关入口中的公网地址。
curl -v http://helloworld.com/hello --resolve "helloworld.com:80:{公网IP}"
预期结果如下
2、关闭ingress同步
稍等1分钟左右,再次执行命令
curl -v http://helloworld.com/hello --resolve "helloworld.com:80:{公网IP}"
预期访问失败如下
3、适配大部分nginx标签,示例: 配置重试标签注解
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: helloworld
namespace: test-ywj
annotations:
nginx.ingress.kubernetes.io/proxy-next-upstream: http_502
nginx.ingress.kubernetes.io/proxy-next-upstream-timeout: "5"
nginx.ingress.kubernetes.io/proxy-next-upstream-tries: "10"
spec:
rules:
- host: helloworld.exa12.com
http:
paths:
- path: /hello1
pathType: Exact
backend:
service:
name: helloworld
port:
number: 5000
删除托管网关
按以下步骤在控制台上删除托管网关:
- 登录百度智能云控制台,选择“产品服务 > 云原生 > 服务网格 CSM”。
- 在服务网格控制台,对应地域的“网格列表”中找到要操作的托管类型的服务网格实例,点击实例名称可在左侧边栏看到“网关管理”。
- 点击“网关管理”页面的托管网关实例后面的“删除”按钮,即可删除托管网关,同时会默认解绑BLB和与之绑定的EIP:
- 在删除托管网关实例之后,建议用户将之前创建下发的托管网关相关istio crd一并删除。