我们正在为容器设置Azure 应用程序网关,它是 k8s 网关 API 的实现。
我已经能够在网关和多站点托管中设置具有 TLS 终止功能的工作 POC。
但是,我遇到的问题是我想使用用于应用程序部署的自定义 helm 图表来部署这些资源。
到目前为止,我的设置方法是在网关资源中添加多个 TLS 证书:
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
annotations:
alb.networking.azure.io/alb-name: alb-test-spoke-2
alb.networking.azure.io/alb-namespace:system
name: alb-gw-tls
namespace:system
spec:
gatewayClassName: azure-alb-external
listeners:
- allowedRoutes:
namespaces:
from: All
hostname: first-api.dev
name: https-listener-first-api
port: 443
protocol: HTTPS
tls:
certificateRefs:
- kind: Secret
name: first-api-tls-certificate
mode: Terminate
- allowedRoutes:
namespaces:
from: All
hostname: second-api.dev
name: https-listener-second-api
port: 443
protocol: HTTPS
tls:
certificateRefs:
- kind: Secret
name: second-api-tls-certificate
mode: Terminate
这可行,但据我所知,使用 Helm Chart 来实现此操作并不可行,因为这种方法需要我手动为每个新应用程序向网关添加新的路由/tls 证书引用,而我不想这样做。
我可以为每个应用程序创建一个新网关,但由于某种原因Azure 将连接到容器的 Azure 应用程序网关的网关(前端)数量限制为 5,这使得这种方法非常笨拙。
我尝试考虑终止 HttpRoute Resouce 中的 TLS,但这似乎不是受支持的功能。
是否有其他人建议我如何将这些资源创建为独立资源(文件),以便使用我们的 helm-chart 轻松部署?
如上所述,Azure 应用程序网关容器的“限制”为每个网关五个前端,目前无法增加。要解决此限制,您可以使用通配符证书,允许单个网关资源处理多个子域的 TLS 终止。通过此设置,您只需管理每个新应用程序的 HTTPRoute 资源,从而消除了对主网关配置的频繁更新。 在集群上安装
Gateway API CRD
kubectl apply -k "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v0.5.0"
如果您有通配符证书,请为其创建一个密钥,或者如果您为每个主机名使用单独的证书,请为每个证书创建密钥。
使用通配符或单独证书更新具有 TLS 终止功能的网关 yaml。
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
annotations:
alb.networking.azure.io/alb-name: alb-test-spoke-2
alb.networking.azure.io/alb-namespace: system
name: alb-gw-tls
namespace: system
spec:
gatewayClassName: azure-alb-external
listeners:
- name: https-listener-first-api
port: 443
protocol: HTTPS
hostname: "first-api.dev"
tls:
mode: Terminate
certificateRefs:
- kind: Secret
name: first-api-tls-certificate
namespace: system
allowedRoutes:
namespaces:
from: All
- name: https-listener-second-api
port: 443
protocol: HTTPS
hostname: "second-api.dev"
tls:
mode: Terminate
certificateRefs:
- kind: Secret
name: second-api-tls-certificate
namespace: system
allowedRoutes:
namespaces:
from: All
为网关创建 Helm Chart,以简化动态添加多个侦听器的过程。
编辑以下值
values.yaml
listeners:
- hostname: "first-api.dev"
tlsSecretName: "first-api-tls-certificate"
- hostname: "second-api.dev"
tlsSecretName: "second-api-tls-certificate"
模板/gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
annotations:
alb.networking.azure.io/alb-name: alb-test-spoke-2
alb.networking.azure.io/alb-namespace: system
name: alb-gw-tls
namespace: system
spec:
gatewayClassName: azure-alb-external
listeners:
{{- range .Values.listeners }}
- name: https-listener-{{ .hostname | replace "." "-" }}
port: 443
protocol: HTTPS
hostname: {{ .hostname }}
tls:
mode: Terminate
certificateRefs:
- name: {{ .tlsSecretName }}
kind: Secret
namespace: system
allowedRoutes:
namespaces:
from: All
{{- end }}
部署网关图表
helm install alb-gateway ./gateway-chart -n system
此命令将创建带有
first-api.dev
和
second-api.dev
监听器的网关。如果您将来需要添加其他侦听器,只需更新 values.yaml
对于每个应用程序,创建一个引用网关的单独的 HTTPRoute 资源。此设置允许您将流量路由到新应用程序,而无需修改网关配置。
apiVersion: gateway.networking.k8s.io/v1alpha2
kind: HTTPRoute
metadata:
name: first-api-route
namespace: app-namespace
spec:
parentRefs:
- name: alb-gw-tls
namespace: system
hostnames:
- "first-api.dev"
rules:
- matches:
- path:
type: Prefix
value: /
backendRefs:
- name: first-api-service
port: 80