使用tc命令延迟Pod通信

当使用Pod进行测试时,有时需要添加延迟进行测试。如果有Istio等工具,可以很容易实现,但仅仅为了简单的测试而安装Istio有点麻烦。因此,我们可以尝试使用tc命令将其作为Sidecar注入并引发延迟。

创建和确认运行tc容器

创建一个 TC 容器,并添加一个 ping 用于确认。

cat << EOF > ./Dockerfile
FROM ubuntu:latest
RUN apt-get update && apt-get install -y iproute2
RUN apt-get install iputils-ping net-tools
CMD ["/bin/bash"]
EOF

构建镜像。请将 IMAGE 更改为您的环境中的存储库等。

IMAGE=imuratashared/tc
docker build -t $IMAGE --platform linux/x86_64 .
docker push $IMAGE

接下来进行操作确认。
由于tc需要较高的权限才能运行,所以在这里需要添加Privileged权限来启动。

kubectl run --privileged=true --image $IMAGE tc -- sleep 3d

在没有任何操作的情况下,ping的响应如下所示。

$ kubectl exec -it tc -- ping vmware.com
PING vmware.com (10.113.63.149) 56(84) bytes of data.
64 bytes from cloudsolutions.vmware.com (10.113.63.149): icmp_seq=1 ttl=51 time=34.6 ms

试试延迟一下。

kubectl exec -it tc -- tc qdisc add dev eth0 root netem delay 100ms

以下是ping的响应,可以看出延迟有所影响。(虽然连接目标似乎稍微变化了一下。。。)

$ kubectl exec -it tc -- ping vmware.com
PING vmware.com (10.113.63.149) 56(84) bytes of data.
64 bytes from passwordreset.vmware.com (10.113.63.149): icmp_seq=1 ttl=51 time=135 ms

将其嵌入到任意的Pod中

在initContainer中引入带有先前定义的tc命令的容器,并执行tc命令。以CentOS镜像为示例进行验证。创建以下的清单文件(假设已经设置了名为IMAGE的环境变量)。

cat << EOF > ./delay-centos.yaml
apiVersion: v1
kind: Pod
metadata:
  labels:
    run: centos
  name: centos
spec:
  initContainers:
  - command: ["tc","qdisc","add","dev","eth0","root","netem","delay","100ms"]
    name: tc
    image: $IMAGE
    securityContext:
      capabilities:
        add:
        - NET_ADMIN
  containers:
  - args:
    - sleep
    - 1d
    image: centos
    name: centos
EOF
kubectl apply -f delay-centos.yaml

在创建的Pod中执行ping命令。

$ kubectl exec -it centos -c centos -- ping vmware.com
PING vmware.com (10.113.63.149) 56(84) bytes of data.
64 bytes from www.vmwareblogs.com (10.113.63.149): icmp_seq=1 ttl=51 time=125 ms

另外,若处于未加入任何物品的状态下,以下数值表明可以确认存在延迟。

$ kubectl exec -it centos -- ping vmware.com
PING vmware.com (10.113.63.149) 56(84) bytes of data.
64 bytes from www.vmwareblogs.com (10.113.63.149): icmp_seq=1 ttl=51 time=24.2 ms
广告
将在 10 秒后关闭
bannerAds