當您選擇使用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
執行以下命令,建立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監聽標識,並不是自動探索認證的配置。執行以下命令,建立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