From bc0f4f400d4e85b420beebb43173d0fed496ad22 Mon Sep 17 00:00:00 2001 From: zongzw Date: Sat, 17 Jun 2023 17:49:21 +0800 Subject: [PATCH] Add cilium support. --- deploy/README.md | 9 ++++++++- internal/k8s/k8s.go | 36 ++++++++++++++++++++++++++---------- internal/k8s/utils.go | 39 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 71 insertions(+), 13 deletions(-) diff --git a/deploy/README.md b/deploy/README.md index 128e234..cae8c34 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -1,6 +1,13 @@ These two images cannot be downloaded in China and need to be processed separately. +# for 0.5.1 k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 gcr.io/k8s-staging-gateway-api/admission-server:v0.5.1 -Use docker save && docker load to setup the mentioned images. \ No newline at end of file +# for 0.6.0 +k8s.gcr.io/ingress-nginx/kube-webhook-certgen:v1.1.1 +gcr.io/k8s-staging-gateway-api/admission-server:v0.6.0 + +Use `docker save & docker load` to setup the mentioned images for docker env. +Use `ctr -n k8s.io image export & import` to setup the mentioned images for containerd env. +*The images’ format is universal: docker save -> ctr -n k8s.io image import* \ No newline at end of file diff --git a/internal/k8s/k8s.go b/internal/k8s/k8s.go index fc8d875..7fc81de 100644 --- a/internal/k8s/k8s.go +++ b/internal/k8s/k8s.go @@ -25,17 +25,22 @@ func (ns *Nodes) Set(n *v1.Node) error { node := K8Node{Name: n.Name} - // calico - if _, ok := n.Annotations["projectcalico.org/IPv4Address"]; ok { - ipmask := n.Annotations["projectcalico.org/IPv4Address"] - ipaddr := strings.Split(ipmask, "/")[0] - node = K8Node{ - Name: n.Name, - IpAddr: ipaddr, - NetType: "calico-underlay", - MacAddr: "", + cnitype := detectCNIType(n) + switch cnitype { + case "cilium": + addrs := n.Status.Addresses + ipaddr := "" + for _, addr := range addrs { + if addr.Type == v1.NodeInternalIP { + ipaddr = addr.Address + break + } } - } else { + node.Name = n.Name + node.IpAddr = ipaddr + node.NetType = "" + node.MacAddr = ipv4ToMac(ipaddr) + case "flannel": // flannel v4 if _, ok := n.Annotations["flannel.alpha.coreos.com/backend-data"]; ok { macStr := n.Annotations["flannel.alpha.coreos.com/backend-data"] @@ -65,6 +70,17 @@ func (ns *Nodes) Set(n *v1.Node) error { node.MacAddrV6 = v6["VtepMAC"].(string) } } + case "calico": + ipmask := n.Annotations["projectcalico.org/IPv4Address"] + ipaddr := strings.Split(ipmask, "/")[0] + node = K8Node{ + Name: n.Name, + IpAddr: ipaddr, + NetType: "calico-underlay", + MacAddr: "", + } + default: + return fmt.Errorf("unknown CNI type: %s for node %s", cnitype, n.Name) } NodeCache.mutex <- true diff --git a/internal/k8s/utils.go b/internal/k8s/utils.go index 1969efd..508d240 100644 --- a/internal/k8s/utils.go +++ b/internal/k8s/utils.go @@ -2,6 +2,8 @@ package k8s import ( "fmt" + "strconv" + "strings" "github.com/f5devcentral/f5-bigip-rest-go/utils" v1 "k8s.io/api/core/v1" @@ -48,14 +50,14 @@ func FormatMembersFromServiceEndpoints(svc *v1.Service, eps *v1.Endpoints) ([]Sv } if k8no := NodeCache.Get(*addr.NodeName); k8no == nil { return []SvcEpsMember{}, utils.RetryErrorf("%s not found yet", *addr.NodeName) - } else { + } else if k8no.NetType == "vxlan" { if utils.IsIpv6(addr.IP) { member.MacAddr = k8no.MacAddrV6 } else { member.MacAddr = k8no.MacAddr } - members = append(members, member) } + members = append(members, member) } } } @@ -69,3 +71,36 @@ func FormatMembersFromServiceEndpoints(svc *v1.Service, eps *v1.Endpoints) ([]Sv return members, nil } + +func detectCNIType(node *v1.Node) string { + kind := "unknown" + + for _, c := range node.Status.Conditions { + if c.Reason == "CiliumIsUp" { + kind = "cilium" + break + } + if c.Reason == "CalicoIsUp" { + kind = "calico" + break + } + if c.Reason == "FlannelIsUp" { + kind = "flannel" + break + } + } + return kind +} + +// Convert an IPV4 string to a fake MAC address. +func ipv4ToMac(addr string) string { + ip := strings.Split(addr, ".") + if len(ip) != 4 { + return "" + } + var intIP [4]int + for i, val := range ip { + intIP[i], _ = strconv.Atoi(val) + } + return fmt.Sprintf("0a:0a:%02x:%02x:%02x:%02x", intIP[0], intIP[1], intIP[2], intIP[3]) +}