dnsConfig пропускается в GKE - PullRequest
3 голосов
/ 03 марта 2020

Столкнулся со следующей проблемой: мне нужно добавить поисковый домен на несколько модулей, чтобы иметь возможность общаться с безголовым сервисом. Документация Kubernetes рекомендует установить dnsConfig и установить все в нем. Это то, что я сделал. Также есть ограничение, что только 6 поисковых доменов могут быть установлены. Часть манифеста:

    spec:
  hostname: search
  dnsPolicy: ClusterFirst
  dnsConfig:
    searches:
      - indexer.splunk.svc.cluster.local
  containers:
  - name: search

К сожалению, это не имеет никакого эффекта, и файл resolv.conf на целевом модуле не включает этот поисковый домен:

search splunk.svc.cluster.local svc.cluster.local cluster.local us-east4-c.c.'project-id'.internal c.'project-id'.internal google.internal
nameserver 10.39.240.10
options ndots:5

После быстрого просмотра этого config Я обнаружил, что в настоящее время указывается 6 поисковых доменов, и, вероятно, это причина, по которой новый поисковый домен не добавляется . Вы можете добавить вручную, и все будет работать, но это не то, чего я пытаюсь достичь.

У вас есть идеи, как обойти это ограничение?

PS Задать для dnsPolicy значение None также не вариант, так как установить предварительные перехваты для добавления зоны поиска.

---
# Search-head deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: search
  namespace: splunk
  labels:
    app: splunk
spec:
  replicas: 1
  selector:
    matchLabels:
      app: splunk
  template:
    metadata:
      labels:
        app: splunk
    spec:
      hostname: search
      dnsPolicy: ClusterFirst
      dnsConfig:
        searches:
          - indexer.splunk.svc.cluster.local
      containers:
      - name: search
        image: splunk/splunk
        env:
          - name: SPLUNK_START_ARGS
            value: "--accept-license"
          - name: SPLUNK_PASSWORD
            valueFrom:
              secretKeyRef:
                name: splunk-password
                key: password
          - name: SPLUNK_ROLE
            value: splunk_search_head
          - name: SPLUNK_SEARCH_HEAD_URL
            value: search
          - name: SPLUNK_INDEXER_URL # TODO: make this part dynamic.
            value: indexer-0,indexer-1
        ports:
          - name: web
            containerPort: 8000
          - name: mgmt
            containerPort: 8089
          - name: kv
            containerPort: 8191
        volumeMounts:
        - mountPath: /opt/splunk/var
          name: sh-volume
      volumes:
      - name: sh-volume
        persistentVolumeClaim:
          claimName: sh-volume

1 Ответ

1 голос
/ 03 марта 2020

Согласно документации Pods DnsConfig :

searches: список DNS-доменов поиска для поиска имени хоста в Pod. Это свойство не является обязательным. Если указан, предоставленный список будет объединен с именами базовых доменов поиска, созданными из выбранной политики DNS. Повторяющиеся доменные имена удаляются. Kubernetes допускает не более 6 поисковых доменов.

  • Несмотря на то, что resolv.conf docs упоминает, что он принимает более 6 поисковых доменов в последних версиях пока невозможно превзойти это количество поисковых доменов с помощью развертывания kubernetes.

  • Я создал обходной путь, на котором InitContainer создает и монтирует в модуль новый resolv.conf и после того, как контейнер поднят, он заменяет автоматически сгенерированный. Таким образом, если контейнер аварийно завершает работу или перезагружается, resolv.conf всегда будет усилен.

nginx -emulation-your-splunk-deploy.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: search
  namespace: default
  labels:
    app: splunk
spec:
  replicas: 1
  selector:
    matchLabels:
      app: splunk
  template:
    metadata:
      labels:
        app: splunk
    spec:
      hostname: search
      initContainers:
        - name: initdns
          image: nginx
          imagePullPolicy: IfNotPresent
          command: ["/bin/bash","-c"] 
          args: ["echo -e \"nameserver 10.39.240.10\nsearch indexer.splunk.svc.cluster.local splunk.svc.cluster.local svc.cluster.local cluster.local us-east4-c.c.'project-id'.internal c.'project-id'.internal google.internal\noptions ndots:5\n \" > /mnt/resolv.conf"]
          volumeMounts:
          - mountPath: /mnt
            name: volmnt      
      containers:
        - name: search
          image: nginx
          env:
          - name: SPLUNK_START_ARGS
            value: "--accept-license"
          - name: SPLUNK_PASSWORD
            value: password
          - name: SPLUNK_ROLE
            value: splunk_search_head
          - name: SPLUNK_SEARCH_HEAD_URL
            value: search
          ports:
          - name: web
            containerPort: 8000
          - name: mgmt
            containerPort: 8089
          - name: kv
            containerPort: 8191
          volumeMounts:
          - mountPath: /mnt
            name: volmnt
          command: ["/bin/bash","-c"] 
          args: ["cp /mnt/resolv.conf /etc/resolv.conf ; nginx -g \"daemon off;\""]
      volumes:
      - name: volmnt
        emptyDir: {}
  • Не забудьте проверить следующие поля и установить их в соответствии с вашей средой:
    • namespace, nameserver, container.image, container.args

  • Воспроизведение:
$ kubectl apply -f search-head-splunk.yaml 
deployment.apps/search created

$ kubectl get pods
NAME                      READY   STATUS    RESTARTS   AGE
search-64b6fb5854-shm2x   1/1     Running   0          5m14sa

$ kubectl exec -it search-64b6fb5854-shm2x -- cat /etc/resolv.conf 
nameserver 10.39.240.10
search indexer.splunk.svc.cluster.local splunk.svc.cluster.local svc.cluster.local cluster.local us-east4-c.c.'project-id'.internal c.'project-id'.internal google.internal
options ndots:5

Вы можете видеть, что resolv.conf остается настроенным, пожалуйста Воспроизведите в своей среде и сообщите мне, если вы обнаружите какие-либо проблемы.


РЕДАКТИРОВАТЬ 1:

  • Приведенный выше сценарий предназначен для среды, в которой вам нужно более 6 поисковых доменов.
  • Мы должны жестко закодировать DNS-сервер, но служба kube-dns остается с тем же IP-адресом в течение срока службы кластера, а иногда даже после восстановления кластера, это зависит от конфигурации сети .

  • Если вам нужно 6 или менее доменов, вы можете просто изменить dnsPolicy на None и пропустить InitContainer:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: search
  namespace: splunk
  labels:
    app: splunk
spec:
  replicas: 1
  selector:
    matchLabels:
      app: splunk
  template:
    metadata:
      labels:
        app: splunk
    spec:
      hostname: search
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
          - 10.39.240.10
        searches:
          - indexer.splunk.svc.cluster.local
          - splunk.svc.cluster.local
          - us-east4-c.c.'project-id'.internal
          - c.'project-id'.internal
          - svc.cluster.local
          - cluster.local
        options:
          - name: ndots
          - value: "5"
      containers:
      - name: search
        image: splunk/splunk
...
{{{the rest of your config}}}
...