vlambda博客
学习文章列表

基于Envoy的API网关Gloo 1.0正式版发布

Gloo 是一个基于 Envovy 代理构建的下一代 API 网关和 Kubernetes Ingress 控制器,具有 Kubernetes 原生架构,也可以支持非 Kubernetes 环境。Gloo 是一个控制平面,可以轻松管理 Envovy 的配置,保护传入的流量并将其路由到应用程序。

介绍

Gloo 的核心原则是 连接、安全、和控制所有应用流量。下面我们来重点介绍下 1.0 版本的一些最新功能:

  • TCP 代理:Gloo 现在除了 HTTP 之外还支持 TCP 代理,可以安全访问数据库、缓存和消息队列等服务,可以和云服务商的负载均衡器集成。

  • Web 应用防火墙:Gloo 具有内置 WAF 功能的 API 网关,可以在进入你的环境之前对其进行检查并过滤掉可能有害的流量,为此,Gloo 管理了一个定制的 Envoy 过滤器 来调用 ModSecurity。

  • 认证和授权:Gloo 在授予对应用服务的访问权限之前,可以配置并强制执行请求的身份验证和授权。可以通过 Envovy 的过滤器在 Gloo 中自己手动不是,更高级的功能在企业版中提供,比如 JWT,LDAP,OAuth,OIDC 等。

  • 委托:Gloo 支持几种模型,用于安全地分配路由配置的所有权。管理员可以拥有一组路由,并将特定子路径的管理委派给其他用户,这样,团队可以快速部署和重新配置服务,而不会影响其他团队。

  • 数据丢失保护:Gloo 通过对请求和响应的自定义和强大的转换功能来扩展 Envoy。Gloo 利用这些功能开始支持 Data Loss Prevention,以保护敏感数据离开网关。

  • WebAssembly:WebAssembly 提到会降低 Web 开发的门槛,对于 Gloo 意味着可以更轻松地用任何变成语言构建自定义的 Envoy 和 Gloo 扩展,WebAssembly 仍然是一种新兴的技术,但是 Gloo 已经开始将其作为实验性功能来支持它了。

  • 限速:Gloo 允许你配置到应用程序的传入流量数量来维持服务性能,并防止故障或恶意攻击。

  • 管理控制台:Gloo Web 控制台简化了可观察性和操作,并在出现问题时可以快速查看运行状态、性能和报警信息等。

基于Envoy的API网关Gloo 1.0正式版发布

安装

我们这里以 Ingress Controller 的形式来安装 Gloo。所以提前准备好 Kubernetes 集群,我们这里演示的环境为 v1.16.2 版本。

首先我们需要先安装 glooctl 命令行工具,该工具提供了安装、配置和调试 Gloo 的一些功能,直接执行下面的命令安装即可:

 
   
   
 
  1. $ curl -sL https://run.solo.io/gloo/install | sh

  2. $ export PATH=$HOME/.gloo/bin:$PATH

当然我们也可以直接到 GitHub release 页面下载 glooctl,然后一样把下载的文件路径配置到系统的 PATH 路径下面即可。

完成后我们可以通过如下命令来验证 CLI 工具是否安装成功:

 
   
   
 
  1. $ glooctl version

  2. Client: {"version":"1.0.0"}

  3. Server: version undefined, could not find any version of gloo running

该命令会返回客户端的版本,由于还没有安装 Gloo,所以不会显示服务端信息。

然后可以直接运行下面的命令来部署 Gloo Ingress Controller,默认会安装到 gloo-system 命名空间下面:

 
   
   
 
  1. $ glooctl install ingress

由于我们这里只有 master 节点可以上外网,所以需要对 Ingress Controller 做一些限制,可以加上 --dry-run 参数来获取安装的资源清单:

 
   
   
 
  1. $ glooctl install ingress --dry-run > gloo.yaml

  2. $ vi gloo.yaml

  3. ......

  4. # apiVersion: v1

  5. # kind: Service

  6. # metadata:

  7. # labels:

  8. # app: gloo

  9. # gloo: ingress-proxy

  10. # installationId: 4hxyhvE5MjAF2tm34Bmz

  11. # name: ingress-proxy

  12. # namespace: gloo-system

  13. # spec:

  14. # ports:

  15. # - port: 80

  16. # protocol: TCP

  17. # name: http

  18. # - port: 443

  19. # protocol: TCP

  20. # name: https

  21. # selector:

  22. # gloo: ingress-proxy

  23. # type: LoadBalancer

  24. ......

  25. apiVersion: apps/v1

  26. kind: Deployment

  27. metadata:

  28. labels:

  29. app: gloo

  30. gloo: ingress-proxy

  31. installationId: 4hxyhvE5MjAF2tm34Bmz

  32. name: ingress-proxy

  33. namespace: gloo-system

  34. spec:

  35. replicas: 1

  36. selector:

  37. matchLabels:

  38. gloo: ingress-proxy

  39. template:

  40. metadata:

  41. labels:

  42. gloo: ingress-proxy

  43. spec:

  44. tolerations:

  45. - operator: "Exists"

  46. nodeSelector:

  47. kubernetes.io/hostname: ydzs-master

  48. containers:

  49. ......

  50. ports:

  51. - containerPort: 80

  52. name: http

  53. hostPort: 80

  54. protocol: TCP

  55. - containerPort: 443

  56. name: https

  57. hostPort: 443

  58. protocol: TCP

  59. ......

  60. ......

将 ingress-proxy 固定在 master 节点上,加上上面的容忍和 nodeSelector,由于默认的 ingress-proxy 的服务代理方式是 LoadBalancer,由于我这里不是云环境,所以将该 Service 注释掉,然后给 ingress-proxy 的服务设置成 hostPort 模式,然后直接安装即可:

 
   
   
 
  1. $ kubectl apply -f gloo.yaml

  2. customresourcedefinition.apiextensions.k8s.io/settings.gloo.solo.io created

  3. customresourcedefinition.apiextensions.k8s.io/gateways.gateway.solo.io created

  4. customresourcedefinition.apiextensions.k8s.io/virtualservices.gateway.solo.io created

  5. customresourcedefinition.apiextensions.k8s.io/routetables.gateway.solo.io created

  6. customresourcedefinition.apiextensions.k8s.io/proxies.gloo.solo.io created

  7. customresourcedefinition.apiextensions.k8s.io/upstreams.gloo.solo.io created

  8. customresourcedefinition.apiextensions.k8s.io/upstreamgroups.gloo.solo.io created

  9. customresourcedefinition.apiextensions.k8s.io/authconfigs.enterprise.gloo.solo.io created

  10. namespace/gloo-system created

  11. serviceaccount/gloo created

  12. serviceaccount/discovery created

  13. clusterrole.rbac.authorization.k8s.io/gloo-role-ingress created

  14. clusterrolebinding.rbac.authorization.k8s.io/gloo-role-binding-ingress-gloo-system created

  15. configmap/ingress-envoy-config created

  16. configmap/gloo-usage created

  17. service/ingress-proxy created

  18. service/gloo created

  19. deployment.apps/gloo created

  20. deployment.apps/ingress created

  21. deployment.apps/ingress-proxy created

  22. deployment.apps/discovery created

  23. unable to recognize "gloo.yaml": no matches for kind "Gateway" in version "gateway.solo.io/v1"

  24. unable to recognize "gloo.yaml": no matches for kind "Gateway" in version "gateway.solo.io/v1"

  25. unable to recognize "gloo.yaml": no matches for kind "Settings" in version "gloo.solo.io/v1"

该资源清单文件中声明了大量的资源,如果出现上面的错误信息,再重新执行一次上面的 apply 命令即可,这是因为 CRD 声明的先后顺序问题造成的。

除了上面这种安装方式之外,还可以用 Helm 来快速安装:

 
   
   
 
  1. $ helm repo add gloo https://storage.googleapis.com/solo-public-helm

  2. $ helm fetch --untar=true --untardir=. gloo/gloo

  3. $ helm install gloo --namespace gloo-system -f gloo/values-ingress.yaml

最后安装完成后,我们可以通过查看 gloo-system 命名空间下面的资源对象来验证是否安装成功:

 
   
   
 
  1. $ kubectl get all -n gloo-system

  2. NAME READY STATUS RESTARTS AGE

  3. pod/discovery-7f7dc9cb78-ftcd4 1/1 Running 0 9m31s

  4. pod/gloo-654dbd7f58-x5njx 1/1 Running 0 9m32s

  5. pod/ingress-86dcd7b99-x7trl 1/1 Running 0 9m31s

  6. pod/ingress-proxy-58cb9fd886-pz4nq 1/1 Running 0 21s


  7. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

  8. service/gloo ClusterIP 10.103.174.129 <none> 9977/TCP,9988/TCP,9966/TCP 9m32s


  9. NAME READY UP-TO-DATE AVAILABLE AGE

  10. deployment.apps/discovery 1/1 1 1 9m32s

  11. deployment.apps/gloo 1/1 1 1 9m33s

  12. deployment.apps/ingress 1/1 1 1 9m32s

  13. deployment.apps/ingress-proxy 1/1 1 1 9m32s


  14. NAME DESIRED CURRENT READY AGE

  15. replicaset.apps/discovery-7f7dc9cb78 1 1 1 9m32s

  16. replicaset.apps/gloo-654dbd7f58 1 1 1 9m33s

  17. replicaset.apps/ingress-86dcd7b99 1 1 1 9m32s

  18. replicaset.apps/ingress-proxy-57c579c885 0 0 0 9m32s

  19. replicaset.apps/ingress-proxy-58cb9fd886 1 1 1 22s

示例

比如我们创建一个如下的 Nginx 服务:(nginx-demo)

 
   
   
 
  1. apiVersion: apps/v1

  2. kind: Deployment

  3. metadata:

  4. name: nginx-demo

  5. spec:

  6. selector:

  7. matchLabels:

  8. app: nginx

  9. template:

  10. metadata:

  11. labels:

  12. app: nginx

  13. spec:

  14. containers:

  15. - name: nginx

  16. image: nginx

  17. ports:

  18. - containerPort: 80


  19. ---


  20. apiVersion: v1

  21. kind: Service

  22. metadata:

  23. name: nginx-demo

  24. spec:

  25. ports:

  26. - name: http

  27. port: 80

  28. selector:

  29. app: nginx

直接创建:

 
   
   
 
  1. $ kubectl apply -f nginx.yaml

  2. deployment.apps/nginx-demo created

  3. service/nginx-demo created

然后创建一个如下的 Ingress 对象:(nginx-demo-ingrss.yaml)

 
   
   
 
  1. apiVersion: extensions/v1beta1

  2. kind: Ingress

  3. metadata:

  4. name: nginx-demo

  5. annotations:

  6. # 设置成 gloo

  7. kubernetes.io/ingress.class: gloo

  8. spec:

  9. rules:

  10. - host: gloo.example.com

  11. http:

  12. paths:

  13. - path: /

  14. backend:

  15. serviceName: nginx-demo

  16. servicePort: 80

直接创建:

 
   
   
 
  1. $ kubectl apply -f nginx-demo-ingrss.yaml

  2. ingress.extensions/nginx-demo created

  3. $ kubectl get ingress nginx-demo

  4. NAME HOSTS ADDRESS PORTS AGE

  5. nginx-demo gloo.example.com 80 65s

然后我们在本地的 /etc/hosts 里面加上域名 gloo.example.com 的映射,然后直接在浏览器中访问:

关于 Gloo 的更多使用可以查看文档 https://docs.solo.io/gloo




K8S进阶课程推荐