具有应用程序路由加载项的托管 NGINX Ingress
本文内容
将超文本传输协议 (HTTP) 和安全 (HTTPS) 流量路由到在 Azure Kubernetes 服务 (AKS) 群集上运行的应用程序的一种方法是使用 Kubernetes Ingress 对象 。 创建使用应用程序路由加载项 的 NGINX Ingress 类的 Ingress 对象时,加载项会在 AKS 群集中创建、配置和管理一个或多个 Ingress 控制器。
本文介绍如何在 AKS 群集中部署和配置基本 Ingress 控制器。
具有 NGINX 功能的应用程序路由加载项
具有 NGINX 的应用程序路由加载项提供以下优势:
有关其他配置,请参阅:
随着云原生计算基础 (CNCF) 停用 Open Service Mesh (OSM),不建议将应用程序路由附加产品与 OSM 一起使用。
先决条件
Azure 订阅。 如果你没有 Azure 订阅,可以创建一个试用版订阅 。
安装并配置了 Azure CLI 2.54.0 或更高版本。 运行 az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI 。
限制
应用程序路由附加产品最多支持五个 Azure DNS 区域。
应用程序路由加载项只能在具有托管标识 的 AKS 群集上启用。
与附加产品集成的所有全局 Azure DNS 区域都必须位于同一资源组中。
与附加产品集成的所有专用 Azure DNS 区域都必须位于同一资源组中。
不支持编辑 app-routing-system
命名空间中的 ingress-nginx ConfigMap
。
以下代码片段注释被阻止,并将阻止配置流入量:load_module
、lua_package
、_by_lua
、location
、root
、proxy_pass
、serviceaccount
、{
、}
、'
。
使用 Azure CLI 启用应用程序路由
在新群集上启用
若要在新群集上启用应用程序路由,请使用 az aks create
命令,并指定 --enable-app-routing
标志。
az aks create \
--resource-group <ResourceGroupName> \
--name <ClusterName> \
--location <Location> \
--enable-app-routing \
--generate-ssh-keys
在现有群集上启用
若要在现有群集上启用应用程序路由,请使用 az aks approuting enable
命令。
az aks approuting enable --resource-group <ResourceGroupName> --name <ClusterName>
注意
Open Service Mesh (OSM) 已由 NCF 停用。 不建议使用与 OSM 集成的应用程序路由附加产品创建 Ingress,并且该功能将停用。
支持此配置需要以下附加产品:
open-service-mesh :如果需要在 NGINX Ingress 与服务之间加密群集内流量(推荐),需要安装提供相互 TLS (mTLS) 的 Open Service Mesh 附加产品。
在新群集上启用
通过在 open-service-mesh
加载项中使用 az aks create
命令并指定 --enable-app-routing
标志以及 --enable-addons
参数,在新 AKS 群集上启用应用程序路由:
az aks create \
--resource-group <ResourceGroupName> \
--name <ClusterName> \
--location <Location> \
--enable-app-routing \
--enable-addons open-service-mesh \
--generate-ssh-keys
在现有群集上启用
若要在现有群集上启用应用程序路由,请使用 az aks approuting enable
命令和 az aks enable-addons
命令,并将 --addons
参数设置为 open-service-mesh
:
az aks approuting enable --resource-group <ResourceGroupName> --name <ClusterName>
az aks enable-addons --resource-group <ResourceGroupName> --name <ClusterName> --addons open-service-mesh
注意
若要将该加载项与 Open Service Mesh 配合使用,应安装 osm
命令行工具。 此命令行工具包含配置和管理 Open Service Mesh 所需的一切。 最新二进制文件在 OSM GitHub 版本页面 上提供。
在新群集上启用
若要在新群集上启用应用程序路由,请使用 az aks create
命令,并指定 --enable-app-routing
标志。
az aks create \
--resource-group <ResourceGroupName> \
--name <ClusterName> \
--location <Location> \
--enable-app-routing \
--generate-ssh-keys
在现有群集上启用
若要在现有群集上启用应用程序路由,请使用 az aks approuting enable
命令:
az aks approuting enable --resource-group <ResourceGroupName> --name <ClusterName>
连接到 AKS 群集
若要从本地计算机连接到 Kubernetes 群集,请使用 kubectl (Kubernetes 命令行客户端)。 可以使用 az aks install-cli
命令在本地进行安装。 如果使用的是 Azure Cloud Shell,则 kubectl
已安装。
使用 az aks get-credentials 命令将 kubectl
配置为连接到你的 Kubernetes 群集。
az aks get-credentials --resource-group <ResourceGroupName> --name <ClusterName>
部署应用程序
应用程序路由附加产品使用 Kubernetes Ingress 对象的注释来创建适当的资源。
创建名为 hello-web-app-routing
的应用程序命名空间,以使用 kubectl create namespace
命令运行示例 Pod。
kubectl create namespace hello-web-app-routing
通过将以下 YAML 清单复制到名为 deployment.yaml 的新文件中来创建部署,并将该文件保存到本地计算机。
apiVersion: apps/v1
kind: Deployment
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
spec:
replicas: 1
selector:
matchLabels:
app: aks-helloworld
template:
metadata:
labels:
app: aks-helloworld
spec:
containers:
- name: aks-helloworld
image: mcr.azk8s.cn/azuredocs/aks-helloworld:v1
ports:
- containerPort: 80
env:
- name: TITLE
value: "Welcome to Azure Kubernetes Service (AKS)"
通过将以下 YAML 清单复制到名为 service.yaml 的新文件中来创建服务,并将该文件保存到本地计算机。
apiVersion: v1
kind: Service
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
spec:
type: ClusterIP
ports:
- port: 80
selector:
app: aks-helloworld
创建 Ingress 对象
应用程序路由附加产品在名为 webapprouting.kubernetes.azure.com 的群集上创建一个 Ingress 类。 使用此类创建 Ingress 对象时,会激活附加产品。
将以下 YAML 清单复制到名为 ingress.yaml 的新文件中,并将该文件保存到本地计算机。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
spec:
ingressClassName: webapprouting.kubernetes.azure.com
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
使用 kubectl apply
命令创建群集资源。
kubectl apply -f deployment.yaml -n hello-web-app-routing
以下示例输出显示了创建的资源:
deployment.apps/aks-helloworld created
kubectl apply -f service.yaml -n hello-web-app-routing
以下示例输出显示了创建的资源:
service/aks-helloworld created
kubectl apply -f ingress.yaml -n hello-web-app-routing
以下示例输出显示了创建的资源:
ingress.networking.k8s.io/aks-helloworld created
创建名为 hello-web-app-routing
的命名空间,以使用 kubectl create namespace
命令运行示例 Pod。
kubectl create namespace hello-web-app-routing
使用 osm namespace add
命令将应用程序命名空间添加到 OSM 控制平面。
osm namespace add hello-web-app-routing
通过将以下 YAML 清单复制到名为 deployment.yaml 的新文件中来创建部署,并将该文件保存到本地计算机。
apiVersion: apps/v1
kind: Deployment
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
spec:
replicas: 1
selector:
matchLabels:
app: aks-helloworld
template:
metadata:
labels:
app: aks-helloworld
spec:
containers:
- name: aks-helloworld
image: mcr.azk8s.cn/azuredocs/aks-helloworld:v1
ports:
- containerPort: 80
env:
- name: TITLE
value: "Welcome to Azure Kubernetes Service (AKS)"
通过将以下 YAML 清单复制到名为 service.yaml 的新文件中来创建服务,并将该文件保存到本地计算机。
apiVersion: v1
kind: Service
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
spec:
type: ClusterIP
ports:
- port: 80
selector:
app: aks-helloworld
创建 Ingress 对象
应用程序路由附加产品在名为 webapprouting.kubernetes.azure.com 的群集上创建一个 Ingress 类。 使用此类创建 Ingress 对象时,会激活附加产品。 Ingress 对象上的 kubernetes.azure.com/use-osm-mtls: "true"
注释会创建一个 Open Service Mesh (OSM) IngressBackend ,用于配置后端服务以接受来自信任源的 Ingress 流量。
将以下 YAML 清单复制到名为 ingress.yaml 的新文件中,并将该文件保存到本地计算机。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
kubernetes.azure.com/use-osm-mtls: "true"
nginx.ingress.kubernetes.io/backend-protocol: HTTPS
nginx.ingress.kubernetes.io/configuration-snippet: |2-
proxy_ssl_name "default.hello-web-app-routing.cluster.local";
nginx.ingress.kubernetes.io/proxy-ssl-secret: kube-system/osm-ingress-client-cert
nginx.ingress.kubernetes.io/proxy-ssl-verify: "on"
name: aks-helloworld
namespace: hello-web-app-routing
spec:
ingressClassName: webapprouting.kubernetes.azure.com
rules:
- host: <Hostname>
http:
paths:
- backend:
service:
name: aks-helloworld
port:
number: 80
path: /
pathType: Prefix
使用 kubectl apply
命令创建群集资源。
kubectl apply -f deployment.yaml -n hello-web-app-routing
以下示例输出显示了创建的资源:
deployment.apps/aks-helloworld created
kubectl apply -f service.yaml -n hello-web-app-routing
以下示例输出显示了创建的资源:
service/aks-helloworld created
kubectl apply -f ingress.yaml -n hello-web-app-routing
以下示例输出显示了创建的资源:
ingress.networking.k8s.io/aks-helloworld created
创建应用程序命名空间
创建名为 hello-web-app-routing
的命名空间,以使用 kubectl create namespace
命令运行示例 Pod。
kubectl create namespace hello-web-app-routing
使用 osm namespace add
命令将应用程序命名空间添加到 OSM 控制平面。
osm namespace add hello-web-app-routing
通过将以下 YAML 清单复制到名为 deployment.yaml 的新文件中来创建部署,并将该文件保存到本地计算机。
apiVersion: apps/v1
kind: Deployment
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
spec:
replicas: 1
selector:
matchLabels:
app: aks-helloworld
template:
metadata:
labels:
app: aks-helloworld
spec:
containers:
- name: aks-helloworld
image: mcr.azk8s.cn/azuredocs/aks-helloworld:v1
ports:
- containerPort: 80
env:
- name: TITLE
value: "Welcome to Azure Kubernetes Service (AKS)"
通过将以下 YAML 清单复制到名为 service.yaml 的新文件中来创建服务,并将该文件保存到本地计算机。
apiVersion: v1
kind: Service
metadata:
name: aks-helloworld
namespace: hello-web-app-routing
spec:
type: ClusterIP
ports:
- port: 80
selector:
app: aks-helloworld
使用 kubectl apply
命令创建群集资源。
kubectl apply -f deployment.yaml -n hello-web-app-routing
以下示例输出显示了创建的资源:
deployment.apps/aks-helloworld created
kubectl apply -f service.yaml -n hello-web-app-routing
以下示例输出显示了创建的资源:
service/aks-helloworld created
验证是否已创建托管 Ingress
可以使用 kubectl get ingress
命令验证是否已创建托管 Ingress。
kubectl get ingress -n hello-web-app-routing
以下示例输出显示了创建的托管 Ingress:
NAME CLASS HOSTS ADDRESS PORTS AGE
aks-helloworld webapprouting.kubernetes.azure.com myapp.contoso.com 20.51.92.19 80, 443 4m
删除应用程序路由加载项
若要删除关联的命名空间,请使用 kubectl delete namespace
命令。
kubectl delete namespace hello-web-app-routing
若要从群集中删除应用程序路由附加产品,请使用 az aks approuting disable
命令。
az aks approuting disable --name myAKSCluster --resource-group myResourceGroup
注意
为了避免当应用程序路由加载项被禁用时可能会中断流向群集的流量,某些 Kubernetes 资源(包括 configMaps、机密以及运行控制器的部署)将保留在群集上。 这些资源位于 app-routing-system 命名空间中。 如果不再需要这些资源,则可以通过使用 kubectl delete ns app-routing-system
删除该命名空间来删除这些资源。
后续步骤