Я новичок в кубернете. Пытаюсь понять, что происходит, когда я пытаюсь получить доступ к google.com
из модуля kubernetes.
Будет ли запрос напрямую доходить до google.com (конечно, нет) или какой-то поиск DNS будет происходить в файле /etc/hosts.allow
, прежде чем вызов выйдет за пределы модуля? Каков поток или путь исходящего звонка?
PS: у меня уже запущен модуль coredns по умолчанию.
Что такое исходящий поток вызовов Kubernetes?
Ответы (1)
Я думаю, что этот вопрос можно разделить на 2 разные темы:
DNS
разрешение.Pod
сети при попытке доступа к внешним источникам.
Ответ на оба этих вопроса может быть довольно длинным, но я постараюсь дать вам базовую информацию и добавить дополнительную документацию, которая будет более подробной.
DNS
разрешение, происходящее внутри/вне кластера:
Как вы уже сказали, вы используете CoreDNS
. Он будет отвечать в вашей настройке за разрешение DNS
. Ваш Pods
будет запрашивать его при поиске доменов, которые не включены локально (например, /etc/hosts
). После получения ответов они свяжутся с внешними источниками (подробнее об этом позже).
Дополнительное замечание!
Разрешение
DNS
(локальное, запрос) будет зависеть от инструмента, который вы использовали.curl
проверит это, но, например,nslookup
запросит DNS-сервер напрямую.
Ваш CoreDNS
, скорее всего, доступен под одним из Services
в вашем кластере:
$ kubectl get service --all-namespaces
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 79m
kube-system kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 79m
Я думаю, вы можете найти много полезной информации в официальной документации:
Вы также можете следовать этому руководству, чтобы получить больше практического опыта:
Сеть Pod при попытке доступа к внешним источникам:
Каждое решение Kubernetes может отличаться тем, как именно работает с сетью. Пожалуйста, обратитесь к документации вашего решения для получения более подробной информации. Основная предпосылка этого заключается в том, что Pod
не будет напрямую связываться с внешними источниками. Ниже вы можете найти более подробную информацию о причинах этого:
исходящий NAT
Преобразование сетевых адресов (NAT) — это процесс сопоставления IP-адреса в пакете с другим IP-адрес при прохождении пакета через устройство, выполняющее NAT. В зависимости от варианта использования NAT может применяться к исходному или целевому IP-адресу или к обоим адресам.
В контексте выхода Kubernetes NAT используется, чтобы разрешить модулям подключаться к службам за пределами кластера, если модули имеют IP-адреса, которые не маршрутизируются за пределами кластера (например, если сеть модуля является наложением).
Например, если модуль в оверлейной сети пытается подключиться к IP-адресу за пределами кластера, то узел, на котором размещается модуль, использует SNAT (преобразование исходного сетевого адреса) для сопоставления немаршрутизируемого исходного IP-адреса пакета с IP-адрес узла перед пересылкой пакета. Затем узел сопоставляет ответные пакеты, приходящие в противоположном направлении, с исходным IP-адресом модуля, поэтому пакеты передаются из конца в конец в обоих направлениях, при этом ни модуль, ни внешняя служба не знают, что происходит сопоставление.
Короче говоря, при отсутствии других факторов (например, дополнительных NAT
, используемых вашим облачным провайдером), ваш Pod
попытается связаться с внешними источниками с помощью Node IP
(используя Source NAT
).
Вы можете найти более подробное объяснение жизни пакета (некоторые аспекты специфичны для GKE
) следующим образом:
- Youtube.com: Life of a Packet [I] – Майкл Рубин, Google — около
17:55
минуты.
Дополнительные ресурсы
Coredns.io: подключаемые модули: журнал — вы можете изменить
CoreDNS
ConfigMap
($ kubectl edit configmap -n kube-system coredns
, чтобы включить ведение журнала на стандартный вывод ($ kubectl logs ...
), чтобы увидеть более подробное разрешение запросов.Speakerdeck.com : Tockin: Kubernetes и сети, почему это так чертовски сложно: Slide 57 — больше о сетях Kubernetes.