你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

使用适用于容器的应用程序网关的后端 MTLS - 网关 API

本文档可帮助设置一个使用网关 API 中以下资源的示例应用程序。 下面是步骤:

  • 使用一个 HTTPS 侦听器创建网关资源。
  • 创建引用后端服务的 HTTPRoute 资源。
  • 创建 BackendTLSPolicy 资源,该资源具有 HTTPRoute 中引用的后端服务的客户端和 CA 证书。

背景

相互传输层安全性 (MTLS) 是一个依赖于证书来加密通信和标识服务客户端的过程。 这样,后端工作负载只需信任经过身份验证的设备的连接,才能进一步提高其安全态势。

请参见下图:

A diagram showing the Application Gateway for Containers backend MTLS process.

先决条件

  1. 如果遵循 BYO 部署策略,请确保设置适用于容器的应用程序网关资源和 ALB 控制器

  2. 如果遵循 ALB 托管部署策略,请确保预配 ALB 控制器,并通过 ApplicationLoadBalancer 自定义资源预配适用于容器的应用程序网关资源。

  3. 部署示例 HTTP 应用程序:

    在群集上应用以下 deployment.yaml 文件来创建示例 Web 应用程序并部署示例机密,以演示后端相互身份验证 (mTLS)。

    kubectl apply -f https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/refs/heads/main/articles/application-gateway/for-containers/examples/https-scenario/end-to-end-ssl-with-backend-mtls/deployment.yaml
    

    此命令在群集上创建以下内容:

    • 名为 test-infra 的命名空间
    • test-infra 命名空间中一个名为 mtls-app 的服务
    • test-infra 命名空间中一个名为 mtls-app 的部署
    • test-infra 命名空间中一个名为 mtls-app-nginx-cm 的 ConfigMap
    • test-infra 命名空间中四个分别名为 backend.comfrontend.comgateway-client-certca.bundle 的机密

部署所需的网关 API 资源

创建网关

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: gateway-01
  namespace: test-infra
  annotations:
    alb.networking.azure.io/alb-namespace: alb-test-infra
    alb.networking.azure.io/alb-name: alb-test
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - name: https-listener
    port: 443
    protocol: HTTPS
    allowedRoutes:
      namespaces:
        from: Same
    tls:
      mode: Terminate
      certificateRefs:
      - kind : Secret
        group: ""
        name: frontend.com
EOF

注意

当 ALB 控制器在 ARM 中创建适用于容器的应用程序网关时,它将对前端资源使用以下命名约定:fe-<8 个随机生成的字符>

如果要更改在 Azure 中创建的前端的名称,请考虑按照创建自己的部署策略中的说明进行操作。

创建网关资源后,请确保状态有效,侦听器已编程,并地址已分配给网关。

kubectl get gateway gateway-01 -n test-infra -o yaml

成功创建了网关时的示例输出:

status:
  addresses:
  - type: IPAddress
    value: xxxx.yyyy.alb.azure.com
  conditions:
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Valid Gateway
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted
  - lastTransitionTime: "2023-06-19T21:04:55Z"
    message: Application Gateway For Containers resource has been successfully updated.
    observedGeneration: 1
    reason: Programmed
    status: "True"
    type: Programmed
  listeners:
  - attachedRoutes: 0
    conditions:
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Listener is accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T21:04:55Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    name: https-listener
    supportedKinds:
    - group: gateway.networking.k8s.io
      kind: HTTPRoute

创建网关后,请创建 HTTPRoute 资源。

kubectl apply -f - <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: https-route
  namespace: test-infra
spec:
  parentRefs:
  - name: gateway-01
  rules:
  - backendRefs:
    - name: mtls-app
      port: 443
EOF

创建 HTTPRoute 资源后,请确保路由被接受,并且适用于容器的应用程序网关已编程

kubectl get httproute https-route -n test-infra -o yaml

验证是否已成功更新适用于容器的应用程序网关资源的状态。

status:
  parents:
  - conditions:
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: ""
      observedGeneration: 1
      reason: ResolvedRefs
      status: "True"
      type: ResolvedRefs
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Route is Accepted
      observedGeneration: 1
      reason: Accepted
      status: "True"
      type: Accepted
    - lastTransitionTime: "2023-06-19T22:18:23Z"
      message: Application Gateway For Containers resource has been successfully updated.
      observedGeneration: 1
      reason: Programmed
      status: "True"
      type: Programmed
    controllerName: alb.networking.azure.io/alb-controller
    parentRef:
      group: gateway.networking.k8s.io
      kind: Gateway
      name: gateway-01
      namespace: test-infra

创建 BackendTLSPolicy

kubectl apply -f - <<EOF
apiVersion: alb.networking.azure.io/v1
kind: BackendTLSPolicy
metadata:
  name: mtls-app-tls-policy
  namespace: test-infra
spec:
  targetRef:
    group: ""
    kind: Service
    name: mtls-app
    namespace: test-infra
  default:
    sni: backend.com
    ports:
    - port: 443
    clientCertificateRef:
      name: gateway-client-cert
      group: ""
      kind: Secret
    verify:
      caCertificateRef:
        name: ca.bundle
        group: ""
        kind: Secret
      subjectAltName: backend.com
EOF

创建 BackendTLSPolicy 对象后,请检查对象的状态以确保策略有效:

kubectl get backendtlspolicy -n test-infra mtls-app-tls-policy -o yaml

创建有效 BackendTLSPolicy 对象的示例输出:

status:
  conditions:
  - lastTransitionTime: "2023-06-29T16:54:42Z"
    message: Valid BackendTLSPolicy
    observedGeneration: 1
    reason: Accepted
    status: "True"
    type: Accepted

测试对应用程序的访问

现在,我们已准备好通过分配给前端的 FQDN 将一些流量发送到示例应用程序。 使用以下命令获取 FQDN:

fqdn=$(kubectl get gateway gateway-01 -n test-infra -o jsonpath='{.status.addresses[0].value}')

运行此 FQDN 应根据 HTTPRoute 上的配置从后端返回响应。

curl --insecure https://$fqdn/

恭喜,你已安装 ALB 控制器,部署了后端应用程序,并通过适用于容器的应用程序网关上的入口将流量路由到应用程序。