Kubernetes Multus:不同节点上的 Pod 之间没有 macvlan 连接(无法 ping)



我有一个问题,我有一个Kubernetes集群有两个工作节点和一个主节点。让我们对W1、W2和m进行实验。我有一个部署,它创建了一组CentOS7 pod,每个worker上都有一些。我使用Multus,以便在每个pod上有一个额外的net1接口,该接口映射到worker上的eth1。所有pod的net1都连接到同一个名为up-net的macvlan。

在W1和W2上,我可以在运行在同一节点上的pod之间ping,但是W1中的pod不能ping W2中的另一个pod,反之亦然。在所有情况下,都可以在eth0上的标准kube网络上ping通。只有macvlan有这个问题。

总之,这就是问题所在。现在让我更详细地描述一下我们正在使用的设置。

我们有一个有3个物理服务器的实验室,我们在上面部署了Kolla(它是安装在Kubernets上的Openstack)。在这个Openstack安装中,我再次尝试设置一个Kubernetes安装,主节点和工作节点托管在Openstack虚拟机(即W1, W2, M)中,是在Openstack中运行的VM。这意味着我们总共有三层虚拟化。我只是想提一下如果有人知道任何可能的线索。但是我还没有碰到任何我认为与虚拟化有关的问题。还可以提到这些vm有两个接口eth0和eth1。Eth1是我想要macvlan上的设备。最后,对于虚拟机和物理服务器,操作系统都是CentOS7。

关于Kubernetes安装:
  • Kubernetes (overcloud)是使用Kubespray安装的。
  • 我编辑主机文件,使node1成为node2 W1和node3 W2的主节点。
  • 我将kube_network_plugin_multus设置为true。
  • 去向用于为net1接口分配ip地址。
  • 我使用calico作为网络驱动程序。

下面是macvlan网络的配置:

apiVersion: "k8s.cni.cncf.io/v1"
kind: NetworkAttachmentDefinition
metadata:
name: up-net
spec:
config: '{
"cniVersion": "0.3.0",
"name": "up-net",
"type": "macvlan",
"master": "eth1",
"mode": "bridge",
"ipam": {
"type": "whereabouts",
"datastore": "kubernetes",
"kubernetes": { "kubeconfig": "/etc/cni/net.d/whereabouts.d/whereabouts.kubeconfig" },
"range": "192.168.3.225/28",
"log_file" : "/tmp/whereabouts.log",
"log_level" : "debug"
}
}'

下面是pods的配置:

apiVersion: apps/v1
kind: Deployment
metadata:
name: sample
labels:
app: centos-host
spec:
replicas: 4
selector:
matchLabels:
app: centos-host
template:
metadata:
labels:
app: centos-host
annotations:
k8s.v1.cni.cncf.io/networks: up-net
spec:
containers:
- name: centos-container
image: centos:7
command: ["/bin/sleep", "infinity"]

我没有明确指定它们最终在哪个worker上结束,但通常负载均衡器会平均分配四个pod。

还有,下面是Kube系统的pod:

[centos@node1 ~]$ kubectl get pods -n kube-system
NAME                                      READY   STATUS    RESTARTS   AGE
calico-kube-controllers-8b5ff5d58-msq2m   1/1     Running   1          29h
calico-node-2kg2l                         1/1     Running   1          29h
calico-node-4fxwr                         1/1     Running   1          29h
calico-node-m4l67                         1/1     Running   1          29h
coredns-85967d65-6ksqx                    1/1     Running   1          29h
coredns-85967d65-8nbgq                    1/1     Running   1          29h
dns-autoscaler-5b7b5c9b6f-567vz           1/1     Running   1          29h
kube-apiserver-node1                      1/1     Running   1          29h
kube-controller-manager-node1             1/1     Running   1          29h
kube-multus-ds-amd64-dzmj5                1/1     Running   1          29h
kube-multus-ds-amd64-mvfpc                1/1     Running   1          29h
kube-multus-ds-amd64-sbw8n                1/1     Running   1          29h
kube-proxy-6jgvn                          1/1     Running   1          29h
kube-proxy-tzf5t                          1/1     Running   1          29h
kube-proxy-vgmh8                          1/1     Running   1          29h
kube-scheduler-node1                      1/1     Running   1          29h
nginx-proxy-node2                         1/1     Running   1          29h
nginx-proxy-node3                         1/1     Running   1          29h
nodelocaldns-27bct                        1/1     Running   1          29h
nodelocaldns-75cgg                        1/1     Running   1          29h
nodelocaldns-ftvn9                        1/1     Running   1          29h
whereabouts-4tktv                         1/1     Running   0          28h
whereabouts-nfwkz                         1/1     Running   0          28h
whereabouts-vxgwr                         1/1     Running   0          28h

现在已经解释了我所运行的实验的设置。

考虑工人1 (W1)上的pod P1a和P1b。在工人2 (W2)上有P2a和P2b。我使用ping和tcpdump来访问连接。

从P1a到P1b的Ping工作正常,tcpdump告诉我在W1的eth1设备上有icmp流量。W2也是如此。

然而,当我从P1a ping P2a时,它看起来像这样:

[root@sample-7b9755db48-gxq5m /]# ping -c 2 192.168.3.228
PING 192.168.3.228 (192.168.3.228) 56(84) bytes of data.
From 192.168.3.227 icmp_seq=1 Destination Host Unreachable
From 192.168.3.227 icmp_seq=2 Destination Host Unreachable
--- 192.168.3.228 ping statistics ---
2 packets transmitted, 0 received, +2 errors, 100% packet loss, time 1000ms
pipe 2

然而,一个有趣的线索是,在这种情况下,icmp数据包最终在pod的lo接口上结束:

[root@sample-7b9755db48-gxq5m /]# tcpdump -vnes0 -i lo
tcpdump: listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
12:51:57.261003 00:00:00:00:00:00 > 00:00:00:00:00:00, ethertype IPv4 (0x0800), length 126: (tos 0xc0, ttl 64, id 32401, offset 0, flags [none], proto ICMP (1), length 112)
192.168.3.227 > 192.168.3.227: ICMP host 192.168.3.228 unreachable, length 92
(tos 0x0, ttl 64, id 39033, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.3.227 > 192.168.3.228: ICMP echo request, id 137, seq 1, length 64
12:51:57.261019 00:00:00:00:00:00 > 00:00:00:00:00:00, ethertype IPv4 (0x0800), length 126: (tos 0xc0, ttl 64, id 32402, offset 0, flags [none], proto ICMP (1), length 112)
192.168.3.227 > 192.168.3.227: ICMP host 192.168.3.228 unreachable, length 92
(tos 0x0, ttl 64, id 39375, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.3.227 > 192.168.3.228: ICMP echo request, id 137, seq 2, length 64

你认为我的路由表可能有问题吗?我什么也看不见,但我对网络有点陌生:
[root@sample-7b9755db48-gxq5m /]# ip route
default via 169.254.1.1 dev eth0 
169.254.1.1 dev eth0 scope link 
192.168.3.224/28 dev net1 proto kernel scope link src 192.168.3.227

最后,列出了我尝试过但没有成功的事情:

  • 在W1、W2和m的eth1上设置eth1为混杂模式
  • 为ipv4禁用rp_filter(因为我检查了macvlan对macaddress做了奇怪的事情)。

综上所述,我自己已经找到了答案。原来是OpenStack安全组造成了这个问题。我所需要做的就是禁用所有eth1网络端口上的端口安全性。以下是我对每个这样的端口使用的命令:

openstack port set --no-security-group --disable-port-security <id or name of the neutron port>

之后,机器就可以访问了。不需要重新启动服务器或服务或类似的

我确实发现这个问题只发生在次要网络上有点奇怪。在任何一种情况下,希望这有助于其他人试图在openstack的虚拟机中运行kubernetes。

相关内容

  • 没有找到相关文章

最新更新