Это способ добавить произвольную запись в kube-dns?

Я буду использовать очень специфический способ объяснить проблему, но я думаю, что это лучше быть конкретные, чем абстрактные задачи...

скажем, есть реплика Mongo db, установленная вне кластера kubernetes, но в сети. Ip-адреса всех членов набора реплик были разрешены /etc / hosts на серверах приложений и серверах БД.

на этапе эксперимента / перехода мне нужно получить доступ к этим серверам Mongo db из модулей kubernetes. Однако, kubernetes не кажется разрешить добавление пользовательской записи в/etc / hosts в стручках / контейнерах.

наборы реплик Mongo db уже работают с большим набором данных, создание нового набора реплик в кластере не является опцией.

Becaseu я использую GKE, изменение любого из ресурсов в пространстве имен kube-dns следует избегать, я полагаю. Настройка или замена kube-dns, чтобы быть подходящим для моей потребности, - последнее, что нужно попробовать.

Is-это способ разрешения ip-адреса пользовательских имен хостов в kubernetes кластер?

это просто идея, но если kube2sky может читать некоторые записи configmap и использовать их в качестве записей dns, это будет здорово. например,repl1.mongo.local: 192.168.10.100.

EDIT: я ссылался на этот вопрос из https://github.com/kubernetes/kubernetes/issues/12337

4 ответов


для доступа к хостам или IP-адресам за пределами kubernetes требуется тип внешнего имени.

следующее сработало для меня.

{
    "kind": "Service",
    "apiVersion": "v1",
    "metadata": {
        "name": "tiny-server-5",
        "namespace": "default"
    },
    "spec": {
        "type": "ExternalName",
        "externalName": "192.168.1.15",
        "ports": [{ "port": 80 }]
    }
}

для записи, альтернативное решение для тех, кто не проверяя ссылки выпуск github.

вы можете определить "внешнюю" службу в Kubernetes, не указывая селектор или ClusterIP. Вы также должны определить соответствующую конечную точку, указывающую на ваш внешний IP.

С документация Kubernetes:

{
    "kind": "Service",
    "apiVersion": "v1",
    "metadata": {
        "name": "my-service"
    },
    "spec": {
        "ports": [
            {
                "protocol": "TCP",
                "port": 80,
                "targetPort": 9376
            }
        ]
    }
}
{
    "kind": "Endpoints",
    "apiVersion": "v1",
    "metadata": {
        "name": "my-service"
    },
    "subsets": [
        {
            "addresses": [
                { "ip": "1.2.3.4" }
            ],
            "ports": [
                { "port": 9376 }
            ]
        }
    ]
}

С помощью этого вы можете указать свое приложение внутри контейнеров на my-service:9376 и трафик должен быть перенаправлены в 1.2.3.4:9376

ограничения:

  • используемое DNS-имя должно быть только буквы, цифры или дефисы. Вы не можете использовать многоуровневые имена (something.like.this). Это означает, что вам, вероятно, придется изменить свое приложение, чтобы указать только на your-service, а не yourservice.domain.tld.
  • вы можете указать только определенный IP, а не DNS-имя. Для этого вы можете определить своего рода псевдоним DNS с ExternalName тип сервиса.

обновление: 2017-07-03 Kunbernetes 1.7 теперь поддержка добавление записей в Pod / etc / hosts с HostAliases.


решение касается не kube-dns, а /etc/hosts. Во всяком случае, следование трюку, кажется, работает до сих пор...

EDIT: изменение/etc / hosts может иметь состояние гонки с системой kubernetes. Пусть повторится.

1) Создайте configMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: db-hosts
data:
  hosts: |
    10.0.0.1  db1
    10.0.0.2  db2

2) добавить скрипт с именем ensure_hosts.sh.

#!/bin/sh                                                                                                           
while true
do
    grep db1 /etc/hosts > /dev/null || cat /mnt/hosts.append/hosts >> /etc/hosts
    sleep 5
done

не забудьте chmod a+x ensure_hosts.sh.

3) добавить скрипт-оболочку start.sh изображение

#!/bin/sh
$(dirname "$(realpath "")")/ensure_hosts.sh &
exec your-app args...

не забудьте chmod a+x start.sh

4) Используйте configmap в качестве Тома и запустите start.sh

apiVersion: extensions/v1beta1
kind: Deployment
...
spec:
  template:
    ...
    spec:
      volumes:
      - name: hosts-volume
        configMap:
          name: db-hosts
      ...
      containers:
        command:
        - ./start.sh
        ...
        volumeMounts:
        - name: hosts-volume
          mountPath: /mnt/hosts.append
        ...

использовать configMap кажется лучшим способом установить DNS, но это немного тяжело, когда просто добавить несколько записей (на мой взгляд). Поэтому я добавляю записи в /etc/hosts скриптом оболочки, выполняемым docker CMD.

например:

Dockerfile

...(ignore)
COPY run.sh /tmp/run.sh
CMD bash /tmp/run.sh

run.sh

#!/bin/bash
echo repl1.mongo.local 192.168.10.100 >> /etc/hosts
# some else command...

обратите внимание, если ваш запустить более одного контейнера в стручке, вы должны добавить скрипт в каждый контейнер, потому что kubernetes запускают контейнер случайным образом,/etc/hosts может быть переопределение другим контейнером (который запускается позже).