使用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中創建HTTPS監聽
默認AlbConfig配置一個監聽端口為80、協議為HTTP的監聽,您還需要創建HTTPS監聽,并確保配置相關證書。如果未配置證書,HTTPS監聽則不可用,Controller會存在由于缺少證書導致的失敗事件。更多詳情,請參見創建監聽。
控制臺
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在資源對象瀏覽器頁簽的搜索框中,搜索AlbConfig,然后單擊搜索結果AlbConfig。
在AlbConfig面板中,找到名稱為alb(默認),或其他AlbConfig的資源,單擊其右側操作列下的YAML編輯。
在查看YAML面板,新增
spec.listeners.port
和spec.listeners.protocol
字段。然后單擊確定。
kubectl
使用以下命令,編輯
albconfig
配置文件。kubectl edit albconfig <Albconfig_Name>
根據您的需求修改配置,可以在Albconfig中設置
port
和protocol
,以創建相應的監聽。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: addressAllocatedMode: Fixed addressType: Internet zoneMappings: - vSwitchId: vsw-bp19sXXXXXXX176iv - vSwitchId: vsw-bp1boXXXXXXXu74xz listeners: - port: 80 protocol: HTTP - port: 443 # 新增。 protocol: HTTPS # 新增,protocol的可選項為HTTP、HTTPS、QUIC。
(可選)步驟二:生成自簽名證書
如果還未獲取證書,執行以下命令可以通過OpenSSL創建自簽名證書。
由于缺乏可靠的CA認證,自簽名證書在瀏覽器和客戶端中默認不受信任,通常會導致客戶訪問時收到安全警告。本文中生成的自簽名證書僅作為示例,請勿在生產環境中使用。
命令中的
demo.alb.ingress.top
是生成的自簽名證書所關聯的域名。如果您已擁有自己的域名,請進行替換。
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
執行以下命令,查看證書和私鑰。
cat albtop-key.pem # 私鑰。
cat albtop-cert.pem # 證書。
執行以下命令,使用Base64對證書和私鑰編碼。
echo -n `cat albtop-key.pem` | base64 # Base64加密私鑰文件。
echo -n `cat albtop-cert.pem` | base64 # Base64加密證書文件.
步驟三:創建示例資源
控制臺
除了AlbConfig外,ALB Ingress還需要Deployment、Service、IngressClass和Ingress這4種資源才能正常工作,您可以使用以下步驟快速創建這4種資源。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
單擊使用YAML創建資源。
示例模板:選擇自定義。
模板:輸入YAML配置文件代碼。該配置文件用于Deployment、Service、IngressClass和Ingress這4種資源。
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
配置完成后單擊創建,頁面將提示創建成功。
檢查Deployment和Service創建成功:
在左側導航欄,選擇工作負載 > 無狀態。可查看到名稱為
https-deploy
的Deployment已部署。在左側導航欄,選擇網絡 > 服務。可查看到名稱為的
https-svc
的Service已部署。在左側導航欄,選擇
可查看到名稱為的https-ingress
的Ingress已部署。
kubectl
除了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: 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
執行以下命令創建。
kubectl apply -f https-quickstart.yaml
步驟四:配置證書
使用自動發現證書
控制臺
在將證書上傳到阿里云數字證書中心后,您可以通過在Ingress中的TLS配置證書關聯的域名,使ALB Ingress自動發現并使用已上傳的證書。
將自簽名證書上傳至阿里云數字證書中心。具體操作,請參見上傳和共享SSL證書。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在路由頁面,單擊目標Ingress其右側操作列下的更新,然后在編輯 Ingress對話框中,配置如下參數。
配置項
說明
示例值
TLS配置
開啟TLS配置開關,配置安全的路由服務。
域名:自定義域名。
保密字典:根據需要選擇對應的保密字典。
說明值為空時,為自動發現形式配置證書。
如果您需要創建Secret,請執行如下操作。
在保密字典右側,單擊創建。
在創建 Secret對話框,自定義保密字典的名稱、Cert、Key,然后單擊確定。
在保密字典的下拉框,選擇已創建的Secret。
單擊+ 新增TLS配置,可配置多條TLS。
域名:demo.alb.ingress.top
保密字典:不填值,為空。
(可選)注解
您可自定義注解名稱和值,也可根據名稱選擇或搜索要配置的注解。Ingress的注解請參見Ingress支持的Annotation。單擊+添加注解,可對Ingress無上限地添加注解。
無需配置。
說明如需同時監聽HTTP/HTTPS協議時需要添加如下注釋。
名稱:
alb.ingress.kubernetes.io/listen-ports
輸入值:
[{"HTTP": 80},{"HTTPS": 443}]
kubectl
在將證書上傳到阿里云數字證書中心后,您可以通過在Ingress中的tls
字段里填入證書關聯的域名,使ALB Ingress自動發現并使用已上傳的證書。
將自簽名證書上傳至阿里云數字證書中心。具體操作,請參見上傳和共享SSL證書。
執行以下命令編輯Ingress。
kubectl edit ingress https-ingress
添加
tls
字段,填入證書關聯的域名。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: # annotations: # alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # 如果需要同時監聽HTTP和HTTPS協議時需要添加此注釋。 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 tls: # 新增。 - hosts: # 新增。 - demo.alb.ingress.top # 新增,需要和“rules: host“字段中的域名保持一致,同時是證書關聯的域名。
使用Secret證書
控制臺
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在路由頁面,單擊目標Ingress其右側操作列下的更新,然后在編輯 Ingress對話框中,配置如下參數。
配置項
說明
示例值
TLS配置
開啟TLS配置開關,配置安全的路由服務。
域名:自定義域名。
保密字典:根據需要選擇對應的保密字典。
說明值為空時,為自動發現形式配置證書。
如果您需要創建Secret,請執行如下操作。
在保密字典右側,單擊創建。
在創建 Secret對話框,自定義保密字典的名稱、Cert、Key,然后單擊確定。
在保密字典的下拉框,選擇已創建的Secret。
單擊+ 新增TLS配置,可配置多條TLS。
域名:demo.alb.ingress.top
保密字典:https-secret
Secret名稱:https-secret
Cert:非Base64加密自簽證書。
Key:非Base64加密自簽私鑰。
(可選)注解
您可自定義注解名稱和值,也可根據名稱選擇或搜索要配置的注解。Ingress的注解請參見Ingress支持的Annotation。單擊+添加注解,可對Ingress無上限地添加注解。
無需配置。
說明如需同時監聽HTTP/HTTPS協議時需要添加如下注釋。
名稱:
alb.ingress.kubernetes.io/listen-ports
輸入值:
[{"HTTP": 80},{"HTTPS": 443}]
kubectl
您可以將證書保存在集群的Secret資源中,并在Ingress中使用。
創建Secret
使用以下內容創建https-secret.yaml,示例如下,對應的證書和私鑰編碼請參見步驟二使用Base64對證書和私鑰編碼。
apiVersion: v1 kind: Secret metadata: name: https-secret type: kubernetes.io/tls data: tls.key: | # Base64編碼后的albtop-key.pem。 {base64 albtop-key.pem} tls.crt: | # Base64編碼后的albtop-cert.pem。 {base64 albtop-cert.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: # annotations: # alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # 如果需要同時監聽HTTP和HTTPS協議時需要添加此注釋。 name: https-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.alb.ingress.top # demo.alb.ingress.top替換為證書關聯的域名。 http: paths: - backend: service: name: https-svc port: number: 443 path: / pathType: Prefix tls: # 新增。 - hosts: - demo.alb.ingress.top # 新增,需要和“rules: host“字段中的域名保持一致,同時是證書關聯的域名。 secretName: https-secret # 新增,創建證書密鑰。
使用AlbConfig指定證書
控制臺
獲取自簽證書的CertIdentifier。
在將證書上傳到阿里云數字證書中心后,您可以在AlbConfig中的監聽的
CertificateId
字段填入證書的ID,以便為監聽關聯已上傳的證書。說明如果監聽配置了證書,那么此監聽下的Ingress將不再使用自動發現證書。
上傳自簽名證書至阿里云數字證書中心。具體操作,請參見上傳和共享SSL證書。
獲取證書ID。
登錄數字證書管理服務控制臺。
在左側導航欄,選擇。
在SSL證書頁面,單擊上傳證書頁簽,在目標證書操作列下單擊更多。
在證書詳情面板中獲取CertIdentifier。
關聯證書至AlbConfig。
編輯Ingress。
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在路由頁面,單擊目標Ingress其右側操作列下的更新,然后在編輯 Ingress對話框中,配置如下參數。
配置項
說明
示例值
注解
您可自定義注解名稱和值,也可根據名稱選擇或搜索要配置的注解。Ingress的注解請參見Ingress支持的Annotation。單擊+添加注解,可對Ingress無上限地添加注解。
名稱:
alb.ingress.kubernetes.io/listen-ports
輸入值:
[{"HTTPS": 443}]
說明如果需要同時監聽HTTP和HTTPS協議替換為
[{"HTTP": 80},{"HTTPS": 443}]
kubectl
在將證書上傳到阿里云數字證書中心后,您可以在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: addressType: Intranet name: xiaosha-alb-test listeners: - port: 80 protocol: HTTP - certificates: - CertificateId: 756****-cn-hangzhou # 證書的CertIdentifier。 IsDefault: true # 是否為默認證書。 port: 443 protocol: HTTPS
執行以下命令編輯Ingress。
kubectl edit ingress https-ingress
新增
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]'
注釋。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS": 443}]' # 新增,如果需要同時監聽HTTP和HTTPS協議時修改為'[{"HTTP": 80},{"HTTPS": 443}]' 。 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
步驟五:效果驗證
通過使用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雙向認證提高服務的安全性。