眉山招聘网站建设长沙网站推广有哪些啊
文章目录
- CNI 网络流量分析(七)Calico 介绍与原理(二)
- CNI
- IPAM
- 指定 IP
- 指定非 IPAM IP
CNI 网络流量分析(七)Calico 介绍与原理(二)
CNI
- 支持多种 datapath,默认是 linuxDataplane,支持 CRI 调用时 选择 grpc 实现的 dataplane,还支持 ebpf,vpp
- 通过 ipam 获取到 ip 后,DoNetworking
func (d *linuxDataplane) DoNetworking(ctx context.Context,calicoClient calicoclient.Interface,args *skel.CmdArgs,result *cniv1.Result,desiredVethName string,routes []*net.IPNet,endpoint *api.WorkloadEndpoint,annotations map[string]string,
)
- Ns 里创建 veth 设备
- Host 端网卡 calixxx 配置 mac ee:ee:ee:ee:ee:ee
- 如果有 ipv6 地址,关闭 DAD
- Linkup 网卡
- 通过 annotation 查 是否指定 mac,指定则配置指定的 mac
- 配置 ns 里路由 default via 169.254.1.1 dev eth0,169.254.1.1 dev eth0 scope link
- 如果有 ipv6,设置 /proc/sys/net/ipv6/conf/all/disable_ipv6 = 0, /proc/sys/net/ipv6/conf/default/disable_ipv6 = 0,/proc/sys/net/ipv6/conf/lo/disable_ipv6 = 0,创建 ip route6
- 为 ns 里网卡配置 ip
- 开启 ipforwarding
- 开启 /proc/sys/net/ipv4/conf/calixxx/route_localnet = 1,Enable routing to localhost
- /proc/sys/net/ipv4/neigh/calixxx/proxy_delay = 0,arp 延迟,calico 不需要
- /proc/sys/net/ipv4/conf/calixxx/proxy_arp = 1,开启 arp 代理
- /proc/sys/net/ipv4/conf/calixxx/forwarding。
- 在 host 配置到该 ip 的路由指向 calixxx。
- 通过 annotation 检查是否有浮动 ip 配置,创建 ipnat
- 创建 WorkloadEndpoints
- done
Pod 创建完后,pod 内部默认路由指向 169.254.1.1,且 veth host 端配置了 arp_proxy,配置的 mac 是 ee:ee:ee:ee:ee:ee,所以 pod 内部下一跳都是 169.254.1.1
# ip netns exec cni-138c93d8-c975-8b38-3154-1dccf5ed9d83 ip r
default via 169.254.1.1 dev eth0
169.254.1.1 dev eth0 scope link # ip netns exec cni-138c93d8-c975-8b38-3154-1dccf5ed9d83 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000link/ipip 0.0.0.0 brd 0.0.0.0
4: eth0@if11: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1480 qdisc noqueue state UP group default link/ether 32:21:45:c4:c5:d5 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.244.153.204/32 scope global eth0valid_lft forever preferred_lft foreverinet6 fe80::3021:45ff:fec4:c5d5/64 scope link valid_lft forever preferred_lft forever# ip netns exec cni-138c93d8-c975-8b38-3154-1dccf5ed9d83 ip neighbor
169.254.1.1 dev eth0 lladdr ee:ee:ee:ee:ee:ee REACHABLE
172.18.22.111 dev eth0 lladdr ee:ee:ee:ee:ee:ee STALE
IPAM
- 默认使用 “calico-ipam” IPAM
- 先获取 namespace 是否通过 annotation 配置 ippool,pod 是否配置 ippool
- 获取 pod annotation 是否有 cni.projectcalico.org/ipAddrsNoIpam,cni.projectcalico.org/ipAddrs
ipAddrsNoIpam := annot["cni.projectcalico.org/ipAddrsNoIpam"]ipAddrs := annot["cni.projectcalico.org/ipAddrs"]// Switch based on which annotations are passed or not passed.switch {case ipAddrs == "" && ipAddrsNoIpam == "":case ipAddrs != "" && ipAddrsNoIpam != "":case ipAddrsNoIpam != "":case ipAddrs != "":
- 全不配置时,直接代理调取 calico-ipam 二进制
- 全配置时,失败
- 只配置 ipAddrsNoIpam 时,必须是 calico-ipam 类型,会配置成所指定的 IP
- 只配置 ipAddrs 时,必须是 calico-ipam 类型,先 calico.IPAM().ReleaseIPs ip,再使用指定的 IP 去代理调用 calico-ipam
- 通过调用 calicoClient.IPAM().AutoAssign(ctx, assignArgs) 获取 ip
- 获取 预留 IP 和 cidr,预留 IP 和 cidr 可以通过 资源 IPReservation 进行配置
- 通过 node 相关的 cidr 去获取一个 ip。
指定 IP
apiVersion: v1
kind: Pod
metadata:name: pod5namespace: defaultannotations:cni.projectcalico.org/ipAddrs: "[\"10.244.153.250\"]"
spec:containers:- name: pod5image: nginxports:- name: nginx-portcontainerPort: 80protocol: TCP
default pod5 1/1 Running 0 115s 10.244.153.250
指定非 IPAM IP
需要先开启 feature
# kubectl edit configmap calico-config -n kube-system
// 添加"feature_control": {"ip_addrs_no_ipam": true,"floating_ips": true}
apiVersion: v1
kind: Pod
metadata:name: pod5namespace: defaultannotations:cni.projectcalico.org/ipAddrsNoIpam: "[\"80.90.100.200\"]"
spec:containers:- name: pod5image: nginxports:- name: nginx-portcontainerPort: 80protocol: TCP
pod5 1/1 Running 0 54s 80.90.100.200 node112
当然只有本节点能通,其他节点需要自己解决路由问题
Floating_ips
apiVersion: v1
kind: Pod
metadata:name: pod5namespace: defaultannotations:cni.projectcalico.org/floatingIPs: "[\"172.18.22.113\"]"
spec:containers:- name: pod5image: nginxports:- name: nginx-portcontainerPort: 80protocol: TCP
- apiVersion: projectcalico.org/v3kind: WorkloadEndpointmetadata:creationTimestamp: "2023-02-14T02:03:01Z"labels:projectcalico.org/namespace: defaultprojectcalico.org/orchestrator: k8sprojectcalico.org/serviceaccount: defaultname: node112-k8s-pod5-eth0namespace: defaultresourceVersion: "4509106"uid: beb345d3-6e9f-4144-918d-4f96fa8aada5spec:containerID: dc36d90f05c1890f78b8bb8ddc72426c2730ce60b58bf926b946d0131f620c78endpoint: eth0interfaceName: cali8e9fad9b07cipNATs:- externalIP: 172.18.22.113internalIP: 10.244.146.203ipNetworks:- 10.244.146.203/32node: node112orchestrator: k8spod: pod5ports:- hostIP: ""hostPort: 0name: nginx-portport: 80protocol: TCPprofiles:- kns.default- ksa.default.defaultserviceAccountName: default
kind: WorkloadEndpointList
metadata:resourceVersion: "4509937"