一文搞懂HTTPProxy丨含基础、高级路由、服务韧性


题图摄于北京奥利匹克中心

【编者推荐】本文选自马哥教育 CEO 马永亮老师撰写的《Kubernetes进阶实战(第2版)》,第十三章 13.3.3-13.3.5 节。马老师曾经到我司给云原生开发人员讲授 Kubernetes 的课程,讲解内容细致入微、条理清晰,受到学员一致好评。文末赠书活动,欢迎参加。

《Kubernetes进阶实战(第2版)》新增与重写多种知识点,基于 Kubernetes v1.19 与 v1.20 讲解新特性,值得推荐给大家。感兴趣的读者可参加文末赠书活动,或直接购买。

Contour 是 Kubernetes Ingress 控制器的另一款开源实现,它以高性能的 Envoy 代理程序作为数据平面,支持开箱即用的动态配置和多种高级路由机制,支持 TCP 代理,并且提供了自定义资源(CRD)HTTPProxy 扩展了 Ingress API,它以更丰富的功能集部分地解决了Ingress 原始设计中的缺点,是Ingress控制器的较为出色实现之一。

本文主要就 HTTPProxy 基础、HTTPProxy 高级路由、HTTPProxy 服务韧性三个方面展开介绍 HTTPProxy。

提示:本文中的操作需要读者部署完成了可用的Kubernetes集群,且部署了Contour 作为 Ingress Controller。

(一)   HTTPProxy 基础


HTTPProxy 资源几乎兼容 Ingress 资源的所有功能,只不过它使用独有的资源规范,具体的格式及简要说明如下所示。

apiVersion: projectcontour.io/v1   # API群组及版本
kind: HTTPProxy       # CRD资源的名称
metadata:
  name <string>
  namespace <string>      # 名称空间级别的资源
spec:
  virtualhost <VirtualHost>  # 定义FQDN格式的虚拟主机,类似于Ingress中的host
    fqdn <string>       # 虚拟主机FQDN格式的名称
    tls <TLS>         # 启用HTTPS,且默认以301将HTTP请求重定向至HTTPS
      secretName <string>     # 存储证书和私钥信息的Secret资源名称
      minimumProtocolVersion <string>   # 支持的SSL/TLS协议的最低版本
      passthrough <boolean>     # 是否启用透传模式,启用时控制器不卸载HTTPS会话
      clientValidation <DownstreamValidation>   # 验证客户端证书,可选配置
        caSecret <string>     # 用于验证客户端证书的CA证书
  routes <[]Route>      # 定义路由规则
    conditions <[]Condition>    # 流量匹配条件,支持PATH前缀和标头匹配两种检测机制
      prefix <String>       # PATH路径前缀匹配,类似于Ingress中的path字段
    permitInsecure <Boolean>   # 是否禁止默认的将HTTP重定向到HTTPS的功能
    services <[]Service>     # 后端服务,会对应转换为Envoy的Cluster定义
      name <String>        # 服务名称
      port <Integer>       # 服务端口
      protocol <String>     # 到达后端服务的协议,可用值为tls、h2或者h2c
      validation <UpstreamValidation>   # 是否校验服务端证书
        caSecret <String>  
        subjectName <string>   # 要求证书中使用的Subject值

需要特别说明的是,在同一个 conditions 字段中使用多个 prefix 前缀时,前缀间将存在串联关系,例如对于第一个前缀 /api 和第二个前缀 /docs 来说,该条件实际匹配的是 /api/docs 路由前缀。但通常在一个条件中只应该使用单个 prefix。

我们以 demoapp 应用为例来说明如何通过 HTTPProxy 将应用发布到 Kubernetes 集群外部。为了隔离其它环境,我们下面先创建一个测试使用的名称空间,以 dev 为例,而后在该名称空间下分别创建 deployments/demoapp 和 service/demoapp 资源。

~$ kubectl create namespace dev
~$ kubectl create deployments demoapp –image=”ikubernetes/demoapp:v1.0“ -n dev
~$ kubectl create service clusterip demoapp –tcp=80 -n dev

下面配置清单中定义的 HTTPProxy 资源将 demoapp 以 HTTP 和 HTTPS 协议同时予以发布,客户端可通过其中任何一种协议发起访问请求。当然,我们也可以将 “permitInsecure: true” 中的值修改为“false”,从而将 HTTP 请求一律重定向至 HTTPS。

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: httpproxy-demo
  namespace: dev
spec:
  virtualhost:
    fqdn: www.ilinux.io
    tls:
      secretName: tls-ingress-www-ilinux
      minimumProtocolVersion: "tlsv1.1"   # 支持的TLS协议最小版本
  routes:
  - conditions:
    - prefix: /   # PATH路径前缀匹配
    services:
    - name: demoapp
      port: 80
permitInsecure: true   # 禁止将HTTP重定向至HTTPS

随后,将上面的定义的 httpproxy/httpproxy-demo 创建于 Kubernetes 上,即可展开访问测试。

~$ kubectl apply -f httpproxy-demo.yaml 
httpproxy.projectcontour.io/httpproxy-demo created

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值