我按照这个来部署 K8s ExternalDNS 并做了以下事情:
- 创建了 Azure 应用服务域和 DNS 区域(即
demo.com
) - 为 AKS 群集启用托管标识
- 为 DNS 区域的 AKS 托管标识分配了参与者角色
- 为 ExternalDNS 创建了 K8s 密钥(使用
azure.json
) - 在默认 K8s (AKS) 命名空间中部署 ExternalDNS
host: api.demo.com
使用路径和创建了 2 个入口/foo
&/bar
(仅供参考,AKS AGIC 已启用,并且“静态公共 IP”正在被应用程序网关使用)
如果我理解正确,ExternalDNS 应该在 Azure DNS 区域中创建记录集,并且入口应该可以工作。但是 ExternalDNS 没有创建记录集(入口不起作用)。
仅供参考,如果我执行以下操作,那么一切正常
- 创建一个别名记录集,
"Alias type: Azure resource"
它指向应用程序网关使用的“静态公共 IP” - 分别用
[Route("api/foo")]
&注释的控制器[Route("api/bar")]
host: demo.com
使用和路径创建 2 个入口api/foo/*
&api/bar/*
- 为每个入口使用注释:(
appgw.ingress.kubernetes.io/backend-path-prefix: "/foo/"
与 Bar API 相同"/bar/"
:)
但是,我想要的是托管我的 API api.demo.com
(还有 SSL 和 Let's Encrypt)
foo-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: foo-api
namespace: default
annotations:
kubernetes.io/ingress.class: azure/application-gateway
appgw.ingress.kubernetes.io/ssl-redirect: "false"
appgw.ingress.kubernetes.io/backend-path-prefix: "/foo/"
spec:
rules:
- host: api.demo.com
http:
paths:
- path: /foo/*
pathType: Prefix
backend:
service:
name: foo-api
port:
number: 80
external-dns.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: external-dns
---
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"]
---
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
spec:
serviceAccountName: external-dns
containers:
- name: external-dns
image: k8s.gcr.io/external-dns/external-dns:v0.8.0
args:
- --source=service
- --source=ingress
- --domain-filter=demo.com
- --provider=azure
- --azure-resource-group=my-poc-rg
volumeMounts:
- name: azure-config-file
mountPath: /etc/kubernetes
readOnly: true
volumes:
- name: azure-config-file
secret:
secretName: azure-config-file