我想使用 AWS Certificate Manager (ACM) 終止 Amazon Elastic Kubernetes Service (Amazon EKS) 工作負載上的 HTTPS 流量。
簡短描述
若要在 Kubernetes Service 物件的 Elastic Load Balancing 層級終止 HTTPS 流量,您必須:
- 為您的自訂網域請求公有 ACM 憑證。
- 發佈您的 Kubernetes 服務,並將類型欄位設定為 LoadBalancer。
- 使用 Kubernetes 網站上的 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 註釋在 Kubernetes 服務上指定 ACM 憑證的 Amazon Resource Name (ARN)。此註釋允許 Kubernetes API 伺服器在建立該憑證時將其與 Classic Load Balancer 關聯。
- 將自訂網域與負載平衡器關聯。
下列解決方法假設:
- 您具有一個含有關聯工作節點的作用中 Amazon EKS 叢集。
- 您正在使用 Classic Load Balancer。
**注意:**若要使用 Application Load Balancer,您必須在 Amazon EKS 上部署應用程式負載平衡。
**注意:**僅在 Kubernetes 1.15 或更高版本中支援終止 Network Load Balancer 上的 TLS 連線。如需詳細資訊,請參閱 Kubernetes 網站上的透過 AWS NLB 支援終止 TLS。
解決方法
1. 為您的自訂網域請求公有 ACM 憑證。
2. 識別您要與負載平衡器的 HTTPS 接聽程式搭配使用的憑證 ARN。
3. 若要識別向 Amazon EKS 叢集註冊的節點,請在設定 kubectl的環境中執行下列命令:
$ kubectl get nodes
4. 在文字編輯器中,根據下列項目建立 deployment.yaml 清單檔案:
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo-deployment
spec:
replicas: 3
selector:
matchLabels:
app: echo-pod
template:
metadata:
labels:
app: echo-pod
spec:
containers:
- name: echoheaders
image: k8s.gcr.io/echoserver:1.10
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
5. 若要建立 Kubernetes 部署物件,請執行下列命令:
$ kubectl create -f deployment.yaml
6. 若要確認 Kubernetes Pod 是否已部署在您的 Amazon EKS 叢集上,請執行下列命令:
$ kubectl get pods
注意:這些 Pod 會標示為 app=echo-pod。您可以使用此標籤作為服務物件的選取器,以識別一組 Pod。
7. 在文字編輯器中,根據下列範例建立 service.yaml 清單檔案。然後,編輯 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 註釋以提供步驟 2 中的 ACM ARN。
apiVersion: v1
kind: Service
metadata:
name: echo-service
annotations:
# Note that the backend talks over HTTP.
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
# TODO: Fill in with the ARN of your certificate.
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
# Only run SSL on the port named "https" below.
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
spec:
selector:
app: echo-pod
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8080
type: LoadBalancer
8. 若要建立服務物件,請執行下列命令:
$ kubectl create -f service.yaml
9. 若要傳回 LoadBalancer類型的服務的 DNS URL,請執行下列命令:
$ kubectl get service
**注意:**如果您的叢集中正在執行許多作用中服務,請從命令輸出中取得 LoadBalancer 類型的正確服務 URL。
10. 開啟 Amazon Elastic Compute Cloud (Amazon EC2) 主控台,然後選擇負載平衡器。
11. 選取負載平衡器,然後選擇接聽程式。
12. 對於接聽程式 ID,確認您的負載平衡器連接埠設定為 443。
13. 對於 SSL 憑證,確認您在 YAML 檔案中定義的 SSL 憑證已連接至負載平衡器。
14. 將自訂網域名稱與負載平衡器名稱關聯。
15. 在 Web 瀏覽器中,使用下列 HTTPS 協定測試您的自訂網域:
https://yourdomain.com
成功的回應會傳回包含有關用戶端詳細資訊的網頁。此回應包括主機名稱、Pod 資訊、伺服器值、請求資訊和請求標頭。
**重要:**透過與 ACM 整合,您無法在負載平衡器上安裝含有 4,096 位元 RSA 金鑰或 EC 金鑰的憑證。若要將金鑰與負載平衡器搭配使用,您必須將含有 4,096 位元 RSA 或 EC 金鑰的憑證上傳至 AWS Identity and Access Management (IAM)。然後,將相應的 ARN 與 service.beta.kubernetes.io/aws-load-balancer-ssl-cert 註釋搭配使用。