启动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"}