系列文章:


总目录索引:九析带你轻松完爆 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 流量管理。流量管理的本质是对网络流量的路由和控制。生活中经常有这样的例子,比如下雨塌方,交警会疏导新的交通路线,这便是路由;比如景区周末实行单双号限行,这便是流量控制。

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

        下图便是网络流向图:

        当用户使用浏览器发起一个请求( http://jiuxi.com/xxx )进入 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.yaml

2 jiuxi-virtual-svc.yaml

3 jiuxi-svc.yaml( tomcat 和 nginx 的 service 写在一个文件)

4 jiuxi-deploy.yaml(tomcat 和 nginx 的 deployment 写在一个文件)

3.1 创建网关文件

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

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

    name: jiuxi-gateway

    namespace: jiuxi

spec:

    selector:

        istio: ingressgateway

servers:

- hosts:

   - jiuxi.com

   port:

       number: 80

       name: http

       protocol: HTTP

        创建资源:

kubectl apply -f jiuxi-gateway.yaml

3.2 创建虚拟服务文件

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

apiVersion: networking.istio.io/v1alpha3

kind: VirtualService

metadata:

    name: jiuxi-virtual-svc

    namespace: jiuxi

spec:

    gateways:

    - jiuxi-gateway

    hosts:

    - jiuxi.com

    http:

    - 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: v1

kind: Service

metadata:

    name: nginx-svc

    namespace: jiuxi

spec:

    ports:

    -  name: port

        port: 80

        protocol: TCP

        targetPort: 80

     selector:

        app: nginx-pod

---

apiVersion: v1

kind: Service

metadata:

    name: tomcat-svc

    namespace: jiuxi

spec:

    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: Deployment

metadata:


    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

        执行结果如下图所示,本人的 INGRESS_HOST 就是 10.110.101.205。

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

vim /etc/hosts # linux

c:/windows/system32/drivers/etc/hosts # windows

        添加 DNS 记录:

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

4.3 访问 tomcat

        浏览器输入 http://jiuxi.com,帮尝试多刷新几次,你就会看到流量分别路由到 tomcat 和 nginx 服务去了,并且流量上基本达到了均分,各 50%。


5 小节

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