當您選擇使用HTTPS協議的監聽時,您需要為監聽配置SSL/TLS證書以確保與客戶端的加密連接。本文介紹ALB Ingress支持的多種配置證書的方法。
前提條件
已創建AlbConfig資源,并在AlbConfig中創建HTTPS監聽。具體操作,請參見ALB Ingress快速入門。
已通過kubectl工具連接集群。
已獲取到可信的數字證書。您可以從以下幾個途徑獲取數字證書:
由于缺乏可靠的CA認證,自簽名證書在瀏覽器和客戶端中默認不受信任,通常會導致客戶訪問時收到安全警告。本文中生成的自簽名證書僅作為示例,請勿在面向公眾的生產環境中使用。
證書管理方式對比
ALB Ingress支持三種配置證書的方式:自動發現證書、Secret證書和AlbConfig指定證書。三種配置方式的區別如下。
ALB Ingress不影響長鏈接。
對比項 | |||
關聯資源 | Ingress | Ingress | AlbConfig |
存儲方式 | 阿里云數字證書中心 | 集群內的Secret資源 | 阿里云數字證書中心 |
適用場景 | 適用于已在阿里云數字證書中心已購買證書或上傳證書,并希望在Ingress級別進行證書管理的場景。 | 適用于集群內部管理的證書,例如使用cert-manager類的管理工具時,ALB實例證書會隨著證書Secret的更新而更新。 | 適用于已在阿里云數字證書中心已購買證書或上傳證書,并希望在ALB實例級別進行證書管理的場景。 |
優先級(僅供參考) | 低 | 中 | 高 |
跨命名空間使用 | 支持 | 不支持,僅支持在Secret資源所處的命名空間使用。 | 支持 |
更新證書方式 | 在數字證書中心上傳新證書或續費證書后,更新Ingress資源。 | 更新Ingress關聯的Secret資源。 | 在數字證書中心上傳新證書或續費證書后,更新AlbConfig資源。 |
證書管理方式兼容性說明
在ALB Ingress中,如果您同時使用了多種證書配置方式時,證書的管理方式和兼容性如下所示。
證書配置 | 說明 |
在Ingress資源中同時定義了自動發現證書和Secret證書 |
|
在Ingress資源中同時定義了自動發現證書和AlbConfig指定證書,并且它們關聯的Listener相同 |
|
在Ingress資源中同時定義了Secret證書和在AlbConfig指定證書 | AlbConfig指定證書和Secret證書是可以完全兼容的,并且可以同時使用。 |
創建前置資源
您需要Deployment、Service、AlbConfig、IngressClass、Ingress這5種資源才能使ALB Ingress工作,您可以使用以下的示例快速創建這5種資源。
創建https-quickstart.yaml文件,并將以下內容拷貝到該文件中。
apiVersion: apps/v1 kind: Deployment metadata: name: https-deploy namespace: default spec: replicas: 1 selector: matchLabels: app: https-deploy template: metadata: labels: app: https-deploy spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1 imagePullPolicy: IfNotPresent name: https-deploy ports: - containerPort: 8080 protocol: TCP --- apiVersion: v1 kind: Service metadata: name: https-svc namespace: default spec: ports: - name: port1 port: 443 protocol: TCP targetPort: 8080 selector: app: https-deploy sessionAffinity: None type: ClusterIP --- 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-demo # 修改為您的AlbConfig資源的名稱 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: https-ingress namespace: default 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
執行以下命令創建服務。
kubectl apply -f https-quickstart.yaml
(可選)生成自簽名證書
如果您還未獲取證書,您可以執行以下命令,通過OpenSSL創建自簽名證書。
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是自簽名證書所關聯的域名。如果您擁有域名,請您進行替換。如果您未擁有域名,可以不進行替換,不影響本文后續步驟。
使用自動發現證書
同一個ALB支持的擴展證書上限為25個,包含同域名的證書總數不能超過該閾值。
將自簽名證書上傳至阿里云數字證書中心。具體操作,請參見上傳和共享SSL證書。
更新Ingress配置。
執行以下命令更新Ingress配置。
kubectl edit ingress https-ingress
在https-quickstart.yaml的Ingress部分中添加tls字段,填入證書關聯的域名并保存退出。
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: https-ingress namespace: default spec: ingressClassName: alb rules: - host: demo.alb.ingress.top # demo.alb.ingress.top可以替換為您的域名 http: #... tls: - hosts: - demo.alb.ingress.top # 需要和“host“字段中的域名保持一致,同時是證書關聯的域名
執行以下命令,驗證證書是否配置成功。
curl https://demo.alb.ingress.top/tea
預期輸出:
{"hello":"tee"}
返回以上結果,說明證書配置成功。
使用Secret證書
以下以自簽名證書為例,介紹如何配置Secret證書。
同一證書支持創建不同的Secret,ALB也支持關聯多個證書,但同一ALB支持的擴展證書上限為25個。
執行以下命令,使用OpenSSL創建自簽名證書。
openssl genrsa -out albtop-key.pem 4096 openssl req -subj "/CN=demo.alb.ingress.top" -sha256 -new -key albtop-key.pem -out albtop.csr echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
在Base64編碼步驟1中的albtop-key.pem和albtop-cert.pem。
echo -n `cat albtop-key.pem` | base64
echo -n `cat albtop-cert.pem` | base64
創建Secret。
創建secret.yaml,代碼示例如下。
apiVersion: v1 kind: Secret metadata: name: secret-tls type: kubernetes.io/tls data: # the data is abbreviated in this example tls.crt: | {base64 albtop-cert.pem} # Base64編碼后的albtop-cert.pem。 tls.key: | {base64 albtop-key.pem} # Base64編碼后的albtop-key.pem。
執行以下命令,創建Secret。
kubectl apply -f secret.yaml
創建Ingress、Service和應用。
創建demo.yaml,代碼示例如下。
在Ingress的YAML中添加證書對應的域名。
tls: - hosts: - demo.alb.ingress.top secretName: secret-tls
apiVersion: v1 kind: Service metadata: name: demo-service-https namespace: default spec: ports: - name: port1 port: 443 protocol: TCP targetPort: 8080 selector: app: demo-cafe sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: demo-cafe namespace: default spec: replicas: 1 selector: matchLabels: app: demo-cafe template: metadata: labels: app: demo-cafe spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1 imagePullPolicy: IfNotPresent name: demo-cafe ports: - containerPort: 8080 protocol: TCP --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-https namespace: default spec: ingressClassName: alb rules: - host: demo.alb.ingress.top http: paths: - backend: service: name: demo-service-https port: number: 443 path: / pathType: Prefix tls: - hosts: - demo.alb.ingress.top secretName: secret-tls
執行以下命令,創建Ingress、Service和應用。
kubectl apply -f demo.yaml
執行以下命令,驗證證書是否配置成功。
curl https://demo.alb.ingress.top/tea
預期輸出:
{"hello":"tee"}
返回以上結果,說明證書配置成功。
使用AlbConfig指定證書
以下以自簽名證書為例,介紹如何使用AlbConfig指定證書。
如果監聽配置了證書ID,那么相同監聽下的域名不會再使用Secret證書和自動發現證書。
執行以下命令,通過OpenSSL創建自簽名證書。
openssl genrsa -out albtop-key.pem 4096 openssl req -subj "/CN=demo.alb.ingress.top" -sha256 -new -key albtop-key.pem -out albtop.csr echo subjectAltName = DNS:demo.alb.ingress.top > extfile.cnf openssl x509 -req -days 3650 -sha256 -in albtop.csr -signkey albtop-key.pem -out albtop-cert.pem -extfile extfile.cnf
上傳自簽名證書至阿里云數字證書中心。具體操作,請參見上傳和共享SSL證書。
獲取證書ID。
登錄數字證書管理服務控制臺。
在控制臺左側導航欄,單擊SSL 證書。
在SSL證書頁面,單擊上傳證書頁簽,在目標證書操作列下選擇 。
在證書詳情面板中獲取證書ID。
關聯證書至AlbConfig。
未創建AlbConfig場景
創建albconfig.yaml,代碼示例如下。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: #... listeners: - caEnabled: false certificates: - CertificateId: 756****-cn-hangzhou # 證書ID IsDefault: true port: 443 protocol: HTTPS #...
參數
說明
caEnabled
是否開啟TLS握手過程中有效證書的身份驗證。本示例配置false,表示不需要客戶端的身份驗證。
CertificateId
證書ID。本示例配置為756****-cn-hangzhou。CertificateId格式示例及說明如下:
中國地域:756****-cn-hangzhou。-cn-hangzhou為固定內容,不受地域影響,配置時您只需替換756****即可。
海外地域:756****-ap-southeast-1。-ap-southeast-1為固定內容,不受地域影響,配置時您只需替換756****即可。
IsDefault
是否為默認證書。本文配置為true,表示是默認證書。
protocol
支持監聽的協議類型。本文配置為HTTPS,表示支持HTTPS協議的監聽。
執行以下命令,創建AlbConfig。
kubectl apply -f albconfig.yaml
已創建AlbConfig場景
通過
kubectl edit
命令進行增量更新。執行以下命令,查看AlbConfig名稱。
kubectl -n kube-system get AlbConfig
預期輸出:
NAME AGE alb-demo 87m
執行以下命令,更新對應AlbConfig。
kubectl -n kube-system edit AlbConfig alb-demo #... spec: config: #... listeners: - caEnabled: false certificates: - CertificateId: 756****-cn-hangzhou # 證書ID IsDefault: true port: 443 protocol: HTTPS #...
更多關于更新AlbConfig的信息,請參見更新AlbConfig。
創建Ingress、Service和應用。
創建demo.yaml,代碼示例如下。
說明本例Ingress中的
tls
字段只作為掛載到443監聽標識,并不是自動發現證書的配置。apiVersion: v1 kind: Service metadata: name: demo-service-https namespace: default spec: ports: - name: port1 port: 443 protocol: TCP targetPort: 8080 selector: app: demo-cafe sessionAffinity: None type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: demo-cafe namespace: default spec: replicas: 1 selector: matchLabels: app: demo-cafe template: metadata: labels: app: demo-cafe spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1 imagePullPolicy: IfNotPresent name: demo-cafe ports: - containerPort: 8080 protocol: TCP --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo-https namespace: default spec: ingressClassName: alb rules: - host: demo.alb.ingress.top http: paths: - backend: service: name: demo-service-https port: number: 443 path: / pathType: Prefix tls: - hosts: - demo.alb.ingress.top
執行以下命令,創建Ingress、Service和應用。
kubectl apply -f demo.yaml
執行以下命令,驗證證書是否配置成功。
curl https://demo.alb.ingress.top/tea
預期輸出:
{"hello":"tee"}
(可選)釋放資源
執行以下命令,您可以釋放在本文中創建的資源。
kubectl delete deployment https-deploy
kubectl delete service https-svc
kubectl delete ingressclass https-ingressclass
kubectl delete ingress https-ingress
rm https-quickstart.yaml