第四章 九析帶你輕鬆完爆 service mesh - istio Gateway 設置路由

系列文章:linux


總目錄索引:九析帶你輕鬆完爆 istio 服務網格系列教程nginx

目錄docker

1 流量管理vim

2 建立命名空間windows

3 資源文件準備api

    3.1 建立網關文件瀏覽器

    3.2 建立虛擬服務文件tomcat

    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)

        若是你對博客有任何疑問,請告訴我。

1.jpeg

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

        本節重點介紹 istio 流量管理。流量管理的本質是對網絡流量的路由和控制。生活中常常有這樣的例子,好比下雨塌方,交警會疏導新的交通路線,這即是路由;好比景區週末實行單雙號限行,這即是流量控制。

        在介紹流量管理以前,首先介紹一下網絡流向,介紹一個 http 請求在安裝了 istio 的 k8s 中都通過哪些點,有了這個介紹以後,再談流量管理將是水到渠成的事情。

        下圖即是網絡流向圖:

clipboard2.png

        當用戶使用瀏覽器發起一個請求( 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

        修改內容以下截圖所示:image3.png


4 嘗試網關路由功能

4.1 肯定 INGRESS_HOST

kubectl get pod -n istio-system -o wide

        執行結果以下圖所示,本人的 INGRESS_HOST 就是 10.110.101.205。image4.png

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%。

image5.pngimage6.png


5 小節

        自此咱們使用了 istio 的 gateway 和 virtual service 實現了流量管理的功能。下面咱們還會繼續庖丁解牛 istio 其餘強大的特性。

相關文章
相關標籤/搜索