服务网格Istio全系列之三——IstioGate

1 流量管理(traffic management)

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

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

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

        下图便是网络流向图:

image.png

        当用户使用浏览器发起一个请求进入 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):

  • jiuxi-svc.yaml
  • jiuxi-deploy.yaml
  • jiuxi-gateway.yaml
  • jiuxi-virtual-svc.yaml

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
复制代码

        修改内容如下截图所示:

image.png


4 尝试网关路由功能

4.1 确定 INGRESS_HOST

# kubectl get pod -n istio-system -o wide
复制代码

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

image.png

vim /etc/hosts # linux
c:/windows/system32/drivers/etc/hosts # windows
复制代码

        添加 DNS 记录:

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

4.3 访问 tomcat

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

image.png

image.png


5 小节

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