发生了什么?
我正在运行一个DNS服务器(dnsmasq)部署,它通过Traefik反向代理暴露在互联网上。DNS协议要求我在同一个端口上复用不同的协议,因为DNS查询可以以TCP或UDP协议到来。
在dnsmasq和Traefik部署中,我遇到了一个问题,即K8s API“ Gulp ”了其中一个复用的端口,从而使DNS服务器变得无用(因为TCP或UDP流量无法到达Pod)。
简而言之:
当我将此端口配置应用于容器时:
ports:
- containerPort: 1053
name: udp
protocol: UDP
- containerPort: 1053
name: tcp
protocol: TCP
实际上只有两个端口中的一个被应用(似乎随机选择其中哪个端口被应用)。
这个问题不是每次都能100%重现!在我的研究中,大约每5次尝试就会发生一次。我不知道必须满足哪些条件才能重现此问题。
我的当前解决方法是在初始应用Deployment后,使用kubectl/ArgoCD手动添加缺失的端口。这始终解决了问题,但对我来说不是一个可行的长期解决方案。
预期会发生什么?
我预期在第一个 kubectl apply
之后,两个协议都可以在同一端口上使用。
如何尽可能精确地重现它?
请记住,这个问题是随机发生的,你可能需要尝试几次才能重现它。
你可以通过执行以下命令来重现问题:
apiVersion: apps/v1
kind: Deployment
metadata:
name: multiplexed-port
namespace: multiplexed-port
spec:
replicas: 1
selector:
matchLabels:
app: multiplexed-port
template:
metadata:
labels:
app: multiplexed-port
spec:
containers:
- name: multiplexed-port
image: busybox:latest
command: ["sh", "-c", "echo 'Hello, World!' && sleep infinity"]
ports:
- containerPort: 1053
name: udp
protocol: UDP
- containerPort: 1053
name: tcp
protocol: TCP
在将清单应用到集群后,运行 kubectl describe
以查看只有一个端口被应用。
我没有测试裸Pod或其他pod控制器,如 DaemonSet
或 StatefulSet
。
还需要了解其他信息吗?
我使用ArgoCD(当前版本v2.9.6)管理我的部署。当其中一个复用的端口没有正确应用时,ArgoCD不会为我的部署显示OutOfSync状态,表明K8s API在这里工作不正常。kubectl.kubernetes.io/last-applied-configuration
注解也显示两个端口都已应用,而当我运行 kubectl describe
时,只显示一个端口。
Kubernetes版本
$ kubectl version
Client Version: v1.29.3
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.27.9
WARNING: version difference between client (1.29) and server (1.27) exceeds the supported minor version skew of +/-1
云提供商
我们使用的是AKS集群,运行在AzureLinux上。
OS版本
我使用的是MacOS Sonoma(14.4)。
集群始终运行在最新的AzureLinux版本上。
3条答案
按热度按时间hl0ma9xz1#
这个问题目前正在等待分类。
如果SIG或子项目确定这是一个相关的问题,他们将通过应用
triage/accepted
标签并提供进一步的指导来接受它。组织成员可以通过在评论中写入
/triage accepted
来添加triage/accepted
标签。有关使用PR评论与我互动的说明,请查看here。如果您对我的行为有任何问题或建议,请针对kubernetes/test-infra仓库提出一个问题。
tjrkku2a2#
/sig apps
atmip9wb3#
Kubernetes项目目前缺乏足够的贡献者来充分应对所有问题。
此机器人根据以下规则对未分类的问题进行分级处理:
lifecycle/stale
应用后的90天不活动后,将应用lifecycle/stale
lifecycle/stale
应用后的30天不活动后,将应用lifecycle/rotten
lifecycle/rotten
应用后的30天不活动后,该问题将被关闭您可以:
/remove-lifecycle stale
/close
关闭此问题请将反馈发送至sig-contributor-experience@kubernetes/community。
/lifecycle stale