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

news2024/12/29 8:37:43

一、概述

  • 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
EOF

istioctl 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: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*" # *表示通配符,通过任何域名都可以访问
  • 在上面这个 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.local
  http:
  - name: "reviews-v2-routes"
    match:
    - uri:
        prefix: "/wpcatalog"
    - uri:
        prefix: "/consumercatalog"
    rewrite:
      uri: "/newcatalog"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: v2
  - name: "reviews-v1-route"
    route:
    - destination:
        host: reviews.prod.svc.cluster.local
        subset: 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-ingressgateway

kubectl 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 implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - 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.com
  gateways:
  - my-http-gw # <---- bind to gateway
  http:
  - match:
    - uri:
        prefix: /nginx-1
    rewrite:
      uri: /
    route:
    - destination:
        host: my-nginx-1.default.svc.cluster.local  #<---- server name
        port:
          number: 80
  - match:
    - uri:
        prefix: /apache-1
    rewrite:
      uri: /
    route:
    - destination:
        host: my-apache-1.default.svc.cluster.local  #<---- server name
        port:
          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 implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - my-http-gw.com
    tls:
     httpsRedirect: true
  - port:
      number: 443
      name: https
      protocol: HTTPS
    hosts:
    - my-http-gw.com
    tls:
      mode: SIMPLE
      serverCertificate: /opt/istio/test/tls/my-http-gw.com.crt
      privateKey: /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.com
  gateways:
  - my-https-gw # <---- bind to gateway
  http:
  - match:
    - uri:
        prefix: /nginx-1
    rewrite:
      uri: /
    route:
    - destination:
        host: my-nginx-1  #<---- server name
        port:
          number: 80
  - match:
    - uri:
        prefix: /apache-1
    rewrite:
      uri: /
    route:
    - destination:
        host: my-apache-1  #<---- server name
        port:
          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.coloradmin.cn/o/727070.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

6.1 计算机网络应用模式

6.1 计算机网络应用模式 计算机网络应用模式与计算机网络的发展密切相关&#xff0c;大体可以分为三个阶段 以大型机为中心的应用模式&#xff08;mainframe-centric&#xff09; 该应用模式也称为分时共享&#xff08;time-sharing&#xff09;模式&#xff0c;也就是面向终端…

配置IOC的方式(配置文件和注解)

目录 背景实现xml方式实现结果&#xff1a; 注解方式实现效果&#xff1a; 升华 背景 我们已经学些了IOC概念和原理详情请见 一篇文章解释清楚IOC和DI 下面说如何实现IOC容器的效果。 实现 首先引入jar包 <dependency><groupId>org.springframework</groupId…

Prometheus - Concept

一 Prometheus 是什么 Prometheus 是一个开源的 监控和报警系统 。该系统内置和基于时间序列地抓取、存储、查询、绘图数据、报警。 现在是一个开源项目&#xff0c;继 K8S 后的第二个云原生计算基金会的托管项目&#xff0c;可见其火爆程度。 二 Prometheus 的特征 Promet…

异构系统的对接互通,天翎低代码平台有高招

编者按&#xff1a;企业内部里&#xff0c;最难的就是跨系统、跨应用的对接问题&#xff0c;系统之间的阻隔是影响业务效率的重要原因之一&#xff0c;如今随着技术的发展&#xff0c;这个问题上天翎低代码平台在异构系统对接方面提供多元化、多层次的方式让企业高效低成本的打…

python处理yaml、ini和execl文件

一、yaml的初步了解 YAML 是一个被广泛使用的数据序列化和配置语言&#xff0c;后缀可以为yaml或yml, 支持#注释&#xff0c;通过缩进表示层级&#xff0c;区分大小写&#xff0c;读取出来之后是一个字典列表 yaml 的用途&#xff1a; 用于做配置文件 &#xff08;yaml &…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第十八天 18/50【层序遍历二叉树(两个队列一个遍历上一层,一个记录下一层)】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

数字虚拟人物制作为多个行业中的智能应用场景赋能

虚拟人物制作的广义定义为数字化外形的虚拟人物&#xff0c;是“虚拟”(存在于非物理世界中)“数字”(由计算机图形学、图形染、动作捕捉、深度学习、语音合成等计算机手段创造及使用)“人”(具有多重人类特征&#xff0c;如外貌、人类表演/交互能力等)的综合产物。 制作一个虚…

Hbase drop 表卡住没有响应

在实际工作中遇到过重新创建一个hbase的hive外部表&#xff0c;在 disable table_name; drop table_name 在drop table_name卡住 最后有提示报错。 建议各位查看下表有无lock的情况&#xff0c; 查看和释放hbase lock可以通过如下方式来查看 pid获取&#xff1a; 在 Ma…

idea支持vue文件-设置对vue的支持

一、idea支持.vue文件 这一步其实就是安装vue.js插件&#xff0c;具体路径为&#xff1a;File ----> Settings ----> Plugins ----> 输入vue&#xff0c;点击搜索结果里的vue.js右边的install按钮&#xff0c;安装成功后重启idea&#xff0c;这样idea就能识别.vue文件…

惨痛面经,做个记录

今天的行情太难了&#xff0c;找工作的还是比较艰难的一个过程。不和哪些优秀的人对比&#xff0c;我就是普通二本院校&#xff0c;工作4年&#xff0c;能力一般般&#xff0c;努力奋斗的一个搬砖人。分享一个月比较惨痛的找工作经历。 简历这一块自己准备的时间比较长&#xf…

争夺数据黑匣子市场,谁将接盘这家Tier1的被动安全业务

在相继卖掉智驾软件算法资产&#xff08;高通收购&#xff09;、主动安全传感器及系统业务&#xff08;麦格纳收购&#xff09;后&#xff0c;Veoneer最后剩余的被动安全系统业务&#xff08;主要是安全气囊ECU&#xff09;也在寻找产业买家。 本周&#xff0c;美国私募股权公司…

Docker Swarm安装PXC高可用集群

docker安装PXC集群 创建数据卷创建集群专用网络创建证书 主流mysql高可用的方式有以下几种 准备三台服务器 hostIP说明node1192.168.31.130PXC集群1node2192.168.31.131PXC集群2node3192.168.31.132PXC集群3 创建docker swarm集群 主节点node1执行 #docker swarm init --ad…

Camera API2 使用说明

CameraAPI1 使用说明 目录 一、 概览 1.1 Pipeline 1.2 Supported Hardware Level 1.3 Capture 1.4 CameraManager 1.5 CameraCharacteristics 1.6 CameraDevice 1.7 Surface 1.8 CameraCaptureSession 1.9 CaptureRequest 1.10 CaptureResult 1.11 一些只有 Came…

基于 Arduino 库实现 ESP32 TCP Server 应用例程

实现步骤&#xff1a; ESP32 开启 WiFi Station 模式连接路由器连上路由器后将获取到分配的 IP 地址基于分配的 IP 地址创建 TCP Server 测试代码如下&#xff1a; #include <WiFi.h> #include <WiFiClient.h>const char* ssid "cc2.4"; const char*…

《水经注地图服务》发布的影像数据在ArcMap中调用

当有用户需要发布一个省以上的海量卫星影像数据时&#xff0c;我们就会强烈建议他使用《水经注地图服务》&#xff08;WeServer&#xff09;进行发布。 因为&#xff0c;《水经注地图服务》在经过我们工程师的不断升级优化之后&#xff0c;现在发布全球100TB级卫星影像数据所需…

【用户调研】需求挖掘

文章目录 用户需求的定义为什么要挖掘用户需求需求挖掘方法用户访谈问卷调查可用性测试运营数据分析 用户访谈介绍实地研究用户观察用户访谈焦点小组 调查问卷介绍总结 用户需求的定义 为什么要挖掘用户需求 需求挖掘方法 用户访谈 问卷调查 可用性测试 运营数据分析 用户访谈介…

妙记多 Mojidoc PC端(Mac+Windows 端)内测体验官招募!

你们呼唤了无数呼唤的妙记多 Mojidoc 客户端来了&#xff01; 优先内测上线的是 桌面端&#xff01;包含 Mac端 和 Windows 端 为了更好的用户体验&#xff0c;小 Mojidoc 在上线前邀请大家一起加入内测体验&#xff01; 为了让你更好的成为内测体验官&#xff0c;有一点心里…

使用adb工具通过wifi连接安卓设备

一、下载adb包&#xff0c;并解压。网上很多地方可以下载资源或者从我的网盘下载 链接&#xff1a;https://pan.baidu.com/s/1hLf14wCCUMs2xdU5WkLY8g 提取码&#xff1a;8cbh 二、安卓设备打开开发者选项&#xff0c;打开USB调试开关 三、确保手机和wifi在同一个wifi网路下。…

SSM学习笔记-------SpringMVC(二)

SSM学习笔记-------SpringMVC&#xff08;二&#xff09; SpringMVC_day021、SSM整合1.1 流程分析1.2 整合配置步骤1&#xff1a;创建Maven的web项目步骤2:添加依赖步骤3:创建项目包结构步骤4:创建SpringConfig配置类步骤5:创建JdbcConfig配置类步骤6:创建MybatisConfig配置类步…

QT中LIBS的配置

QT中引用外部第3方库时&#xff0c;需要配置LIBS参数。 QT选择kit时有MSVC、MinGW两种方式&#xff0c;一般MSVC的静态库文件以.lib结尾&#xff0c;MinGW以.a结尾。什么是C的静态库、动态库我这里就不介绍了&#xff0c;其实这种库在几乎所有的语言中都有&#xff1a;比如jav…