美文网首页
阿里云istio使用初体验

阿里云istio使用初体验

作者: 国服最坑开发 | 来源:发表于2021-08-14 18:14 被阅读0次

由于阿里云在整合istio时, 进行了内部定制,导致好多外部资料上编写的通过istioctl指令操作的步骤,无法在ask/asm上实施.

参考: https://help.aliyun.com/document_detail/176082.html?spm=a2c4g.11186623.6.556.2b562f596DWhZn

istioctl指令

0x01 部署服务端

部署内容为python接口服务, 有两个版本, 对应两个deployment.
这里直接用kubectl 部署两个版本应用, 同时部署一份service

  • v1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flaskapp-v1
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: flaskapp
        version: v1
    spec:
      containers:
        - name: flaskapp
          image:  {falskapp.image.url}
          imagePullPolicy: IfNotPresent
          env:
            - name: version
              value: v1
  selector:
    matchLabels:
      app: flaskapp
      version: v1
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: flaskapp-v2
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: flaskapp
        version: v2
    spec:
      containers:
        - name: flaskapp
          image: {imageUrl}
          imagePullPolicy: IfNotPresent
          env:
            - name: version
              value: v2
  selector:
    matchLabels:
      app: flaskapp
      version: v2
---
apiVersion: v1
kind: Service
metadata:
  name: flaskapp
  labels:
    app: flaskapp
spec:
  selector:
    app: flaskapp
  ports:
    - port: 80
      name: http

由于上一篇文章中, 已经对当前namespace做了自动注入istio-agent的label, 所以, 在查看pod 信息的时候, 会发现pod里的containers 为2

0x02 部署客户端

编写纯k8s风格的部署文件:

apiVersion: v1
kind: Service
metadata:
  name: sleep
  labels:
    app: sleep
    version: v1
spec:
  selector:
    app: sleep
    version: v1
  ports:
    - name: ssh
      port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sleep
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: sleep
        version: v1
    spec:
      containers:
        - name: sleep
          image: dustise/sleep
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
  selector:
    matchLabels:
      app: sleep
      version: v1

0x03 验证

第2步相当于在集群内部署了一份客户端, 现在可以通过kubectl 登录到客户端上, 进行服务验证

kubectl exec -it sleep-d798b647b-wfx72 -c sleep bash

关于 http 指令:
usage: http [--json] [--form] [--compress] [--pretty {all,colors,format,none}] [--style STYLE] [--print WHAT] [--headers] [--body] [--verbose] [--all] [--history-print WHAT] [--stream] [--output FILE] [--download] [--continue]
[--session SESSION_NAME_OR_PATH | --session-read-only SESSION_NAME_OR_PATH] [--auth USER[:PASS]] [--auth-type {basic,digest}] [--ignore-netrc] >[--offline] [--proxy PROTOCOL:PROXY_URL] [--follow] [--max-redirects MAX_REDIRECTS] [--max-headers MAX_HEADERS]
[--timeout SECONDS] [--check-status] [--path-as-is] [--verify VERIFY] [--ssl {ssl2.3,tls1,tls1.1,tls1.2}] [--cert CERT] [--cert-key CERT_KEY] [--ignore-stdin] [--help] [--version] [--traceback] [--default-scheme DEFAULT_SCHEME] [--debug]
[METHOD] URL [REQUEST_ITEM [REQUEST_ITEM ...]]

登录后, 执行pod里自带的http命令, 进行服务验证
多次执行: http --body http://flaskapp/env/version, 查看结果:

http 服务验证

小结

  • 在istio中发布的deployment , 必需都要配置相应的Service , 否则istio 无法处理
  • http://flaskapp/env/version 其中的 flaskapp, 正在是上面的service 名称, 由于 service 中没有对两个版本进行权重设置, 两个应用以相同的机率返回结果.

0x04 配置DestinationRule

利用pod 的label, 把pod分成两类, 流量定义如下

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: flaskapp
spec:
  host: flaskapp
  subsets:
    - name: v1
      labels:
        version: v1
    - name: v2
      labels:
        version: v2

其中, host字段的值, 可以理解为Service 的名称.

注意: 这里的 apiVersion 是istio独有的, 所以在发布时候, 要使用asm的config, 进行发布.

0x05 配置 VirtualService

定义一个istio的vs(VirtualService), 指定默认的请求流量, 全部打到 v2 的 pod上,
这里的 v2 由上面的 dr 来定义

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: flaskapp-default-v2
spec:
  hosts:
    - flaskapp
  http:
    - name: "default-v2"
      route:
        - destination:
            host: flaskapp
            subset: v2

此时, 再来请求:

k exec -it sleep-d798b647b-wfx72 -n m7 -c sleep bash
http --body http://flaskapp/env/version
http --body http://flaskapp/env/version
http --body http://flaskapp/env/version
v2流量

此时, 发现所有请求, 全部打到了 v2 节点上.

0x06 部署网关

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name:  flask-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 81
        name: http
        protocol: HTTP
      hosts:
        - "*"

如上apiVersion所示, 这里使用的是istio的crd, 所以要使用istio的config进行部署.

这里为什么要设置端口 81 呢, 主要是集群里已经有了一个80端口占用,这里直接使用istio ingress 的4层协议, 增加一个81端口转发:

手动增加ingress gateway端口

同时, 需要修改上面的VirtualService 配置:
可以使用在线修改方式: kubectl edit vs flaskapp-default-v2 -n demo

spec:       
  gateways:
  - flask-gateway
  hosts: 
  - '*'  
  http:  
  - name: default-v2
    route:
    - destination:
        host: flaskapp                                                                                                                                                             
        subset: v2

主要修改点两个:

  • 关联入口网关
  • 修改hosts 为 "*"

然后, 就可以在集群外部, 测试这个接口请求:

curl 172.16.64.222:81/env/version
v2

到此, 一个完整的istio发布过程结束

0x07 小结

  • 学会使用 sleep 镜像, 在集群内部进行调试, 支持指令: wget, curl, http... 等.
  • 初步体验了 istio 中的 Deployment, Service, DestinationRule, VirtualServce 使用方法.
  • 结合上一篇, 基本可以和外部的 gateway 串起来.
访问关系图

相关文章

网友评论

      本文标题:阿里云istio使用初体验

      本文链接:https://www.haomeiwen.com/subject/iadebltx.html