简介
flannel
是 coreos 开源的 Kubernetes CNI
实现。它使用 etcd
或者 Kubernetes API
存储整个集群的网络配置。每个 kubernetes节点上运行 flanneld
组件,它从 etcd
或者 Kubernetes API
获取集群的网络地址空间,并在空间内获取一个 subnet
,该节点上的容器 IP都从这个 subnet
中分配,从而保证不同节点上的 IP不会冲突。flannel通过不同的 backend
来实现跨主机的容器网络通信,目前支持 udp
, vxlan
, host-gw
等一系列 backend实现。
源码地址:https://github.com/flannel-io/flannel
SubnetManager
子网管理器,以下简称sm
在main方法中会初始化sm: sm, err := newSubnetManager(ctx)
这里kube子网管理为例:
func NewSubnetManager(ctx context.Context, apiUrl, kubeconfig, prefix, netConfPath string, setNodeNetworkUnavailable, useMultiClusterCidr bool) (subnet.Manager, error) {
var cfg *rest.Config
var err error
// Try to build kubernetes config from a master url or a kubeconfig filepath. If neither masterUrl
// or kubeconfigPath are passed in we fall back to inClusterConfig. If inClusterConfig fails,
// we fallback to the default config.
cfg, err = clientcmd.BuildConfigFromFlags(apiUrl, kubeconfig)
if err != nil {
return nil, fmt.Errorf("fail to create kubernetes config: %v", err)
}
c, err := clientset.NewFor