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應用成功。