为您的 AWS Kubernetes 集群处理 DNS 和 SSL/TLS

将您的 Kubernetes 服务连接到 AWS 上的域的简要说明——因此,您已经在 AWS 上创建了一个 Kubernetes 集群,在其上部署了一些应用程序,并最终准备好向世界展示您所构建的东西。但是您需要考虑将域连接到您的应用程序并设置 SSL/TLS。我也遇到过类似的情况……

为您的 AWS Kubernetes 集群处理 DNS 和 SSL/TLS

将 Kubernetes 服务连接到 AWS 上的域的快速概述

因此,您已经在 AWS 上创建了一个 Kubernetes 集群,在其上部署了一些应用程序,并最终准备好向全世界展示您所构建的东西。但是您需要考虑将域连接到您的应用程序并设置 SSL/TLS。我以前也遇到过类似的情况,所以我写了这篇速记,这样你就不必从 Kubernetes 的兔子洞里找答案了。

我将为 SSL/TLS 设置写一篇单独的文章并将其链接到此处,这样这篇文章就不会太长。

将您的域迁移到 AWS Route53

Route53 是 AWS 提供的 DNS 服务。它的工作是将请求路由到您的域和子域到附加到它们的 IP。

您可能已经通过 Route53 注册了您的域,在这种情况下,您无需在此处执行任何操作。但是,如果您通过其他提供商购买您的域名,例如Namecheap 然后您需要将其转移到 Route53 以管理您的 DNS 记录和路由流量。

要通过 AWS 控制台执行此操作,请导航到 AWS Route53 并创建一个托管区域。托管区域保存有关您希望如何路由流量的记录。您将被要求提供一个域,例如example.com 创建托管区域时,但如果您不想迁移整个域,也可以放入像 test.example.com 这样的子域。

您的新托管区域将具有包含 4 个服务器列表的 NS 记录。在当前所在的提供商中进入您的域的管理部分。它将具有添加自定义 DNS 的部分。将 4 个名称服务器中的每一个复制到自定义 DNS 部分。你完成了。现在,您最多需要等待 24 小时才能进行迁移。

使用 Kubernetes 集群配置 ExternalDNS

为什么我们将您的域迁移到 Route53?因为我们希望在您的 DNS 上为您拥有的所有公开的 Kubernetes 服务和入口自动创建新记录,如果您的 DNS 位于 AWS 上,这样做会更容易。 ExternalDNS 将为我们做这件事。它基本上是我们将在您的集群上部署的一个 pod。它将在 route53 中查找需要 DNS 记录的资源列表并自动创建这些记录。[0]

这是 ExternalDNS 的 K8S 模板:

apiVersion: v1
kind: ServiceAccount
metadata:
name: external-dns
# If you're using Amazon EKS with IAM Roles for Service Accounts, specify the following annotation.
# Otherwise, you may safely omit it.
annotations:
# Substitute your account ID and IAM service role name below.
eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT-ID:role/IAM-SERVICE-ROLE-NAME
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: external-dns
rules:
- apiGroups: [""]
resources: ["services","endpoints","pods"]
verbs: ["get","watch","list"]
- apiGroups: ["extensions","networking.k8s.io"]
resources: ["ingresses"]
verbs: ["get","watch","list"]
- apiGroups: [""]
resources: ["nodes"]
verbs: ["list","watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: external-dns-viewer
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: external-dns
subjects:
- kind: ServiceAccount
name: external-dns
namespace: default
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: external-dns
spec:
strategy:
type: Recreate
selector:
matchLabels:
app: external-dns
template:
metadata:
labels:
app: external-dns
# If you're using kiam or kube2iam, specify the following annotation.
# Otherwise, you may safely omit it.
annotations:
iam.amazonaws.com/role: arn:aws:iam::ACCOUNT-ID:role/IAM-SERVICE-ROLE-NAME
spec:
serviceAccountName: external-dns
containers:
- name: external-dns
image: k8s.gcr.io/external-dns/external-dns:v0.7.6
args:
- --source=service
- --source=ingress
- --domain-filter=external-dns-test.my-org.com # will make ExternalDNS see only the hosted zones matching provided domain, omit to process all available hosted zones
- --provider=aws
- --policy=upsert-only # would prevent ExternalDNS from deleting any records, omit to enable full synchronization
- --aws-zone-type=public # only look at public hosted zones (valid values are public, private or no value for both)
- --registry=txt
- --txt-owner-id=my-hostedzone-identifier
securityContext:
fsGroup: 65534 # For ExternalDNS to be able to read Kubernetes and AWS token files

您会注意到有几行粗体表示 AWS IAM 角色 Arn 的注释。 IAM 角色将由 ExternalDNS 承担。它应该有权将记录添加到您在 Route53 上的托管区域。以下是创建该角色的方法。

将此内联策略保存到 json 文件。该策略为将代入 Route53 托管区域的角色提供权限。

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"route53:ChangeResourceRecordSets"
],
"Resource": [
"arn:aws:route53:::hostedzone/*"
]
},
{
"Effect": "Allow",
"Action": [
"route53:ListHostedZones",
"route53:ListResourceRecordSets"
],
"Resource": [
"*"
]
}
]
}

使用 AWS CLI 创建角色。

aws iam create-role — role-name role-example — assume-role-policy-document path/to/policy

将上述命令返回的 Arn 替换为 ExternalDNS 模板中的粗体部分并部署 .

kubectl -n external-dns apply template.yaml

好的,我们已经完成了 ExternalDNS 的设置。现在将为您部署的每个入口或服务自动创建 DNS 记录。

它是如何工作的一个例子

这是指向 mynginx.your-domain.com 的 nginx 服务的模板。

apiVersion: v1
kind: Service
metadata:
name: nginx
annotations:
external-dns.alpha.kubernetes.io/hostname: mynginx.your-domain.com
spec:
type: LoadBalancer
ports:
- port: 80
name: http
targetPort: 80
selector:
app: nginx
---apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
name: http

要进行测试,您可以使用 kubectl apply -f [your-file-name.yaml] 应用上面的模板,然后检查您在 route53 中托管区域下的记录。您会发现自动为 mynginx.your-domain.com 创建了一条新的 A 记录,指向该 nginx 服务的 DNS 名称。

这就是连接您的域。总而言之,我们在您的集群上部署了 ExternalDNS,以便它可以自动将指向集群上服务和入口的新记录添加到托管在 Route53 上的域的 DNS 中。我们还将您的域迁移到 Route53,以便它可以由 AWS 管理,并创建了一个新角色来为 Route53 授予 ExternalDNS 权限。接下来,您需要为您的服务设置 TLS/SSL。我将在下一篇文章中讨论这个问题并在此处链接。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2022年5月13日
下一篇 2022年5月13日

相关推荐