Istio 13 Gateway LoadBalancer

Submitted by Lizhe on Wed, 06/24/2020 - 01:42

 

Kubernetes 提供了 Ingress 规范,用来入站流量管理

Istio的早期版本也实现了自己的 Ingress,后又因为 Ingress 在后来无法满足不断增加的需求,所以又推出了 Gateway,用于在网络边缘进行入站和出站的流量管理

Ingress Gateway 在逻辑上相当于一个负载均衡器

实际上之前做过的 VirtualService 对象, 都默认包含 gateways 字段,如果没有指定,那么默认值是

 

gateways:

- mesh

 

这里的 mesh 是 Istio 内部的虚拟 Gateway , 代表网络内部的所有 Sidecar, 换句话说,所有网络内部服务之间的相互通信,都是通过这个网关进行的。

 

如果要对外部提供服务,就需要定义 Gateway 对象, 并在 gateways 字段中进行赋值。
一旦在gateways中填写了mesh之外的对象名称,就要继续对内部通信进行流量控制,并必须显示地将内置的mesh对象名称也加入列表中

 


 

因为这个例子比之前的稍微复杂一些,所以这里我会把之前的yaml都重新贴一遍

第一种是 走 AWS 的 CLB ,这种对provider有依赖,你的集群需要 aws 权限

先创建 测试用的 flaskapp 两个,再创建 sleep ,这里 flaskapp 是最终被访问的endpoint,sleep 是为了使用 http 命令,作为客户端

 

20200624042444

sleep 客户端

apiVersion: v1

kind: Service

metadata:

  name: sleep

  namespace: lizhe 

  labels: 

    app: sleep

spec: 

  selector: 

    app: sleep

  ports: 

    - name: ssh

      port: 80

 

---

 

apiVersion: apps/v1

kind: Deployment

metadata:

  name: sleep-v1

  namespace: lizhe

spec: 

  replicas: 1

  selector:

    matchLabels:

      app: sleep

      version: v1

  template:

    metadata:

      labels:

        app: sleep

        version: v1

    spec: 

      containers:

      - name: flaskapp

        image: dustise/sleep

        imagePullPolicy: IfNotPresent

 

---

 

apiVersion: apps/v1

kind: Deployment

metadata:

  name: sleep-v2

  namespace: lizhe

spec: 

  replicas: 1

  selector:

    matchLabels:

      app: sleep

      version: v2

  template:

    metadata:

      labels:

        app: sleep

        version: v2

    spec: 

      containers:

      - name: flaskapp

        image: dustise/sleep

        imagePullPolicy: IfNotPresent

 

 

flaskapp 终端

apiVersion: v1

kind: Service

metadata:

  name: flaskapp-service

  namespace: lizhe 

  labels: 

    app: flaskapp-service-label

spec: 

  selector: 

    app: flaskapp-app

  ports: 

    - name: http

      port: 80

 

---

 

apiVersion: apps/v1

kind: Deployment

metadata:

  name: flaskapp-v1 

  namespace: lizhe 

spec: 

  replicas: 1

  selector:

    matchLabels:

      app: flaskapp-app

      version: v1

  template:

    metadata:

      labels:

        app: flaskapp-app

        version: v1

    spec: 

      containers:

      - name: flaskapp

        image: dustise/flaskapp

        imagePullPolicy: IfNotPresent

        env:

        - name: version 

          value: v1

 

---

 

apiVersion: apps/v1

kind: Deployment

metadata:

  name: flaskapp-v2

  namespace: lizhe 

spec: 

  replicas: 1

  selector:

    matchLabels:

      app: flaskapp-app

      version: v2

  template:

    metadata:

      labels:

        app: flaskapp-app

        version: v2

    spec: 

      containers:

      - name: flaskapp

        image: dustise/flaskapp

        imagePullPolicy: IfNotPresent

        env:

        - name: version 

          value: v2

 

 

这里需要检查一下 istio gateway 的安装, 上面提到了 它本身是 ingress , 在 Load Balancing 下 挂在 L4 层

20200624042513

 

20200624044013

 

检查 aws 中的 LB , 可以得到一个 创建好的 CLB

20200624044431

在 route53中创建一条记录指向这个 LB

20200624051316

创建一个 gateway

apiVersion: networking.istio.io/v1alpha3

kind: Gateway

metadata:

  name: example-gateway

  namespace: lizhe

spec:

  selector: 

    istio: ingressgateway

  servers:

    - port:

        number: 80

        name: http

        protocol: HTTP

      hosts:

      - "istio.pac-deg.com"

 

再创建 VirtualService

apiVersion: networking.istio.io/v1alpha3

kind: VirtualService

metadata:

  name: flaskapp-canary

  namespace: lizhe

spec: 

  hosts:

  - flaskapp-service.lizhe.svc.cluster.local

  - istio.pac-deg.com

  gateways:

  - mesh

  - example-gateway

  http:

  - route: 

    - destination: 

        host: flaskapp-service.lizhe.svc.cluster.local

        subset: v2

 

 

在 sleep 客户端上测试一下

20200624041235