Kubernetes исходящие соединения - PullRequest
0 голосов
/ 20 ноября 2018

Я собираюсь оставить это простым и спросить, есть ли способ увидеть, какой модуль имеет активное соединение с конечной точкой, такой как конечная точка базы данных?

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

Я могу видеть из своего кластера базы данных, чтосоединения происходят с IP-адреса моего кластерного узла ... но он не скажет, какие модули ... и у меня довольно много модулей ...

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Каждый контейнер использует свое собственное пространство имен сети, поэтому для проверки сетевого подключения внутри пространства имен контейнера необходимо выполнить команду внутри этого пространства имен.

К счастью, все контейнеры в модуле используют одно и то же сетевое пространство имен, поэтому вы можете добавить небольшой контейнер с коляской для модуля, который печатает в журнале открытых соединений.

В качестве альтернативы вы можете запустить netstatКоманда внутри модуля (если модуль находится в его файловой системе):

kubectl get pods | grep Running | awk '{ print $1 }' | xargs -I % sh -c 'echo == Pod %; kubectl exec -ti % -- netstat -tunaple' >netstat.txt
# or
kubectl get pods | grep Running | awk '{ print $1 }' | xargs -I % sh -c 'echo == Pod %; kubectl exec -ti % -- netstat -tunaple | grep ESTABLISHED' >netstat.txt

После этого на вашем диске будет файл (netstat.txt) со всей информацией о соединениях в модулях.

Третий путь наиболее сложен .Вам нужно найти идентификатор контейнера с помощью docker ps и выполнить следующую команду, чтобы получить PID

$ pid = "$(docker inspect -f '{{.State.Pid}}' "container_name | Uuid")"

Затем вам нужно создать именованное пространство имен: (вы можете использовать любое имя, которое вы хотите, или container_name / Uuid/ Pod_Name как замена namespace_name)

sudo mkdir -p /var/run/netns
sudo ln -sf /proc/$pid/ns/net "/var/run/netns/namespace_name"

Теперь вы можете запускать команды в этом пространстве имен:

sudo ip netns exec "namespace_name" netstat -tunaple | grep ESTABLISHED

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

Для вас может быть полезно установить Istio в вашем кластере.В этом ответе

есть несколько интересных особенностей
0 голосов
/ 20 ноября 2018

Самый простой способ - запустить netstat на всех ваших узлах Kubernetes:

$ netstat -tunaple | grep ESTABLISHED | grep <ip address of db provider>

Последний столбец - это столбец PID/Program name, и это программа, которая выполняется в контейнере (сдругой внутренний контейнер PID) в вашем модуле на этом конкретном узле.Существуют разные способы узнать, что это за контейнер / контейнер.Например,

# Loop through all containers on the node with
$ docker top <container-id> 

Затем, после того как вы найдете идентификатор контейнера, если вы просматриваете все свои модули:

$ kubectl get pod <pod-id> -o=yaml

И вы можете найти статус, например:

  status:
    conditions:
    - lastProbeTime: null
      lastTransitionTime: 2018-11-09T23:01:36Z
      status: "True"
      type: Initialized
    - lastProbeTime: null
      lastTransitionTime: 2018-11-09T23:01:38Z
      status: "True"
      type: Ready
    - lastProbeTime: null
      lastTransitionTime: 2018-11-09T23:01:38Z
      status: "True"
      type: ContainersReady
    - lastProbeTime: null
      lastTransitionTime: 2018-11-09T23:01:36Z
      status: "True"
      type: PodScheduled
    containerStatuses:
    - containerID: docker://f64425b3cd0da74a323440bcb03d8f2cd95d3d9b834f8ca5c43220eb5306005d
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...