文章目录

  • 一、概述
  • 二、Istio 架构
  • 三、通过 istioctl 部署 Istio
    • 1)安装istioctl 工具
    • 2)通过istioctl安装istio
    • 3)检查
  • 四、Istio Gateway
  • 五、Istio VirtualService 虚拟服务
  • 六、示例演示(bookinfo)
    • 1)安装bookinfo应用
      • 1、创建命令空间
      • 2、添加label
      • 3、开始部署bookinfo
    • 2)添加路由规则
    • 3)访问服务
      • 1、通过NodePort访问
      • 2、通过externalip访问
    • 4)卸载bookinfo服务
    • 5)卸载 istio
  • 七、Istio Gateway 示例演示
    • 1)Helm 安装 Nginx,Apache
    • 2)http 测试
      • 1、配置 Gateway
      • 2、配置 VirtualService
      • 3、测试验证
    • 3)https 测试
      • 1、生成证书(有证书可忽略)
      • 2、配置 Gateway 和 VirtualService
  • 八、Ingress Controller 与 Istio Gateway 比较

一、概述

Istio 提供一种简单的方式来为已部署的服务建立网络,该网络具有负载均衡、服务间认证、监控、网关等功能,而不需要对服务的代码做任何改动。这里主要讲Istio Gateway服务。

  • 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 流量。

官方文档:https://istio.io/latest/zh/docs/
Istio Gateway 官方文档:https://preliminary.istio.io/latest/zh/docs/reference/config/networking/gateway/
GitHub地址:https://github.com/istio/istio

二、Istio 架构

在Kubernetes环境中,Ingress controller用于管理进入集群的流量。在Istio服务网格中 Istio Ingress Gateway承担相应的角色,它使用新的配置模型(Gateway 和 VirtualServices)完成流量管理的功能。通过下图做一个总的描述。

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

三、通过 istioctl 部署 Istio

1)安装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

2)通过istioctl安装istio

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

istioctl profile list

配置文件 核心组件 说明
default istio-ingressgateway、istiod 根据 IstioOperator API 的默认设置启动组件。可用于生产部署。
demo istio-egressgateway、istio-ingressgateway、istiod 旨在展示 Istio 的功能,启用了高级别的追踪和访问日志(需要具有适度的资源),适合学习使用。
minimal istiod 与默认配置文件相同,但只安装了控制平面组件。
remote - 配置 Multicluster Mesh 的 Remote Cluster。
empty - 不部署任何东西。可以作为自定义配置的基本配置文件。
preview istio-ingressgateway、istiod 实验性。用于探索 Istio 的新功能。不确保稳定性、安全性和性能。

当你足够熟悉 Istio 后,你可以自定义配置文件。但在此之前,我们还是先以 demo 来入门吧。

### 查看 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

3)检查

istioctl version
kubectl -n istio-system get deploy

四、Istio Gateway

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

  • 网关是一个运行在网格边缘的负载均衡器,用于接收传入或传出的HTTP/TCP连接。
  • 主要工作是接受外部请求,把请求转发到内部服务。网格边缘的Ingress 流量,会通过对应的 Istio IngressGateway Controller 进入到集群内部。

官方文档:https://preliminary.istio.io/latest/zh/docs/reference/config/networking/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中定义的服务的子集。

官方文档:https://preliminary.istio.io/latest/zh/docs/reference/config/networking/virtual-service/

【示例配置】

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)

1)安装bookinfo应用


在线书店-bookinfo:该应用由四个单独的微服务构成,这个应用模仿在线书店的一个分类,显示一本书的信息,页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

Bookinfo应用分为四个单独的微服务

  • productpage这个微服务会调用details和reviews两个微服务,用来生成页面;
  • details这个微服务中包含了书籍的信息;
  • reviews这个微服务中包含了书籍相关的评论,它还会调用ratings微服务;
  • ratings这个微服务中包含了由书籍评价组成的评级信息。

reviews微服务有3个版本

  • v1版本不会调用ratings服务;
  • v2版本会调用ratings服务,并使用1到5个黑色星形图标来显示评分信息;
  • v3版本会调用ratings服务,并使用1到5个红色星形图标来显示评分信息。

1、创建命令空间

kubectl create ns bookinfo

2、添加label

因为Istio proxy的注入是基于label,因此我们需要为demo namespace添加label,

kubectl label namespace bookinfo istio-injection=enabled
kubectl get ns --show-labels bookinfo

3、开始部署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

2)添加路由规则

服务部署后,还需要添加路由规则,将请求路由到对应的服务

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo
kubectl get virtualservice -n bookinfo

3)访问服务

1、通过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

web:http://192.168.182.111:32688/productpage

2、通过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

4)卸载bookinfo服务

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

5)卸载 istio

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

七、Istio Gateway 示例演示

1)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

2)http 测试

1、配置 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字段对应。

2、配置 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.210为VIP,无需自动创建,这个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

3、测试验证

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

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

3)https 测试

1、生成证书(有证书可忽略)

自签名证书来只允许 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/

2、配置 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 Controller Istio Gateway
根据HTTP Header选择路由规则 仅支持单个Header,不支持多个Header组合 支持
Header规则支持正则表达式 支持 支持
服务之间设置权重拆分流量 支持 支持
Header和权重规则组合使用 支持 支持
路由规则检查 不支持 支持
路由规则粒度 service service下的不同pod
支持的协议 HTTP1.1/HTTP2/gRPC/TCP/Websockets HTTP1.1/HTTP2/gRPC/TCP/Websockets/MongoDB

这样一比较,就很显然看出,Istio Gateway比Ingress Controller强大,这里只是介绍了常用的负载转发功能,还有流量控制,安全控制等功能,如果只是简单的负载转发用istio就点大材小用了,如果公司需要更复杂网络管控,可以选择istio,所以一般在生产环境中可以使用Istio Gateway应对复杂的网络环境。

Istio Gateway 介绍与 简单使用就先到这里了,有疑问的小伙伴欢迎给我留言,后续会持续更新【云原生+大数据】相关的文章,请小伙伴耐心等待~

【云原生】Kubernetes(k8s)Istio Gateway 介绍与实战操作相关推荐

  1. 云原生及k8s组件简单介绍

    一.云原生 云原生景观图: https://landscape.cncf.io/ cncf官网: https://www.cncf.io/projects/ Graduated 毕业项目,可在生产中使 ...

  2. 云原生 | Kubernetes - k8s集群搭建(kubeadm)(持续收录报错中)

    目录 前置 1.实现效果 2.环境准备 3.系统初始化 关闭防火墙 关闭 selinux 关闭 swap 主机名 配置hosts 将桥接的 IPv4 流量传递到 iptables 的链 时间同步 部署 ...

  3. 【云原生 | Kubernetes 实战】18、K8s 安全实战篇之 RBAC 认证授权(上)

    目录 一.k8s 安全管理:认证.授权.准入控制概述 1.1 认证 认证基本介绍 授权基本介绍 准入控制基本介绍 为什么需要准入控制器呢? k8s 客户端访问 apiserver 的几种认证方式 ku ...

  4. 【云原生 | Kubernetes 实战】01、K8s-v1.25集群搭建和部署基于网页的 K8s 用户界面 Dashboard

    目录 一.K8s 概述 可以查看官方文档:概述 | Kubernetes 组件交互逻辑: 二.kubeadm 安装 K8s-v1.25高可用集群 k8s 环境规划: 1.初始化环境 2.安装 Dock ...

  5. 【云原生 | Kubernetes 实战】18、K8s 安全实战篇之 RBAC 认证授权(下)

    目录 一.常见角色(role)授权的案例 1.1 允许读取核心 API 组的 Pod 资源 1.2 允许读写 apps API 组中的 deployment 资源 1.3 允许读取 Pod 以及读写 ...

  6. istio概述,与微服务、云原生、k8s的关系

    1.1简单介绍istio 与k8s紧密结合,适用于云原生场景,service mesh形态,服务治理的开放平台 服务治理,包括:连接.安全.策略执行和可观察性. 连接:通过配置的流量规则控制服务间的流 ...

  7. 【云原生Kubernetes系列第五篇】kubeadm v1.20 部署K8S 集群架构(人生这道选择题,总会有遗憾)

    系列文章目录 ??即日起,更新云原生相关知识,喜欢的小伙伴可以给我点个三连喔 ??收录至专栏 云原生 ??[云原生Docker系列第一篇]Docker镜像管理 ??[云原生Docker系列第二篇]Do ...

  8. 云原生服务网格Istio:原理、实践、架构与源码解析

    华为云原生团队600多页的Istio实战精华总结,云原生服务网格Istio:原理.实践.架构与源码解析的电子书. 图书介绍 <云原生服务网格Istio:原理.实践.架构与源码解析>分为原理 ...

  9. 如何理解Eating这个词?云原生与微服务专场介绍

    点击上方"开源社"关注我们 | 作者:开源社 | 编辑:李明康 | 责编:袁睿斌 有一幅曾经传播很广的漫画,大意是:软件吞噬世界,开源吞噬软件.后来这个漫画又被人加了两条鱼:云计算 ...

最新文章

  1. php替换文件中的数据库,批量替换php文件中的class,id的值
  2. minitab怎么算西格玛水平_西格玛和西格玛水平
  3. POJ3277(矩形切割)
  4. 机器学习算法——K近邻法
  5. Python之进程+线程+协程(异步、selectors模块、阻塞、非阻塞IO)
  6. AcWing 840. 模拟散列表(散列hash)
  7. 拓端tecdat|R语言基于Garch波动率预测的区制转移交易策略
  8. 小程序WXML 使用小结
  9. 算法:数组找出2个只出现一次的数字(其他元素出现两次)
  10. 智慧零售怎么做客流统计和客流分析?|图普客流统计系统
  11. php解析m3u8代码,m3u8后缀 视频解析接口源码
  12. c# FlexCell自动换行
  13. C和C++不安全?Android 支持 Rust 开发操作系统
  14. iOS实现APP支持SpotLight搜索
  15. 如何在高德地图windowInfo弹窗中使用VUE组件
  16. 操作系统的分类有哪些?
  17. 16.面向对象-基础
  18. 【一日一logo_day_24】Phoenix??
  19. 两台计算机是怎么“连接”在一起的
  20. 电大 专科 计算机应用,2015春中央电大计算机应用基础(专科)平时作业(3)

热门文章

  1. 【Unity】动作游戏开发实战详细分析-15-可扩展的战斗系统
  2. 【代码审计】模板注入
  3. Unity SteamVR
  4. Java 加载、操作和保存WPS文字文档
  5. iphone与android比较好,资深果粉告诉你,安卓比苹果或许更好用!
  6. 程序员究竟在做什么——职业程序员的工作内容(我们不是修电脑的),以及如何转型成为一名程序员?
  7. Android运行C/C++程序,无需ROOT!
  8. MySQL系列---事务与锁详解
  9. 常用模拟低通滤波器的设计~经典 IIR 滤波器之巴特沃斯滤波器
  10. 【愚公系列】2023年03月 Java教学课程 099-MySQL数据库(SQL介绍)