ASM支持在管理的集群中使用Ingress资源,并指定特定的ASM网关作为Ingress Controller。本文介绍如何在ACK中配置Ingress资源,使用ASM网关作为Ingress Controller暴露集群内的服务。
前提条件
已添加ACK集群到ASM实例,且ASM实例版本为1.16及以上。具体操作,请参见添加集群到ASM实例。
已部署入口网关服务,并暴露80和443端口。具体操作,请参见已部署入口网关服务。
已部署httpbin应用(不需要暴露在网关上)。具体操作,请参见部署httpbin应用。
使用限制
使用ASM网关作为Ingress Controller时,不支持在Ingress中配置defaultBackend字段。更多信息,请参见Ingress。
仅支持V1版本的Ingress API,使用前请确认数据面中的Ingress API版本为V1。
功能介绍
Ingress是Kubernetes的标准API对象,用于管理Kubernetes服务的外部访问。您可以在Ingress中配置路由规则,将集群内的HTTP或HTTPS服务暴露到集群外部。
ASM支持在管理的集群中使用Ingress资源,并指定特定的ASM网关作为Ingress Controller。ASM网关支持自动扩缩容、TLS硬件加速、网关优雅下线等多项高级功能。当使用ASM网关作为Ingress Controller时,您可以使用服务网格提供的多种可观测能力和安全能力。ASM网关还支持动态加载证书。TLS(Transport Layer Security)所需的私钥、服务器证书以及根证书,都可以在网关不重启的条件下动态配置。
步骤一:在目标网关上启用Ingress
登录ASM控制台,在左侧导航栏,选择 。
在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择 。
在目标网关右侧的高级功能区域,单击启用Ingress API访问,然后在确认对话框,单击确定。
步骤二:创建Ingress资源,并指定ASM网关为IngressController
Ingress不支持选择网关监听的端口。HTTP协议默认会使用80端口,HTTPS协议默认使用443端口。因此,您的ASM网关需要开启80和443端口的监听。
使用Annotations指定IngressController
使用以下内容,创建ingress.yaml。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: kubernetes.io/ingress.class: istio name: ingress spec: rules: - host: httpbin.aliyun.com http: paths: - path: /status pathType: Prefix backend: service: name: httpbin port: number: 8000
使用kubectl连接到ACK集群,执行以下命令,指定ASM网关为IngressController。
kubectl apply -f ingress.yaml
使用IngressClass指定IngressController
使用以下内容,创建ingress.yaml。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress spec: ingressClassName: istio rules: - host: httpbin.aliyun.com http: paths: - path: / pathType: Prefix backend: service: name: httpbin port: number: 8000
使用kubectl连接到ACK集群,执行以下命令,指定ASM网关为IngressController。
kubectl apply -f ingress.yaml
步骤三:使用HTTP的方式访问httpbin服务
使用以下命令,访问httpbin服务。
curl -H 'host: httpbin.aliyun.com' http://${ASM网关IP地址}/status/418
预期输出:
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
预期输出表明,使用Ingress在ASM网关上暴露httpbin应用成功。
步骤四:设置TLS并使用HTTPS的方式访问httpbin服务
ASM支持Ingress指定TLS设置。ASM网关运行在命名空间istio-system,因此Ingress中引用的Secret也必须存在于istio-system命名空间。
ASM网关作为Ingress资源控制器,支持动态加载证书。TLS(Transport Layer Security)所需的私钥、服务器证书以及根证书,都可以在网关不重启的条件下动态配置。同时,ASM网关也允许挂载多个Secret支持不同的证书加载,整个过程不需要网关Pod重启。
下文以加载一个证书为例进行说明。如果需要支持多个证书,请参照下文步骤2和步骤3创建Secret完成自动加载。
准备服务器证书和私钥。
使用域名时需要备案才能正常访问。本示例使用aliyun.com生成证书和私钥,并保存为Secret。
场景一:没有针对aliyun.com可用的证书和私钥
您可以通过openssl,执行以下步骤来生成证书和密钥。
执行以下命令,创建根证书和私钥。
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=myexample Inc./CN=aliyun.com' -keyout aliyun.root.key -out aliyun.root.crt
执行以下命令,为aliyun.com服务器生成证书和私钥。
openssl req -out aliyun.com.csr -newkey rsa:2048 -nodes -keyout aliyun.com.key -subj "/CN=aliyun.com/O=myexample organization" openssl x509 -req -days 365 -CA aliyun.root.crt -CAkey aliyun.root.key -set_serial 0 -in aliyun.com.csr -out aliyun.com.crt
在入口网关Pod所在的集群对应的KubeConfig环境下,执行以下命令,在istio-system命名空间中创建包含证书和私钥的Secret。
kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt
场景二:已有针对aliyun.com可用的证书和私钥
将证书命名为aliyun.com.crt,私钥命名为aliyun.com.key。
在入口网关Pod所在的集群对应的KubeConfig环境下,执行以下命令,在istio-system命名空间中创建包含证书和私钥的Secret。
kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt
创建Ingress资源,并指定TLS引用的Secret为步骤1创建的myexample-credential。
使用以下内容,创建ingress-https.yaml。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress annotations: kubernetes.io/ingress.class: istio spec: rules: - host: httpbin.aliyun.com http: paths: - backend: service: name: httpbin port: number: 8000 path: /status pathType: Prefix tls: - hosts: - httpbin.aliyun.com secretName: myexample-credential
使用kubectl连接到ACK集群,执行以下命令,部署Ingress资源。
kubectl apply -f ingress-https.yaml
执行以下命令,使用HTTPS的方式访问httpbin服务。
curl -H Host:httpbin.aliyun.com --resolve httpbin.aliyun.com:443:${ASM网关IP} https://httpbin.aliyun.com:443/status/418 -k
预期输出:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/
预期输出表明,使用Ingress在ASM网关上暴露httpbin应用成功。