tkestack/galaxy

将release-policy设置为never时,删除POD 重建后,IP 并不能固定

huangzhuxing opened this issue · 6 comments

之前我在同样的环境试过是能够固定 ip 的,请问下大佬,这个问题该如何定位?会不会是 etcd 的数据错乱导致?

实验步骤和环境信息见下图:

第一次删除(ip 从 251 变成 253):
image

测试 demo:
image

第二次删除(ip 从 253 变成 200):
image

我开始认为与s tke.cloud.tencent.com/eni-ip:“1” 有关,但我重试将该参数加上,最后的验证结果依然是一样的(如下图):
(ip 从 202 变成 204)
image

环境信息如下(galaxy 的 image 我重新 build 过,主要是将 macvlan copy 进去):
galaxy 是 1.0.8
k8s 是 1.19.11
docker 是19.03.12
all-in-one 单节点环境

image

macvlan配置如下:

[root@rhl7base yaml]# cat /etc/cni/net.d/20-macvlan.conf
{
"cniVersion": "0.2.0",
"type": "macvlan",
"name": "galaxy-k8s-macvlan",
"master": "eno16777736",
"mode": "bridge",
"ipam": {
"type": "host-local",
"ranges": [
[ {
"subnet": "172.16.49.0/24",
"rangeStart": "172.16.49.200",
"rangeEnd": "172.16.49.253",
"gateway": "172.16.49.2"
} ]
]
}
}

我试过使用 ipvlan,同样是以上效果。

  1. tke.cloud.tencent.com/eni-ip:"1" 是需要配置的。
  2. 固定IP功能仅支持underlay网络,不支持overlay网络,你应该将CNI配置中ipam部分删掉(不删掉也没关系)。需要配置floatingip池 Configmap https://github.com/tkestack/galaxy/blob/master/doc/galaxy-ipam-config.md#float-ip-configuration

你的问题原因是没有配置floatingip池,配置后应该是调度器插件galaxy-ipam在调度阶段分配ip,写入pod的annotation中

  1. tke.cloud.tencent.com/eni-ip:"1" 是需要配置的。
  2. 固定IP功能仅支持underlay网络,不支持overlay网络,你应该将CNI配置中ipam部分删掉(不删掉也没关系)。需要配置floatingip池 Configmap https://github.com/tkestack/galaxy/blob/master/doc/galaxy-ipam-config.md#float-ip-configuration

感谢大佬在百忙之中答复我的疑问。

�抱歉,在之前没完全说清楚我的环境信息,关于“floatingip池”,我是有配置的,但我没有单独创建kind: FloatingIP这个资源,如图:
image

后面我又发现了新的情况,用pod的annotation中的 ip 跟实际的 POD IP 不是一致的(之前我试过用galaxy-bridge,是可以保持一致并且能一直重建成功固定的,近期是重建了 k8s 环境后用galaxy-bridge也无法固定),建如下图:
image

我也摘取了 galaxy 的日志(为自己方便 debug,加了一下自己的日志代码,逻辑没动):
获取出来的 IP 是172.16.49.244,传入给 cni.go --> DelegateAdd 执行,调用invoke.ExecPluginWithResult的函数执行返回的是172.16.49.251 IP,本来计划将 cni 的 0.6.0 升级到0.8.1 尝试排除下,发现编译的时候多个地方报错,有部分函数 api的参数结构发生调整,就暂搁这个思路了。

image

galaxy-ipam 的日志:
一直是172.16.49.244这个 IP
image

关于您说的“固定IP功能仅支持underlay网络,不支持overlay网络”,这块我不是特别理解我当前的网络环境是 underlay 还是 overlay 的,我主要是通过虚拟机的网卡eno16777736设置我的 macvlan 网络的(通过 galaxy 创建的 macvlan 也能正常使用),不知道是否跟这个有关,还望大佬提供一下排查思路,继续指引一下,感谢!

我看你用的自己的macvlan的cni,需要修改下cni以支持从pod的annotation中获取ip,

galaxy/pkg/galaxy/server.go

Lines 268 to 285 in dbc3522

func parseExtendedCNIArgs(pod *corev1.Pod) (map[string]json.RawMessage, error) {
if pod.Annotations == nil {
return nil, nil
}
args := pod.Annotations[constant.ExtendedCNIArgsAnnotation]
if args == "" {
return nil, nil
}
// CniArgs is the cni args in pod annotation
var cniArgs struct {
// Common is the common args for cni plugins to setup network
Common map[string]json.RawMessage `json:"common"`
}
if err := json.Unmarshal([]byte(args), &cniArgs); err != nil {
return nil, fmt.Errorf("failed to unmarshal cni args %s: %v", args, err)
}
return cniArgs.Common, nil
}

https://github.com/tkestack/galaxy/blob/master/cni/ipam/ipam.go#L44-L58

感谢大佬指引。
macvlan 一直没有固定 ip 的问题大概已经弄清楚,我简单总结下:

1、我开始以为 bin 目录下的 macvlan 是 galaxy 编译出来的,后来发现是在 make 编译时,从下载的cni-plugins 解压出来,所以这块如果需要原生的macvlan实现 ip 固定,可能需要改动一下。

2、之前使用galaxy-k8s-vlan验证通过,后来出现问题是因为我更新了 float ip,但 galaxy-ipam 没有读取到最新的配置导致。

3 、目前验证 galaxy-k8s-vlan没有问题,但galaxy-flannel和galaxy-bridge一直不能固定,发现两种现象:
3.1:如果floatingip-config配置中,指定一个节点可以用多个网段时(如下配置代码),galaxy-flannel(172.20.x.x) 在 Annotation.args.commo.ipinfos设置的 ip 一直是第一个网段 ip,并且跟 pod ip 无法对应上(如下图),而 vlan(10.20.30.x) 则是正常的
3.2:尝试过将floatingip-config只保留galaxy-flannel(172.20.x.x)的 IP 段,仍然无法对应上,但Annotation.args.commo.ipinfos与galaxy-flannel(172.20.x.x)会变成同网段,例如 pod ip 是 172.20.0.10,而 pod 的 args 可能是172.20.0.20 这种奇怪现象, 这块可能是我还有某些地方没有正确配置导致?

kind: ConfigMap
apiVersion: v1
metadata:
 name: floatingip-config
 namespace: kube-system
data:
  floatingips: '[ {
	"routableSubnet": "172.16.49.131/32",
	"ips":["10.20.30.3~10.20.30.253"],
	"subnet":"10.20.30.0/24",
	"gateway":"10.20.30.1"
}, {
	"routableSubnet": "172.16.49.131/32",
	"ips":["172.20.0.0~172.20.253.253"],
	"subnet":"172.20.0.0/16",
	"gateway":"172.20.0.0"
},{
	"routableSubnet": "172.16.49.131/32",
	"ips":["172.16.49.3~172.16.49.253"],
	"subnet":"172.16.49.0/24",
	"gateway":"172.16.49.2"
}]'

image

galaxy-flannel、galaxy-bridge不支持固定IP
支持固定IP的是这里的https://github.com/tkestack/galaxy/blob/master/doc/supported-cnis.md underlay network plugin

收到,感谢大佬的耐性指导。