新功能:在TwitterMastodon

在 AWS Elastic Kubernetes Service (EKS) 上部署 cert-manager,并使用 Let's Encrypt 为 HTTPS 网站签署 TLS 证书

最后验证时间:2024 年 9 月 9 日

在本教程中,您将学习如何在 AWS Elastic Kubernetes Service (EKS) 上部署和配置 cert-manager,以及如何部署 HTTPS Web 服务器并将其公开到互联网。您将学习如何配置 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 为 Web 服务器创建 SSL 证书。您将为您的网站创建 DNS 域名,创建 EKS 集群,安装 cert-manager,创建 TLS 证书,然后部署一个 Web 服务器,该服务器响应来自互联网上客户端的 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 名称匹配。请查看 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 集群。使用 eksctl 创建 EKS 集群的最简单方法。 下载并安装 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 的新命名空间中创建三个部署和一些服务和 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 的秘密中。您可以使用 cmctl inspect secret www-tls 解码秘密的 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
...

部署示例 Web 服务器

现在部署一个简单的 Web 服务器,该服务器使用“hello world!”响应 HTTPS 请求。TLS 密钥和证书通过使用 www-tls 秘密作为卷并将其内容安装到 Pod 中的 hello-app 容器的文件系统中,提供给 Web 服务器

# 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 服务,以便来自互联网的连接可以路由到 Web 服务器 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 服务创建负载均衡器,并使用 传统云提供商负载均衡器控制器。这对于本教程很方便,因为它不需要任何额外的软件或配置,但 AWS 云提供商负载均衡器控制器是传统的,目前只接收关键错误修复,根据 EKS 最佳实践指南。建议使用 AWS 负载均衡器控制器 替代。

负载均衡器的稳定 DNS 主机名可以用作您选择的 www 记录的别名,在您选择的 $DOMAIN_NAME 中,通过创建 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 web 服务器正在运行,您现在应该能够使用 curl 或使用您的 web 浏览器连接到它

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 令牌来对 AWS 进行身份验证,并且该令牌无需存储在 Kubernetes 密钥中。

📖 阅读有关 使用 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 http://cert-manager.k8s.ac.cn/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 的令牌的客户端假定。
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 令牌的权限

cert-manager 需要权限为您在上一步中创建的 Kubernetes ServiceAccount 生成一个 JWT 令牌。在 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 暂存环境创建 ClusterIssuer

ClusterIssuer 是一种自定义资源,它告诉 cert-manager 如何签署证书。在这种情况下,ClusterIssuer 将被配置为连接到 Let's Encrypt 暂存服务器,这使我们能够在不使用我们的 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: [email protected]
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 的键下的原因。

ℹ️ 电子邮件地址仅由 Let's Encrypt 用于提醒您在证书到期前 30 天续订证书。只有在使用 cert-manager 续订证书时出现问题时,您才会收到此电子邮件。

ℹ️ 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

最后,当新的证书颁发后,您必须重启 web 服务器才能使用它

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

最后,当新的证书颁发后,您必须重启 web 服务器才能使用它

kubectl rollout restart deployment helloweb

现在您应该能够安全地连接到 web 服务器,无需使用 --insecure 标志,如果您在 web 浏览器中访问该网站,它应该在 URL 旁边显示一个挂锁 (🔒) 符号。

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,以及如何配置它使用 Let's Encrypt 签署的证书,使用 DNS-01 协议和 Route53 DNS。您已经学习了有关服务帐户的 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 Web UI 手动删除。

下一步

📖 阅读其他cert-manager 教程入门指南.

📖 了解更多关于使用 Route53 DNS 配置 cert-manager ACME 发行者