#kubernetes #amazon-eks #aws-fargate #kubelet #kubernetes-networking
#kubernetes #amazon-eks #aws-fargate #kubelet #kubernetes-сеть
Вопрос:
Я пытаюсь подключиться к kubelet, работающему на «поддельном узле», из модуля EKS fargate.
Например, у меня есть два модуля nginx с IP 10.0.0.1
-адресами, 10.0.0.2
размещенные на двух поддельных узлах с одинаковыми IP 10.0.0.1
-адресами и 10.0.0.2
.
Из модуля 10.0.0.1
я могу корректно работать с 10.0.0.2
:
curl -X GET https://10.0.0.2:10250/stats/summary --header "Authorization: Bearer $TOKEN" --insecure
{
"node": {
"nodeName": "fargate-ip-10.0.0.2.us-east-2.compute.internal",
"systemContainers": [
{
"name": "pods",
"startTime": "2021-03-02T11:21:55Z",
[...]
- Но если я попытаюсь свернуть тот же хост
10.0.0.1:10250
, я получу отказ в подключении. - Выполнение того же самого из второго модуля приводит к противоположному результату, я могу запрашивать
10.0.0.1
и нет10.0.0.2
. - Обратите внимание, что если я закручиваю порт 80, nginx отвечает правильно, поэтому кажется, что при подключении из самого модуля сеть не может понять, что хост может ответить на запрос
- Более того, я знаю, что могу пройти через прокси (
curl -X GET https://172.20.0.1:443/api/v1/nodes/fargate-ip-10-0-0-1.us-east-2.compute.internal/stats/summary --header "Authorization: Bearer $TOKEN" --insecure
), но из-за некоторых ограничений это невозможно в моем сценарии
Комментарии:
1. Что именно вы хотели бы знать? Почему это не работает? Как заставить это работать? В этом вопросе мне не хватает части «вопрос»: D
Ответ №1:
Итак, в AWS Fargate модули и связанные узлы совместно используют IP-адрес:
$ kubectl get pods -o=wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
foo 1/1 Running 0 94m 192.168.152.183 fargate-ip-192-168-152-183.eu-central-1.compute.internal <none> <none>
$
$ kubectl get nodes -o=wide fargate-ip-192-168-152-183.eu-central-1.compute.internal
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
fargate-ip-192-168-152-183.eu-central-1.compute.internal Ready <none> 92m v1.18.9-eks-866667 192.168.152.183 <none> Amazon Linux 2 4.14.209-160.339.amzn2.x86_64 containerd://1.4.1
Если вы проверите таблицу маршрутизации в модуле, вы обнаружите следующее:
$ kubectl exec -i -t foo -- ip r get 192.168.152.183
local 192.168.152.183 dev lo src 192.168.152.183 uid 0
cache <local>
$
$ kubectl exec -i -t foo -- ip r get 192.168.152.20 # Notice different IP address.
192.168.152.20 dev eth0 src 192.168.152.183 uid 0
cache
Поэтому, если вы попытаетесь связаться со своим собственным IP-адресом из модуля Pod, трафик будет проходить через сетевой стек, локальный для контейнера, где kubelet недоступен.
При доступе извне вы сначала попадаете в базовую ОС хоста, на которой kubelet
выполняется. Я предполагаю, что тогда выполняется какая-то магия, которая перенаправляет трафик в контейнер.
Fargate не позволяют запускать привилегированные контейнеры или добавлять CAP_SYS_ADMIN
дополнительные возможности, поэтому невозможно обойти локальный стек, переопределив таблицу маршрутизации.
Я не знаю, есть ли другие способы сделать это непривилегированным способом.