云原生之深入解析K8S Istio Gateway服务的架构分析与实战操作

一、概述

  • Istio 提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控、网关等功能,而不需要对服务的代码做任何改动。
    • istio 适用于容器或虚拟机环境(特别是 k8s),兼容异构架构;
    • istio 使用 sidecar(边车模式)代理服务的网络,不需要对业务代码本身做任何的改动;
    • HTTP、gRPC、WebSocket 和 TCP 流量的自动负载均衡;
    • istio 通过丰富的路由规则、重试、故障转移和故障注入,可以对流量行为进行细粒度控制;支持访问控制、速率限制和配额;
    • istio 对出入集群入口和出口中所有流量的自动度量指标、日志记录和跟踪;
    • istio 支持蓝绿发布和金丝雀发布(灰度发布)等。
  • Istio Gateway 描述在网格边缘运行的负载均衡器 接收传入或传出的 HTTP/TCP 连接,规格描述应公开的一组端口,协议的类型使用、负载均衡器的 SNI 配置等。
    • 使用网关为网格来管理入站和出站流量,可以让用户指定要进入或离开网格的流量;
    • Gateway 用于为 HTTP / TCP 流量配置负载均衡器,并不管该负载均衡器将在哪里运行,网格中可以存在任意数量的 Gateway,并且多个不同的 Gateway 实现可以共存。实际上,通过在配置中指定一组工作负载(Pod)标签,可以将 Gateway 配置绑定到特定的工作负载,从而允许用户通过编写简单的 Gateway Controller 来重用现成的网络设备;
    • Gateway 只用于配置 L4-L6 功能(例如,对外公开的端口,TLS 配置),所有主流的 L7 代理均以统一的方式实现了这些功能,然后,通过在 Gateway 上绑定 VirtualService 的方式,可以使用标准的 Istio 规则来控制进入 Gateway 的 HTTP 和 TCP 流量。
  • Istio 相关的学习文档:
    • Istio 的官方文档
    • Istio Gateway 官方文档
    • GitHub 地址

二、Istio 架构

  • 在 Kubernetes 环境中,Ingress controller 用于管理进入集群的流量,在 Istio 服务网格中 Istio Ingress Gateway 承担相应的角色,它使用新的配置模型(Gateway 和 VirtualServices)完成流量管理的功能。
  • Istio 架构大致如下:

在这里插入图片描述

  • 分析说明:
    • 上图 ①:用户向某端口发出请求;
    • 上图 ②:负载均衡器监听端口,并将请求转发到集群中的某个节点上,Istio Ingress Gateway Service 会监听集群节点端口的请求;
    • 上图 ③:Istio Ingress Gateway Service 将请求交给 Istio Ingress Gateway Pod 处理,IngressGateway Pod 通过 Gateway 和 VirtualService 配置规则处理请求,其中,Gateway 用来配置端口、协议和证书,VirtualService 用来配置一些路由信息(找到请求对应处理的服务 App Service);
    • 上图 ④:Istio Ingress Gateway Pod 将请求转给 App Service;
    • 上图 ⑤:最终的请求会交给 App Service 关联的 App Deployment 处理。

三、通过 istioctl 部署 Istio

① 安装 istioctl 工具

wget https://github.com/istio/istio/releases/download/1.16.0/istio-1.16.0-linux-amd64.tar.gz
tar -xf istio-1.16.0-linux-amd64.tar.gz
ln -s /opt/istio/istioctl/istio-1.16.0/bin/istioctl /usr/local/bin/istioctl
istioctl version

② 通过 istioctl 安装 istio

  • 要想知道有哪几个内置的配置文件,可以运行以下命令:
istioctl profile list

在这里插入图片描述

  • 相关的配置文件如下表所示:
配置文件核心组件说明
defaultistio-ingressgateway、istiod根据 IstioOperator API 的默认设置启动组件,可用于生产部署
demoistio-egressgateway、istio-ingressgateway、istiod旨在展示 Istio 的功能,启用了高级别的追踪和访问日志(需要具有适度的资源),适合学习使用
minimalistiod与默认配置文件相同,但只安装了控制平面组件
remote-配置 Multicluster Mesh 的 Remote Cluster
empty-不部署任何东西,可以作为自定义配置的基本配置文件
previewistio-ingressgateway、istiod实验性,用于探索 Istio 的新功能,不确保稳定性、安全性和性能
  • 当足够熟悉 Istio 后,可以自定义配置文件:
### 查看 demo 的配置信息
istioctl profile dump demo### 开始安装
# 【方式一】通过--set传参
istioctl install --set profile=demo# 【方式二】通过-f指定文件
cat >my-demo-config.yaml<<EOF
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:profile: demo
EOFistioctl install -f my-demo-config.yaml

③ 检查

istioctl version
kubectl -n istio-system get deploy

在这里插入图片描述

四、Istio Gateway

  • 在 Kubernetes 环境中,Ingress controller 用于管理进入集群的流量,在 Istio 服务网格中 Istio Ingress Gateway 承担相应的角色,它使用新的配置模型(Gateway 和 VirtualServices)完成流量管理的功能。
    • 网关是一个运行在网格边缘的负载均衡器,用于接收传入或传出的 HTTP/TCP 连接;
    • 主要工作是接受外部请求,把请求转发到内部服务,网格边缘的 Ingress 流量,会通过对应的 Istio IngressGateway Controller 进入到集群内部。
  • Istio Gateway 的官方文档。
  • 示例配置:
# cat gateway.yaml
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:name: canary-gateway
spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- "*" # *表示通配符,通过任何域名都可以访问
  • 在上面这个 yaml 里配置了一个监听 80 端口的入口网关,它会将 80 端口的 http 流量导入到集群内对应的 Virtual Service 上。

五、Istio VirtualService 虚拟服务

  • VirtualService 是 Istio 流量治理的一个核心配置,可以说是 Istio 流量治理中最重要、最复杂的。VirtualService 在形式上表示一个虚拟服务,将满足条件的流量都转发到对应的服务后端,这个服务后端可以是一个服务,也可以是在 DestinationRule 中定义的服务的子集。
  • VirtualService 的官方文档。
  • 示例配置:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: reviews-route
spec:hosts:- reviews.prod.svc.cluster.localhttp:- name: "reviews-v2-routes"match:- uri:prefix: "/wpcatalog"- uri:prefix: "/consumercatalog"rewrite:uri: "/newcatalog"route:- destination:host: reviews.prod.svc.cluster.localsubset: v2- name: "reviews-v1-route"route:- destination:host: reviews.prod.svc.cluster.localsubset: v1
  • 说明:

在这里插入图片描述

六、示例演示(bookinfo)

① 安装 bookinfo 应用

在这里插入图片描述

  • 在线书店 -bookinfo:该应用由四个单独的微服务构成,这个应用模仿在线书店的一个分类,显示一本书的信息,页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。
  • Bookinfo 应用分为四个单独的微服务:
    • productpage 这个微服务会调用 details 和 reviews 两个微服务,用来生成页面;
    • details 这个微服务中包含了书籍的信息;
    • reviews 这个微服务中包含了书籍相关的评论,它还会调用 ratings 微服务;
    • ratings 这个微服务中包含了由书籍评价组成的评级信息。
  • reviews 微服务有 3 个版本:
    • v1 版本不会调用 ratings 服务;
    • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息;
    • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。
  • 创建命令空间:
kubectl create ns bookinfo
  • 添加 label,因为 Istio proxy 的注入是基于 label,因此需要为 demo namespace 添加 label:
kubectl label namespace bookinfo istio-injection=enabled
kubectl get ns --show-labels bookinfo
  • 开始部署 bookinfo:
cd /opt/istio/istioctl/istio-1.16.0
kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
kubectl get pod -n bookinfo

在这里插入图片描述

  • 然后可查看应用 pod 里的容器信息,可以看到已经被注入 istio-proxy:
kubectl get pod productpage-v1-bf4b489d8-gt7gw -n bookinfo -o jsonpath='{.status.containerStatuses}' | jq

在这里插入图片描述

② 添加路由规则

  • 服务部署后,还需要添加路由规则,将请求路由到对应的服务:
kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo
kubectl get virtualservice -n bookinfo

在这里插入图片描述

③ 访问服务

  • 通过 NodePort 访问:
    • 获取 host ip,也就是 ingressgateway pod 所在机器 ip:
kubectl get po -l istio=ingressgateway -n istio-system -o jsonpath='{.items[0].status.hostIP}'
    • 获取 port,也就是 80 端口映射的目的端口,即 31082:
kubectl -n istio-system get service istio-ingressgateway
  • 通过 externalip 访问:
    • 因为是本地测试,肯定没法使用公网的 LB,因此可以直接将 externalip 修改为某个 node 的 ip 或者 VIP,这是设置一个 VIP(跟 node 节点同网段),这样就能通过 80 端口访问:
kubectl -n istio-system get service istio-ingressgatewaykubectl patch svc istio-ingressgateway --namespace istio-system --patch '{"spec": { "externalIPs": ["192.168.182.210"] }}'

在这里插入图片描述

    • 从上图可知,会把 VIP 帮到 kube-ipvs0 虚拟网卡上,接下来就可以通过 VIP 访问 web:

在这里插入图片描述

④ 卸载 bookinfo 服务

cd /opt/istio/istioctl/istio-1.16.0
sh samples/bookinfo/platform/kube/cleanup.sh

⑤ 卸载 istio

istioctl manifest generate --set profile=demo | kubectl delete -f -

七、Istio Gateway 示例演示

在这里插入图片描述

① Helm 安装 Nginx,Apache

# 添加chart源
helm repo add bitnami https://charts.bitnami.com/bitnami# 安装Nginx
helm pull bitnami/nginx --version 13.2.1
helm install my-nginx-1 ./nginx-13.2.1.tgz# 安装Apache
helm pull bitnami/apache --version 9.2.7
helm install my-apache-1 ./apache-9.2.7.tgz

② http 测试

  • 配置 Gateway,网关将是应用于在带有标签的容器上运行的代理 app: my-grafana-gateway:
cat >my-http-gw.yaml<<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: my-http-gw
spec:selector:istio: ingressgateway # use Istio default gateway implementationservers:- port:number: 80name: httpprotocol: HTTPhosts:- my-http-gw.com
EOF
  • 使用默认网关,istio: ingressgateway需要跟默认网关 svc 的 labels 字段对应:

在这里插入图片描述

② 配置 VirtualService

  • 要为进入上面的 Gateway 的流量配置相应的路由,必须为同一个 host 定义一个 VirtualService,并使用配置中的 gateways 字段绑定到前面定义的 Gateway 上:
cat >my-http-vs.yaml<<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: ratings-route
spec:hosts:- my-http-gw.comgateways:- my-http-gw # <---- bind to gatewayhttp:- match:- uri:prefix: /nginx-1rewrite:uri: /route:- destination:host: my-nginx-1.default.svc.cluster.local  #<---- server nameport:number: 80- match:- uri:prefix: /apache-1rewrite:uri: /route:- destination:host: my-apache-1.default.svc.cluster.local  #<---- server nameport:number: 80
EOF
  • 因为是本地测试,肯定没法使用公网的 LB,因此可以直接将 externalip 修改为某个 node 的 ip 或者同网段的 VIP,且 type: LoadBalancer,这样就能通过 80 端口访问:
kubectl -n istio-system get service istio-ingressgateway# 192.168.182.210VIP,无需自动创建,这个vip会自动绑定到kube-ipvs0虚拟网卡上
kubectl patch svc istio-ingressgateway --namespace istio-system --patch '{"spec": { "externalIPs": ["192.168.182.210"] }}'

在这里插入图片描述

  • 配置 hosts:
192.168.182.210 my-http-gw.com

③ 测试验证

http://my-http-gw.com/nginx-1

在这里插入图片描述
在这里插入图片描述

③ https 测试

  • 生成证书(有证书可忽略),自签名证书来只允许 https 流量来保证 istio ingress gateway 的安全:
openssl req -x509 -nodes -newkey rsa:2048 -keyout my-http-gw.com.key -out my-http-gw.com.cert -subj "/CN=*.my-http-gw.com"### 证书添加到 kubernetes secret
kubectl create -n istio-system secret tls istio-ingressgateway-certs --key my-http-gw.com.key --cert my-http-gw.com.cert### 查看证书和私钥是否部署成功
kubectl exec -it -n istio-system \$(kubectl -n istio-system get pods \-l istio=ingressgateway \-o jsonpath='{.items[0].metadata.name}') \-- ls -l /etc/istio/ingressgateway-certs/
  • 配置 Gateway 和 VirtualService:网关将是 应用于在带有标签的容器上运行的代理 app: my-grafana-gateway:
cat >my-https.yaml<<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:name: my-https-gw
spec:selector:istio: ingressgateway # use Istio default gateway implementationservers:- port:number: 80name: httpprotocol: HTTPhosts:- my-http-gw.comtls:httpsRedirect: true- port:number: 443name: httpsprotocol: HTTPShosts:- my-http-gw.comtls:mode: SIMPLEserverCertificate: /opt/istio/test/tls/my-http-gw.com.crtprivateKey: /opt/istio/test/tls/my-http-gw.com.key
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: https-route
spec:hosts:- my-https-gw.comgateways:- my-https-gw # <---- bind to gatewayhttp:- match:- uri:prefix: /nginx-1rewrite:uri: /route:- destination:host: my-nginx-1  #<---- server nameport:number: 80- match:- uri:prefix: /apache-1rewrite:uri: /route:- destination:host: my-apache-1  #<---- server nameport:number: 80
EOF

八、Ingress Controller 与 Istio Gateway 比较

  • K8S 官方维护的 Nginx Ingress Controller 及 Istio Gateway 比较:
NGINX Ingress ControllerIstio Gateway
根据 HTTP Header 选择路由规则仅支持单个 Header,不支持多个 Header 组合支持
Header 规则支持正则表达式支持支持
服务之间设置权重拆分流量支持支持
Header 和权重规则组合使用支持支持
路由规则检查不支持支持
路由规则粒度serviceservice 下的不同 pod
支持的协议HTTP1.1/HTTP2/gRPC/TCP/WebsocketsHTTP1.1/HTTP2/gRPC/TCP/Websockets/MongoDB
  • 这样一比较,就很显然看出,Istio Gateway 比 Ingress Controller 强大,这里只是介绍了常用的负载转发功能,还有流量控制,安全控制等功能,如果只是简单的负载转发用 istio 就点大材小用了,如果公司需要更复杂网络管控,可以选择 istio,所以一般在生产环境中可以使用 Istio Gateway 应对复杂的网络环境。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/13374.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MV-Map论文研读

MV-Map MV-Map: Offboard HD-Map Generation with Multi-view Consistency 论文&#xff1a;https://arxiv.org/pdf/2305.08851.pdf code&#xff1a;https://github.com/ZiYang-xie/MV-Map 代码未开源 总体网络结构 简述 论文首次提出以非车载的方式产生高精度地图。可以…

5、加载3dtileset模型并定位到模型

这一节使用CCesium加载3dtiles模型&#xff0c;3dtiles模型使用ceisum官网示例中的模型&#xff0c;加载3dtiles功能目前只能添加没有压缩的模型&#xff0c;draco或其他解压缩功能没有写。 1、在上一个例子的基础上&#xff0c;将鼠标事件改成右键的鼠标事件Cesium::ScreenSp…

一篇文章让你搞懂指针笔试题(加深对指针的理解)

指针笔试题 笔试题1 #include<stdio.h> int main() {int a[5] { 1, 2, 3, 4, 5 };int* ptr (int*)(&a 1);printf("%d,%d", *(a 1), *(ptr - 1));//程序的结果是什么&#xff1f;return 0; }给定一个数组a&#xff0c;当我们取地址a的时候&#xff0c…

网络关键设备和网络安全专用产品目录-2023年7月

2023年7月3日&#xff0c;网络关键设备和网络安全专用产品目录&#xff08;一级&#xff09;终于更新了&#xff0c;增加到38类&#xff0c;大家想了解每类产品对应哪家检测机构、以及涉及相关的标准、分解的二级产品目录&#xff0c;可以联系龙域认证客服。 一、网络关键设备…

【spring源码系列-06】refresh中obtainFreshBeanFactory方法的执行流程

Spring源码系列整体栏目 内容链接地址【一】spring源码整体概述https://blog.csdn.net/zhenghuishengq/article/details/130940885【二】通过refresh方法剖析IOC的整体流程https://blog.csdn.net/zhenghuishengq/article/details/131003428【三】xml配置文件启动spring时refres…

vscode里vue文件内<template>标签报错

发现只要把文件名使用驼峰命名法&#xff0c;把Login.vue改为LoginView.vue就不报错了加个大写的View就没有了。 官方参考文档&#xff1a;vue/multi-word-component-names | eslint-plugin-vue

MySQL库表的简单操作

1.创建数据Market&#xff0c;在数据库中创建表customers&#xff0c;表结构如图 (1)创建数据库Market create database Market&#xff1b; (2)创建数据表customers&#xff0c;在c_num字段添加主键约束&#xff0c;c_birth字段上添加非空约束 create table customers&#…

基于stm32单片机的智能家居环境监控系统

​一.硬件方案 智能家居环境监控系统的整体电路主要由stm32单片机最小系统&#xff0c;光MQ-2烟雾传感器电路&#xff0c;红外人体检测电路&#xff0c;DS18B20温度传感器&#xff0c;LCD1602显示电路&#xff0c;水泵驱动电路&#xff0c;风扇驱动电路&#xff0c;LED指示灯&…

【EXCEL】给数据添加图表(数据条、柱状图、折线图等),快速分析功能图文详解

目录 0.环境 1.背景简介 2.具体实现 2.1 给数据添加数据条 实现效果&#xff1a; 具体操作&#xff1a; 2.2 给数据添加柱状图图表 实现效果&#xff1a; 具体操作&#xff1a; 2.3 给数据添加迷你图&#xff08;在表格中的折线图&#xff09; 实现效果&#xff1a; …

UNI-APP_vmin横屏适配问题

vmax和vmin vmax 相对于视口的宽度或高度中较大的那个。其中最大的那个被均分为100单位的vmax vmin 相对于视口的宽度或高度中较小的那个。其中最小的那个被均分为100单位的vmin当竖屏布局时750rpx是竖屏布局屏幕的宽度 vmin不管横竖屏的情况下&#xff0c;100vmin都是手机屏幕…

Claude使用教程,解决Claude不能回复

Claude是ChatGPT最为有⼒的竞争对⼿之⼀&#xff0c;Claude 的研发公司是专注人工智能安全和研究的初创公司 Anthropic&#xff0c;由前 OpenAI 员工共同创立的。今年 3 月份 Anthropic 获得了谷歌 3 亿美元的投资&#xff0c;谷歌也因此获得其 10% 股份。 ⽬前可以通过官⽹加…

【Accumulate】Gitee解决每次推送输入账户密码问题

【前言】 每次建立私人仓库后&#xff0c;一推送就得输入账户密码&#xff0c;真的巨烦人啊。 【解决】 step1&#xff1a; 绑定私匙&#xff1a; 配置Git_犟小孩的博客-CSDN博客 step2&#xff1a; 每次绑定远程仓库的时候&#xff0c;使用SSH绑定 如果已经绑定过了&…