Записи DNS не создаются для входных ресурсов

#azure #kubernetes #azure-aks

#azure #kubernetes #azure-aks

Вопрос:

Моя конфигурация:

 apiVersion: v1
kind: ServiceAccount
metadata:
  name: external-dns
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: external-dns
rules:
- apiGroups: [""]
  resources: ["services"]
  verbs: ["get","watch","list"]
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get","watch","list"]
- apiGroups: ["extensions"] 
  resources: ["ingresses"] 
  verbs: ["get","watch","list"]
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["list"]
- apiGroups: ["networking.istio.io"]
  resources: ["gateways"]
  verbs: ["get","watch","list"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
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: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: external-dns
  namespace: kube-system
spec:
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: external-dns
    spec:
      serviceAccountName: external-dns
      containers:
      - name: external-dns
        image: registry.opensource.zalan.do/teapot/external-dns:latest
        args:
        - --source=ingress
        - --source=istio-gateway
        - --domain-filter=xxx
        - --policy=upsert-only
        - --provider=azure
        volumeMounts:
        - name: azure-config-file
          mountPath: /etc/kubernetes
          readOnly: true
      volumes:
      - name: azure-config-file
        secret:
          secretName: azuredns-config
  

Объекты шлюза Istio анализируются, и создаются записи DNS (это произошло некоторое время назад, сейчас я ничего не вижу в журнале). По какой-то причине входные записи не анализируются. Я пробовал добавлять --source=service и аннотировать сервис с помощью: external-dns.alpha.kubernetes.io/hostname: my.host.name , тоже безрезультатно.

Есть идеи? Это выглядит нормально, но почему-то не работает. Вход работает, cert-manager создает сертификат, если я вручную создаю запись DNS, вход работает нормально.

Ответ №1:

Я предлагаю запустить https://github.com/kubernetes-incubator/external-dns с соответствующей ролью поставщика облачных услуг, например, ролью IAM в AWS, которая позволяет изменять записи Route53.

Для Azure: https://github.com/kubernetes-incubator/external-dns/blob/master/docs/tutorials/azure.md

При запуске убедитесь, что у вас включен входной источник: https://github.com/helm/charts/blob/master/stable/external-dns/values.yaml#L8-L12

В нем есть ведение журнала отладки, поэтому вы можете точно проверить, что происходит с вашей записью.

Комментарии:

1. вы упомянули, что записи istio создаются при запуске кластера, возможно, они являются частью начальной загрузки и создаются другим механизмом (terraform?)

2. пример аргументов из моего развертывания: --log-level=debug --policy=upsert-only --provider=aws --registry=txt --txt-owner-id=my.k8s.cluster --source=service --source=ingress

3. нет, они создаются внешним dns, они имеют внешнюю аннотацию dnd txt

4. тогда роль правильная. Попробуйте включить ведение журнала отладки, добавьте оба --source флага и посмотрите, попадает ли ваша запись хотя бы в поле зрения external-dns

5. Для входа он не ищет аннотацию внешнего dns, он берет имя хоста из самого входа: spec: rules: - host: <hostname-which-goes-to-dns>

Ответ №2:

проблема возникла из-за того, что nginx-ingress не опубликовал свой IP-адрес в поле состояния входных ресурсов. Проблема GH: https://github.com/kubernetes-incubator/external-dns/issues/456

 --log-level=debug
  

помогло определить проблему. Исправлено путем добавления этого в развертывание контроллера входа nginx:

 - --publish-service=kube-system/nginx-ingress-controller
- --update-status