使用HTTPS協議的監聽時,您需要配置SSL/TLS認證以確保監聽與用戶端的加密串連。本文介紹ALB Ingress支援的多種配置認證的方法。
認證配置方式對比
ALB Ingress支援三種配置認證的方式:自動探索認證、Secret認證和AlbConfig指定認證。三種配置方式的對比如下。
對比項 | 自動探索認證 | AlbConfig指定認證 | Secret認證 |
憑證存放區方式 | 阿里雲數位憑證中心。 | 叢集內的Secret資源。 | |
認證發現方式 | 使用網域名稱匹配自動探索。 | 通過數位憑證中心產生的認證ID發現。 | 指定叢集的內的Secret資摘要搜索。 |
適用情境 | 適用於已在阿里雲數位憑證中心已購買認證或上傳認證的情境。 | 適用於需要在叢集內部管理憑證的情境,例如使用cert-manager類的管理工具時。 | |
跨命名空間使用 | 支援。 | 不支援,僅支援在Secret資源所處的命名空間使用。 | |
更新認證方式 | 在數位憑證管理服務控制台上傳新認證或續約認證後,更新Ingress資源。 | 更新Secret資源的內容。 |
單個ALB執行個體支援的認證上限為25個。通常情況下,單個ALB執行個體所使用的認證數量等於此ALB執行個體所有監聽的認證數量之和(包括關聯在Ingress資源上的認證)。具體的計算方法,請參見ALB配額計算方式。
認證管理方式相容性說明
如果同時使用了多種認證配置方式,認證的管理方式和相容性如下所示。
認證配置情況 | 說明 |
在Ingress中同時使用了自動探索認證和Secret認證。 |
|
同時使用了自動探索認證和AlbConfig指定認證,並且它們關聯的Listener相同。 | 如果在AlbConfig中指定了認證,則此Listener不會使用自動探索認證。 |
同時使用了Secret認證和AlbConfig指定認證,並且它們關聯的Listener相同。 | AlbConfig指定認證和Secret認證是可以完全相容的,並且可以同時使用。 |
前提條件
已建立AlbConfig資源,並在AlbConfig中建立HTTPS監聽。具體操作,請參見ALB Ingress快速入門。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
已擷取到可信的數位憑證。您可以從以下幾個途徑擷取數位憑證:
(可選)步驟一:產生自我簽署憑證
如果還未擷取認證,執行以下命令可以通過OpenSSL建立自我簽署憑證。
由於缺乏可靠的CA認證,自我簽署憑證在瀏覽器和用戶端中預設不受信任,通常會導致客戶訪問時收到安全警告。本文中產生的自我簽署憑證僅作為樣本,請勿在生產環境中使用。
openssl genrsa -out albtop-key.pem 4096
openssl req -subj "/CN=demo.alb.ingress.top" -sha256 -new -key albtop-key.pem -out albtop.csr # demo.alb.ingress.top可替換為您的網域名稱
echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf # demo.alb.ingress.top可替換為您的網域名稱
openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
命令中的demo.alb.ingress.top
是產生的自我簽署憑證所關聯的網域名稱。如果您已擁有自己的網域名稱,請進行替換。
步驟二:建立樣本資源
除了AlbConfig外,ALB Ingress還需要Deployment、Service、IngressClass、Ingress這4種資源才能正常工作,您可以使用以下的樣本快速建立這4種資源。
建立https-quickstart.yaml檔案,並將以下內容拷貝到該檔案中並儲存。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: https-ingressclass spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb # 修改為AlbConfig資源的名稱 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: https-ingress spec: ingressClassName: https-ingressclass rules: - host: demo.alb.ingress.top # demo.alb.ingress.top替換為認證關聯的網域名稱 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix --- apiVersion: apps/v1 kind: Deployment metadata: name: https-deploy spec: replicas: 1 selector: matchLabels: app: https-deploy template: metadata: labels: app: https-deploy spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/acs-sample/old-nginx:latest imagePullPolicy: IfNotPresent name: https-deploy ports: - containerPort: 80 protocol: TCP --- apiVersion: v1 kind: Service metadata: name: https-svc spec: ports: - name: port1 port: 443 protocol: TCP targetPort: 80 selector: app: https-deploy sessionAffinity: None type: ClusterIP
(可選)如果在AlbConfig中同時配置了使用HTTP協議的監聽與使用HTTPS協議的監聽,請在Ingress中添加
annotations
欄位,以保證Ingress同時適用於多個監聽,修改內容如下:執行以下命令建立。
kubectl apply -f https-quickstart.yaml
步驟三:配置認證
使用自動探索認證
在將認證上傳到阿里雲數位憑證中心後,您可以通過在Ingress中的tls
欄位裡填入認證關聯的網域名稱,使ALB Ingress自動探索並使用已上傳的認證。
將自我簽署憑證上傳至阿里雲數位憑證中心。具體操作,請參見上傳和共用SSL認證。
更新Ingress配置。
執行以下命令編輯Ingress。
kubectl edit ingress https-ingress
添加
tls
欄位,填入認證關聯的網域名稱。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: https-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.alb.ingress.top http: #... tls: - hosts: - demo.alb.ingress.top # 需要和“rules: host“欄位中的網域名稱保持一致,同時是認證關聯的網域名稱
使用Secret認證
您可以將認證儲存在叢集的Secret資源中,並在Ingress中使用。
執行以下命令,使用Base64對認證和私密金鑰編碼。
echo -n `cat albtop-key.pem` | base64 # albtop-key.pem替換為私密金鑰檔案
echo -n `cat albtop-cert.pem` | base64 # albtop-cert.pem替換為認證檔案
建立Secret。
建立https-secret.yaml,程式碼範例如下。
apiVersion: v1 kind: Secret metadata: name: https-secret type: kubernetes.io/tls data: tls.key: | {base64 albtop-key.pem} # Base64編碼後的albtop-cert.pem。 tls.crt: | {base64 albtop-cert.pem} # Base64編碼後的albtop-key.pem。
執行以下命令,建立Secret。
kubectl apply -f https-secret.yaml
更新Ingress配置。
執行以下命令編輯Ingress。
kubectl edit ingress https-ingress
添加
tls
欄位,填入認證關聯的網域名稱,以及secret資源的名稱。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: https-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.alb.ingress.top http: #... tls: - hosts: - demo.alb.ingress.top # 需要和“rules: host“欄位中的網域名稱保持一致,同時是認證關聯的網域名稱 secretName: https-secret
使用AlbConfig指定認證
在將認證上傳到阿里雲數位憑證中心後,您可以在AlbConfig中的監聽的CertificateId
欄位填入認證的ID,為監聽關聯已上傳的認證。
如果監聽配置了認證,那麼此監聽下的Ingress不會再使用自動探索認證。
上傳自我簽署憑證至阿里雲數位憑證中心。具體操作,請參見上傳和共用SSL認證。
擷取認證ID。
登入數位憑證管理服務控制台。。
在左側導覽列,選擇。
在SSL認證頁面,單擊上傳認證頁簽,在目標認證操作列下選擇
。在認證詳情面板中擷取CertIdentifier。
關聯認證至AlbConfig。
執行以下命令編輯AlbConfig。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替換AlbConfig的名稱
在監聽中添加
certificates
欄位,填入之前步驟中擷取的CertIdentifier。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: #... listeners: - port: 443 protocol: HTTPS certificates: - CertificateId: 756****-cn-hangzhou # 認證的CertIdentifier IsDefault: true # 是否為預設認證 - port: #... protocol: #...
步驟四:效果驗證
通過使用HTTPS協議訪問服務,可以驗證配置認證的效果。
執行以下命令,查看Ingress資訊。
kubectl get ingress
預期輸出:
NAME CLASS HOSTS ADDRESS PORTS AGE https-ingress https-ingressclass demo.alb.ingress.top alb-********.alb.aliyuncs.com 80, 443 83m
記錄下
HOSTS
與ADDRESS
部分的值,以便後續步驟使用。執行以下命令,使用HTTPS協議串連ALB Ingress訪問後端服務。其中的
demo.alb.ingress.top
與alb-********.alb.aliyuncs.com
請替換為在上一步中得到的值。curl -H HOST:demo.alb.ingress.top -k https://alb-********.alb.aliyuncs.com
預期輸出如下,則表明認證配置成功:
old
相關文檔
如果您希望相容用戶端使用HTTP/3協議訪問服務,請參見使用QUIC監聽相容HTTP/3協議。
如果您希望在監聽上使用HTTPS雙向認證功能,請參見使用HTTPS雙向認證提高服務的安全性。