6.3. 外部 DNS Operator
6.3.1. 外部 DNS Operator 发行注记
External DNS Operator 部署并管理 ExternalDNS
,以便为从外部 DNS 供应商到 OpenShift Container Platform 的服务和路由提供名称解析。
External DNS Operator 仅在 x86_64
架构上被支持。
本发行注记介绍了 OpenShift Container Platform 中外部 DNS Operator 的开发。
6.3.1.1. 外部 DNS Operator 1.2.0
以下公告可用于外部 DNS Operator 版本 1.2.0 :
6.3.1.1.1. 新功能
- External DNS Operator 现在支持 AWS 共享 VPC。如需更多信息,请参阅使用共享 VPC 在不同的 AWS 帐户中创建 DNS 记录。
6.3.1.1.2. 程序错误修复
-
操作对象的更新策略从
Rolling
改为Recreate
。(OCPBUGS-3630)
6.3.1.2. 外部 DNS Operator 1.1.1
以下公告可用于外部 DNS Operator 版本 1.1.1:
6.3.1.3. 外部 DNS Operator 1.1.0
此发行版本包含来自上游项目 0.13.1 版本的操作对象的变基。以下公告可用于外部 DNS Operator 版本 1.1.0:
6.3.1.3.1. 程序错误修复
-
在以前的版本中,ExternalDNS Operator 为卷强制有一个空的
defaultMode
值,这会导致因为与 OpenShift API 冲突而造成恒定的更新。现在,defaultMode
值不会被强制,操作对象部署不会持续更新。(OCPBUGS-2793)
6.3.1.4. 外部 DNS Operator 1.0.1
以下公告可用于外部 DNS Operator 版本 1.0.1:
6.3.1.5. 外部 DNS Operator 1.0.0
以下公告可用于 External DNS Operator 版本 1.0.0:
6.3.1.5.1. 程序错误修复
- 在以前的版本中,External DNS Operator 在 ExternalDNS 操作对象 pod 部署中发出有关违反 restricted SCC 策略的警告。这个问题已解决。(BZ#2086408)
6.3.2. 了解外部 DNS Operator
External DNS Operator 部署并管理 ExternalDNS
,以便为从外部 DNS 供应商到 OpenShift Container Platform 的服务和路由提供名称解析。
6.3.2.1. 外部 DNS Operator
External DNS Operator 从 olm.openshift.io
API 组实现外部 DNS API。External DNS Operator 更新服务、路由和外部 DNS 供应商。
先决条件
-
已安装
yq
CLI 工具。
流程
您可以根据 OperatorHub 的要求部署外部 DNS Operator。部署外部 DNS Operator 会创建一个 Subscription
对象。
运行以下命令,检查安装计划的名称:
$ oc -n external-dns-operator get sub external-dns-operator -o yaml | yq '.status.installplan.name'
输出示例
install-zcvlr
运行以下命令,检查安装计划的状态是否为
Complete
:$ oc -n external-dns-operator get ip <install_plan_name> -o yaml | yq '.status.phase'
输出示例
Complete
运行以下命令,查看
external-dns-operator
部署的状态:$ oc get -n external-dns-operator deployment/external-dns-operator
输出示例
NAME READY UP-TO-DATE AVAILABLE AGE external-dns-operator 1/1 1 1 23h
6.3.2.2. 查看外部 DNS Operator 日志
您可以使用 oc logs
命令查看外部 DNS Operator 日志。
流程
运行以下命令,查看外部 DNS Operator 的日志:
$ oc logs -n external-dns-operator deployment/external-dns-operator -c external-dns-operator
6.3.2.2.1. 外部 DNS Operator 域名限制
External DNS Operator 使用 TXT registry,它为 TXT 记录添加前缀。这可减少 TXT 记录的域名的最大长度。没有对应的 TXT 记录时无法出现 DNS 记录,因此 DNS 记录的域名必须遵循与 TXT 记录相同的限制。例如,一个 <domain_name_from_source>
DNS 记录会导致一个 external-dns-<record_type>-<domain_name_from_source>
TXT 记录。
外部 DNS Operator 生成的 DNS 记录的域名有以下限制:
记录类型 | 字符数 |
---|---|
CNAME | 44 |
AzureDNS 上的通配符 CNAME 记录 | 42 |
A | 48 |
AzureDNS 上的通配符 A 记录 | 46 |
如果生成的域名超过任何域名限制,则外部 DNS Operator 日志中会出现以下错误:
time="2022-09-02T08:53:57Z" level=error msg="Failure in zone test.example.io. [Id: /hostedzone/Z06988883Q0H0RL6UMXXX]" time="2022-09-02T08:53:57Z" level=error msg="InvalidChangeBatch: [FATAL problem: DomainLabelTooLong (Domain label is too long) encountered with 'external-dns-a-hello-openshift-aaaaaaaaaa-bbbbbbbbbb-ccccccc']\n\tstatus code: 400, request id: e54dfd5a-06c6-47b0-bcb9-a4f7c3a4e0c6"
6.3.3. 安装 External DNS Operator
您可以在云供应商环境中安装外部 DNS Operator,如 AWS、Azure 和 GCP。
6.3.3.1. 使用 OperatorHub 安装 External DNS Operator
您可以使用 OpenShift Container Platform OperatorHub 安装外部 DNS Operator。
流程
-
在 OpenShift Container Platform Web 控制台中点 Operators
OperatorHub。 - 点 External DNS Operator。您可以使用 Filter by keyword 文本框或过滤器列表从 Operator 列表中搜索 External DNS Operator。
-
选择
external-dns-operator
命名空间。 - 在 External DNS Operator 页面中,点 Install。
在 Install Operator 页面中,确保选择了以下选项:
- 将频道更新为 stable-v1。
- 安装模式为 A specific name on the cluster。
-
安装的命名空间为
external-dns-operator
。如果命名空间external-dns-operator
不存在,它会在 Operator 安装过程中创建。 - 将 Approval Strategy 选为 Automatic 或 Manual。默认情况下,批准策略设置为 Automatic。
- 点 Install。
如果选择了 Automatic 更新,Operator Lifecycle Manager(OLM)将自动升级 Operator 的运行实例,而无需任何干预。
如果选择 手动 更新,则 OLM 会创建一个更新请求。作为集群管理员,您必须手动批准该更新请求,才可将 Operator 更新至新版本。
验证
验证 External DNS Operator 是否在 Installed Operators 仪表板上显示 Status 为 Succeeded。
6.3.3.2. 使用 CLI 安装 External DNS Operator
您可以使用 CLI 安装 External DNS Operator
前提条件
-
以具有
cluster-admin
权限的用户身份登录 OpenShift Container Platform Web 控制台。 -
已登陆到 OpenShift CLI (
oc
)。
流程
创建一个
Namespace
对象:创建定义
Namespace
对象的 YAML 文件:namespace.yaml
文件示例apiVersion: v1 kind: Namespace metadata: name: external-dns-operator
运行以下命令来创建
Namespace
对象:$ oc apply -f namespace.yaml
创建一个
OperatorGroup
对象:创建定义
OperatorGroup
对象的 YAML 文件:operatorgroup.yaml
文件示例apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: external-dns-operator namespace: external-dns-operator spec: upgradeStrategy: Default targetNamespaces: - external-dns-operator
运行以下命令来创建
OperatorGroup
对象:$ oc apply -f operatorgroup.yaml
创建
Subscription
对象:创建定义
Subscription
对象的 YAML 文件:subscription.yaml
文件示例apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: external-dns-operator namespace: external-dns-operator spec: channel: stable-v1 installPlanApproval: Automatic name: external-dns-operator source: redhat-operators sourceNamespace: openshift-marketplace
运行以下命令来创建
Subscription
对象:$ oc apply -f subscription.yaml
验证
运行以下命令,从订阅获取安装计划的名称:
$ oc -n external-dns-operator \ get subscription external-dns-operator \ --template='{{.status.installplan.name}}{{"\n"}}'
运行以下命令,验证安装计划的状态是否为
Complete
:$ oc -n external-dns-operator \ get ip <install_plan_name> \ --template='{{.status.phase}}{{"\n"}}'
运行以下命令,验证
external-dns-operator
pod 的状态是否为Running
:$ oc -n external-dns-operator get pod
输出示例
NAME READY STATUS RESTARTS AGE external-dns-operator-5584585fd7-5lwqm 2/2 Running 0 11m
运行以下命令,验证订阅的目录源是否为
redhat-operators
:$ oc -n external-dns-operator get subscription
输出示例
NAME PACKAGE SOURCE CHANNEL external-dns-operator external-dns-operator redhat-operators stable-v1
运行以下命令检查
external-dns-operator
版本:$ oc -n external-dns-operator get csv
输出示例
NAME DISPLAY VERSION REPLACES PHASE external-dns-operator.v<1.y.z> ExternalDNS Operator <1.y.z> Succeeded
6.3.4. 外部 DNS Operator 配置参数
External DNS Operator 包括以下配置参数。
6.3.4.1. 外部 DNS Operator 配置参数
External DNS Operator 包括以下配置参数:
参数 | 描述 |
---|---|
| 启用云供应商的类型。 spec: provider: type: AWS 1 aws: credentials: name: aws-access-key 2 |
|
允许您根据域指定 DNS 区域。如果没有指定区, zones:
- "myzoneid" 1
|
|
允许您根据域指定 AWS 区域。如果没有指定域, domains: - filterType: Include 1 matchType: Exact 2 name: "myzonedomain1.com" 3 - filterType: Include matchType: Pattern 4 pattern: ".*\\.otherzonedomain\\.com" 5 |
|
允许您指定 DNS 记录、 source: 1 type: Service 2 service: serviceType:3 - LoadBalancer - ClusterIP labelFilter: 4 matchLabels: external-dns.mydomain.org/publish: "yes" hostnameAnnotation: "Allow" 5 fqdnTemplate: - "{{.Name}}.myzonedomain.com" 6
source: type: OpenShiftRoute 1 openshiftRouteOptions: routerName: default 2 labelFilter: matchLabels: external-dns.mydomain.org/publish: "yes" |
6.3.5. 在 AWS 上创建 DNS 记录
您可以使用 External DNS Operator 在 AWS 和 AWS GovCloud 上创建 DNS 记录。
6.3.5.1. 使用 Red Hat External DNS Operator 在 AWS 公共托管区中创建 DNS 记录
您可以使用 Red Hat External DNS Operator 在 AWS 公共托管区上创建 DNS 记录。您可以使用相同的说明在 AWS GovCloud 的托管区上创建 DNS 记录。
流程
检查用户。用户必须有权访问
kube-system
命名空间。如果没有凭证,您可以从kube-system
命名空间中获取凭证,以使用云供应商客户端:$ oc whoami
输出示例
system:admin
从
kube-system
命名空间中存在的 aws-creds secret 中获取值。$ export AWS_ACCESS_KEY_ID=$(oc get secrets aws-creds -n kube-system --template={{.data.aws_access_key_id}} | base64 -d) $ export AWS_SECRET_ACCESS_KEY=$(oc get secrets aws-creds -n kube-system --template={{.data.aws_secret_access_key}} | base64 -d)
获取路由来检查域:
$ oc get routes --all-namespaces | grep console
输出示例
openshift-console console console-openshift-console.apps.testextdnsoperator.apacshift.support console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.testextdnsoperator.apacshift.support downloads http edge/Redirect None
获取 dns zones 列表以查找与之前找到的路由域对应的 dns 区域:
$ aws route53 list-hosted-zones | grep testextdnsoperator.apacshift.support
输出示例
HOSTEDZONES terraform /hostedzone/Z02355203TNN1XXXX1J6O testextdnsoperator.apacshift.support. 5
为
路由
源创建ExternalDNS
资源:$ cat <<EOF | oc create -f - apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-aws 1 spec: domains: - filterType: Include 2 matchType: Exact 3 name: testextdnsoperator.apacshift.support 4 provider: type: AWS 5 source: 6 type: OpenShiftRoute 7 openshiftRouteOptions: routerName: default 8 EOF
- 1
- 定义外部 DNS 资源的名称。
- 2
- 默认情况下,所有托管区都被选为潜在的目标。您可以包括需要的托管区。
- 3
- 目标区的域匹配必须是完全准确的(与正则表达式匹配不同)。
- 4
- 指定您要更新的区域的确切域。路由的主机名必须是指定域的子域。
- 5
- 定义
AWS Route53
DNS 供应商。 - 6
- 定义 DNS 记录源的选项。
- 7
- 定义 OpenShift
路由
资源,作为在之前指定的 DNS 供应商中创建的 DNS 记录来源。 - 8
- 如果源是
OpenShiftRoute
,您可以传递 OpenShift Ingress Controller 名称。外部 DNS Operator 在创建 CNAME 记录时,选择该路由器的规范主机名作为目标。
使用以下命令,检查为 OCP 路由创建的记录:
$ aws route53 list-resource-record-sets --hosted-zone-id Z02355203TNN1XXXX1J6O --query "ResourceRecordSets[?Type == 'CNAME']" | grep console
6.3.5.2. 使用共享 VPC 在不同的 AWS 帐户中创建 DNS 记录
您可以使用 ExternalDNS Operator 使用共享 Virtual Private Cloud (VPC)在不同的 AWS 帐户中创建 DNS 记录。通过使用共享 VPC,组织可将资源从多个项目连接到通用 VPC 网络。然后,机构可以使用 VPC 共享在多个 AWS 帐户间使用单个 Route 53 实例。
先决条件
- 您已创建了两个 Amazon AWS 帐户:一个 VPC 和配置了 Route 53 私有托管区(帐户 A),另一个用于安装集群(帐户 B)。
- 您已创建了具有帐户 B 的相应权限的 IAM 策略和 IAM 角色,以便在帐户 A 的 Route 53 托管区中创建 DNS 记录。
- 您已在帐户 B 上安装了帐户 A 的集群。
- 您已在帐户 B 的集群中安装了 ExternalDNS Operator。
流程
运行以下命令,获取您创建的 IAM 角色的 Role ARN,以允许帐户 B 访问帐户 A 的 Route 53 托管区:
$ aws --profile account-a iam get-role --role-name user-rol1 | head -1
输出示例
ROLE arn:aws:iam::1234567890123:role/user-rol1 2023-09-14T17:21:54+00:00 3600 / AROA3SGB2ZRKRT5NISNJN user-rol1
运行以下命令,找到用于帐户 A 凭证的私有托管区:
$ aws --profile account-a route53 list-hosted-zones | grep testextdnsoperator.apacshift.support
输出示例
HOSTEDZONES terraform /hostedzone/Z02355203TNN1XXXX1J6O testextdnsoperator.apacshift.support. 5
运行以下命令来创建
ExternalDNS
对象:$ cat <<EOF | oc create -f - apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-aws spec: domains: - filterType: Include matchType: Exact name: testextdnsoperator.apacshift.support provider: type: AWS aws: assumeRole: arn: arn:aws:iam::12345678901234:role/user-rol1 1 source: type: OpenShiftRoute openshiftRouteOptions: routerName: default EOF
- 1
- 指定 Role ARN,以便在帐户 A 中创建 DNS 记录。
使用以下命令,检查为 OpenShift Container Platform (OCP) 路由创建的记录:
$ aws --profile account-a route53 list-resource-record-sets --hosted-zone-id Z02355203TNN1XXXX1J6O --query "ResourceRecordSets[?Type == 'CNAME']" | grep console-openshift-console
6.3.6. 在 Azure 上创建 DNS 记录
您可以使用外部 DNS Operator 在 Azure 上创建 DNS 记录。
不支持在支持 Microsoft Entra Workload ID 的集群或在 Microsoft Azure Government (MAG) 区域中运行的集群中使用 External DNS Operator。
6.3.6.1. 在 Azure 公共 DNS 区域中创建 DNS 记录
您可以使用 External DNS Operator 在 Azure 公共 DNS 区域上创建 DNS 记录。
先决条件
- 您必须具有管理员特权。
-
admin
用户必须有权访问kube-system
命名空间。
流程
运行以下命令,从
kube-system
命名空间中获取凭证以使用云供应商客户端:$ CLIENT_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_client_id}} | base64 -d) $ CLIENT_SECRET=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_client_secret}} | base64 -d) $ RESOURCE_GROUP=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_resourcegroup}} | base64 -d) $ SUBSCRIPTION_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_subscription_id}} | base64 -d) $ TENANT_ID=$(oc get secrets azure-credentials -n kube-system --template={{.data.azure_tenant_id}} | base64 -d)
运行以下命令来登录到 Azure:
$ az login --service-principal -u "${CLIENT_ID}" -p "${CLIENT_SECRET}" --tenant "${TENANT_ID}"
运行以下命令来获取路由列表:
$ oc get routes --all-namespaces | grep console
输出示例
openshift-console console console-openshift-console.apps.test.azure.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.azure.example.com downloads http edge/Redirect None
运行以下命令,获取 DNS 区域列表:
$ az network dns zone list --resource-group "${RESOURCE_GROUP}"
创建一个 YAML 文件,如
external-dns-sample-azure.yaml
,该文件定义ExternalDNS
对象:external-dns-sample-azure.yaml
文件示例apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-azure 1 spec: zones: - "/subscriptions/1234567890/resourceGroups/test-azure-xxxxx-rg/providers/Microsoft.Network/dnszones/test.azure.example.com" 2 provider: type: Azure 3 source: openshiftRouteOptions: 4 routerName: default 5 type: OpenShiftRoute 6
运行以下命令,检查为 OpenShift Container Platform 路由创建的 DNS 记录:
$ az network dns record-set list -g "${RESOURCE_GROUP}" -z test.azure.example.com | grep console
注意要在私有 Azure DNS 上的私有托管区上创建记录,您需要在
zones
字段中指定私有区,用于在ExternalDNS
容器参数中将供应商类型填充到azure-private-dns
。
6.3.7. 在 GCP 上创建 DNS 记录
您可以使用 External DNS Operator 在 Google Cloud Platform (GCP) 上创建 DNS 记录。
不支持在启用了 GCP Workload Identity 的集群上使用 External DNS Operator。有关 GCP Workload Identity 的更多信息,请参阅 GCP Workload Identity。
6.3.7.1. 在 GCP 公共管理区上创建 DNS 记录
您可以使用 External DNS Operator 在 GCP 公共受管区上创建 DNS 记录。
先决条件
- 您必须具有管理员特权。
流程
运行以下命令,将
gcp-credentials
secret 复制到encoded-gcloud.json
文件中:$ oc get secret gcp-credentials -n kube-system --template='{{$v := index .data "service_account.json"}}{{$v}}' | base64 -d - > decoded-gcloud.json
运行以下命令导出 Google 凭证:
$ export GOOGLE_CREDENTIALS=decoded-gcloud.json
使用以下命令激活您的帐户:
$ gcloud auth activate-service-account <client_email as per decoded-gcloud.json> --key-file=decoded-gcloud.json
运行以下命令来设置项目:
$ gcloud config set project <project_id as per decoded-gcloud.json>
运行以下命令来获取路由列表:
$ oc get routes --all-namespaces | grep console
输出示例
openshift-console console console-openshift-console.apps.test.gcp.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.gcp.example.com downloads http edge/Redirect None
运行以下命令来获取受管区列表:
$ gcloud dns managed-zones list | grep test.gcp.example.com
输出示例
qe-cvs4g-private-zone test.gcp.example.com
创建一个 YAML 文件,如
external-dns-sample-gcp.yaml
,该文件定义ExternalDNS
对象:external-dns-sample-gcp.yaml
文件示例apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-gcp 1 spec: domains: - filterType: Include 2 matchType: Exact 3 name: test.gcp.example.com 4 provider: type: GCP 5 source: openshiftRouteOptions: 6 routerName: default 7 type: OpenShiftRoute 8
运行以下命令,检查为 OpenShift Container Platform 路由创建的 DNS 记录:
$ gcloud dns record-sets list --zone=qe-cvs4g-private-zone | grep console
6.3.8. 在 Infoblox 上创建 DNS 记录
您可以使用 External DNS Operator 在 Infoblox 上创建 DNS 记录。
6.3.8.1. 在 Infoblox 上的公共 DNS 区域中创建 DNS 记录
您可以使用 External DNS Operator 在 Infoblox 上的公共 DNS 区域上创建 DNS 记录。
先决条件
-
您可以访问 OpenShift CLI(
oc
)。 - 您可以访问 Infoblox UI。
流程
运行以下命令,使用 Infoblox 凭证创建
secret
对象:$ oc -n external-dns-operator create secret generic infoblox-credentials --from-literal=EXTERNAL_DNS_INFOBLOX_WAPI_USERNAME=<infoblox_username> --from-literal=EXTERNAL_DNS_INFOBLOX_WAPI_PASSWORD=<infoblox_password>
运行以下命令来获取路由列表:
$ oc get routes --all-namespaces | grep console
输出示例
openshift-console console console-openshift-console.apps.test.example.com console https reencrypt/Redirect None openshift-console downloads downloads-openshift-console.apps.test.example.com downloads http edge/Redirect None
创建一个 YAML 文件,如
external-dns-sample-infoblox.yaml
,该文件定义ExternalDNS
对象:external-dns-sample-infoblox.yaml
文件示例apiVersion: externaldns.olm.openshift.io/v1beta1 kind: ExternalDNS metadata: name: sample-infoblox 1 spec: provider: type: Infoblox 2 infoblox: credentials: name: infoblox-credentials gridHost: ${INFOBLOX_GRID_PUBLIC_IP} wapiPort: 443 wapiVersion: "2.3.1" domains: - filterType: Include matchType: Exact name: test.example.com source: type: OpenShiftRoute 3 openshiftRouteOptions: routerName: default 4
运行以下命令,在 Infoblox 上创建
ExternalDNS
资源:$ oc create -f external-dns-sample-infoblox.yaml
通过 Infoblox UI,检查为
console
路由创建的 DNS 记录:-
点 Data Management
DNS Zones。 - 选择区域名称。
-
点 Data Management
6.3.9. 在外部 DNS Operator 上配置集群范围代理
配置集群范围代理后,Operator Lifecycle Manager (OLM) 会触发对使用 HTTP_PROXY
、HTTPS_PROXY
和 NO_PROXY
环境变量的新内容的所有部署的 Operator 的自动更新。
6.3.9.1. 信任集群范围代理的证书颁发机构
您可以将外部 DNS Operator 配置为信任集群范围代理的证书颁发机构。
流程
运行以下命令,创建配置映射以在
external-dns-operator
命名空间中包含 CA 捆绑包:$ oc -n external-dns-operator create configmap trusted-ca
要将可信 CA 捆绑包注入配置映射中,请运行以下命令将
config.openshift.io/inject-trusted-cabundle=true
标签添加到配置映射中:$ oc -n external-dns-operator label cm trusted-ca config.openshift.io/inject-trusted-cabundle=true
运行以下命令更新外部 DNS Operator 的订阅:
$ oc -n external-dns-operator patch subscription external-dns-operator --type='json' -p='[{"op": "add", "path": "/spec/config", "value":{"env":[{"name":"TRUSTED_CA_CONFIGMAP_NAME","value":"trusted-ca"}]}}]'
验证
部署外部 DNS Operator 后,运行以下命令来验证可信 CA 环境变量是否已添加到
external-dns-operator
部署中:$ oc -n external-dns-operator exec deploy/external-dns-operator -c external-dns-operator -- printenv TRUSTED_CA_CONFIGMAP_NAME
输出示例
trusted-ca