Ambassador系列-05-负载均衡

Ambassador支持多种负载均衡算法。

  • round_robin,轮询算法,依次把客户端的请求分发到不同的上游服务实例。
  • least_request,最少请求算法,请求会被转发到请求数最少的上游服务实例。
  • ring_hash,会话亲和算法,可以根据hash、http头,Cookie或者实际的源IP地址,始终转发同一个上游服务实例。

负载均衡配置即可全局配置,也可以基于Service配置。

重新部署echo服务,将echo的副本数设为2。

vi echo-server-service.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    app: echo
  name: echo
spec:
  ports:
  - port: 8080
    name: high
    protocol: TCP
    targetPort: 8080
  - port: 80
    name: low
    protocol: TCP
    targetPort: 8080
  selector:
    app: echo
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  labels:
    app: echo
  name: echo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: echo
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: echo
    spec:
      containers:
      - image: gcr.io/kubernetes-e2e-test-images/echoserver:2.2
        name: echo
        ports:
        - containerPort: 8080
        env:
          - name: NODE_NAME
            valueFrom:
              fieldRef:
                fieldPath: spec.nodeName
          - name: POD_NAME
            valueFrom:
              fieldRef:
                fieldPath: metadata.name
          - name: POD_NAMESPACE
            valueFrom:
              fieldRef:
                fieldPath: metadata.namespace
          - name: POD_IP
            valueFrom:
              fieldRef:
                fieldPath: status.podIP
        resources: {}

kubectl apply -f echo-server-service.yaml

kubectl get pod
NAME                         READY   STATUS    RESTARTS   AGE
ambassador-877b57b69-cvzbl   1/1     Running   2          8d
ambassador-877b57b69-rtgcq   1/1     Running   2          8d
echo-5599595fd9-2vfnt        1/1     Running   2          8d
echo-5599595fd9-ffxpn        1/1     Running   2          8d

round_robin,轮询算法

负载均衡使用到Kubernetes endpoint级服务发现,所以需要实现创建KubernetesEndpointResolver。可以看出是轮询访问。

vi echo-server-mapping.yaml
---
apiVersion: getambassador.io/v1
kind: KubernetesEndpointResolver
metadata:
  name: echo-endpoint-resolver
---
apiVersion: getambassador.io/v1
kind: Mapping
metadata:
  name: echo-server-mapping
spec:
  prefix: /foo
  service: echo:8080
  resolver: echo-endpoint-resolver
  load_balancer:
    policy: round_robin

kubectl apply -f echo-server-mapping.yaml

curl -i http://192.168.1.50:38080/foo
HTTP/1.1 200 OK
date: Sat, 07 Dec 2019 13:23:11 GMT
content-type: text/plain
server: envoy
x-envoy-upstream-service-time: 6
lua-scripts-enabled: Processed
transfer-encoding: chunked


Hostname: echo-5599595fd9-2vfnt

Pod Information:
        node name:      k8s-node1
        pod name:       echo-5599595fd9-2vfnt
        pod namespace:  default
        pod IP: 10.244.1.7
......


curl -i http://192.168.1.50:38080/foo
HTTP/1.1 200 OK
date: Sat, 07 Dec 2019 13:23:28 GMT
content-type: text/plain
server: envoy
x-envoy-upstream-service-time: 5
lua-scripts-enabled: Processed
transfer-encoding: chunked


Hostname: echo-5599595fd9-ffxpn

Pod Information:
        node name:      k8s-node2
        pod name:       echo-5599595fd9-ffxpn
        pod namespace:  default
        pod IP: 10.244.2.6

curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.1.7
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.1.7
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.1.7
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.1.7
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.1.7

least_request,最少请求算法

---
apiVersion: getambassador.io/v1
kind: KubernetesEndpointResolver
metadata:
  name: echo-endpoint-resolver
---
apiVersion: getambassador.io/v1
kind: Mapping
metadata:
  name: echo-server-mapping
spec:
  prefix: /foo
  service: echo:8080
  resolver: echo-endpoint-resolver
  load_balancer:
    policy: least_request

ring_hash,会话亲和算法

根据源IP地址会话亲和,由于源IP地址相同,所以始终转发到同一个echo实例。

vi echo-server-mapping.yaml
---
apiVersion: getambassador.io/v1
kind: KubernetesEndpointResolver
metadata:
  name: echo-endpoint-resolver
---
apiVersion: getambassador.io/v1
kind: Mapping
metadata:
  name: echo-server-mapping
spec:
  prefix: /foo
  service: echo:8080
  resolver: echo-endpoint-resolver
  load_balancer:
    policy: ring_hash
    source_ip: true

kubectl apply -f echo-server-mapping.yaml

curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6
curl -i http://192.168.1.50:38080/foo -s | grep "pod IP:"
        pod IP: 10.244.2.6

Ambassador系列文章

Ambassador系列-01-介绍、安装和使用

Ambassador系列-02-Module模块

Ambassador系列-03-服务配置和服务发现

Ambassador系列-04-服务配置Mapping

Ambassador系列-05-负载均衡

Ambassador系列-06-金丝雀发布、断路器、CORS和流量镜像

Ambassador系列-07-TCP映射TCPMapping

Ambassador系列-08-TLS配置-HTTPS重定向和TLS终结

Ambassador系列-09-AuthService认证服务

Ambassador系列-10-RateLimitService限速服务

Ambassador系列-11-Helm安装Ambassador Edge Stack 1.1.0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值