如何使用 TLS 憑證為我的 Amazon EKS 應用程式啟用 HTTPS 連線?

3 分的閱讀內容
0

我想使用 Transport Layer Security (TLS) 憑證為我的 Amazon Elastic Kubernetes Service (Amazon EKS) 應用程式啟用 HTTPS 連線。

簡短描述

若要為您的 Amazon EKS 應用程式啟用 HTTPS 連線,您必須執行下列動作:

  • 為您的自訂網域取得有效的 TLS 憑證。
  • 使用負載平衡器服務類型公開您的 Kubernetes 服務,或使用 AWS 負載平衡器控制器 (在 GitHub 上) 公開您的 Kubernetes 輸入物件。
  • 將自訂網域與負載平衡器的 DNS 建立關聯。

解決方案

為您的自訂網域取得有效的 TLS 憑證:

1.    為您的自訂網域申請公有 AWS Certificate Manager (ACM) 憑證,或將您自己的 TLS 憑證上傳至 ACM。

2.    確定您要與負載平衡器的 HTTPS 接聽程式搭配使用的憑證的 Amazon Resource Name (ARN)。

3.    若要建立範例 NGINX 部署,請執行下列命令:

$ kubectl create deploy web --image=nginx --port 80 --replicas=3

4.    若要確認 Kubernetes Pod 是否已部署在您的 Amazon EKS 叢集上,請執行下列命令:

$ kubectl get pods -l app=web

**注意:**Pod 會標示為 app=web。使用此標籤做為服務物件的選取器,以識別一組 Pod。

使用負載平衡器服務類型公開您的 Kubernetes 服務

注意:若要使用輸入物件公開您的應用程式,請跳至使用輸入物件公開您的 Kubernetes 服務小節。

1.    若要建立 service.yaml 清單檔案,請使用服務類型 LoadBalancer:

cat <<EOF > loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
  name: lb-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-tls-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
    # Only run TLS on the port named "https" below.
    service.beta.kubernetes.io/aws-load-balancer-tls-ports: "https"
    # By default In-tree controller will create a Classic LoadBalancer if you require a NLB uncomment below annotation.
    # service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  selector:
    app: web
  ports:
  - name: http
    port: 80
    targetPort: 80
  - name: https
    port: 443
    targetPort: 80
  type: LoadBalancer
EOF

2.    編輯註釋 service.beta.kubernetes.io/aws-load-balancer-tls-cert 以包含 ACM 的 ARN。

3.    若要套用 loadbalancer.yaml 檔案,請執行下列命令:

$ kubectl create -f loadbalancer.yaml

4.    跳到將自訂網域與負載平衡器的 DNS 建立關聯小節。

使用輸入物件公開您的 Kubernetes 服務

**注意:**以下解決方案假設您已在 Amazon EKS 叢集中安裝 AWS 負載平衡器控制器

1.    根據下列範例建立 NodePort 類型的 Kubernetes 服務:

cat  <<EOF  > ingressservice.yaml
apiVersion: v1
kind: Service
metadata:
  name: web-nginx
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  type: NodePort
  selector:
    app: web
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "web-nginx-ingress"
  annotations:
    # Below annotation is to specify if the loadbalancer is "internal" or "internet-facing"	   
    alb.ingress.kubernetes.io/scheme: internet-facing
    # TODO: Fill in with the ARN of your certificate.
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxx:certificate/xxxxxx
    # TODO: Fill in the listening ports.
    alb.ingress.kubernetes.io/listen-ports: '\[{"HTTP": 80}, {"HTTPS":443}\]'
    # Set HTTP to HTTPS redirects. Every HTTP listener configured will be redirected to below mentioned port over HTTPS.
    alb.ingress.kubernetes.io/ssl-redirect: '443'
  labels:
    app: web
spec:
  ingressClassName: alb
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: "web-nginx"
                port:
                  number: 80
EOF

**注意:**先前的輸入清單檔案會接聽 HTTP 和 HTTPS,然後在 ALB 上終止 TLS,並將 HTTP 重新導向至 HTTPS。

2.    若要套用 ingressservice.yaml 檔案,請執行下列命令:

$ kubectl create -f ingressservice.yaml

將自訂網域與負載平衡器的 DNS 建立關聯

1.    若要傳回 LoadBalancer 類型的服務的 DNS URL,請執行下列命令:

$ kubectl get service

2.    若要傳回 Ingress 類型的服務的 DNS URL,請執行下列命令:

$ kubectl get ingress/web-nginx-ingress

3.    將自訂網域名稱與負載平衡器名稱建立關聯

4.    在網頁瀏覽器中,使用下列 HTTPS 通訊協定測試您的自訂網域:

https://yourdomain.com
AWS 官方
AWS 官方已更新 1 年前