-
Notifications
You must be signed in to change notification settings - Fork 114
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
SFC steering options with SRv6 #1667
Comments
Just want to say that L2 and L3 steering do not overlap in use cases and to cover all cases we need both When chain ends using end.DX2, then L2 steering must be used due to ethernet header in packet that is expected in end.DX2. Similarly, end.DX4/end.DX6 expects to NOT have ethernet header in packet, so L3 steering must be used. Regarding 2.2 c)
I understood this that we have 1 service and 1 SFC chain that share the same virtual IP. The service/SFC chain doesn't share anything except cluster IP address and they are not connected serially We would run into IP collisions again or at least at some point packet would not know where to go (service or chain?). |
agree, L2 and L3 steering are completely different use-cases Regarding 2.2 c)
yes
The k8s service should have no endpoints in this case (no pods linked to that service). We can document that and may for instance decide to not render the SFC (and log an error) in case there is an endpoint for such a service. -- |
So you meant a dummy service with no endpoints that serves functionality related to IP address (cluster IP provider, cluster IP assign/delete, DNS, ...). Basically use already working service configuration functionality for SFC chain purposes. |
exactly |
Thanks Rasto for clearly explaining the issue. |
@ahabdels |
Let's assume we would use the CRD approach for defining steering criteria as destination IP/subnet (2.2.a). For that we need to modify the SFC data model: servicefunctionchain.proto What would be the preferred way for its modification? a) add a new field to the b) define steering as a special type of Or are there any other suggestions? |
You can also make it part of first ServiceFunction. I mention this only for completeness of choices, but it is not my preferred option. I would prefer option A, to have it as top level field. This setting is IMHO related to the whole chain. You can i.e use it for next hop going into inner(=not first or last pod/interface in chain) service. So service can use this ip address/subnet for traffic identification or other stuff. Current SRv6 implementation doesn't use it, it just push packets into inner services and expects services to handle every packet from incoming interface. |
By SRv6 implementation of Service Function Chaining (SFC) in Contiv, we have several options for steering the traffic into service chains:
This issue was created with purpose to start the discussion on the options that we have:
1. Using L2 steering, we can implement service chains similar to the existing l2xconnect SFC renderer implementation (see SFC examples) where the chain always starts on an interface, either in a pod, or on an external DPDK interface. The only difference between SRv6 and l2xconnect rendering would be the underlying technology used to forward frames in the chain. The SRv6 rendering would still bring some benefits:
On the other hand, the l2xconnect renderer may be a bit faster performance-wise, since l2xconnect is the fastest way of forwarding packets on VPP.
2. L3 steering is much different, since it does not allow us to define an interface as the start of the chain. With L3 steering, only packets that match destination IP / subnet can go into the chain. The destination IP/subnet can be:
The option 2.1 brings some challenges, e.g. destination IP address conflicts in the routing table. Also, I’m not sure about the use-case for this, since the behavior would be dependent on the dynamic IPAM allocation of the pod, which is not very usable in real-world scenarios.
The option 2.2 would mean allocating a virtual IP address or subnet for each service chain. Any traffic destined to this IP / subnet (from a pod or from an external interface) would be steered into the service chain. The virtual IP subnet could be:
The option 2.3 is in fact the same as 2.2 a), with the difference that the statically defined IP address/subnet is not virtual, but has its purpose outside of the scope of the k8s cluster. This can be very helpful for creating service chains interconnected with e.g. legacy networking infra, or other cloud-native infrastructure.
The text was updated successfully, but these errors were encountered: