我要保持简单,然后问一下,是否有办法查看哪个容器与数据库端点之类的端点有活动连接?
我的集群包含数百个命名空间,我的数据库提供者刚刚告诉我,几乎已达到最大连接数,我想指出同时使用多个连接到数据库端点的pod。
我从数据库集群中看到连接来自集群节点的IP ...但是它不会说出哪些容器...而且我有很多容器...
感谢您的帮助
答案 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
您需要对每个节点上的每个吊舱执行此操作。因此,对特定的容器进行故障排除可能很有用,但是您的任务需要更多的自动化。
中提到的几个有趣的功能