gpt4 book ai didi

Kubernetes postStart 生命周期钩子(Hook) block CNI

转载 作者:行者123 更新时间:2023-12-02 12:17:03 31 4
gpt4 key购买 nike

我的工作负载需要网络连接才能正常启动,我想使用 postStart lifecycle hook等待它准备好然后做一些事情。然而,生命周期钩子(Hook)似乎阻止了 CNI;以下工作负载永远不会分配 IP:

kubectl apply -f <(cat <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- |
while true; do
sleep
done
EOF
)
kubectl get pods -o wide

这意味着我的工作负载永远不会开始(尝试连接时挂起)并且我的生命周期钩子(Hook)循环永远存在。有办法解决这个问题吗?

编辑:我使用 sidecar 而不是生命周期 Hook 来实现同样的事情 - 仍然不确定为什么生命周期 Hook 不起作用,执行 CNI 是容器创建 IMO 的一部分,所以我希望生命周期 Hook 在联网后触发已配置

最佳答案

这是一个有趣的问题 :-) 这不是一个很好的答案,但我做了一些调查,我想我分享它 - 也许它有一些用处。

我从问题中发布的 yaml 开始。然后我登录到运行这个 pod 的机器并找到了容器。

$ kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE
nginx-8f59d655b-ds7x2 0/1 ContainerCreating 0 3m <none> node-x

$ ssh node-x
node-x$ docker ps | grep nginx-8f59d655b-ds7x2
2064320d1562 881bd08c0b08 "nginx -g 'daemon off" 3 minutes ago Up 3 minutes k8s_nginx_nginx-8f59d655b-ds7x2_default_14d1e071-4cd4-11e9-8104-42010af00004_0
2f09063ed20b k8s.gcr.io/pause-amd64:3.1 "/pause" 3 minutes ago Up 3 minutes k8s_POD_nginx-8f59d655b-ds7x2_default_14d1e071-4cd4-11e9-8104-42010af00004_0

第二个运行/pause 的容器是基础设施容器。另一个是 Pod 的 nginx 容器。请注意,通常此信息也可以通过 kubectl get pod 获得,但在本例中不是。奇怪。

我希望在容器中设置网络并且运行 nginx。让我们验证一下:

node-x$ docker exec -it 2064320d1562 bash
root@nginx-8f59d655b-ds7x2:/# apt update && apt install -y iproute2 procps
...installs correctly...
root@nginx-8f59d655b-ds7x2:/# ip a s eth0
3: eth0@if2136: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1410 qdisc noqueue state UP group default
link/ether 0a:58:0a:f4:00:a9 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.244.0.169/24 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::da:d3ff:feda:1cbe/64 scope link
valid_lft forever preferred_lft forever

因此网络已设置,路由已到位,eth0 上的 IP 地址实际上在覆盖网络上,因为它应该是。现在查看进程列表:

root@nginx-8f59d655b-ds7x2:/# ps auwx
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 32652 4900 ? Ss 18:56 0:00 nginx: master process nginx -g daemon off;
root 5 5.9 0.0 4276 1332 ? Ss 18:56 0:46 /bin/sh -c while true; do sleep done
nginx 94 0.0 0.0 33108 2520 ? S 18:56 0:00 nginx: worker process
root 13154 0.0 0.0 36632 2824 ? R+ 19:09 0:00 ps auwx
root 24399 0.0 0.0 18176 3212 ? Ss 19:02 0:00 bash

哈,nginx 正在运行,preStop 命令也在运行。但是请注意大型 PID。部署文件中存在拼写错误,它正在执行没有参数的 sleep - 这是一个错误。

root@nginx-8f59d655b-ds7x2:/# sleep
sleep: missing operand
Try 'sleep --help' for more information.

这是从一个循环中运行的,因此 fork 负载会导致较大的 PID。

作为另一个测试,我还尝试从一个节点 curl 服务器:

node-x$ curl http://10.244.0.169
...
<p><em>Thank you for using nginx.</em></p>
...

这是非常值得期待的。所以最后我想强制 preStop 命令完成,所以从容器内部我杀死了包含的 shell:

root@nginx-8f59d655b-ds7x2:/# kill -9 5
...container is terminated in a second, result of the preStop hook failure...

$ kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-8f59d655b-ds7x2 0/1 PostStartHookError: rpc error: code = ResourceExhausted desc = grpc: received message larger than max (53423560 vs. 16777216) 0 21m

嗯,所以我想这 50MB (!) 的消息是由于缺少参数导致 sleep 失败。实际上,更令人毛骨悚然的是 Deployment 没有从这次失败中恢复。这个 Pod 会永远挂起,而不是你所期望的(产生另一个 Pod 并重试)。

在这一点上,我删除了部署并使用固定在 preStop Hook 中的 sleep 重新创建它 (sleep 1)。结果大致相同,并且 Deployment 在这种情况下也不会生成另一个 Pod(所以它不仅仅是因为日志阻塞)。

现在我确实在顶部说过这不是真正的答案。但也许有一些要点:生命周期 Hook 需要一些工作才能被认为是有用和安全的。

关于Kubernetes postStart 生命周期钩子(Hook) block CNI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55298354/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com