使用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