Istio

随着微服务的发展,越来越多复杂问题都找打了第三方组件的解决方案,但是对于以往的单体架构的微服务化可能需要进行大量的重构,而且服务间的网络调用变得十分复杂,就需要一个完善的服务治理工具。而又因为 K8s 和微服务的完美结合,使其解决了微服务的编排部署的问题,但是服务治理还是过于繁琐,而且 k8s 对于服务治理方面不够完善,所以提出了服务网格的概念,通过代理微服务的网络,从而实现网络的追踪和监控。

基本案例

基本案例是基于 Istio 的官方提供的案例,可通过 git 下载https://github.com/istio/istio

部署 K8s 服务

执行samples\bookinfo\platform\kube\bookinfo.yaml,截取部分配置说明:

## 创建Service,选取app为details的pod
apiVersion: v1
kind: Service
metadata:
  name: details # 服务名称
  labels:
    app: details
    service: details
spec:
  ports: # 端口号
    - port: 9080
      name: http
  selector:
    app: details
---
## 创建帐号
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-details
  labels:
    account: details
---
## 创建Deployment进行管理Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: details-v1
  labels:
    app: details
    ## 自定义标签的版本号
    version: v1
spec:
  ## 副本个数
  replicas: 1
  selector:
    matchLabels:
      app: details
      version: v1
  template:
    metadata:
      labels:
        app: details
        version: v1
    spec:
      serviceAccountName: bookinfo-details
      containers:
        - name: details
          ## 镜像名
          image: docker.io/istio/examples-bookinfo-details-v1:1.16.1
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 9080
---

综上可看出,该配置文件只是单纯的使用 K8s 部署服务,生成对应的 Pod、Deploment、Service,这里并未使用 Istio,但是此处应该选择对应的命名空间自动注入 Istio,否则无法进行 Istio 的流量管理等的操作。

虚拟服务

下面需要执行虚拟服务的配置文件(samples\bookinfo\networking\virtual-service-all-v1.yaml),截取部分如下:

## 创建Istio的虚拟服务
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  ## 这里对应的服务的名称,这里如果不明白可百度k8s的网络相关
  hosts:
    - productpage
  http:
    ## 转发规则 转发到对应的规则(下面会讲到规则),当然此处可以设置转发权重,也就是基本的流量管理,也可设置符合的路径转发等的功能,后面会说到
    - route:
        - destination:
            host: productpage
            subset: v1
---

综上,此处使用了 Istio 的虚拟服务的概念,其实相当于 K8s 的 service,只是此处的虚拟服务提供能更加强大的功能,能够转发符合一定条件的请求。

规则

下面需要执行虚拟服务的配置文件(samples\bookinfo\networking\destination-rule-all.yaml),截取部分如下:

---
## 定义Istio的规则
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: reviews
spec:
  host: reviews
  ## 设置规则,subsets和虚拟服务相对应,通过hosts选择对应的k8s的服务,通过label进一步细选。
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2
    - name: v3
      labels:
        version: v3

网关

下面需要执行虚拟服务的配置文件(samples\bookinfo\networking\bookinfo-gateway.yaml),截取部分如下:

## 定义Istio的Gateway
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
        ## 这里通过hosts绑定
      hosts:
        - "*"
---
## 这里的Istio的虚拟服务通过路径进行转发
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
    - "*"
  gateways:
    - bookinfo-gateway
  http:
    - match:
        - uri:
            exact: /productpage
        - uri:
            prefix: /static
        - uri:
            exact: /login
        - uri:
            exact: /logout
        - uri:
            prefix: /api/v1/products
      route:
        - destination:
            host: productpage
            port:

基本流程

Istio

流量管理

kind: VirtualService
metadata:
  name: reviews
  ...
spec:
  hosts:
  - reviews
  ## 不仅仅可以转发http还可转发TCP等的
  http:
  ## 设置延迟,所有的请求都会被延迟7s
  - fault:
      delay:
        fixedDelay: 7s
        percentage:
          value: 100
  - match:
  ## 通过headers中的参数进行转发, 符合条件的转发给v2其他的转发给v1
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
    # 设置镜像流量到v3,并在 headers 中的 Host/Authority 属性值上追加 -shadow,可以使用 mirror_percent 属性来设置镜像流量的百分比
    mirror:
      host: reviews
      subset: v3
    mirror_percent: 100
  - route:
    - destination:
        host: reviews
        subset: v1
        ## 设置转发权重
      weight: 50
    ## 设置超时时间
    timeout: 0.5s
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    timeout: 0.5s
## 熔断
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
  ...
spec:
  host: httpbin
  ## 设置熔断
  trafficPolicy:
    connectionPool:
      http:
      ## 设置最大请求数
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
      tcp:
      ## 设置最大并发连接数
        maxConnections: 1
    outlierDetection:
      baseEjectionTime: 180.000s
      consecutiveErrors: 1
      interval: 1.000s
      maxEjectionPercent: 100
## Gateway的相关内容
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  selector:
    istio: ingressgateway # use istio default ingress gateway
  servers:
    - port:
        number: 443
        name: https
        protocol: HTTPS
        ## 通过证书实现https,该 secret 必须在 istio-system 命名空间下,且名为 istio-ingressgateway-certs,以与此任务中使用的 Istio 默认 ingress 网关的配置保持一致,证书和私钥必须位于 /etc/istio/ingressgateway-certs,否则网关将无法加载它们
      ## 安全
      tls:
        ## 可设置不同的模式
        mode: MUTUAL
        serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
        privateKey: /etc/istio/ingressgateway-certs/tls.key
        caCertificates: /etc/istio/ingressgateway-ca-certs/example.com.crt
      hosts:
        - "httpbin.example.com"

可观察性

策略

上一篇:云计算应用场景分析


下一篇:后K8S时代的微服务