使用应用程序网关通过 HTTP 或 HTTPS 公开 AKS 服务

本文演示了如何使用 Kubernetes 入口资源通过 Azure 应用程序网关经 HTTP 或 HTTPS 公开示例 Azure Kubernetes 服务 (AKS) 服务。

先决条件

  • 已安装的 ingress-azure Helm 图表:
    • 绿地部署:如果你是从头开始,请参阅这些安装说明,其中概述了使用应用程序网关部署 AKS 群集以及在 AKS 群集上安装应用程序网关入口控制器 (AGIC) 的步骤。
    • 棕地部署:如果你有现有的 AKS 群集和应用程序网关部署,请参阅这些说明,了解如何在 AKS 群集上安装 AGIC。
  • 一个 x509 证书及其私钥(如果要在此应用程序上使用 HTTPS)。

部署留言簿应用程序

guestbook 应用程序是一个规范的 Kubernetes 应用程序,由 Web UI 前端、后端和 Redis 数据库组成。

默认情况下,guestbook 在端口 80 上通过名为 frontend 的服务公开其应用程序。 在没有 Kubernetes 入口资源的情况下,该服务不能从 AKS 群集外部访问。 你使用此应用程序并设置入口资源,以便通过 HTTP 和 HTTPS 来访问此应用程序。

若要部署 guestbook 应用程序,请执行以下操作:

  1. 此 GitHub 页面下载 guestbook-all-in-one.yaml

  2. 通过运行以下命令将 guestbook-all-in-one.yaml 部署到 AKS 群集中:

    kubectl apply -f guestbook-all-in-one.yaml
    

通过 HTTP 公开服务

若要公开 guestbook 应用程序,请使用以下入口资源:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: guestbook
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
  - http:
      paths:
      - backend:
          serviceName: frontend
          servicePort: 80

此入口会将 guestbook-all-in-one 部署的 frontend 服务公开为应用程序网关部署的默认后端。

请将以上入口资源另存为 ing-guestbook.yaml

  1. 通过运行以下命令来部署 ing-guestbook.yaml

    kubectl apply -f ing-guestbook.yaml
    
  2. 检查入口控制器的日志以了解部署状态。

guestbook 应用程序现在应该可用。 可以通过访问应用程序网关部署的公共地址来检查可用性。

通过 HTTPS 公开服务

没有指定的主机名

如果你未指定主机名,则 guestbook 服务在指向应用程序网关部署的所有主机名上可用。

  1. 在部署入口资源之前,请创建一个 Kubernetes 机密来托管证书和私钥:

    kubectl create secret tls <guestbook-secret-name> --key <path-to-key> --cert <path-to-cert>
    
  2. 定义以下入口资源。 在 secretName 部分中,将 <guestbook-secret-name> 替换为你的机密的名称。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: guestbook
      annotations:
        kubernetes.io/ingress.class: azure/application-gateway
    spec:
      tls:
        - secretName: <guestbook-secret-name>
      rules:
      - http:
          paths:
          - backend:
              serviceName: frontend
              servicePort: 80
    
  3. 将入口资源存储在名为 ing-guestbook-tls.yaml 的文件中。

  4. 通过运行以下命令来部署 ing-guestbook-tls.yaml

    kubectl apply -f ing-guestbook-tls.yaml
    
  5. 检查入口控制器的日志以了解部署状态。

现在,guestbook 应用程序在 HTTP 和 HTTPS 上均可用。

具有指定的主机名

你还可以在入口资源上指定主机名,以便将 TLS 配置和服务多路复用。 指定了主机名时,guestbook 服务仅在指定的主机上可用。

  1. 定义以下入口资源。 在 secretName 部分中,将 <guestbook-secret-name> 替换为你的机密的名称。 在 hostshost 部分中,将 <guestbook.contoso.com> 替换为你的主机名。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: guestbook
      annotations:
        kubernetes.io/ingress.class: azure/application-gateway
    spec:
      tls:
        - hosts:
          - <guestbook.contoso.com>
          secretName: <guestbook-secret-name>
      rules:
      - host: <guestbook.contoso.com>
        http:
          paths:
          - backend:
              serviceName: frontend
              servicePort: 80
    
  2. 通过运行以下命令来部署 ing-guestbook-tls-sni.yaml

    kubectl apply -f ing-guestbook-tls-sni.yaml
    
  3. 检查入口控制器的日志以了解部署状态。

现在,guestbook 应用程序在 HTTP 和 HTTPS 上均可用,但仅限于指定的主机。

与其他服务集成

使用以下入口资源添加路径并将这些路径重定向到其他服务:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: guestbook
  annotations:
    kubernetes.io/ingress.class: azure/application-gateway
spec:
  rules:
  - http:
      paths:
      - path: </other/*>
        backend:
          serviceName: <other-service>
          servicePort: 80
       - backend:
          serviceName: frontend
          servicePort: 80