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