TCP 流量转移

    • 按照安装指南中的说明安装 Istio。

    • 熟悉中的相关概念。

    • 第一个步骤是部署 tcp-echo 微服务的 v1 版本。

    istioctl kube-inject 的作用如文档所言,是在提交 tcp-echo-services.yaml 之前进行修改。

    • 如果使用的是一个启用了 的集群,可以给 default 命名空间打上 istio-injection=enabled 标签:
    1. $ kubectl label namespace default istio-injection=enabled

    然后简单的使用 kubectl 进行服务部署即可:

    Zip

    1. $ kubectl apply -f @samples/tcp-echo/tcp-echo-services.yaml@
    • 下一步,把所有目标是 tcp-echo 微服务的 TCP 流量路由到 v1 版本:

    • 确认 tcp-echo 服务已经启动并开始运行。

    下面的 $INGRESS_HOST 变量中保存了 Ingress 的外部 IP 地址(Bookinfo 文档中描写了这一部分的相关内容)。可以使用下面的命令来获取 $INGRESS_PORT 的值:

    1. $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
    1. $ for i in {1..10}; do \
    2. docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $INGRESS_PORT"; \
    3. done
    4. one Mon Nov 12 23:24:57 UTC 2018
    5. one Mon Nov 12 23:25:00 UTC 2018
    6. one Mon Nov 12 23:25:02 UTC 2018
    7. one Mon Nov 12 23:25:05 UTC 2018
    8. one Mon Nov 12 23:25:12 UTC 2018
    9. one Mon Nov 12 23:25:15 UTC 2018
    10. one Mon Nov 12 23:25:17 UTC 2018
    11. one Mon Nov 12 23:25:19 UTC 2018

    不难发现,所有的时间戳都有一个 one 前缀,这代表所有访问 tcp-echo 服务的流量都被路由到了 v1 版本。

    • 用下面的命令把 20% 的流量从 tcp-echo:v1 转移到 tcp-echo:v2

    需要一定时间完成新规则的传播和生效。

    • 确认该规则已经完成替换:
    1. $ kubectl get virtualservice tcp-echo -o yaml
    2. apiVersion: networking.istio.io/v1alpha3
    3. kind: VirtualService
    4. metadata:
    5. name: tcp-echo
    6. ...
    7. spec:
    8. ...
    9. tcp:
    10. - match:
    11. - port: 31400
    12. route:
    13. - destination:
    14. host: tcp-echo
    15. port:
    16. weight: 80
    17. - destination:
    18. host: tcp-echo
    19. port:
    20. number: 9000
    21. subset: v2
    22. weight: 20
    • tcp-echo 微服务发送更多 TCP 流量:
    1. $ for i in {1..10}; do \
    2. docker run -e INGRESS_HOST=$INGRESS_HOST -e INGRESS_PORT=$INGRESS_PORT -it --rm busybox sh -c "(date; sleep 1) | nc $INGRESS_HOST $INGRESS_PORT"; \
    3. done
    4. one Mon Nov 12 23:38:45 UTC 2018
    5. two Mon Nov 12 23:38:47 UTC 2018
    6. one Mon Nov 12 23:38:50 UTC 2018
    7. one Mon Nov 12 23:38:52 UTC 2018
    8. one Mon Nov 12 23:38:55 UTC 2018
    9. two Mon Nov 12 23:38:57 UTC 2018
    10. one Mon Nov 12 23:39:00 UTC 2018
    11. one Mon Nov 12 23:39:02 UTC 2018
    12. one Mon Nov 12 23:39:05 UTC 2018
    13. one Mon Nov 12 23:39:07 UTC 2018

    现在应该会看到,输出内容中有 20% 的时间戳前缀为 two,这意味着 80% 的流量被路由到 tcp-echo:v1,其余 20% 流量被路由到了 v2

    这个任务里,用 Istio 的权重路由功能,把一部分访问 tcp-echo 服务的 TCP 流量被从旧版本迁移到了新版本。容器编排平台中的版本迁移使用的是对特定组别的实例进行伸缩来完成对流量的控制的,两种迁移方式显然大相径庭。

    在 Istio 中可以对两个版本的 服务进行独立的扩缩容,伸缩过程中不会对流量的分配结果造成影响,可以阅读博客:使用 Istio 进行金丝雀部署,进一步了解相关内容。

    Zip

    在多集群服务网格环境中配置 Istio 的路由规则。

    评估加入 Egress gateway 对性能造成的影响。

    Istio Sidecar 注入过程解密

    Istio 将数据面组件注入到现存部署之中的过程。

    如何使用 cert-manager 手工部署一个自定义 Ingress 网关。

    增量式应用 Istio 第一部分,流量管理

    如何在不部署 Sidecar 代理的情况下使用 Istio 进行流量管理。

    描述了一个基于 Istio 的 Bookinfo 示例的简单场景。