第四章 九析带你轻松完爆 service mesh - istio Gateway 设置路由

网友投稿 258 2022-10-29

第四章 九析带你轻松完爆 service mesh - istio Gateway 设置路由

系列文章:总目录索引:九析带你轻松完爆 istio 服务网格系列教程

目录

1 流量管理

2 创建命名空间

3 资源文件准备

3.1 创建网关文件

3.2 创建虚拟服务文件

3.3 创建 k8s service 文件

3.4 创建 k8s deployment 文件:

3.5 修改 istio-ingressgateway deployment

4 尝试网关路由功能

4.1 确定 INGRESS_HOST

4.2 编辑浏览器所在主机 hosts 文件

4.3 访问 tomcat

5 小节

1 流量管理(traffic management)

如果你对博客有任何疑问,请告诉我。

istio 四大特性是流量管理(traffic management)、安全(security)、策略(policies)和遥测(observability)。

本节重点介绍 istio 流量管理。流量管理的本质是对网络流量的路由和控制。生活中经常有这样的例子,比如下雨塌方,交警会疏导新的交通路线,这便是路由;比如景区周末实行单双号限行,这便是流量控制。

在介绍流量管理之前,首先介绍一下网络流向,介绍一个 请求在安装了 istio 的 k8s 中都经过哪些点,有了这个介绍之后,再谈流量管理将是水到渠成的事情。

下图便是网络流向图:

当用户使用浏览器发起一个请求( )进入 k8s 中的 istio-ingressgateway,因为在 istio-ingressgateway 上设置了 istio 的 gateway,而且此 gateway 又绑定了 virtual service,在 virtual service 设置了 2 条路由规则,分别指向 tomcat 和 nginx 这 2 个 k8s service,而每个 service 又关联到各自的 pod,于是此请求最终可根据 url 触达到 pod 内的容器。

了解了请求流向的整个流程,下面介绍如何操作。前提是你已经安装好了 k8s 和 istio。关于如何安装和配置 istio,可以查看本人的系列文章第一章。

2 创建命名空间

kubectl create ns jiuxi

istio 默认安装在 jiuxi 这个命名空间下,并且设置在 jiuxi 命名空间自动注入 sidecar。相关操作请参考本人系列文章的第一章。

3 资源文件准备

从上图可知,共需要 4 个资源文件(yaml):

1 jiuxi-gateway.yaml2 jiuxi-virtual-svc.yaml3 jiuxi-svc.yaml( tomcat 和 nginx 的 service 写在一个文件)4 jiuxi-deploy.yaml(tomcat 和 nginx 的 deployment 写在一个文件)

3.1 创建网关文件

网关文件 jiuxi-gateway.yaml 文件内容如下:

apiVersion: networking.istio.io/v1alpha3kind: Gatewaymetadata:    name: jiuxi-gateway    namespace: jiuxispec:    selector:        istio: ingressgatewayservers:- hosts:   - jiuxi.com   port:       number: 80       name:  protocol: HTTP

创建资源:

kubectl apply -f jiuxi-gateway.yaml

3.2 创建虚拟服务文件

虚拟服务文件 jiuxi-virtual-svc.yaml 文件内容如下:

apiVersion: networking.istio.io/v1alpha3kind: VirtualServicemetadata:    name: jiuxi-virtual-svc    namespace: jiuxispec:    gateways:    - jiuxi-gateway    hosts:    - jiuxi.com    route:       - destination:             host: tomcat-svc             port:                 number: 8080       weight: 50        - destination:              host: nginx-svc              port:                 number: 80        weight: 50

创建资源:

kubectl apply -f jiuxi-virtual-svc.yaml

3.3 创建 k8s service 文件

服务文件 jiuxi-svc.yaml 文件内容如下:

apiVersion: v1kind: Servicemetadata:    name: nginx-svc    namespace: jiuxispec:    ports:    -  name: port        port: 80        protocol: TCP        targetPort: 80     selector:        app: nginx-pod---apiVersion: v1kind: Servicemetadata:    name: tomcat-svc    namespace: jiuxispec:    ports:    -  name: port        port: 8080        protocol: TCP        targetPort: 8080    selector:    app: tomcat-pod

创建资源:

kubectl apply -f jiuxi-svc.yaml

3.4 创建 k8s deployment 文件

jiuxi-deploy 文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
    labels:
    app: nginx-deploy
    name: nginx-deploy
    namespace: jiuxi
spec:
    replicas: 1
    selector:
        matchLabels:
            app: nginx-pod 
    template:
        metadata:
            labels:
                app: nginx-pod 
        spec:
            containers:
                  -  image: nginx:1.14-alpine
                imagePullPolicy: Always
                name: nginx
                ports:
                -  containerPort: 80
                    name: port
                    protocol: TCP
---
apiVersion: apps/v1
kind: Deploymentmetadata:
    labels:
        app: tomcat-deploy
    name: tomcat-deploy
    namespace: jiuxi
spec:
    replicas: 1
    selector:
        matchLabels:
            app: tomcat-pod 
    template:
        metadata:
            labels:
                app: tomcat-pod 
        spec:            containers:            -  image: docker.io/kubeguide/tomcat-app:v1                imagePullPolicy: Always                name: tomcat                ports:                    - containerPort: 8080                    name: port                    protocol: TCP

创建资源:

kubectl apply -f jiuxi-deploy.yaml

3.5 修改 istio-ingressgateway deployment

这一步非常重要,因为默认情况下 istio-ingressgateway 对应的容器并没有暴露在服务网格之外,所以我们需要将其暴露出来。编辑 istio-system 命名空间下的 istio-ingressgateway deployment:

kubectl edit deployment -n istio-system istio-ingressgateway

4 尝试网关路由功能

4.1 确定 INGRESS_HOST

kubectl get pod -n istio-system -o wide

vim /etc/hosts # linuxc:/windows/system32/drivers/etc/hosts # windows

添加 DNS 记录:

10.110.101.205 jiuxi.com # 根据个人实际情况改写

4.3 访问 tomcat

浏览器输入 tomcat 和 nginx 服务去了,并且流量上基本达到了均分,各 50%。

5 小节

自此我们使用了 istio 的 gateway 和 virtual service 实现了流量管理的功能。下面我们还会继续庖丁解牛 istio 其他强大的特性。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:9 个技巧,解决 K8s 中的日志输出问题
下一篇:解决springboot依赖包中报错unknown的问题
相关文章

 发表评论

暂时没有评论,来抢沙发吧~