最新消息:在TwitterMastodon取得專案更新

在 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 tutorial
export 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 名稱相符。請參閱NameServersaws 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 Certificate
kubectl explain CertificateRequest
kubectl explain Issuer

📖 閱讀有關安裝 cert-manager 的其他方式

📖 閱讀更多關於憑證和簽發者的資訊。

建立測試 ClusterIssuer 和憑證

現在一切都準備就緒,您可以建立您的第一個憑證。這將是一個自我簽署的憑證,但稍後我們會將其替換為 Let's Encrypt 簽署的憑證。

# clusterissuer-selfsigned.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsigned
spec:
selfSigned: {}

🔗 clusterissuer-selfsigned.yaml

kubectl apply -f clusterissuer-selfsigned.yaml

然後使用envsubst將您選擇的網域名稱替換到下列憑證範本中

# certificate.yaml
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: www
spec:
secretName: www-tls
revisionHistoryLimit: 1
privateKey:
rotationPolicy: Always
commonName: www.$DOMAIN_NAME
dnsNames:
- www.$DOMAIN_NAME
usages:
- digital signature
- key encipherment
- server auth
issuerRef:
name: selfsigned
kind: ClusterIssuer

🔗 certificate.yaml

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.net
URIs: <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.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloweb
labels:
app: hello
spec:
selector:
matchLabels:
app: hello
tier: web
template:
metadata:
labels:
app: hello
tier: web
spec:
containers:
- name: hello-app
image: us-docker.pkg.dev/google-samples/containers/gke/hello-app-tls:1.0
imagePullPolicy: Always
ports:
- containerPort: 8443
volumeMounts:
- name: tls
mountPath: /etc/tls
readOnly: true
env:
- name: TLS_CERT
value: /etc/tls/tls.crt
- name: TLS_KEY
value: /etc/tls/tls.key
volumes:
- name: tls
secret:
secretName: www-tls

🔗 deployment.yaml

kubectl apply -f deployment.yaml

您還需要建立一個 Kubernetes LoadBalancer 服務,以便將來自網際網路的連線路由到網頁伺服器 Pod。當您建立以下 Kubernetes 服務時,也會建立一個具有臨時公用 IP 位址的 AWS 傳統負載平衡器。

# service.yaml
apiVersion: v1
kind: Service
metadata:
name: helloweb
spec:
ports:
- port: 443
protocol: TCP
targetPort: 8443
selector:
app: hello
tier: web
type: LoadBalancer

🔗 service.yaml

kubectl apply -f service.yaml

在 2-3 分鐘內,應該會佈建一個具有公用 IP 的負載平衡器。

kubectl get service helloweb

範例輸出

$ kubectl get service helloweb
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
helloweb 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_NAMEwww 記錄的別名,方法是建立 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.229
www.cert-manager-aws-tutorial.richard-gcp.jetstacker.net. 60 IN A 44.232.234.71
www.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 中。

📖 請閱讀其他設定具有 AWS Route53 DNS 的 ACME 發行者的方法

為您的叢集建立 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 服務帳戶關聯

以下命令會執行三項任務

  1. 在 cert-manager 命名空間中建立一個新的專用 Kubernetes ServiceAccount,以及
  2. 使用上一步驟中政策中定義的權限設定新的 AWS 角色。
  3. 設定角色,使其只能由具有此 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/v1
kind: Role
metadata:
name: cert-manager-acme-dns01-route53-tokenrequest
namespace: cert-manager
rules:
- apiGroups: ['']
resources: ['serviceaccounts/token']
resourceNames: ['cert-manager-acme-dns01-route53']
verbs: ['create']
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cert-manager-acme-dns01-route53-tokenrequest
namespace: cert-manager
subjects:
- kind: ServiceAccount
name: cert-manager
namespace: cert-manager
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: cert-manager-acme-dns01-route53-tokenrequest

🔗 rbac.yaml

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.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
server: https://acme-staging-v02.api.letsencrypt.org/directory
email: ${EMAIL_ADDRESS}
privateKeySecretRef:
name: letsencrypt-staging
solvers:
- dns01:
route53:
region: ${AWS_DEFAULT_REGION}
role: arn:aws:iam::${AWS_ACCOUNT_ID}:role/cert-manager-acme-dns01-route53
auth:
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.com
Uri: https://acme-staging-v02.api.letsencrypt.org/acme/acct/77882854
Conditions:
Last Transition Time: 2024-09-04T15:41:18Z
Message: The ACME account was registered with the ACME server
Observed Generation: 1
Reason: ACMEAccountRegistered
Status: True
Type: 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 www
cmctl 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.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-production
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: $EMAIL_ADDRESS
privateKeySecretRef:
name: letsencrypt-production
solvers:
- dns01:
route53:
region: ${AWS_DEFAULT_REGION}
role: arn:aws:iam::${AWS_ACCOUNT_ID}:role/cert-manager-acme-dns01-route53
auth:
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 www
cmctl 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 $CLUSTER
HOSTED_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 簽發者的資訊。