使用ASM網(wǎng)關(guān)作為Ingress Controller暴露集群內(nèi)的服務(wù)
ASM支持在管理的集群中使用Ingress資源,并指定特定的ASM網(wǎng)關(guān)作為Ingress Controller。本文介紹如何在ACK中配置Ingress資源,使用ASM網(wǎng)關(guān)作為Ingress Controller暴露集群內(nèi)的服務(wù)。
前提條件
已添加ACK集群到ASM實例,且ASM實例版本為1.16及以上。具體操作,請參見添加集群到ASM實例。
已部署入口網(wǎng)關(guān)服務(wù),并暴露80和443端口。具體操作,請參見已部署入口網(wǎng)關(guān)服務(wù)。
已部署httpbin應(yīng)用(不需要暴露在網(wǎng)關(guān)上)。具體操作,請參見部署httpbin應(yīng)用。
使用限制
使用ASM網(wǎng)關(guān)作為Ingress Controller時,不支持在Ingress中配置defaultBackend字段。更多信息,請參見Ingress。
僅支持V1版本的Ingress API,使用前請確認數(shù)據(jù)面中的Ingress API版本為V1。
功能介紹
Ingress是Kubernetes的標準API對象,用于管理Kubernetes服務(wù)的外部訪問。您可以在Ingress中配置路由規(guī)則,將集群內(nèi)的HTTP或HTTPS服務(wù)暴露到集群外部。
ASM支持在管理的集群中使用Ingress資源,并指定特定的ASM網(wǎng)關(guān)作為Ingress Controller。ASM網(wǎng)關(guān)支持自動擴縮容、TLS硬件加速、網(wǎng)關(guān)優(yōu)雅下線等多項高級功能。當使用ASM網(wǎng)關(guān)作為Ingress Controller時,您可以使用服務(wù)網(wǎng)格提供的多種可觀測能力和安全能力。ASM網(wǎng)關(guān)還支持動態(tài)加載證書。TLS(Transport Layer Security)所需的私鑰、服務(wù)器證書以及根證書,都可以在網(wǎng)關(guān)不重啟的條件下動態(tài)配置。
步驟一:在目標網(wǎng)關(guān)上啟用Ingress
登錄ASM控制臺,在左側(cè)導航欄,選擇 。
在網(wǎng)格管理頁面,單擊目標實例名稱,然后在左側(cè)導航欄,選擇 。
在目標網(wǎng)關(guān)右側(cè)的高級功能區(qū)域,單擊啟用Ingress API訪問,然后在確認對話框,單擊確定。
步驟二:創(chuàng)建Ingress資源,并指定ASM網(wǎng)關(guān)為IngressController
Ingress不支持選擇網(wǎng)關(guān)監(jiān)聽的端口。HTTP協(xié)議默認會使用80端口,HTTPS協(xié)議默認使用443端口。因此,您的ASM網(wǎng)關(guān)需要開啟80和443端口的監(jiān)聽。
使用Annotations指定IngressController
使用以下內(nèi)容,創(chuàng)建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集群,執(zhí)行以下命令,指定ASM網(wǎng)關(guān)為IngressController。
kubectl apply -f ingress.yaml
使用IngressClass指定IngressController
使用以下內(nèi)容,創(chuàng)建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集群,執(zhí)行以下命令,指定ASM網(wǎng)關(guān)為IngressController。
kubectl apply -f ingress.yaml
步驟三:使用HTTP的方式訪問httpbin服務(wù)
使用以下命令,訪問httpbin服務(wù)。
curl -H 'host: httpbin.aliyun.com' http://${ASM網(wǎng)關(guān)IP地址}/status/418
預期輸出:
-=[ teapot ]=-
_...._
.' _ _ `.
| ."` ^ `". _,
\_;`"---"`|//
| ;/
\_ _/
預期輸出表明,使用Ingress在ASM網(wǎng)關(guān)上暴露httpbin應(yīng)用成功。
步驟四:設(shè)置TLS并使用HTTPS的方式訪問httpbin服務(wù)
ASM支持Ingress指定TLS設(shè)置。ASM網(wǎng)關(guān)運行在命名空間istio-system,因此Ingress中引用的Secret也必須存在于istio-system命名空間。
ASM網(wǎng)關(guān)作為Ingress資源控制器,支持動態(tài)加載證書。TLS(Transport Layer Security)所需的私鑰、服務(wù)器證書以及根證書,都可以在網(wǎng)關(guān)不重啟的條件下動態(tài)配置。同時,ASM網(wǎng)關(guān)也允許掛載多個Secret支持不同的證書加載,整個過程不需要網(wǎng)關(guān)Pod重啟。
下文以加載一個證書為例進行說明。如果需要支持多個證書,請參照下文步驟2和步驟3創(chuàng)建Secret完成自動加載。
準備服務(wù)器證書和私鑰。
使用域名時需要備案才能正常訪問。本示例使用aliyun.com生成證書和私鑰,并保存為Secret。
場景一:沒有針對aliyun.com可用的證書和私鑰
您可以通過openssl,執(zhí)行以下步驟來生成證書和密鑰。
執(zhí)行以下命令,創(chuàng)建根證書和私鑰。
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
執(zhí)行以下命令,為aliyun.com服務(wù)器生成證書和私鑰。
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
在入口網(wǎng)關(guān)Pod所在的集群對應(yīng)的KubeConfig環(huán)境下,執(zhí)行以下命令,在istio-system命名空間中創(chuàng)建包含證書和私鑰的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。
在入口網(wǎng)關(guān)Pod所在的集群對應(yīng)的KubeConfig環(huán)境下,執(zhí)行以下命令,在istio-system命名空間中創(chuàng)建包含證書和私鑰的Secret。
kubectl create -n istio-system secret tls myexample-credential --key=aliyun.com.key --cert=aliyun.com.crt
創(chuàng)建Ingress資源,并指定TLS引用的Secret為步驟1創(chuàng)建的myexample-credential。
使用以下內(nèi)容,創(chuàng)建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集群,執(zhí)行以下命令,部署Ingress資源。
kubectl apply -f ingress-https.yaml
執(zhí)行以下命令,使用HTTPS的方式訪問httpbin服務(wù)。
curl -H Host:httpbin.aliyun.com --resolve httpbin.aliyun.com:443:${ASM網(wǎng)關(guān)IP} https://httpbin.aliyun.com:443/status/418 -k
預期輸出:
-=[ teapot ]=- _...._ .' _ _ `. | ."` ^ `". _, \_;`"---"`|// | ;/ \_ _/
預期輸出表明,使用Ingress在ASM網(wǎng)關(guān)上暴露httpbin應(yīng)用成功。