Kubernetes传出连接

时间:2018-11-20 19:17:57

标签: database kubernetes

我要保持简单,然后问一下,是否有办法查看哪个容器与数据库端点之类的端点有活动连接?

我的集群包含数百个命名空间,我的数据库提供者刚刚告诉我,几乎已达到最大连接数,我想指出同时使用多个连接到数据库端点的pod。

我从数据库集群中看到连接来自集群节点的IP ...但是它不会说出哪些容器...而且我有很多容器...

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

最简单的方法是在所有Kubernetes节点上运行netstat

$ 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> 

然后,找到所有容器后,找到容器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

答案 1 :(得分:0)

每个容器使用其自己的网络名称空间,因此要检查容器名称空间内的网络连接,您需要在该名称空间内运行命令。

幸运的是,Pod中的所有容器都共享相同的网络名称空间,因此您可以将小的Sidecar容器添加到Pod中,以打印到日志打开的连接中。

或者,您可以在pod内部运行netstat命令(如果pod在其文件系统上有此命令):

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)上拥有一个文件,其中包含有关Pod中所有连接的信息。

第三种方式是最complex。您需要使用docker ps查找容器ID,然后运行以下命令以获取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安装到群集可能对您有所帮助。它具有answer

中提到的几个有趣的功能