Как добавить приватную зону DNS в kube-dns в GKE - PullRequest
0 голосов
/ 21 мая 2019

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

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

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

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

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 работает нормально.

1 Ответ

1 голос
/ 31 мая 2019

При извлечении образа из реестра при запуске модуля используются параметры 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, поскольку этот файл имеет более высокий приоритет и вы сможете запускатьpods с вашим изображением.

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

apiVersion: extensions/v1beta1
metadata:
  name: ssd-startup-script
  labels:
    app: ssd-startup-script
spec:
  template:
    metadata:
      labels:
        app: ssd-startup-script
    spec:
      hostPID: true
      containers:
      - name: ssd-startup-script
        image: gcr.io/google-containers/startup-script:v1
        imagePullPolicy: Always
        securityContext:
          privileged: true
        env:
        - name: STARTUP_SCRIPT
          value: |
            #!/bin/bash
            <YOUR COMMAND LINE>
            <YOUR COMMAND LINE>
            <YOUR COMMAND LINE>
            echo Done```

you need to run the kubectl apply -f <demonset yaml file>
...