6.2.3 示例

启动service1示例应用,这个应用将会作为本任务的后端服务。下载本书所使用的示例代码之后,切换到目录traffic-policy/loadbalancer下可以查看所有相关的代码文件。

运行以下命令:


kubectl create namespace lb
kubectl label namespace lb istio-injection=enabled
kubectl apply -n lb -f app.yaml
kubectl apply -n lb -f sleep.yaml

注意,Service1部署设置了3个副本。运行如下命令,可以得到创建的pod列表:


kubectl get po -n lb
NAME                             READY   STATUS    RESTARTS   AGE
service1-v1-b9455d67-jtl2c       2/2     Running   0          1m
service1-v1-b9455d67-nw8k4       2/2     Running   0          1m
service1-v1-b9455d67-svsfq       2/2     Running   0          1m
sleep-6576c7f89d-9l9rz           2/2     Running   0          1m

确认Sleep pod运行正常:


SLEEP_POD=$(kubectl get pod -n lb | grep sleep | awk '{ print $1 }')

然后,执行以下命令,登录到sleep容器中:


kubectl exec -it -n lb $SLEEP_POD  -c sleep sh

执行如下脚本,可以看到返回结果是轮询式的负载分布:


root@sleep-6576c7f89d-9l9rz:/# for i in `seq 100`; do curl http://service1:5678/
ip;  echo ''; sleep 1;  done;
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.227","hostname":"service1-v1-69d7f6ddfc-gxhmb"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.227","hostname":"service1-v1-69d7f6ddfc-gxhmb"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
....

将负载均衡算法更改为RANDOM。以下是Istio的DestinationRule代码(参见文件lb-ramdem.yaml):


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: lb-service1
spec:
  host: service1.lb.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: RANDOM

再次执行如下脚本,可以看到返回结果是随机式的负载分布:


root@sleep-6576c7f89d-9l9rz:/# for i in `seq 100`; do curl http://service1:5678/
ip;  echo ''; sleep 1;  done;
{"ipAddress":"172.22.2.227","hostname":"service1-v1-69d7f6ddfc-gxhmb"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.227","hostname":"service1-v1-69d7f6ddfc-gxhmb"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.227","hostname":"service1-v1-69d7f6ddfc-gxhmb"}
{"ipAddress":"172.22.2.227","hostname":"service1-v1-69d7f6ddfc-gxhmb"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.227","hostname":"service1-v1-69d7f6ddfc-gxhmb"}
{"ipAddress":"172.22.2.227","hostname":"service1-v1-69d7f6ddfc-gxhmb"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.227","hostname":"service1-v1-69d7f6ddfc-gxhmb"}

将负载均衡算法更改为LEAST_CONN。以下是Istio的DestinationRule代码(参见文件lb-least-conn.yaml):


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: lb-service1
spec:
  host: service1.lb.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      simple: LEAST_CONN

再次执行如下脚本,可以看到返回结果是负载分布遵循加权最少请求方式:


root@sleep-6576c7f89d-9l9rz:/# for i in `seq 1000`; do curl http://service1:5678/
ip;  echo ''; sleep 1;  done;
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.73","hostname":"service1-v1-69d7f6ddfc-8kvhj"}

将负载均衡策略更改为会话保持,根据HTTP Header属性来提供会话保持功能,并启用。以下是Istio的DestinationRule代码(参见文件lb-sessionaffinity.yaml):


apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: lb-service1
spec:
  host: service1.lb.svc.cluster.local
  trafficPolicy:
    loadBalancer:
      consistentHash: 
        httpHeaderName: username
        useSourceIp: true

再次执行如下脚本,可以看到如下返回结果:


root@sleep-6576c7f89d-9l9rz:/# for i in `seq 1000`; do curl http://service1:5678/
ip;  echo ''; sleep 1;  done;
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}
{"ipAddress":"172.22.2.74","hostname":"service1-v1-69d7f6ddfc-5rkrc"}