cert-manager是一個證書生命周期管理系統,支持證書的申請、部署等功能。您可以使用cert-manager頒發ASM網關的證書,從而可以使用HTTPS協議通過ASM網關訪問服務,保證數據傳輸的安全。本文介紹如何使用cert-manager管理網關的證書。
背景信息
cert-manager支持簽發自簽名證書和DNS域名證書,從而可以使用HTTPS協議通過ASM網關訪問服務。這兩種證書的區別如下:
自簽名證書:自簽名證書僅具有加密功能,無身份驗證功能。您可以在命令行工具中使用HTTPS協議訪問ASM網關,但是自簽名證書不受Web瀏覽器的信任,Web瀏覽器檢查HTTPS連接會標記為潛在風險并彈出錯誤消息,即無法在Web瀏覽器中使用HTTPS協議通過ASM網關訪問服務。
DNS域名證書:DNS域名證書由受信任的CA機構頒發,兼具加密和身份驗證功能。相比自簽名證書,DNS域名證書具有更高的安全性,受到Web瀏覽器的信任。您可以同時在命令行工具和Web瀏覽器中使用HTTPS協議通過ASM網關訪問服務。
若您在ASM數據面集群中使用cert-manager時報錯,可以加入釘群(釘群號:30421250)進行咨詢。
前提條件
在集群中安裝cert-manager
在本地安裝Helm。具體操作,請參見Helm。
使用kubectl連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
執行以下命令,創建cert-manager命名空間。
kubectl create namespace cert-manager
執行以下命令,添加cert-manager Chart。
helm repo add jetstack https://charts.jetstack.io
執行以下命令,獲取cert-manager Chart的最新信息。
helm repo update
執行以下命令,安裝cert-manager。
說明cert-manager的版本需要和Kubernetes版本保持兼容。關于cert-manager和Kubernetes版本的對應關系,請參見Supported Releases。
helm install \ cert-manager jetstack/cert-manager \ --namespace cert-manager \ --version v1.14 \ --set installCRDs=true
使用cert-manager簽發自簽名證書
步驟一:在集群中生成自簽證書
使用以下內容,創建issuer.yaml。
apiVersion: cert-manager.io/v1 kind: Issuer metadata: name: selfsigned spec: selfSigned: {} --- apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: istio-ingressgateway-certs spec: isCA: true duration: 2160h # 90d secretName: istio-ingressgateway-certs commonName: istio-ingressgateway-certs subject: organizations: - cluster.local - cert-manager issuerRef: name: selfsigned kind: Issuer group: cert-manager.io
執行以下命令,創建自簽名CA來頒發工作負載證書。
kubectl apply -f issuer.yaml -n istio-system
執行以下命令,查看證書。
kubectl get secret -n istio-system
預期輸出:
NAME TYPE DATA AGE istio-ingressgateway-certs kubernetes.io/tls 3 68m
步驟二:驗證使用HTTPS協議訪問服務是否成功
部署httpbin應用。具體操作,請參見部署httpbin應用。
修改httpbin應用對應的網關規則。
您可以使用ASM的KubeConfig在命令行進行操作,或者登錄ASM控制臺,在網關規則頁面修改YAML。具體操作,請參見管理網關規則。
修改后的YAML示例如下。在443端口增加了HTTPS協議的監聽,并且使用了cert-manager創建的證書。
apiVersion: networking.istio.io/v1beta1 kind: Gateway metadata: name: httpbin namespace: default spec: selector: istio: ingressgateway servers: - hosts: - '*' port: name: test number: 80 protocol: HTTP - hosts: - '*' port: name: https number: 443 protocol: HTTPS tls: credentialName: istio-ingressgateway-certs mode: SIMPLE
執行以下命令,在集群中獲取入口網關的IP地址。
kubectl get svc -n istio-system -l istio=ingressgateway
執行以下命令,通過HTTPS協議訪問httpbin應用。
curl -k --resolve istio-ingressgateway-certs:443:${ASM網關IP} https://istio-ingressgateway-certs/status/418 -I
訪問成功后,您可以看到返回了418狀態碼。此處訪問ASM網關使用的域名是
istio-ingressgateway-certs
,這是因為之前創建Certificate時,使用的commonName
為istio-ingressgateway-certs
。