Calico + ipvs/strict_arp kube-proxy + Metallb l2模式多接口问题

问题描述 投票:0回答:1

我正在使用 l2 模式下的 Metallb 和具有 2 个接口的 ubuntu 22.04 系统上的 iptables 路由。

我有 ens160(在所有节点主节点 + 工作节点上)用于所有本地流量,还有 ens192(仅在我的工作节点上),其中 Metallb 可以访问我的公共 IP 网络。我将 Metallb 配置为仅使用 ens192 可用的工作节点。 我使用的是 Ubuntu 22.04,它默认使用 netplan,我最终尝试为接口 ens192 设置一些规则。

接口ens192没有直接设置ip。根据 Metallb 和 kube-proxy 文档,在 ipvs 模式下使用 kube-proxy 和严格的 arp 模式是它应该工作的方式,并且应该使用 arp 来公布 ip。作为入口,我使用 nginx 成功获取 Metallb 分配的 IP。当检查虚拟接口 kube-ipvs0 时,我可以看到 assigend ip 地址。

kubectl -n nginx-ingress get svc
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.249.73.29    1.2.3.17   80:30311/TCP,443:31050/TCP   21d
ingress-nginx-controller-admission   ClusterIP      10.247.82.117   <none>          443/TCP                      21d

在我的集群中,我可以直接访问该服务,但不能从外部访问。超时了。

我用netplan设置的路由规则如下:


network:
  version: 2
  renderer: networkd
  ethernets:
    ens160:
      dhcp4: no
      dhcp6: no
      addresses:
        - 172.31.16.20/24
      routes:
      - to: default
        via: 172.31.16.254
      nameservers:
        addresses:
          - 10.2.2.2
          - 10.7.2.2
        search:
          - esrv.local
    ens192:
      dhcp4: no
      dhcp6: no
      routing-policy:
      - from: 1.2.3.16/28
        table: 1019
        priority: 100
      - from:1.2.3.16/28
        to: 192.168.0.0/16
        priority: 99
      routes:
      - to: default        
        via: 1.2.3.30
        table: 1019
      - to: 1.2.3.16/28
        table: 1019
      - to: 1.2.3.16/28

路线信息:

ip rule show
0: from all lookup local
99: from 1.2.3.16/28 to 192.168.0.0/16 lookup main proto static
100: from 1.2.3.16/28 lookup 1019 proto static
32766: from all lookup main
32767: from all lookup default
ip route list
default via 172.31.16.254 dev ens160 proto static
172.31.16.0/24 dev ens160 proto kernel scope link src 172.31.16.20
192.168.135.64/26 via 192.168.135.65 dev vxlan.calico onlink
blackhole 192.168.177.192/26 proto 80
192.168.177.232 dev calid7e72cc188e scope link
192.168.177.233 dev cali3542ba50312 scope link
192.168.177.234 dev cali101d1e0fb1d scope link
1.2.3.16/28 dev ens192 proto static scope link
ip route list table 1019
default via 1.2.3.30 dev ens192 proto static onlink
1.2.3.16/28 dev ens192 proto static scope link

当我踢出

100: from 1.2.3.16/28 lookup 1019 proto static
规则时,我可以看到流量通过 ens160 路由。由于默认路由,在这种情况下这是正确的。


tcpdump -n -e -q -vvvvv -i any port 80

tcpdump: data link type LINUX_SLL2
tcpdump: listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
12:05:07.961685 ens192 In ifindex 3 70:70:8b:1d:6a:bf (tos 0x0, ttl 58, id 63476, offset 0, flags [DF], proto TCP (6), length 60)
[CLIENT PUB IP].10400 > 1.2.3.17.80: tcp 0
12:05:07.961967 cali3542ba50312 Out ifindex 6 ee:ee:ee:ee:ee:ee (tos 0x0, ttl 57, id 63476, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.20.14633 > 192.168.177.233.80: tcp 0
12:05:07.962018 cali3542ba50312 In ifindex 6 e6:d1:f8:03:b9:b7 (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
192.168.177.233.80 > 172.31.16.20.14633: tcp 0
12:05:07.962062 ens160 Out ifindex 2 00:50:56:a6:1e:38 (tos 0x0, ttl 63, id 0, offset 0, flags [DF], proto TCP (6), length 60)
1.2.3.17.80 > [CLIENT PUB IP].10400: tcp 0
12:05:07.962290 ens160 In ifindex 2 54:75:d0:5b:10:fc (tos 0x0, ttl 255, id 43249, offset 0, flags [none], proto TCP (6), length 40)
[CLIENT PUB IP].10400 > 1.2.3.17.80: tcp 0
12:05:07.962344 cali3542ba50312 Out ifindex 6 ee:ee:ee:ee:ee:ee (tos 0x0, ttl 254, id 43249, offset 0, flags [none], proto TCP (6), length 40)
172.31.16.20.14633 > 192.168.177.233.80: tcp 0
^C
6 packets captured
8 packets received by filter
0 packets dropped by kernel

但是当添加

100: from 1.2.3.16/28 lookup 1019 proto static
规则时,它似乎使用了路由表,但我看不到路由出去的流量。

tcpdump -n -e -q -vvvvv -i any port 80

tcpdump: data link type LINUX_SLL2
tcpdump: listening on any, link-type LINUX_SLL2 (Linux cooked v2), snapshot length 262144 bytes
12:08:26.444843 ens192 In ifindex 3 70:70:8b:1d:6a:bf (tos 0x0, ttl 58, id 20253, offset 0, flags [DF], proto TCP (6), length 60)
[CLIENT PUB IP].10400 > 1.2.3.17.80: tcp 0
12:08:26.444975 cali3542ba50312 Out ifindex 6 ee:ee:ee:ee:ee:ee (tos 0x0, ttl 57, id 20253, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.20.38026 > 192.168.177.233.80: tcp 0
12:08:26.445009 cali3542ba50312 In ifindex 6 e6:d1:f8:03:b9:b7 (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
192.168.177.233.80 > 172.31.16.20.38026: tcp 0
12:08:27.467228 cali3542ba50312 In ifindex 6 e6:d1:f8:03:b9:b7 (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
192.168.177.233.80 > 172.31.16.20.38026: tcp 0
12:08:27.492653 ens192 In ifindex 3 70:70:8b:1d:6a:bf (tos 0x0, ttl 58, id 20254, offset 0, flags [DF], proto TCP (6), length 60)
[CLIENT PUB IP].10400 >1.2.3.17.80: tcp 0
12:08:27.492742 cali3542ba50312 Out ifindex 6 ee:ee:ee:ee:ee:ee (tos 0x0, ttl 57, id 20254, offset 0, flags [DF], proto TCP (6), length 60)
172.31.16.20.38026 > 192.168.177.233.80: tcp 0
12:08:27.492773 cali3542ba50312 In ifindex 6 e6:d1:f8:03:b9:b7 (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
192.168.177.233.80 > 172.31.16.20.38026: tcp 0
^C
7 packets captured
9 packets received by filter
0 packets dropped by kernel

IP信息:

2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:a6:1e:38 brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 172.31.16.20/24 brd 172.31.16.255 scope global ens160
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fea6:1e38/64 scope link
valid_lft forever preferred_lft forever
3: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:50:56:a6:8d:f5 brd ff:ff:ff:ff:ff:ff
altname enp11s0
inet6 fe80::250:56ff:fea6:8df5/64 scope link
valid_lft forever preferred_lft forever
4: kube-ipvs0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN group default
inet 1.2.3.17/32 scope global kube-ipvs0
valid_lft forever preferred_lft forever
Ubuntu 22.04 with kernel 5.15.0-76-generic
Kubernetes: 1.26.5
Calico cluster: v3.25.0
Metallb: 0.13.10
Kube Proxy in ipvs mode with strict arp

Calico 配置:

helm 安装 calico 项目calico/tigera-operator --version v3.25.0 -f calico-config.yaml --namespace Tigera-operator

---
installation:
  cni:
    type: Calico
  calicoNetwork:
    bgp: Disabled
    ipPools:
    - cidr: 192.168.0.0/16
      encapsulation: VXLAN

Metallb 是使用 helm 使用默认参数安装的。 Metallb 配置:

 cat metallb-namespace.yml 
apiVersion: v1
kind: Namespace
metadata:
  labels:
    pod-security.kubernetes.io/enforce: privileged
    pod-security.kubernetes.io/audit: privileged
    pod-security.kubernetes.io/warn: privileged
  name: metallb
cat metallb-crds.yml 
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: isp-vlan1086-ipp
spec:
  addresses:
  - 1.2.3.17 - 1.2.3.27
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: isp-vlan1086-adv
spec:
  ipAddressPools:
  - isp-vlan1086-ipp
  nodeSelectors:
  - matchLabels:
      kubernetes.io/hostname: itsrv4635.esrv.local
  interfaces:
  - ens192

我试图遵循这篇文章,但没有运气:https://itnext.io/configuring-routing-for-metalb-in-l2-mode-7ea26e19219e

我希望任何人都知道这里发生了什么。几周以来我一直在研究这个问题,但不知道我错过了什么。

在过去的几周里,我处理了 20 多个不同的线程和 github 问题,但没有运气。我猜最重要的三个: https://github.com/projectcalico/calico/issues/6789 https://github.com/metalb/metalb/issues/610

另外还通过一篇文章描述了如何设置路由: https://itnext.io/configuring-routing-for-metalb-in-l2-mode-7ea26e19219e

我从 RHEL 9 开始,它的 rook ceph 存在问题。更改为 RHEL 8,我在路由方面没有运气,最终使用了 Ubuntu 22.04,目前我也没有运气。

编辑: 我从 calico 更改为 flannel 应用基于源的路由,现在我可以看到 cni0 之后流量停滞了:

09:12:50.867851 ens192 In  ifindex 3 70:70:8b:1d:6a:bf (tos 0x0, ttl 59, id 54409, offset 0, flags [DF], proto TCP (6), length 60)
    [Client PUB IP].54660 > 1.2.3.17.80: tcp 0
09:12:50.868209 cni0  Out ifindex 6 6a:2a:26:51:8c:94 (tos 0x0, ttl 58, id 54409, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.2.1.60619 > 192.168.2.10.80: tcp 0
09:12:50.868218 vethc393243b Out ifindex 9 6a:2a:26:51:8c:94 (tos 0x0, ttl 58, id 54409, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.2.1.60619 > 192.168.2.10.80: tcp 0
09:12:50.868258 vethc393243b P   ifindex 9 ea:59:75:f8:df:bc (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.2.10.80 > 192.168.2.1.60619: tcp 0
09:12:50.868258 cni0  In  ifindex 6 ea:59:75:f8:df:bc (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 60)
    192.168.2.10.80 > [Client PUB IP].54660: tcp 0

现在似乎无法通过 ens192 离开。

ubuntu kubernetes iptables calico metallb
1个回答
0
投票

我已经处理同样的问题好几天了。
您能否尝试将地址 1.2.3.17/28 静态分配给 ens192? (我知道这有点hacky,但是emmm)

我已经尝试了与您完全相同的配置。 我能得到的最好的方法是让不在集群中的其他服务器能够访问 1.2.3.17:80。 (假设通过链接访问 1.2.3.18,通过来自 1.2.3.30 的 NAT 访问其他 IP,例如 172.31.16.21)

但是我的1.2.3.17实际上是上游IPS的DMZ,我可以在本地访问,但端口转发后,我无法在公共互联网中访问它。

所以我想知道这是否对你有用,这样我就可以查明这是否是我的 ISP 的问题。 谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.