题图摄于北京奥利匹克中心
【编者推荐】本文选自马哥教育 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