在 AWS Elastic Kubernetes Service (EKS) 上部署 cert-manager 並使用 Let's Encrypt 為 HTTPS 網站簽署 TLS 憑證
上次驗證時間:2024 年 9 月 9 日
在本教學中,您將學習如何在 AWS Elastic Kubernetes Service (EKS) 上部署和設定 cert-manager,以及如何部署 HTTPS 網頁伺服器並使其在網際網路上可用。您將學習如何設定 cert-manager 以從 Let's Encrypt 取得簽署的憑證,這將允許用戶端安全地連線到您的 HTTPS 網站。您將設定 cert-manager 以使用Let's Encrypt DNS-01 挑戰協定搭配 AWS Route53 DNS。您將使用專用的 Kubernetes ServiceAccount 權杖向 Route53 驗證身分。
第一部分
在本教學的第一部分中,您將學習在 AWS Elastic Kubernetes Service (EKS) 叢集上部署 HTTPS 網站所需的基本知識,並使用 cert-manager 為網頁伺服器建立 SSL 憑證。您將為您的網站建立 DNS 網域,建立 EKS 叢集,安裝 cert-manager,建立 TLS 憑證,然後部署一個網頁伺服器,該伺服器會回應來自網際網路用戶端的 HTTPS 請求。第一部分的 TLS 憑證僅用於測試目的;在第二部分中,您將學習如何設定 cert-manager 以使用 Let's Encrypt 和 Route53 DNS 來建立可信的憑證,您可以在生產環境中使用該憑證。
設定 AWS CLI (aws
)
如果您尚未完成此操作,請下載並安裝 AWS CLI (aws
)。
設定aws
命令以進行互動式使用
aws configure
設定預設的輸出格式和區域
export AWS_DEFAULT_OUTPUT=json # ❗ Use JSON output for this tutorialexport AWS_DEFAULT_REGION=us-west-2 # ❗ Your AWS region.
📖 閱讀設定 AWS CLI和設定 AWS CLI,以瞭解有關設定
aws
的更多資訊。
建立公共網域名稱
在本教學中,您將部署一個具有公開存取網域名稱的 HTTPS 網站,因此您需要註冊一個網域,除非您已經有一個網域。您可以使用任何網域名稱註冊商來為您的網站註冊網域名稱。例如,您可以使用Gandi
並為本教學的目的註冊一個便宜的網域名稱。
現在您知道您的網域名稱,請將其儲存在環境變數中
export DOMAIN_NAME=example.com # ❗ Replace this with your own DNS domain name
並將其作為區域新增至 AWS Route53
aws route53 create-hosted-zone --caller-reference $(uuidgen) --name $DOMAIN_NAME
建立的區域詳細資訊將列印到主控台
{"Location": "https://route53.amazonaws.com/2013-04-01/hostedzone/Z0984294TRL0R8AT3SQA","HostedZone": {"Id": "/hostedzone/Z0984294TRL0R8AT3SQA","Name": "cert-manager-aws-tutorial.richard-gcp.jetstacker.net.","CallerReference": "77274711-b648-4da5-81b7-74512897d0db","Config": {"PrivateZone": false},"ResourceRecordSetCount": 2},"ChangeInfo": {"Id": "/change/C04685872DX6N6587E1TL","Status": "PENDING","SubmittedAt": "2024-09-03T16:29:11.960000+00:00"},"DelegationSet": {"NameServers": ["ns-1504.awsdns-60.org","ns-538.awsdns-03.net","ns-278.awsdns-34.com","ns-1765.awsdns-28.co.uk"]}}
登入您網域註冊商的控制面板,並將您網域的 NS 記錄設定為與您的 Route53 主機區域的權威 DNS 伺服器的 DNS 名稱相符。請參閱NameServers
在aws route53 create-hosted-zone
(以上)的輸出中,或者您可以稍後找到名稱伺服器
HOSTED_ZONE_ID=$(aws route53 list-hosted-zones-by-name --dns-name $DOMAIN_NAME --query "HostedZones[0].Id" --output text)aws route53 get-hosted-zone --id ${HOSTED_ZONE_ID}
您可以使用dig
來「追蹤」NS 記錄的階層,以檢查 NS 記錄是否已更新
dig $DOMAIN_NAME ns +trace +nodnssec
⏲ 在父區域中更新 NS 記錄可能需要 1 個小時以上的時間,如果您在更新 NS 記錄之前查詢過 DNS 名稱,則可能需要一些時間才能在 DNS 解析器伺服器的快取中取代舊的 NS 記錄。
📖 閱讀
Gandi.net
文件中的如何更新我的 DNS 記錄?,或尋找您自己網域名稱註冊商的對等文件。
建立 EKS Kubernetes 叢集
首先,讓我們使用 EKS 建立一個 Kubernetes 叢集。建立 EKS 叢集最簡單的方式是使用eksctl
。下載並安裝eksctl
。
為您的叢集選擇一個名稱並將其儲存在環境變數中
export CLUSTER=test-cluster-1
現在,使用下列命令建立叢集
eksctl create cluster \--name $CLUSTER \--nodegroup-name node-group-1 \--node-type t3.small \--nodes 3 \--nodes-min 1 \--nodes-max 3 \--managed \--spot
這將使用您新叢集的憑證更新您的kubectl
設定檔。
檢查您是否可以連線到叢集
kubectl get nodes -o wide
⏲ 建立叢集需要 15-20 分鐘。為什麼?請參閱縮短 EKS 叢集建立時間。
💵 為了盡量減少您的雲端帳單,此命令會使用低成本虛擬機器和現貨執行個體建立一個 3 節點叢集。
⚠️ 此叢集僅適用於學習目的,不適合在生產環境中使用。
安裝 cert-manager
現在您可以安裝和設定 cert-manager。
使用helm
安裝 cert-manager,如下所示
helm install cert-manager cert-manager \--repo https://charts.jetstack.io \--namespace cert-manager \--create-namespace \--set crds.enabled=true
這將在一個名為cert-manager
的新命名空間中建立三個 Deployment 以及一些 Services 和 Pod。它還會安裝各種叢集範圍的支援資源,例如 RBAC 角色和自訂資源定義。
您可以檢視已安裝的一些資源,如下所示
kubectl -n cert-manager get all
您可以使用kubectl explain
探索自訂資源定義 (cert-manager 的 API),如下所示
kubectl explain Certificatekubectl explain CertificateRequestkubectl explain Issuer
📖 閱讀有關安裝 cert-manager 的其他方式。
📖 閱讀更多關於憑證和簽發者的資訊。
建立測試 ClusterIssuer 和憑證
現在一切都準備就緒,您可以建立您的第一個憑證。這將是一個自我簽署的憑證,但稍後我們會將其替換為 Let's Encrypt 簽署的憑證。
# clusterissuer-selfsigned.yamlapiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:name: selfsignedspec:selfSigned: {}
🔗 clusterissuer-selfsigned.yaml
kubectl apply -f clusterissuer-selfsigned.yaml
然後使用envsubst
將您選擇的網域名稱替換到下列憑證範本中
# certificate.yamlapiVersion: cert-manager.io/v1kind: Certificatemetadata:name: wwwspec:secretName: www-tlsrevisionHistoryLimit: 1privateKey:rotationPolicy: AlwayscommonName: www.$DOMAIN_NAMEdnsNames:- www.$DOMAIN_NAMEusages:- digital signature- key encipherment- server authissuerRef:name: selfsignedkind: ClusterIssuer
envsubst < certificate.yaml | kubectl apply -f -
🔗 如果您尚未安裝
envsubst
,您可以下載並安裝envsubst
的 Go 實作。
使用cmctl status certificate
檢查憑證的狀態
cmctl status certificate www
如果成功,私密金鑰和簽署的憑證將儲存在名為www-tls
的 Secret 中。您可以使用cmctl inspect secret www-tls
來解碼 Secret 的 base64 編碼 X.509 內容
$ cmctl inspect secret www-tls...Valid for:DNS Names:- www.cert-manager-aws-tutorial.richard-gcp.jetstacker.netURIs: <none>IP Addresses: <none>Email Addresses: <none>Usages:- digital signature- key encipherment- server auth...
部署範例網頁伺服器
現在部署一個簡單的網頁伺服器,它會以「hello world!」回應 HTTPS 請求。TLS 金鑰和憑證會透過使用 www-tls
Secret 作為磁碟區,並將其內容掛載到 Pod 中 hello-app
容器的檔案系統中,提供給網頁伺服器。
# deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: helloweblabels:app: hellospec:selector:matchLabels:app: hellotier: webtemplate:metadata:labels:app: hellotier: webspec:containers:- name: hello-appimage: us-docker.pkg.dev/google-samples/containers/gke/hello-app-tls:1.0imagePullPolicy: Alwaysports:- containerPort: 8443volumeMounts:- name: tlsmountPath: /etc/tlsreadOnly: trueenv:- name: TLS_CERTvalue: /etc/tls/tls.crt- name: TLS_KEYvalue: /etc/tls/tls.keyvolumes:- name: tlssecret:secretName: www-tls
kubectl apply -f deployment.yaml
您還需要建立一個 Kubernetes LoadBalancer 服務,以便將來自網際網路的連線路由到網頁伺服器 Pod。當您建立以下 Kubernetes 服務時,也會建立一個具有臨時公用 IP 位址的 AWS 傳統負載平衡器。
# service.yamlapiVersion: v1kind: Servicemetadata:name: hellowebspec:ports:- port: 443protocol: TCPtargetPort: 8443selector:app: hellotier: webtype: LoadBalancer
kubectl apply -f service.yaml
在 2-3 分鐘內,應該會佈建一個具有公用 IP 的負載平衡器。
kubectl get service helloweb
範例輸出
$ kubectl get service hellowebNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEhelloweb LoadBalancer 10.100.175.247 ae25d292150aa4e3e90e6c25376f9a7d-496307726.us-west-2.elb.amazonaws.com 443:32184/TCP 6m
您的 EXTERNAL-IP
會與您的不同,而且每次重新建立 LoadBalancer 服務時可能會有所不同,但它會有一個與其關聯的穩定 DNS 主機名稱。
ℹ️ 預設情況下,EKS 會使用 傳統雲端供應商負載平衡器控制器,在叢集中為 LoadBalancer 服務建立傳統負載平衡器。這對本教學課程來說很方便,因為它不需要任何額外的軟體或設定,但根據 EKS 最佳實務指南,AWS 雲端供應商負載平衡器控制器是舊版,目前僅接收重要的錯誤修正。請考慮改用 AWS 負載平衡器控制器。
負載平衡器的穩定 DNS 主機名稱可以用來作為您選擇的 $DOMAIN_NAME
中 www
記錄的別名,方法是建立 Route53 別名記錄。
HOSTED_ZONE_ID=$(aws route53 list-hosted-zones-by-name --dns-name $DOMAIN_NAME --query "HostedZones[0].Id" --output text)ELB_CANONICAL_HOSTED_ZONE_NAME=$(kubectl get svc helloweb --output=jsonpath='{ .status.loadBalancer.ingress[0].hostname }')aws elb describe-load-balancers --query "LoadBalancerDescriptions[?CanonicalHostedZoneName == '$ELB_CANONICAL_HOSTED_ZONE_NAME'] | [0]" \| jq '{"Comment": "Creating an alias record","Changes": [{"Action": "CREATE","ResourceRecordSet": {"Name": "www.\($DOMAIN_NAME)","Type": "A","AliasTarget": {"HostedZoneId": .CanonicalHostedZoneNameID,"DNSName": .CanonicalHostedZoneName,"EvaluateTargetHealth": false}}}]}' \--arg DOMAIN_NAME "${DOMAIN_NAME}" \| aws route53 change-resource-record-sets --hosted-zone-id $HOSTED_ZONE_ID --change-batch file:///dev/stdin
ℹ️ 請閱讀將流量路由到 ELB 負載平衡器,以深入瞭解此任務。
ℹ️ 該腳本使用
JMESPath
查詢,透過與 DNS 名稱比對,來取得 Kubernetes 服務的 ELB。📖 有另一種方式可以使用 ExternalDNS 來管理負載平衡器的 DNS 記錄。ExternalDNS 會將公開的 Kubernetes 服務和 Ingress 與 DNS 提供者同步。請閱讀在 AWS 上 Kubernetes 叢集中使用 ExternalDNS 以深入瞭解。
檢查 www.$DOMAIN_NAME
現在是否解析為負載平衡器的臨時公用 IP 位址。
$ dig www.$DOMAIN_NAME A...;; QUESTION SECTION:;www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net. IN A;; ANSWER SECTION:www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net. 60 IN A 34.212.236.229www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net. 60 IN A 44.232.234.71www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net. 60 IN A 35.164.69.198
如果 DNS 正確,且負載平衡器正在運作,且 hello world 網頁伺服器正在執行,您現在應該可以使用 curl 或網頁瀏覽器連線到它。
curl --insecure -v https://www.$DOMAIN_NAME
⚠️ 我們使用了 curl 的
--insecure
選項,因為否則 curl 會拒絕我們產生的不受信任憑證。稍後您將學習如何建立由 Let's Encrypt 簽署的受信任憑證。
您應該會看到憑證具有預期的 DNS 名稱,且它是自行簽署的。
...* Server certificate:* subject: CN=www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net* start date: Sep 4 08:43:56 2024 GMT* expire date: Dec 3 08:43:56 2024 GMT* issuer: CN=www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net* SSL certificate verify result: self-signed certificate (18), continuing anyway....Hello, world!Protocol: HTTP/2.0!Hostname: helloweb-55cb4cd887-tjlvh
📖 請閱讀使用服務公開您的應用程式,以深入瞭解。
第二部分
在第一部分中,您建立了一個測試憑證。現在您將學習如何設定 cert-manager 以使用 Let's Encrypt 和 AWS Route53 DNS 來建立一個受信任的憑證,您可以在生產環境中使用它。您需要向 Let's Encrypt 證明您擁有憑證的網域名稱,而一種方法是在該網域中建立一個特殊的 DNS 記錄。這稱為 DNS-01 挑戰類型。
cert-manager 可以透過使用 AWS Route53 API 來為您建立該 DNS 記錄,但它需要先進行驗證,而目前最安全的驗證方法是使用具有專用 Kubernetes ServiceAccount 的 IAM 角色。此方法的優點是 cert-manager 將使用臨時 Kubernetes ServiceAccount Token 向 AWS 進行驗證,並且 Token 不需要儲存在 Kubernetes Secret 中。
為您的叢集建立 IAM OIDC 提供者
eksctl utils associate-iam-oidc-provider --cluster $CLUSTER --approve
ℹ️ 請閱讀為您的叢集建立 IAM OIDC 提供者,以瞭解更多詳細資訊。
建立 IAM 政策
aws iam create-policy \--policy-name cert-manager-acme-dns01-route53 \--description "This policy allows cert-manager to manage ACME DNS01 records in Route53 hosted zones. See https://cert-manager.dev.org.tw/docs/configuration/acme/dns01/route53" \--policy-document file:///dev/stdin <<EOF{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "route53:GetChange","Resource": "arn:aws:route53:::change/*"},{"Effect": "Allow","Action": ["route53:ChangeResourceRecordSets","route53:ListResourceRecordSets"],"Resource": "arn:aws:route53:::hostedzone/*"},{"Effect": "Allow","Action": "route53:ListHostedZonesByName","Resource": "*"}]}EOF
ℹ️ 請閱讀 cert-manager ACME DNS01 Route53 設定文件,以瞭解有關此 IAM 政策的更多詳細資訊。
建立 IAM 角色並將其與 Kubernetes 服務帳戶關聯
以下命令會執行三項任務
- 在 cert-manager 命名空間中建立一個新的專用 Kubernetes ServiceAccount,以及
- 使用上一步驟中政策中定義的權限設定新的 AWS 角色。
- 設定角色,使其只能由具有此 EKS 叢集中新專用 Kubernetes ServiceAccount Token 的客戶端假設。
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)eksctl create iamserviceaccount \--name cert-manager-acme-dns01-route53 \--namespace cert-manager \--cluster ${CLUSTER} \--role-name cert-manager-acme-dns01-route53 \--attach-policy-arn arn:aws:iam::${AWS_ACCOUNT_ID}:policy/cert-manager-acme-dns01-route53 \--approve
ℹ️ 請閱讀將 IAM 角色指派給 Kubernetes 服務帳戶,以瞭解更多詳細資訊。
授與 cert-manager 建立 ServiceAccount Token 的權限
cert-manager 需要權限來為您在上一步驟中建立的 Kubernetes ServiceAccount 產生 JWT Token。在 cert-manager 命名空間中套用以下 RBAC 角色和角色繫結
apiVersion: rbac.authorization.k8s.io/v1kind: Rolemetadata:name: cert-manager-acme-dns01-route53-tokenrequestnamespace: cert-managerrules:- apiGroups: ['']resources: ['serviceaccounts/token']resourceNames: ['cert-manager-acme-dns01-route53']verbs: ['create']---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:name: cert-manager-acme-dns01-route53-tokenrequestnamespace: cert-managersubjects:- kind: ServiceAccountname: cert-managernamespace: cert-managerroleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: cert-manager-acme-dns01-route53-tokenrequest
kubectl apply -f rbac.yaml
為 Let's Encrypt Staging 建立 ClusterIssuer
ClusterIssuer 是一個自訂資源,它會告訴 cert-manager 如何簽署憑證。在這種情況下,ClusterIssuer 將設定為連線到 Let's Encrypt Staging 伺服器,這讓我們可以測試所有內容,而不會用完我們網域名稱的 Let's Encrypt 憑證配額。
將以下內容儲存到名為 clusterissuer-lets-encrypt-staging.yaml
的檔案中,將 email
欄位變更為使用您的電子郵件地址並套用它
# clusterissuer-lets-encrypt-staging.yamlapiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:name: letsencrypt-stagingspec:acme:server: https://acme-staging-v02.api.letsencrypt.org/directoryemail: ${EMAIL_ADDRESS}privateKeySecretRef:name: letsencrypt-stagingsolvers:- dns01:route53:region: ${AWS_DEFAULT_REGION}role: arn:aws:iam::${AWS_ACCOUNT_ID}:role/cert-manager-acme-dns01-route53auth:kubernetes:serviceAccountRef:name: cert-manager-acme-dns01-route53
🔗 clusterissuer-lets-encrypt-staging.yaml
如您所見,clusterissuer-lets-encrypt-staging.yaml
中有一些變數需要在我們套用它之前填寫;大多數已在本教學課程中稍早定義,但您需要設定以下內容
export EMAIL_ADDRESS=<email-address> # ❗ Replace this with your email address
現在使用 envsubst
來填寫變數並將其導向 kubectl apply
,如下所示
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)envsubst < clusterissuer-lets-encrypt-staging.yaml | kubectl apply -f -
您可以檢查 ClusterIssuer 的狀態
kubectl describe clusterissuer letsencrypt-staging
範例輸出
Status:Acme:Last Registered Email: firstname.lastname@example.comUri: https://acme-staging-v02.api.letsencrypt.org/acme/acct/77882854Conditions:Last Transition Time: 2024-09-04T15:41:18ZMessage: The ACME account was registered with the ACME serverObserved Generation: 1Reason: ACMEAccountRegisteredStatus: TrueType: Ready
ℹ️ Let's Encrypt 使用自動憑證管理環境 (ACME) 通訊協定,這就是為什麼上面的設定位於名為
acme
的金鑰下。ℹ️ 只有在透過 cert-manager 續約憑證時發生錯誤,Let's Encrypt 才會使用電子郵件地址提醒您在到期前 30 天續約憑證。
ℹ️ Let's Encrypt 生產環境的簽發者有非常嚴格的速率限制。當您在實驗和學習時,很容易就會達到這些限制。由於這個風險,我們將從 Let's Encrypt 的測試環境簽發者開始,一旦我們確定它運作正常,我們就會切換到生產環境的簽發者。
📖 閱讀更多關於設定 ACME 簽發者的資訊。
使用 Let's Encrypt 重新簽發憑證
修補憑證以使用測試環境的 ClusterIssuer
kubectl patch certificate www --type merge -p '{"spec":{"issuerRef":{"name":"letsencrypt-staging"}}}'
這應該會觸發 cert-manager 更新憑證:使用 cmctl
檢查
cmctl status certificate wwwcmctl inspect secret www-tls
最後,當新的憑證簽發後,您必須重新啟動網頁伺服器才能使用它
kubectl rollout restart deployment helloweb
您應該可以再次連線到網站,但這次您將會看到 Let's Encrypt 的測試環境憑證
$ curl -v --insecure https://www.$DOMAIN_NAME...* Server certificate:* subject: CN=www.cert-manager-tutorial-22.site* start date: Jan 5 12:41:14 2023 GMT* expire date: Apr 5 12:41:13 2023 GMT* issuer: C=US; O=(STAGING) Let's Encrypt; CN=(STAGING) Artificial Apricot R3* SSL certificate verify result: unable to get local issuer certificate (20), continuing anyway....Hello, world!Protocol: HTTP/2.0!Hostname: helloweb-9b8bcdd56-6rxm8
⚠️ 我們在這裡再次使用了 curl 的
--insecure
選項,因為 Let's Encrypt 的測試環境簽發者會建立不信任的憑證。接下來您將學習如何建立由 Let's Encrypt 生產環境簽發者簽署的信任憑證。
建立可用於生產環境的憑證
現在所有東西都使用 Let's Encrypt 測試伺服器運作正常,我們可以切換到生產伺服器並取得信任的憑證。
複製測試環境的 ClusterIssuer YAML 並修改伺服器 URL 和名稱,然後套用它,以建立 Let's Encrypt 生產環境的簽發者
# clusterissuer-lets-encrypt-production.yamlapiVersion: cert-manager.io/v1kind: ClusterIssuermetadata:name: letsencrypt-productionspec:acme:server: https://acme-v02.api.letsencrypt.org/directoryemail: $EMAIL_ADDRESSprivateKeySecretRef:name: letsencrypt-productionsolvers:- dns01:route53:region: ${AWS_DEFAULT_REGION}role: arn:aws:iam::${AWS_ACCOUNT_ID}:role/cert-manager-acme-dns01-route53auth:kubernetes:serviceAccountRef:name: cert-manager-acme-dns01-route53
🔗 clusterissuer-lets-encrypt-production.yaml
export AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)envsubst < clusterissuer-lets-encrypt-production.yaml | kubectl apply -f -
檢查 ClusterIssuer 的狀態
kubectl describe clusterissuer letsencrypt-production
修補憑證以使用生產環境的 ClusterIssuer
kubectl patch certificate www --type merge -p '{"spec":{"issuerRef":{"name":"letsencrypt-production"}}}'
這應該會觸發 cert-manager 更新憑證:使用 cmctl
檢查
cmctl status certificate wwwcmctl inspect secret www-tls
最後,當新的憑證簽發後,您必須重新啟動網頁伺服器才能使用它
kubectl rollout restart deployment helloweb
現在您應該可以安全地連線到網頁伺服器,而不需要 --insecure
標誌,如果您在網頁瀏覽器中造訪該網站,網址旁邊應該會顯示一個鎖頭 (🔒) 符號。
curl -v https://www.$DOMAIN_NAME
...* Server certificate:* subject: CN=www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net* start date: Sep 4 19:32:24 2024 GMT* expire date: Dec 3 19:32:23 2024 GMT* subjectAltName: host "www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net" matched cert's "www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net"* issuer: C=US; O=Let's Encrypt; CN=R11* SSL certificate verify ok....
本教學到此結束。您已學習如何在 AWS EKS 上部署 cert-manager,以及如何設定它以使用 Route53 DNS 和 DNS-01 協定來簽發 Let's Encrypt 簽署的憑證。您已了解服務帳戶的 IAM 角色 (IRSA),並且學習如何設定 cert-manager 以使用 Kubernetes ServiceAccount 權杖驗證 AWS Route53。
清理
完成教學後,您可以刪除 EKS 叢集和 Route53 代管區域來進行清理,如下所示
eksctl delete cluster --name $CLUSTERHOSTED_ZONE_ID=$(aws route53 list-hosted-zones-by-name --dns-name $DOMAIN_NAME --query "HostedZones[0].Id" --output text)aws route53 delete-hosted-zone --id ${HOSTED_ZONE_ID}
IAM 原則、角色和身分提供者可以從 AWS 網頁 UI 手動刪除。
下一步
📖 閱讀其他 cert-manager 教學和入門指南。
📖 閱讀更多關於使用 Route53 DNS 設定 cert-manager ACME 簽發者的資訊。