Skip to content

Define ServiceScopeConfig in ServiceSettings #3464

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

Merged
merged 16 commits into from
May 15, 2025

Conversation

jaellio
Copy link
Contributor

@jaellio jaellio commented Mar 11, 2025

@istio-testing
Copy link
Collaborator

Skipping CI for Draft Pull Request.
If you want CI signal for your change, please convert it to an actual PR.
You can still manually trigger a test run with /test all

@istio-testing istio-testing added do-not-merge/work-in-progress Block merging of a PR because it isn't ready yet. size/M Denotes a PR that changes 30-99 lines, ignoring generated files. labels Mar 11, 2025
@jaellio
Copy link
Contributor Author

jaellio commented Mar 11, 2025

/test all

@jaellio jaellio marked this pull request as ready for review March 11, 2025 18:25
@jaellio jaellio requested a review from a team as a code owner March 11, 2025 18:25
@istio-testing istio-testing removed the do-not-merge/work-in-progress Block merging of a PR because it isn't ready yet. label Mar 11, 2025
@jaellio jaellio requested a review from keithmattix March 11, 2025 18:26
@jaellio jaellio requested a review from keithmattix March 12, 2025 21:51
Copy link
Contributor

@keithmattix keithmattix left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like what we got general consensus on in https://docs.google.com/document/d/1Wg6sx9ZUJL4AsHj5wM1kMx3E436s5wg2qoMqoI-bqbQ/edit?tab=t.0 across multiple TOC and WG meetings so I'm approving

@@ -444,6 +444,47 @@ message MeshConfig {
//
// For example: foo.bar.svc.cluster.local, *.baz.svc.cluster.local
repeated string hosts = 2;

// Scope configuration to be applied to matching services.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is the relation between this new setting and the existing hosts/settings?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My thought was that users set one or the other. A oneOf might be better to express that

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At this point ServiceScopes will only apply to ambient multicluster. In traditional multicluster today the default availability is global. For ambient multicluster, the default availability is local. For alpha, I think it is unnecessary to support ServiceScopes for both configurations operating with different default availabilities

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is it possible there could be conflict where the host is foo.bar.svc.cluster.local and the namespace or service has istio.io/global label enabled?

Also, do we need to support both namespace and service level? what if they have conflicts?

Copy link
Contributor Author

@jaellio jaellio May 1, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think if ServiceScopeConfig is defined, even with a 0 value, the host should be ignored in ambient mode. @keithmattix was that your understanding?

Service selectors overwrite namespace selectors. This behavior should be consistent with the ambient enablement API

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, I think hosts should be ignored if ambient is enabled in env vars

//
// ```yaml
// serviceSettings:
// serviceScopes:
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
// serviceScopes:
// - serviceScopes:

serviceSettings is a list of MeshConfig_ServiceSettings. Not entirely sure we need the double nested list?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@keithmattix do you have a preference? I am in favor of it not being double nested

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm looking at the proto, I almost feel like ServiceScopes should just be a sibling to ServiceSettings. The other fields in service settings don't make sense for service scope, and eventually, I think the latter will supplant the former

Copy link
Contributor Author

@jaellio jaellio Mar 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Might be harder to enforce oneof though...

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fair enough...in that case yeah we don't want the extra nesting

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I had another thought: I'm not sure if we can do oneOf because new versions of istiod reading old meshconfig would no longer be able to parse it correctly...

@istio-testing istio-testing added the needs-rebase Indicates a PR needs to be rebased before being merged label Apr 1, 2025
jaellio added 8 commits April 16, 2025 22:43
Signed-off-by: Jackie Elliott <[email protected]>
Signed-off-by: Jackie Elliott <[email protected]>
Signed-off-by: Jackie Elliott <[email protected]>
Signed-off-by: Jackie Elliott <[email protected]>
Signed-off-by: Jackie Elliott <[email protected]>
Signed-off-by: Jackie Elliott <[email protected]>
@jaellio jaellio force-pushed the jaellio/srvcapandexportapi branch from ad386cf to c9111e4 Compare April 16, 2025 23:39
@istio-testing istio-testing removed the needs-rebase Indicates a PR needs to be rebased before being merged label Apr 16, 2025
@istio-policy-bot istio-policy-bot added the lifecycle/stale Indicates a PR or issue hasn't been manipulated by an Istio team member for a while label Apr 16, 2025
@jaellio jaellio removed the lifecycle/stale Indicates a PR or issue hasn't been manipulated by an Istio team member for a while label Apr 16, 2025
@istio-policy-bot istio-policy-bot added the lifecycle/stale Indicates a PR or issue hasn't been manipulated by an Istio team member for a while label Apr 16, 2025
Signed-off-by: Jackie Elliott <[email protected]>
@jaellio
Copy link
Contributor Author

jaellio commented Apr 17, 2025

@louiscryan Could you please take a look?

@jaellio
Copy link
Contributor Author

jaellio commented May 9, 2025

I took another read before attempting to approve - but I've also looked at the previous examples and the existing use of the API we are changing, not only the additions.

I don't think I can approve this - maybe I'm failing to understand something that is obvious to everyone else, but as an Istio developer - or even as an user - the original intent of the API, to define 'cluster local' scope on the client side, defined as "if service is matching, clients will use cluster local - else global' and with a client-scope - mixed with the addition which appear to impact discovery and server side - is completely confusing and contradictory.

Thanks for sharing - we've reviewed this API in several WG meetings and there is an existing doc that shares this API https://docs.google.com/document/d/1Wg6sx9ZUJL4AsHj5wM1kMx3E436s5wg2qoMqoI-bqbQ/edit?tab=t.0#heading=h.nehszyorutrv which you approved. I wish these fundamental concerns had been discussed sooner. I am not sure how to move forward here without having another discussion on the fundamentals of the design.

I'll let @keithmattix chime in here on why we're not using the existing sidecar mode fields for multicluster configuration.

@costinm
Copy link
Contributor

costinm commented May 9, 2025 via email

@jaellio
Copy link
Contributor Author

jaellio commented May 9, 2025

These are the fundamental questions that I think you are looking to be answered:

  1. Why are there separate APIs for ambient mode and sidecar mode global and local configuration?

  2. How does the existing API for multicluster sidecar mode (hosts) differ from the proposed API in this PR?

  3. If the ServiceScopeConfig API is defining discoverability of services, how are users supposed to express routability and enforce policy?

  4. Should ServiceScopeConfig be defined in ServiceSettings or in a separate message?

  5. What pain points exist in sidecar mode multicluster that we are trying to address with this API for ambient mode multicluster?

@jaellio
Copy link
Contributor Author

jaellio commented May 9, 2025

These are the fundamental questions that I think you are looking to be answered:

  1. Why are there separate APIs for ambient mode and sidecar mode global and local configuration?
  2. How does the existing API for multicluster sidecar mode (hosts) differ from the proposed API in this PR?

The hosts field in ServiceSettings for sidecar mode multicluster relies on L7 hostnames. Since ztunnel is operating at L4, it adds additional complexity to scope discoverability to hostnames. The VIP (obtained through DNS) would need to be translated by ztunnel back into the original hostname and the hostname information from the hosts would either need to be communicated directly or via some mapping of hostname to filtered endpoints over WDS.

Aside from this complexity, sidecar mode multicluster operates with global being the default discoverability. In ambient mode mutlicluster our goal is for local to be the default discoverability. This fundamentally different default would cause significant confusion for users using the same API for sidecar and ambient mode.

  1. If the ServiceScopeConfig API is defining discoverability of services, how are users supposed to express routability and enforce policy?

Routability and policy are expressed through DestinationRule on waypoints and Kubernetes traffic distribution

  1. Should ServiceScopeConfig be defined in ServiceSettings or in a separate message?

I believe John was in favor of keeping ServiceScopeConfig within ServiceSettings. If this is undesirable to other TOC members we could create a separate message.

  1. What pain points exist in sidecar mode multicluster that we are trying to address with this API for ambient mode multicluster?

The goal of ServiceScopeConfig is to define a service discoverability API that aligns with the design of Istio ambient mode (l4/l7 separation, per node vs per pod proxies) and ambient mode multicluster (namespace sameness, shift from global to local default discoverability)

@jaellio
Copy link
Contributor Author

jaellio commented May 9, 2025

In isolation the document and intent are very good - but it is hard to review a proposal if the larger context and details are missing.

Now that the doc is no longer in isolation, is the biggest concern that if that ServiceScopeConfig API is defined in ServiceSettings it will add too much confusion with the existing host field? Additionally, it would make it very complicated or impossible to migrate (in place/within a cluster) if we only allowed hosts or ServiceScopeConfig to be set. This last point is assuming we support in place sidecar mode multicluster and ambient mode multicluster migration.

To clarify: I am not blocking this CL. If 2 other TOC members believe it is the right thing to do - it can be merged, it's just that I don't get it, but unanimity is not required.

I agree, but you bring up valid points. I am trying to figure out how in the future we could have exposed these fundamental concerns sooner and more clearly (through more documentation on my part, perhaps more clarify in the original doc on the big picture of how this design fits in with users' understanding of sidecar mode multicluster and pushing for earlier reviews).

I do believe the intent and the direction of the doc are valid and valuable - and using a label selector is a strict and clear improvement over what we currently have, but my head hurts when I see all the contradictions and inconsistencies, and this the kind of API that covers an area that is already extremely hard to understand for most people ( not only users, but many long time Istio developers ). Add on top the already extremely difficult subject of migration from sidecars to ambient - due in large part to subtle and not-so-subtle differences in behavior, which we rarely consider in depth when reviewing new features and APIs.

I agree, it is complicated, and I want to make sure this API has a reasonable user experience and is comprehendible for future maintainers.

There is no technical reason - and nothing in the document - that requires us to take a MeshConfig API that is used for a particular purpose and with a particular semantic and add fields with contradictory semantic. It is perfectly fine to add a brand new message and leave the old one as is, at least this avoids the contradictions.

I agree - there is no limitation on creating a separate message. Originally, I did make since to keep the multicluster discoverability information together in ServiceSettings.

@costinm
Copy link
Contributor

costinm commented May 9, 2025 via email

@costinm
Copy link
Contributor

costinm commented May 9, 2025 via email

@jaellio
Copy link
Contributor Author

jaellio commented May 9, 2025

As far as I know ServiceSettings is hidden from our public docs to begin with. I am not sure any setting (existing or new) is clearly defined. Can we treat the existing API as superior or preferable when it isn't even documented? It might be, but why isn't it documented?

@jaellio
Copy link
Contributor Author

jaellio commented May 9, 2025

Okay, let's back up to levelset on the big picture goal and view of the world:

  1. In sidecar mode mulitcluster if users want to limit discoverability and routability they must do 2 things. 1) Must configure the hosts in ServicesSettings (to limit discoverability) 2) Must applly an istio-ingress resource with the host limitations (to limit available routes at the e/w gateway).
  2. The goal of the proposed API in this PR is to offer a single location for users to declaratively define the local or global discoverability and routability of a service. All configuration for the e/w gateay routes and endpoint filtering for the ztunnels/waypoints would utilize this API as the source of trust for discoverability and routability of a service. This is the intended improvement of this API compared to the existing sidecar mode scope configuration in the meshConfig AND ingress-gatway.

@costinm does this clarify the big picture for you?

@jaellio
Copy link
Contributor Author

jaellio commented May 9, 2025

@linsun @louiscryan Would appreciate your thoughts here as well to make sure I am communicating the big picture of this API change. Trying to come up with some actionable takeaways so this change isn't indefinably blocked either due to unapproachable complexity or fundamental opposition which hasn't been expressed in previous working group meetings.

@costinm
Copy link
Contributor

costinm commented May 10, 2025

Okay, let's back up to levelset on the big picture goal and view of the world:

  1. In sidecar mode mulitcluster if users want to limit discoverability and routability they must do 2 things. 1) Must configure the hosts in ServicesSettings (to limit discoverability) 2) Must applly an istio-ingress resource with the host limitations (to limit available routes at the e/w gateway).

ServiceSetting does not impact discoverability. Just load balancing ( endpoint selection). And default sidecar multicluster does not restrict routes ( doesn't use one for flat network, and programs SNI routes for everything for multi network).

So normally user only needs to opt out services that need to be local, nothing else.

  1. The goal of the proposed API in this PR is to offer a single location for users to declaratively define the local or global discoverability and routability of a service. All configuration for the e/w gateay routes and endpoint filtering for the ztunnels/waypoints would utilize this API as the source of trust for discoverability and routability of a service. This is the intended improvement of this API compared to the existing sidecar mode scope configuration in the meshConfig AND ingress-gatway.

@costinm does this clarify the big picture for you?

It clarifies the problems with the API in trying yo do too much with too little clarity. As I mentioned, maybe others will understand it but please don't mess up the relatively simple API we have - client side LB only and not programing gateways or LB or what not

@keithmattix
Copy link
Contributor

@costinm I believe @jaellio is correct here. If you look at the code, serviceSettings.host (which I'll also point out is an undocumented feature) is plumbed through to endpointbuilder to filter out endpoints sent to the data plane. I understand that to be discoverability of the endpoints; maybe you have a different word for it that we can use to ensure we're all on the same page?

Also, default sidecar multicluster actually does require user interaction to expose services via a multi-network east/west gateway; see this istio.io Gateway resource, specifically the hosts field: https://github.com/istio/istio/blob/9e70ee786fc69aaff46dc3e4fe314bb7fa7b0d08/samples/multicluster/expose-services.yaml#L16.

So as @jaellio explained, we have 2 completely separate APIs for managing the "scope" where a service is made available: one is client side (consumer) and one is server-side (producer). Furthermore, one only exists in multinetwork. The point of the proposed ServiceScope API is to make a single, declarative statement about the scope of a service and its endpoints. Then, based on that declaration, different mesh components (istiod, the e/w gateway) will be configured in specific ways. That's a much smoother API IMO, and based on previous WG meetings, my understanding is that the rest of @istio/technical-oversight-committee agrees

@costinm
Copy link
Contributor

costinm commented May 11, 2025 via email

@jaellio
Copy link
Contributor Author

jaellio commented May 11, 2025

If hosts/ServiceSettings is a heavily utilized and critical API why isn't it documented? Why is it hidden?

We're not breaking the use of the existing API for sidecar mode. We're offering an alternative API for ambient mode. In this proposed API, istiod will still discover ALL endpoints. And will selectively send endpoints to ztunnels/waypoints based on the services scope. We are discussing "discoverability" from the perspective of the ztunnels/waypoints. They will only be able to select or discover endpoints based the destination service's defined scope (and therefore what endpoints have been shared by istiod).

For clarity (even though the exiting API isn't documented), we could create a seperate message for ambient mode service settings - AmbientServiceScope maybe.

Since there is so much knowlege being shared here about ServiceSettings and the hosts fields it would be great to document it. @costinm could you add this documentation? I think it will reduce confusion for us and users.

@keithmattix

@@ -442,8 +442,59 @@ message MeshConfig {
// The services to which the Settings should be applied. Services are selected using the hostname
// matching rules used by DestinationRule.
//
// The hosts field is ignored if ambient mode is enabled.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bit late to the party, but it would also be good to edit the docs of message Settings to specify sidecar multicluster as opposed to ambient MC

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we're restricting Settings to sidecar mode only. For ambient, we'll support both ServiceSettings and ServiceScopeConfigs

between ServiceSettings and ServiceScopeConfigs.

Signed-off-by: Jackie Elliott <[email protected]>
@costinm
Copy link
Contributor

costinm commented May 12, 2025

If hosts/ServiceSettings is a heavily utilized and critical API why isn't it documented? Why is it hidden?

I don't think it's used by a lot of users - but it is critical for the ones that use it.

Is is hidden because it was expected to have feedback - and be documented in DestinationRule or as part of a first class API with the right ownership, with MeshConfig as a place holder. We followed the same path for locality load balancing - first hidden, then documented in MeshConfig and eventually moved to DR.

Ownership is important - DestinationRule like HttpRoute can be namespaced and modified by the owner of the service - while MeshConfig is restricted to mesh admin.

The relation between locality load balancing and the cluster local load balancing was also not very clearly defined -
sending traffic to same cluster is obviously a very specific case and we didn't want to confuse users, yet there was
an urgent need to have some knob for the users who were broken otherwise.

We're not breaking the use of the existing API for sidecar mode. We're offering an alternative API for ambient mode. In this proposed API, istiod will still discover ALL endpoints. And will selectively send endpoints to ztunnels/waypoints based on the services scope. We are discussing "discoverability" from the perspective of the ztunnels/waypoints. They will only be able to select or discover endpoints based the destination service's defined scope (and therefore what endpoints have been shared by istiod).

So DestinationRule subsetting and locality load balancing are also 'discoverability' - from some perspective ? I don't understand the insistence on using the term 'discoverability from ztunnel perspective' when we never used this term in DestinationRule and the other APIs. If you really must use this word - use it with the context (ztunnel or waypoint discoverability) so users don't get confused or believe that Istiod or K8S discoverability are impacted.

For clarity (even though the exiting API isn't documented), we could create a seperate message for ambient mode service settings - AmbientServiceScope maybe.

Since there is so much knowlege being shared here about ServiceSettings and the hosts fields it would be great to document it. @costinm could you add this documentation? I think it will reduce confusion for us and users.

@keithmattix

AFAIK the intention was for this feature to follow the same path as locality load balancing - with use by advanced users first, but eventual promotion to a namespaced v1 API. Incidentally, ServiceExport from MCP is a namespaced API as well - and may work better for a producer setting than a mesh config fragment (and is neutral to implementation choices - i.e. not ambient-only).

@costinm
Copy link
Contributor

costinm commented May 12, 2025 via email

Signed-off-by: Jackie Elliott <[email protected]>
Copy link
Contributor

@keithmattix keithmattix left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added some wording suggestions. I think I'd like to see something more general about how this API should be used by mesh admins to set the criteria for what services are global vs. local

@costinm
Copy link
Contributor

costinm commented May 13, 2025 via email

@jaellio
Copy link
Contributor Author

jaellio commented May 14, 2025

So far, we never used a mesh config even from a different istiod revision
in same cluster - and surely not a mesh config from a remote cluster. The
security and reliability risks are very high, compounded with
cross-namespace selector risks. We spent years removing the cross namespace
uses in original API.

I am not against adding a 4th way to configure if a service is exposed on a
gateway - after 2 Gateway APIs and ServiceExport, but crossing the cluster
boundaries to watch MeshConfigs is absolutely wrong.

I am not suggesting we cross cluster boundaries to watch MeshConfigs in different clusters. We are operating under the requirement that all MeshConfig ServiceScopeConfigs across clusters are the same. When istiod gets all services across all clusters, the selectors defined in the local MeshConfig are applied.

Signed-off-by: Jackie Elliott <[email protected]>
@jaellio jaellio requested review from jewertow and costinm May 14, 2025 20:47
Copy link
Contributor

@costinm costinm left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Cosmetic / doc suggestions - the structure and the rest is good.

// When in ambient mode, if ServiceSettings are defined they will be considered in addition to the
// ServiceScopeConfigs. If a service is defined by ServiceSetting to be cluster local and matches a
// global service scope selector, the service will be considered cluster local. If a service is
// considered global by ServiceSettings and does not match a global service scope selector
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know if this is the right behavior: ServiceSettings operate by hostname, with the primary use case being services that are not under the control of the mesh admin ( like platform services ). If a user sets starts with a 'local by default' model (for example using Service scope with a wildcard or broad selector) - we want ServiceSettings to opt in by hostname.

The second (and maybe more important) issue is that the scope of both settings is usually .cluster.local names (or the custom suffix used by k8s ) - services using global names ( like .internal or prod.expample.com ) which are common for services used in mixed environments or VPC-scoped DNS, or using ServiceEntry and DNS interception - are almost always global.

I see original doc was vague on what happens to ServiceEntry / non-K8S FQDNs - they are still valid Istio services, but can't be in scope for either ServiceSettings or ServiceScope (unless we use the labels on the ServiceEntry - external services don't have labels )

// global service scope selector, the service will be considered cluster local. If a service is
// considered global by ServiceSettings and does not match a global service scope selector
// the serive will be considered local. Local scope takes precedence over global scope. Since
// ServiceScopeConfigs is local by default, all services are considered local unless it is considered
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See above - I would add 'takes precedence ... for .cluster.local services'. We don't want to accidentally break ServiceEntry and external services.

@@ -450,6 +458,54 @@ message MeshConfig {
// Settings to be applied to select services.
repeated ServiceSettings service_settings = 50;

// Configuration for ambient mode multicluster service scope. This setting allows mesh administrators
// to define the criteria by which the cluster's control plane determines which services in other
// clusters in the mesh are treated as global (accessible across multiple clusters) versus local
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am reading this correctly as 'services in other clusters' == services using K8S Service and Pods in other cluster, and implicitly excluding ServiceEntry ? If yes - please make it explicit to avoid confusion. If no - why and how do we avoid breaking them ?

// and/or other matching criteria. This is particularly useful in multicluster service mesh deployments
// to control service visibility and access across clusters. This API is not intended to enforce
// security policies. Resources like DestinationRules should be used to enforce authorization policies.
// If a service matches a global service scope selector, the service's endpoints will be globally
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo - AuthorizationPolicy enforces authorization, DestinationRule load balancing (including locality) and other client-side policies.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, I'll fix this typo

// If a service matches a global service scope selector, the service's endpoints will be globally
// exposed. If a service is locally scoped, its endpoints will only be exposed to local cluster
// services.
//
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you want to add a line about services matching multiple selectors ? Which one takes priority ? Maybe an example or a line on what happens if matchExpression is missing - does it match all and is the default ?

// Match expression for namespaces.
LabelSelector namespace_selector = 1;

// Match expression for serivces.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Only services in namespaces matching the namespace_selector will be used ( i.e. AND ). If namespace_selector is missing - all namespaces ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this is consistent with the ambient enablement API. An empty selector (one selector must be non-empty) is the equivalent of a match all.

// (cluster local) or globally (mesh-wide).
enum Scope {
LOCAL = 0;
GLOBAL = 1;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If the comment above specify 'global' to mean mesh-wide - why not use MESH instead of GLOBAL ?

Usually GLOBAL is larger than MESH, we are twisting enough words. Also GLOBAL can create confusion with regional/zonal ( covered by other APIs ) - while mesh is a bit more clear as intent.

@istio-testing istio-testing merged commit 6c028fe into istio:master May 15, 2025
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
size/M Denotes a PR that changes 30-99 lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.