Это способ добавить произвольную запись в 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.
{ "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
может быть переопределение другим контейнером (который запускается позже).