代理
正向代理和反向代理
- 正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。 比如翻墙vpn
- 反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。 比如nginx
反向代理提升性能
反向代理提高网站性能主要通过三个方面:
1,反向代理可以理解为7层应用层的负载均衡,使用负载均衡之后可以非常便捷的横向扩展服务器集群,实现集群整体并发能力、抗压能力的提高。
2,通常反向代理服务器会带有本地Cache功能,通过静态资源的Cache,有效的减少后端服务器所承载的压力,从而提高性能
3,http压缩,开启压缩后,网络流量传输减小,相同带宽下可以服务更多用户最后还有一个TCP链接复用,不过说实话,如果不是商用的负载均衡器,一般没这个功能。 其实,反向代理还可以有效的隐藏隔离内部服务器,提高了安全性,这也算是提高性能的一个方面吧
ENVOY
Envoy 本身可以做反向代理和负载均衡,它也是 Istio 数据平面中默认使用的 sidecar。在了解一门技术之前一开始就要了解其中的基本概念和术语,只有融入了该语境才能理解这门技术。本文将为大家介绍 Envoy 中的基本术语和重点概念。
从nginx迁移到Envoy Proxy
k8s服务暴露方式
- Cluster IP端口绑定在内部IP上仅供集群内部调用
- Node Port端口绑定在所有Node上集群内部端口不能冲突
- LoadBalancer是NodePort的扩展,自动创建外部负载均衡指向NodePort,仅能够在被支持的云产品中使用
- IngressL4和L7负载均衡对于四层服务,同样面临端口冲突问题
nginx-ingress
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
helm install stable/nginx-ingress --name-template nginx-ingress -n kube-system
kubectl set image deployment/nginx-ingress-default-backend nginx-ingress-default-backend=gcr.azk8s.cn/google-containers/defaultbackend-amd64:1.5
# 官方的 Ingress Controller 有个坑,没有绑定到宿主机 80 端口,也就是说前端 Nginx 没有监听宿主机 80 端口;所以需要把配置搞下来自己加一下 hostNetwork
# 更正:应该是要访问svc
kubectl patch deployment nginx-ingress-controller -p '{"spec":{"template":{"spec":{"hostNetwork":"true"}}}}'
Ambassador
使用 Ambassador 的一个常见场景是将其部署为 Kubernetes 的 edge 服务( API 网关)。Ambassador 是开源 Envoy 的分布式版本,专门为 kubernetes 设计的。
示例
新的api版本可以使用crd来实现
kubectl apply -f https://getambassador.io/yaml/ambassador/ambassador-no-rbac.yaml
cat <<EOF |kubectl apply -f -
apiVersion: v1
kind: Service
metadata:
annotations:
getambassador.io/config: |-
---
apiVersion: ambassador/v0
kind: Mapping
name: test
prefix: /productpage
rewrite: /productpage
service: test.ns1
use_websocket: true
name: test
namespace: ns1
spec:
ports:
- port: 80 #访问服务端口,clusterip:port
protocol: TCP
targetPort: 9080 #容器端口
selector:
app: productpage
type: ClusterIP
EOF
kubectl get svc -n kubeflow ambassador --show-labels
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
ambassador NodePort 10.109.202.211 <none> 80:30008/TCP 138d app.kubernetes.io/name=kfapp,ksonnet.io/component=application,service=ambassador
curl http://nodeIp:30008/productpage
Istio
架构
-
数据平面:数据平面由一组 sidecar 的代理(Envoy)组成。这些代理调解和控制微服务之间的所有网络通信,并且与控制平面的 Mixer 通讯,接受调度策略。
-
控制平面:控制平面通过管理和配置 Envoy 来管理流量。此外,控制平面配置 Mixers来实施路由策略并收集检测到的监控数据。
-
Mixer 是一个独立于平台的组件,负责在整个 Service Mesh 中执行访问控制和使用策略,并从 Envoy 代理和其他服务收集监控到的数据。
-
Pilot 为 Envoy 提供服务发现;为高级路由(例如,A / B 测试,金丝雀部署等)提供流量管理功能;以及异常控制,如:超时,重试,断路器等。
-
Citadel 通过内置身份和凭证管理,提供强大的服务到服务和最终用户身份验证。我们可以使用 Citadel 升级 Service Mesh 中的未加密流量。我们可以使用 Istio 的授权功能来控制谁可以访问服务。
概念
- VirtualService 在 Istio 服务网格中定义路由规则,控制流量路由到服务上的各种行为。
- DestinationRule 是 VirtualService 路由生效后,配置应用与请求的策略集。
- ServiceEntry 通常用于在 Istio 服务网格之外启用的服务请求。
- Gateway 为 HTTP/TCP 流量配置负载均衡器,最常见的是在网格边缘的操作,以启用应用程序的入口流量。
- EnvoyFilter 描述了针对代理服务的过滤器,用来定制由 Istio Pilot 生成的代理配置。一定要谨慎使用此功能。错误的配置内容一旦完成传播,可能会令整个服务网格陷入瘫痪状态。这一配置是用于对 Istio 网络系统内部实现进行变更的。
实战
# 安装
curl -L https://git.io/getLatestIstio | ISTIO_VERSION=1.2.5 sh -
for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done
kubectl get customresourcedefinition|grep istio.io
kubectl apply -f install/kubernetes/istio-demo.yaml
kubectl get pods -n istio-system
# 创建
kubectl apply -n ns1 -f samples/bookinfo/platform/kube/bookinfo.yaml
# Gateway 配置资源允许外部流量进入 Istio 服务网格,并使 Istio 的流量管理和策略功能可用于边缘服务。
kubectl apply -n book -f samples/bookinfo/networking/bookinfo-gateway.yaml
# 获取 ingress http Port端口:
export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
# 获取 ingress IP 地址:
export INGRESS_HOST=$(kubectl get po -l istio=ingressgateway -n istio-system -o 'jsonpath={.items[0].status.hostIP}')
curl -I http://$INGRESS_HOST:$INGRESS_PORT/productpage
# 流量管理(将评论服务全部访问到v3版本)
kubectl apply -f samples/bookinfo/networking/destination-rule-reviews.yaml -n ns1
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml -n ns1
# 速率限制
sed -i 's/default/ns1/g' samples/bookinfo/policy/mixer-rule-productpage-ratelimit.yaml #因为bookinfo部署在namespace ns1中
kubectl apply -f samples/bookinfo/policy/mixer-rule-productpage-ratelimit.yaml
kubectl get svc -n istio-system
#可以查看prometheus grafana kiali端口访问查看页面
# RESOURCE_EXHAUSTED:Quota is exhausted for: requestcountquota