Как добавить частную зону DNS в kube-dns в GKE

Я создал кластер k8 в GKE.

У меня есть реестр докеров, созданный в Artifactory, этот артефакт размещен на AWS. У меня есть запись route53 для docker-repo.aws.abc.com в aws.abc.com размещенной зоне в AWS

Теперь мне нужно настроить свой кластер так, чтобы образы докеров извлекались из артефакта.

Я просмотрел документацию и понял, что мне придется добавить stubDomain в мои конфигурационные карты kube-dns.

kubectl edit cm kube-dns -n kube-system
apiVersion: v1
data:
  stubDomains: |
    {"aws.abc.com" : ["XX.XX.XX.XX"]}
kind: ConfigMap
metadata:
  creationTimestamp: 2019-05-21T14:30:15Z
  labels:
    addonmanager.kubernetes.io/mode: EnsureExists
  name: kube-dns
  namespace: kube-system
  resourceVersion: "7669"
  selfLink: /api/v1/namespaces/kube-system/configmaps/kube-dns
  uid: f378aa5f-7bd4-11e9-9df2-42010aa93d03

Однако команда docker pull по-прежнему не работает.

docker pull docker-repo.aws.abc.com/abc-sampleapp-java/abc-service:V-57bc9c9-201

Error response from daemon: Get https://docker-repo.aws.abc.com/v2/: dial tcp: lookup docker-dev-repo.aws.abc.com on 169.254.169.254:53: no such host

Примечание. Когда я делаю запись в файле / etc / hosts на рабочих узлах, docker pull работает нормально.


person Sunil Gajula    schedule 21.05.2019    source источник


Ответы (1)


При извлечении образа из реестра при запуске модуля используются другие настройки DNS, чем при вызове DNS из модулей внутри кластера.

Когда Kubernetes запускает новый модуль, он направляет его на узел, а затем агент на узле с именем kubelet вызывает механизм контейнера (Docker), чтобы загрузить образ и запустить его с заданной конфигурацией.

Docker использует системный DNS для разрешения адреса реестра, потому что он работает прямо в нашей хост-системе, а не в Kubernetes, поэтому любые настройки DNS не повлияют на разрешение DNS на этапе загрузки образа. https://github.com/kubernetes/kubernetes/issues/8735 - обсуждение об этом на Github.

Если мы хотим изменить настройки DNS и переопределить IP-адрес реестра, чтобы использовать его на этапе загрузки изображения, мы должны установить его в хост-системе. В конфигурации нам нужно изменить настройки DNS на всех ваших узлах в кластере. Самый простой способ сделать это - использовать файл / etc / hosts и добавить запись с вашим собственным IP-адресом, например 192.168.1.124 example.com.

После этих изменений Docker на узлах будет использовать запись из / etc / hosts для вашего реестра вместо глобальных записей DNS, потому что этот файл имеет более высокий приоритет, и вы сможете запускать модули с вашим образом.

Чтобы обновить файл хоста. вы можете использовать DeamonSet с контекстом безопасности в качестве привилегированного, см. ниже:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: hosts-fix-script
  namespace: kube-system
  labels:
    app: hosts-fix-script
spec:
  selector:
    matchLabels:
      name: hosts-fix
  template:
    metadata:
      labels:
        name: hosts-fix
    spec:
      hostPID: true
      containers:
      - name: hosts-fix-script
        image: gcr.io/google-containers/startup-script:v1
        imagePullPolicy: Always
        securityContext:
          privileged: true
        env:
        - name: STARTUP_SCRIPT
          value: |
            #!/bin/bash
                echo "10.0.0.11 onprem.registry" >> /etc/hosts
            echo 'Done'

вам нужно запустить kubectl apply -f

person Sunil Gajula    schedule 31.05.2019