+ Consider these {SAMPLE.length} requests as the raw L7 events captured
+ between workloads in your cluster — one row per request, exactly as seen
+ on the wire before any aggregation is applied. This is the input that the
+ aggregation key collapses into log entries.
+
+
+
+
+
+ {RAW_COLUMNS.map((c) => (
+
{c.label}
+ ))}
+
+
+
+ {SAMPLE.map((row, i) => (
+
+ {RAW_COLUMNS.map((c) => (
+
{row[c.field]}
+ ))}
+
+ ))}
+
+
+
+
+
2. Aggregation key fields
+
+ Include or exclude each field from the aggregation key.
+
+
+ {AGGREGATORS.map((a) => (
+
+ ))}
+
+
+
3. Configuration
+
+ The FelixConfiguration produced by the selected fields.
+
+ What is written to the log file: one JSON entry per unique combination of
+ the included fields, with count requests merged into it.
+ Excluded fields collapse to "-".
+
+ {props.install === 'container' ? (
+
+ Use the following guidelines and sample file to define the environment variables for starting Calico on the host.
+ For more help, see the {props.nodecontainer} configuration reference
+
+ ) : (
+
+ Use the following guidelines and sample file to define the environment variables for starting Calico on the host.
+
+ )}
+
+
For the Kubernetes datastore set the following:
+
+
+
+
Variable
+
Configuration guidance
+
+
+
+
+
KUBECONFIG
+
Path to kubeconfig file to access the Kubernetes API Server
+
+
+
+ {props.install === 'container' && (
+
+ If using certificates and keys, you will need to volume mount them into the container at the location
+ specified by the paths mentioned above.
+
+ )}
+
+ Sample EnvironmentFile - save to /etc/calico/calico.env
+
+ );
+};
+
+export default TableResource;
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/components/FelixConfig/config-params.json b/calico-cloud_versioned_docs/version-24-1/_includes/components/FelixConfig/config-params.json
new file mode 100644
index 0000000000..5024a1c18e
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/components/FelixConfig/config-params.json
@@ -0,0 +1,9377 @@
+{
+ "Comment": "This file generated by calico-felix-docgen, DO NOT EDIT.",
+ "Groups": [
+ {
+ "Name": "Datastore connection",
+ "Fields": [
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "DatastoreType",
+ "NameEnvVar": "FELIX_DatastoreType",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "One of: `etcdv3`, `kubernetes`",
+ "StringSchemaHTML": "One of: etcdv3, kubernetes",
+ "StringDefault": "etcdv3",
+ "ParsedDefault": "etcdv3",
+ "ParsedDefaultJSON": "\"etcdv3\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "Controls which datastore driver Felix will use. Typically, this is detected from the environment\nand it does not need to be set manually. (For example, if `KUBECONFIG` is set, the kubernetes datastore driver\nwill be used by default).",
+ "DescriptionHTML": "
Controls which datastore driver Felix will use. Typically, this is detected from the environment\nand it does not need to be set manually. (For example, if KUBECONFIG is set, the kubernetes datastore driver\nwill be used by default).
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "EtcdAddr",
+ "NameEnvVar": "FELIX_EtcdAddr",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "String matching regex `^[^:/]+:\\d+$`",
+ "StringSchemaHTML": "String matching regex ^[^:/]+:\\d+$",
+ "StringDefault": "127.0.0.1:2379",
+ "ParsedDefault": "127.0.0.1:2379",
+ "ParsedDefaultJSON": "\"127.0.0.1:2379\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "**Open source-only parameter**; `etcdv3` datastore driver is not supported in Calico Enterprise/Cloud.\n\nWhen using the `etcdv3` datastore driver, the etcd server and port to connect to. If EtcdEndpoints\nis also specified, it takes precedence.",
+ "DescriptionHTML": "
Open source-only parameter; etcdv3 datastore driver is not supported in Calico Enterprise/Cloud.
\n
When using the etcdv3 datastore driver, the etcd server and port to connect to. If EtcdEndpoints\nis also specified, it takes precedence.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": true
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "EtcdCaFile",
+ "NameEnvVar": "FELIX_EtcdCaFile",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "Path to file, which must exist",
+ "StringSchemaHTML": "Path to file, which must exist",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "**Open source-only parameter**; `etcdv3` datastore driver is not supported in Calico Enterprise/Cloud.\n\nWhen using the `etcdv3` datastore driver, path to TLS CA file to use when connecting to\netcd. If the CA file is specified, the other TLS parameters are mandatory.",
+ "DescriptionHTML": "
Open source-only parameter; etcdv3 datastore driver is not supported in Calico Enterprise/Cloud.
\n
When using the etcdv3 datastore driver, path to TLS CA file to use when connecting to\netcd. If the CA file is specified, the other TLS parameters are mandatory.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": true
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "EtcdCertFile",
+ "NameEnvVar": "FELIX_EtcdCertFile",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "Path to file, which must exist",
+ "StringSchemaHTML": "Path to file, which must exist",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "**Open source-only parameter**; `etcdv3` datastore driver is not supported in Calico Enterprise/Cloud.\n\nWhen using the `etcdv3` datastore driver, path to TLS certificate file to use when connecting to\netcd. If the certificate file is specified, the other TLS parameters are mandatory.",
+ "DescriptionHTML": "
Open source-only parameter; etcdv3 datastore driver is not supported in Calico Enterprise/Cloud.
\n
When using the etcdv3 datastore driver, path to TLS certificate file to use when connecting to\netcd. If the certificate file is specified, the other TLS parameters are mandatory.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": true
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "EtcdEndpoints",
+ "NameEnvVar": "FELIX_EtcdEndpoints",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "List of HTTP endpoints: comma-delimited list of `http(s)://hostname:port`",
+ "StringSchemaHTML": "List of HTTP endpoints: comma-delimited list of http(s)://hostname:port",
+ "StringDefault": "",
+ "ParsedDefault": "[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "[]string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "**Open source-only parameter**; `etcdv3` datastore driver is not supported in Calico Enterprise/Cloud.\n\nWhen using the `etcdv3` datastore driver, comma-delimited list of etcd endpoints to connect to,\nreplaces EtcdAddr and EtcdScheme.",
+ "DescriptionHTML": "
Open source-only parameter; etcdv3 datastore driver is not supported in Calico Enterprise/Cloud.
\n
When using the etcdv3 datastore driver, comma-delimited list of etcd endpoints to connect to,\nreplaces EtcdAddr and EtcdScheme.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": true
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "EtcdKeyFile",
+ "NameEnvVar": "FELIX_EtcdKeyFile",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "Path to file, which must exist",
+ "StringSchemaHTML": "Path to file, which must exist",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "**Open source-only parameter**; `etcdv3` datastore driver is not supported in Calico Enterprise/Cloud.\n\nWhen using the `etcdv3` datastore driver, path to TLS private key file to use when connecting to\netcd. If the key file is specified, the other TLS parameters are mandatory.",
+ "DescriptionHTML": "
Open source-only parameter; etcdv3 datastore driver is not supported in Calico Enterprise/Cloud.
\n
When using the etcdv3 datastore driver, path to TLS private key file to use when connecting to\netcd. If the key file is specified, the other TLS parameters are mandatory.
If set, tells Felix to connect to Typha at the given address and port. Overrides TyphaK8sServiceName.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "TyphaCAFile",
+ "NameEnvVar": "FELIX_TyphaCAFile",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "Path to file, which must exist",
+ "StringSchemaHTML": "Path to file, which must exist",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "Path to the TLS CA file to use when communicating with Typha. If this parameter is specified,\nthe other TLS parameters must also be specified. For non-cluster hosts, the CA file is extracted from the\ntigera-ca-bundle ConfigMap under the TyphaK8sNamespace namespace.",
+ "DescriptionHTML": "
Path to the TLS CA file to use when communicating with Typha. If this parameter is specified,\nthe other TLS parameters must also be specified. For non-cluster hosts, the CA file is extracted from the\ntigera-ca-bundle ConfigMap under the TyphaK8sNamespace namespace.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "TyphaCN",
+ "NameEnvVar": "FELIX_TyphaCN",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "Common name to use when authenticating to Typha over TLS. If any TLS parameters are specified then one of\nTyphaCN and TyphaURISAN must be set.",
+ "DescriptionHTML": "
Common name to use when authenticating to Typha over TLS. If any TLS parameters are specified then one of\nTyphaCN and TyphaURISAN must be set.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "TyphaCertFile",
+ "NameEnvVar": "FELIX_TyphaCertFile",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "Path to file, which must exist",
+ "StringSchemaHTML": "Path to file, which must exist",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "Path to the TLS certificate to use when communicating with Typha. If this parameter is specified,\nthe other TLS parameters must also be specified. For non-cluster hosts, the certificate will be signed by the\nin-cluster Tigera operator signer.",
+ "DescriptionHTML": "
Path to the TLS certificate to use when communicating with Typha. If this parameter is specified,\nthe other TLS parameters must also be specified. For non-cluster hosts, the certificate will be signed by the\nin-cluster Tigera operator signer.
Namespace to look in when looking for Typha's service (see TyphaK8sServiceName).
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "TyphaK8sServiceName",
+ "NameEnvVar": "FELIX_TyphaK8sServiceName",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "If set, tells Felix to connect to Typha by looking up the Endpoints of the given Kubernetes\nService in namespace specified by TyphaK8sNamespace.",
+ "DescriptionHTML": "
If set, tells Felix to connect to Typha by looking up the Endpoints of the given Kubernetes\nService in namespace specified by TyphaK8sNamespace.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "TyphaKeyFile",
+ "NameEnvVar": "FELIX_TyphaKeyFile",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "Path to file, which must exist",
+ "StringSchemaHTML": "Path to file, which must exist",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "Path to the TLS private key to use when communicating with Typha. If this parameter is specified,\nthe other TLS parameters must also be specified. For non-cluster hosts, the private key is generated locally\nand rotated when the certificate expires.",
+ "DescriptionHTML": "
Path to the TLS private key to use when communicating with Typha. If this parameter is specified,\nthe other TLS parameters must also be specified. For non-cluster hosts, the private key is generated locally\nand rotated when the certificate expires.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "TyphaReadTimeout",
+ "NameEnvVar": "FELIX_TyphaReadTimeout",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "30",
+ "ParsedDefault": "30s",
+ "ParsedDefaultJSON": "30000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "Read timeout when reading from the Typha connection. If typha sends no data for this long,\nFelix will exit and restart. (Note that Typha sends regular pings so traffic is always expected.)",
+ "DescriptionHTML": "
Read timeout when reading from the Typha connection. If typha sends no data for this long,\nFelix will exit and restart. (Note that Typha sends regular pings so traffic is always expected.)
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Datastore connection",
+ "GroupWithSortPrefix": "00 Datastore connection",
+ "NameConfigFile": "TyphaURISAN",
+ "NameEnvVar": "FELIX_TyphaURISAN",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "URI SAN to use when authenticating to Typha over TLS. If any TLS parameters are specified then one of\nTyphaCN and TyphaURISAN must be set.",
+ "DescriptionHTML": "
URI SAN to use when authenticating to Typha over TLS. If any TLS parameters are specified then one of\nTyphaCN and TyphaURISAN must be set.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Process: Feature detection/overrides",
+ "Fields": [
+ {
+ "Group": "Process: Feature detection/overrides",
+ "GroupWithSortPrefix": "00 Process: Feature detection/overrides",
+ "NameConfigFile": "FeatureDetectOverride",
+ "NameEnvVar": "FELIX_FeatureDetectOverride",
+ "NameYAML": "featureDetectOverride",
+ "NameGoAPI": "FeatureDetectOverride",
+ "StringSchema": "Comma-delimited list of key=value pairs",
+ "StringSchemaHTML": "Comma-delimited list of key=value pairs",
+ "StringDefault": "",
+ "ParsedDefault": "map[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "map[string]string",
+ "YAMLType": "string",
+ "YAMLSchema": "String matching the regular expression `^([a-zA-Z0-9-_]+=(true|false|),)*([a-zA-Z0-9-_]+=(true|false|))?$`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String matching the regular expression ^([a-zA-Z0-9-_]+=(true|false|),)*([a-zA-Z0-9-_]+=(true|false|))?$.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to override feature detection based on auto-detected platform\ncapabilities. Values are specified in a comma separated list with no spaces, example;\n\"SNATFullyRandom=true,MASQFullyRandom=false,RestoreSupportsLock=\". A value of \"true\" or \"false\" will\nforce enable/disable feature, empty or omitted values fall back to auto-detection.",
+ "DescriptionHTML": "
Used to override feature detection based on auto-detected platform\ncapabilities. Values are specified in a comma separated list with no spaces, example;\n\"SNATFullyRandom=true,MASQFullyRandom=false,RestoreSupportsLock=\". A value of \"true\" or \"false\" will\nforce enable/disable feature, empty or omitted values fall back to auto-detection.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Feature detection/overrides",
+ "GroupWithSortPrefix": "00 Process: Feature detection/overrides",
+ "NameConfigFile": "FeatureGates",
+ "NameEnvVar": "FELIX_FeatureGates",
+ "NameYAML": "featureGates",
+ "NameGoAPI": "FeatureGates",
+ "StringSchema": "Comma-delimited list of key=value pairs",
+ "StringSchemaHTML": "Comma-delimited list of key=value pairs",
+ "StringDefault": "",
+ "ParsedDefault": "map[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "map[string]string",
+ "YAMLType": "string",
+ "YAMLSchema": "String matching the regular expression `^([a-zA-Z0-9-_]+=([^=]+),)*([a-zA-Z0-9-_]+=([^=]+))?$`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String matching the regular expression ^([a-zA-Z0-9-_]+=([^=]+),)*([a-zA-Z0-9-_]+=([^=]+))?$.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to enable or disable tech-preview Calico features.\nValues are specified in a comma separated list with no spaces, example;\n\"BPFConnectTimeLoadBalancingWorkaround=enabled,XyZ=false\". This is\nused to enable features that are not fully production ready.",
+ "DescriptionHTML": "
Used to enable or disable tech-preview Calico features.\nValues are specified in a comma separated list with no spaces, example;\n\"BPFConnectTimeLoadBalancingWorkaround=enabled,XyZ=false\". This is\nused to enable features that are not fully production ready.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Process: Go runtime",
+ "Fields": [
+ {
+ "Group": "Process: Go runtime",
+ "GroupWithSortPrefix": "00 Process: Go runtime",
+ "NameConfigFile": "GoGCThreshold",
+ "NameEnvVar": "FELIX_GoGCThreshold",
+ "NameYAML": "goGCThreshold",
+ "NameGoAPI": "GoGCThreshold",
+ "StringSchema": "Integer: [-1,2^63-1]",
+ "StringSchemaHTML": "Integer: [-1,263-1]",
+ "StringDefault": "40",
+ "ParsedDefault": "40",
+ "ParsedDefaultJSON": "40",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer: [-1,2^63-1]",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer: [-1,263-1]",
+ "YAMLDefault": "40",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the Go runtime's garbage collection threshold. I.e. the percentage that the heap is\nallowed to grow before garbage collection is triggered. In general, doubling the value halves the CPU time\nspent doing GC, but it also doubles peak GC memory overhead. A special value of -1 can be used\nto disable GC entirely; this should only be used in conjunction with the GoMemoryLimitMB setting.\n\nThis setting is overridden by the GOGC environment variable.",
+ "DescriptionHTML": "
Sets the Go runtime's garbage collection threshold. I.e. the percentage that the heap is\nallowed to grow before garbage collection is triggered. In general, doubling the value halves the CPU time\nspent doing GC, but it also doubles peak GC memory overhead. A special value of -1 can be used\nto disable GC entirely; this should only be used in conjunction with the GoMemoryLimitMB setting.
\n
This setting is overridden by the GOGC environment variable.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Go runtime",
+ "GroupWithSortPrefix": "00 Process: Go runtime",
+ "NameConfigFile": "GoMaxProcs",
+ "NameEnvVar": "FELIX_GoMaxProcs",
+ "NameYAML": "goMaxProcs",
+ "NameGoAPI": "GoMaxProcs",
+ "StringSchema": "Integer: [-1,2^63-1]",
+ "StringSchemaHTML": "Integer: [-1,263-1]",
+ "StringDefault": "-1",
+ "ParsedDefault": "-1",
+ "ParsedDefaultJSON": "-1",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer: [-1,2^63-1]",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer: [-1,263-1]",
+ "YAMLDefault": "-1",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the maximum number of CPUs that the Go runtime will use concurrently. A value of -1 means\n\"use the system default\"; typically the number of real CPUs on the system.\n\nthis setting is overridden by the GOMAXPROCS environment variable.",
+ "DescriptionHTML": "
Sets the maximum number of CPUs that the Go runtime will use concurrently. A value of -1 means\n\"use the system default\"; typically the number of real CPUs on the system.
\n
this setting is overridden by the GOMAXPROCS environment variable.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Go runtime",
+ "GroupWithSortPrefix": "00 Process: Go runtime",
+ "NameConfigFile": "GoMemoryLimitMB",
+ "NameEnvVar": "FELIX_GoMemoryLimitMB",
+ "NameYAML": "goMemoryLimitMB",
+ "NameGoAPI": "GoMemoryLimitMB",
+ "StringSchema": "Integer: [-1,2^63-1]",
+ "StringSchemaHTML": "Integer: [-1,263-1]",
+ "StringDefault": "-1",
+ "ParsedDefault": "-1",
+ "ParsedDefaultJSON": "-1",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer: [-1,2^63-1]",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer: [-1,263-1]",
+ "YAMLDefault": "-1",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets a (soft) memory limit for the Go runtime in MB. The Go runtime will try to keep its memory\nusage under the limit by triggering GC as needed. To avoid thrashing, it will exceed the limit if GC starts to\ntake more than 50% of the process's CPU time. A value of -1 disables the memory limit.\n\nNote that the memory limit, if used, must be considerably less than any hard resource limit set at the container\nor pod level. This is because felix is not the only process that must run in the container or pod.\n\nThis setting is overridden by the GOMEMLIMIT environment variable.",
+ "DescriptionHTML": "
Sets a (soft) memory limit for the Go runtime in MB. The Go runtime will try to keep its memory\nusage under the limit by triggering GC as needed. To avoid thrashing, it will exceed the limit if GC starts to\ntake more than 50% of the process's CPU time. A value of -1 disables the memory limit.
\n
Note that the memory limit, if used, must be considerably less than any hard resource limit set at the container\nor pod level. This is because felix is not the only process that must run in the container or pod.
\n
This setting is overridden by the GOMEMLIMIT environment variable.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Process: Health port and timeouts",
+ "Fields": [
+ {
+ "Group": "Process: Health port and timeouts",
+ "GroupWithSortPrefix": "00 Process: Health port and timeouts",
+ "NameConfigFile": "HealthEnabled",
+ "NameEnvVar": "FELIX_HealthEnabled",
+ "NameYAML": "healthEnabled",
+ "NameGoAPI": "HealthEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "If set to true, enables Felix's health port, which provides readiness and liveness endpoints.",
+ "DescriptionHTML": "
If set to true, enables Felix's health port, which provides readiness and liveness endpoints.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Health port and timeouts",
+ "GroupWithSortPrefix": "00 Process: Health port and timeouts",
+ "NameConfigFile": "HealthHost",
+ "NameEnvVar": "FELIX_HealthHost",
+ "NameYAML": "healthHost",
+ "NameGoAPI": "HealthHost",
+ "StringSchema": "String matching regex `^[a-zA-Z0-9:._+-]{1,64}$`",
+ "StringSchemaHTML": "String matching regex ^[a-zA-Z0-9:._+-]{1,64}$",
+ "StringDefault": "localhost",
+ "ParsedDefault": "localhost",
+ "ParsedDefaultJSON": "\"localhost\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "localhost",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The host that the health server should bind to.",
+ "DescriptionHTML": "
The host that the health server should bind to.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Health port and timeouts",
+ "GroupWithSortPrefix": "00 Process: Health port and timeouts",
+ "NameConfigFile": "HealthPort",
+ "NameEnvVar": "FELIX_HealthPort",
+ "NameYAML": "healthPort",
+ "NameGoAPI": "HealthPort",
+ "StringSchema": "Integer: [0,65535]",
+ "StringSchemaHTML": "Integer: [0,65535]",
+ "StringDefault": "9099",
+ "ParsedDefault": "9099",
+ "ParsedDefaultJSON": "9099",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer: [0,65535]",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer: [0,65535]",
+ "YAMLDefault": "9099",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The TCP port that the health server should bind to.",
+ "DescriptionHTML": "
The TCP port that the health server should bind to.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Health port and timeouts",
+ "GroupWithSortPrefix": "00 Process: Health port and timeouts",
+ "NameConfigFile": "HealthTimeoutOverrides",
+ "NameEnvVar": "FELIX_HealthTimeoutOverrides",
+ "NameYAML": "healthTimeoutOverrides",
+ "NameGoAPI": "HealthTimeoutOverrides",
+ "StringSchema": "Comma-delimited list of `=` pairs, where durations use Go's standard format (e.g. 1s, 1m, 1h3m2s)",
+ "StringSchemaHTML": "Comma-delimited list of <key>=<duration> pairs, where durations use Go's standard format (e.g. 1s, 1m, 1h3m2s)",
+ "StringDefault": "",
+ "ParsedDefault": "map[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "map[string]time.Duration",
+ "YAMLType": "array",
+ "YAMLSchema": "List of health timeout overrides: `[{name: \"\", timeout: \"\"}, ...]` where `` is in the Go duration format, for example `1m30s`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of health timeout overrides: [{name: \"<name>\", timeout: \"<duration>\"}, ...] where <duration> is in the Go duration format, for example 1m30s.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Allows the internal watchdog timeouts of individual subcomponents to be\noverridden. This is useful for working around \"false positive\" liveness timeouts that can occur\nin particularly stressful workloads or if CPU is constrained. For a list of active\nsubcomponents, see Felix's logs.",
+ "DescriptionHTML": "
Allows the internal watchdog timeouts of individual subcomponents to be\noverridden. This is useful for working around \"false positive\" liveness timeouts that can occur\nin particularly stressful workloads or if CPU is constrained. For a list of active\nsubcomponents, see Felix's logs.
",
+ "UserEditable": true,
+ "GoType": "[]v3.HealthTimeoutOverride",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Process: Logging",
+ "Fields": [
+ {
+ "Group": "Process: Logging",
+ "GroupWithSortPrefix": "00 Process: Logging",
+ "NameConfigFile": "LogActionRateLimit",
+ "NameEnvVar": "FELIX_LogActionRateLimit",
+ "NameYAML": "logActionRateLimit",
+ "NameGoAPI": "LogActionRateLimit",
+ "StringSchema": "String matching regex `^([1-9]\\d{0,3}/(?:second|minute|hour|day))?$`",
+ "StringSchemaHTML": "String matching regex ^([1-9]\\d{0,3}/(?:second|minute|hour|day))?$",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String matching the regular expression `^[1-9]\\d{0,3}/(?:second|minute|hour|day)$`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String matching the regular expression ^[1-9]\\d{0,3}/(?:second|minute|hour|day)$.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the rate of hitting a Log action. The value must be in the format \"N/unit\",\nwhere N is a number and unit is one of: second, minute, hour, or day. For example: \"10/second\" or \"100/hour\".",
+ "DescriptionHTML": "
Sets the rate of hitting a Log action. The value must be in the format \"N/unit\",\nwhere N is a number and unit is one of: second, minute, hour, or day. For example: \"10/second\" or \"100/hour\".
Sets the rate limit burst of hitting a Log action when LogActionRateLimit is enabled.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Logging",
+ "GroupWithSortPrefix": "00 Process: Logging",
+ "NameConfigFile": "LogDebugFilenameRegex",
+ "NameEnvVar": "FELIX_LogDebugFilenameRegex",
+ "NameYAML": "logDebugFilenameRegex",
+ "NameGoAPI": "LogDebugFilenameRegex",
+ "StringSchema": "Regular expression",
+ "StringSchemaHTML": "Regular expression",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "*regexp.Regexp",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls which source code files have their Debug log output included in the logs.\nOnly logs from files with names that match the given regular expression are included. The filter only applies\nto Debug level logs.",
+ "DescriptionHTML": "
Controls which source code files have their Debug log output included in the logs.\nOnly logs from files with names that match the given regular expression are included. The filter only applies\nto Debug level logs.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Logging",
+ "GroupWithSortPrefix": "00 Process: Logging",
+ "NameConfigFile": "LogDropActionOverride",
+ "NameEnvVar": "FELIX_LogDropActionOverride",
+ "NameYAML": "logDropActionOverride",
+ "NameGoAPI": "LogDropActionOverride",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Specifies whether or not to include the DropActionOverride in the logs when it is triggered.",
+ "DescriptionHTML": "
Specifies whether or not to include the DropActionOverride in the logs when it is triggered.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Logging",
+ "GroupWithSortPrefix": "00 Process: Logging",
+ "NameConfigFile": "LogFilePath",
+ "NameEnvVar": "FELIX_LogFilePath",
+ "NameYAML": "logFilePath",
+ "NameGoAPI": "LogFilePath",
+ "StringSchema": "Path to file",
+ "StringSchemaHTML": "Path to file",
+ "StringDefault": "/var/log/calico/felix.log",
+ "ParsedDefault": "/var/log/calico/felix.log",
+ "ParsedDefaultJSON": "\"/var/log/calico/felix.log\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "/var/log/calico/felix.log",
+ "Required": false,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "The full path to the Felix log. Set to none to disable file logging.",
+ "DescriptionHTML": "
The full path to the Felix log. Set to none to disable file logging.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Logging",
+ "GroupWithSortPrefix": "00 Process: Logging",
+ "NameConfigFile": "LogPrefix",
+ "NameEnvVar": "FELIX_LogPrefix",
+ "NameYAML": "logPrefix",
+ "NameGoAPI": "LogPrefix",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "calico-packet",
+ "ParsedDefault": "calico-packet",
+ "ParsedDefaultJSON": "\"calico-packet\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String matching the regular expression `^([a-zA-Z0-9%: /_-])*$`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String matching the regular expression ^([a-zA-Z0-9%: /_-])*$.",
+ "YAMLDefault": "calico-packet",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The log prefix that Felix uses when rendering LOG rules. It is possible to use the following specifiers\nto include extra information in the log prefix.\n- %t: Tier name.\n- %k: Kind (short names).\n- %n: Policy or profile name.\n- %p: Policy or profile name (namespace/name for namespaced kinds or just name for non namespaced kinds).\nCalico includes \": \" characters at the end of the generated log prefix.\nNote that iptables shows up to 29 characters for the log prefix and nftables up to 127 characters. Extra characters are truncated.",
+ "DescriptionHTML": "
The log prefix that Felix uses when rendering LOG rules. It is possible to use the following specifiers\nto include extra information in the log prefix.\n- %t: Tier name.\n- %k: Kind (short names).\n- %n: Policy or profile name.\n- %p: Policy or profile name (namespace/name for namespaced kinds or just name for non namespaced kinds).\nCalico includes \": \" characters at the end of the generated log prefix.\nNote that iptables shows up to 29 characters for the log prefix and nftables up to 127 characters. Extra characters are truncated.
The log severity above which logs are sent to the syslog. Set to None for no logging to syslog.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Process: Prometheus metrics",
+ "Fields": [
+ {
+ "Group": "Process: Prometheus metrics",
+ "GroupWithSortPrefix": "00 Process: Prometheus metrics",
+ "NameConfigFile": "PrometheusGoMetricsEnabled",
+ "NameEnvVar": "FELIX_PrometheusGoMetricsEnabled",
+ "NameYAML": "prometheusGoMetricsEnabled",
+ "NameGoAPI": "PrometheusGoMetricsEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Disables Go runtime metrics collection, which the Prometheus client does by default, when\nset to false. This reduces the number of metrics reported, reducing Prometheus load.",
+ "DescriptionHTML": "
Disables Go runtime metrics collection, which the Prometheus client does by default, when\nset to false. This reduces the number of metrics reported, reducing Prometheus load.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Prometheus metrics",
+ "GroupWithSortPrefix": "00 Process: Prometheus metrics",
+ "NameConfigFile": "PrometheusMetricsCAFile",
+ "NameEnvVar": "FELIX_PrometheusMetricsCAFile",
+ "NameYAML": "prometheusMetricsCAFile",
+ "NameGoAPI": "PrometheusMetricsCAFile",
+ "StringSchema": "Path to file, which must exist",
+ "StringSchemaHTML": "Path to file, which must exist",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Defines the absolute path to the TLS CA certificate file used for securing the /metrics endpoint.\nThis certificate must be valid and accessible by the calico-node process.",
+ "DescriptionHTML": "
Defines the absolute path to the TLS CA certificate file used for securing the /metrics endpoint.\nThis certificate must be valid and accessible by the calico-node process.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Prometheus metrics",
+ "GroupWithSortPrefix": "00 Process: Prometheus metrics",
+ "NameConfigFile": "PrometheusMetricsCertFile",
+ "NameEnvVar": "FELIX_PrometheusMetricsCertFile",
+ "NameYAML": "prometheusMetricsCertFile",
+ "NameGoAPI": "PrometheusMetricsCertFile",
+ "StringSchema": "Path to file, which must exist",
+ "StringSchemaHTML": "Path to file, which must exist",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Defines the absolute path to the TLS certificate file used for securing the /metrics endpoint.\nThis certificate must be valid and accessible by the calico-node process.",
+ "DescriptionHTML": "
Defines the absolute path to the TLS certificate file used for securing the /metrics endpoint.\nThis certificate must be valid and accessible by the calico-node process.
Specifies the client authentication type for the /metrics endpoint.\nThis determines how the server validates client certificates. Default is \"RequireAndVerifyClientCert\".
",
+ "UserEditable": true,
+ "GoType": "*v3.PrometheusMetricsClientAuthType",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Prometheus metrics",
+ "GroupWithSortPrefix": "00 Process: Prometheus metrics",
+ "NameConfigFile": "PrometheusMetricsEnabled",
+ "NameEnvVar": "FELIX_PrometheusMetricsEnabled",
+ "NameYAML": "prometheusMetricsEnabled",
+ "NameGoAPI": "PrometheusMetricsEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Enables the Prometheus metrics server in Felix if set to true.",
+ "DescriptionHTML": "
Enables the Prometheus metrics server in Felix if set to true.
The host that the Prometheus metrics server should bind to.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Prometheus metrics",
+ "GroupWithSortPrefix": "00 Process: Prometheus metrics",
+ "NameConfigFile": "PrometheusMetricsKeyFile",
+ "NameEnvVar": "FELIX_PrometheusMetricsKeyFile",
+ "NameYAML": "prometheusMetricsKeyFile",
+ "NameGoAPI": "PrometheusMetricsKeyFile",
+ "StringSchema": "Path to file, which must exist",
+ "StringSchemaHTML": "Path to file, which must exist",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Defines the absolute path to the private key file corresponding to the TLS certificate\nused for securing the /metrics endpoint. The private key must be valid and accessible by the calico-node process.",
+ "DescriptionHTML": "
Defines the absolute path to the private key file corresponding to the TLS certificate\nused for securing the /metrics endpoint. The private key must be valid and accessible by the calico-node process.
The TCP port that the Prometheus metrics server should bind to.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Prometheus metrics",
+ "GroupWithSortPrefix": "00 Process: Prometheus metrics",
+ "NameConfigFile": "PrometheusProcessMetricsEnabled",
+ "NameEnvVar": "FELIX_PrometheusProcessMetricsEnabled",
+ "NameYAML": "prometheusProcessMetricsEnabled",
+ "NameGoAPI": "PrometheusProcessMetricsEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Disables process metrics collection, which the Prometheus client does by default, when\nset to false. This reduces the number of metrics reported, reducing Prometheus load.",
+ "DescriptionHTML": "
Disables process metrics collection, which the Prometheus client does by default, when\nset to false. This reduces the number of metrics reported, reducing Prometheus load.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Process: Prometheus metrics",
+ "GroupWithSortPrefix": "00 Process: Prometheus metrics",
+ "NameConfigFile": "PrometheusWireGuardMetricsEnabled",
+ "NameEnvVar": "FELIX_PrometheusWireGuardMetricsEnabled",
+ "NameYAML": "prometheusWireGuardMetricsEnabled",
+ "NameGoAPI": "PrometheusWireGuardMetricsEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Disables wireguard metrics collection, which the Prometheus client does by default, when\nset to false. This reduces the number of metrics reported, reducing Prometheus load.",
+ "DescriptionHTML": "
Disables wireguard metrics collection, which the Prometheus client does by default, when\nset to false. This reduces the number of metrics reported, reducing Prometheus load.
Overrides the default location where to find the cgroup hierarchy.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "ChainInsertMode",
+ "NameEnvVar": "FELIX_ChainInsertMode",
+ "NameYAML": "chainInsertMode",
+ "NameGoAPI": "ChainInsertMode",
+ "StringSchema": "One of: `append`, `insert`",
+ "StringSchemaHTML": "One of: append, insert",
+ "StringDefault": "insert",
+ "ParsedDefault": "insert",
+ "ParsedDefaultJSON": "\"insert\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Append`, `Insert`.",
+ "YAMLEnumValues": [
+ "Append",
+ "Insert"
+ ],
+ "YAMLSchemaHTML": "One of: Append, Insert.",
+ "YAMLDefault": "Insert",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether Felix hooks the kernel's top-level iptables chains by inserting a rule\nat the top of the chain or by appending a rule at the bottom. insert is the safe default since it prevents\nCalico's rules from being bypassed. If you switch to append mode, be sure that the other rules in the chains\nsignal acceptance by falling through to the Calico rules, otherwise the Calico policy will be bypassed.",
+ "DescriptionHTML": "
Controls whether Felix hooks the kernel's top-level iptables chains by inserting a rule\nat the top of the chain or by appending a rule at the bottom. insert is the safe default since it prevents\nCalico's rules from being bypassed. If you switch to append mode, be sure that the other rules in the chains\nsignal acceptance by falling through to the Calico rules, otherwise the Calico policy will be bypassed.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "DataplaneDriver",
+ "NameEnvVar": "FELIX_DataplaneDriver",
+ "NameYAML": "dataplaneDriver",
+ "NameGoAPI": "DataplaneDriver",
+ "StringSchema": "Path to executable, which must exist. If not an absolute path, the directory containing this binary and the system path will be searched.",
+ "StringSchemaHTML": "Path to executable, which must exist. If not an absolute path, the directory containing this binary and the system path will be searched.",
+ "StringDefault": "calico-iptables-plugin",
+ "ParsedDefault": "calico-iptables-plugin",
+ "ParsedDefaultJSON": "\"calico-iptables-plugin\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "calico-iptables-plugin",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Filename of the external dataplane driver to use. Only used if UseInternalDataplaneDriver\nis set to false.",
+ "DescriptionHTML": "
Filename of the external dataplane driver to use. Only used if UseInternalDataplaneDriver\nis set to false.
The readiness/liveness timeout used for Felix's (internal) dataplane driver.\nDeprecated: replaced by the generic HealthTimeoutOverrides.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "DefaultEndpointToHostAction",
+ "NameEnvVar": "FELIX_DefaultEndpointToHostAction",
+ "NameYAML": "defaultEndpointToHostAction",
+ "NameGoAPI": "DefaultEndpointToHostAction",
+ "StringSchema": "One of: `ACCEPT`, `DROP`, `RETURN`",
+ "StringSchemaHTML": "One of: ACCEPT, DROP, RETURN",
+ "StringDefault": "DROP",
+ "ParsedDefault": "DROP",
+ "ParsedDefaultJSON": "\"DROP\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Accept`, `Drop`, `Return`.",
+ "YAMLEnumValues": [
+ "Accept",
+ "Drop",
+ "Return"
+ ],
+ "YAMLSchemaHTML": "One of: Accept, Drop, Return.",
+ "YAMLDefault": "Drop",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Controls what happens to traffic that goes from a workload endpoint to the host\nitself (after the endpoint's egress policy is applied). By default, Calico blocks traffic from workload\nendpoints to the host itself with an iptables \"DROP\" action. If you want to allow some or all traffic from\nendpoint to host, set this parameter to RETURN or ACCEPT. Use RETURN if you have your own rules in the iptables\n\"INPUT\" chain; Calico will insert its rules at the top of that chain, then \"RETURN\" packets to the \"INPUT\" chain\nonce it has completed processing workload endpoint egress policy. Use ACCEPT to unconditionally accept packets\nfrom workloads after processing workload endpoint egress policy.",
+ "DescriptionHTML": "
Controls what happens to traffic that goes from a workload endpoint to the host\nitself (after the endpoint's egress policy is applied). By default, Calico blocks traffic from workload\nendpoints to the host itself with an iptables \"DROP\" action. If you want to allow some or all traffic from\nendpoint to host, set this parameter to RETURN or ACCEPT. Use RETURN if you have your own rules in the iptables\n\"INPUT\" chain; Calico will insert its rules at the top of that chain, then \"RETURN\" packets to the \"INPUT\" chain\nonce it has completed processing workload endpoint egress policy. Use ACCEPT to unconditionally accept packets\nfrom workloads after processing workload endpoint egress policy.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "DeviceRouteProtocol",
+ "NameEnvVar": "FELIX_DeviceRouteProtocol",
+ "NameYAML": "deviceRouteProtocol",
+ "NameGoAPI": "DeviceRouteProtocol",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "3",
+ "ParsedDefault": "3",
+ "ParsedDefaultJSON": "3",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "3",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls the protocol to set on routes programmed by Felix. The protocol is an 8-bit label\nused to identify the owner of the route.",
+ "DescriptionHTML": "
Controls the protocol to set on routes programmed by Felix. The protocol is an 8-bit label\nused to identify the owner of the route.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "DeviceRouteSourceAddress",
+ "NameEnvVar": "FELIX_DeviceRouteSourceAddress",
+ "NameYAML": "deviceRouteSourceAddress",
+ "NameGoAPI": "DeviceRouteSourceAddress",
+ "StringSchema": "IPv4 address",
+ "StringSchemaHTML": "IPv4 address",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "net.IP",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "IPv4 address to set as the source hint for routes programmed by Felix. When not set\nthe source address for local traffic from host to workload will be determined by the kernel.",
+ "DescriptionHTML": "
IPv4 address to set as the source hint for routes programmed by Felix. When not set\nthe source address for local traffic from host to workload will be determined by the kernel.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "DeviceRouteSourceAddressIPv6",
+ "NameEnvVar": "FELIX_DeviceRouteSourceAddressIPv6",
+ "NameYAML": "deviceRouteSourceAddressIPv6",
+ "NameGoAPI": "DeviceRouteSourceAddressIPv6",
+ "StringSchema": "IPv6 address",
+ "StringSchemaHTML": "IPv6 address",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "net.IP",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "IPv6 address to set as the source hint for routes programmed by Felix. When not set\nthe source address for local traffic from host to workload will be determined by the kernel.",
+ "DescriptionHTML": "
IPv6 address to set as the source hint for routes programmed by Felix. When not set\nthe source address for local traffic from host to workload will be determined by the kernel.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "DisableConntrackInvalidCheck",
+ "NameEnvVar": "FELIX_DisableConntrackInvalidCheck",
+ "NameYAML": "disableConntrackInvalidCheck",
+ "NameGoAPI": "DisableConntrackInvalidCheck",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Disables the check for invalid connections in conntrack. While the conntrack\ninvalid check helps to detect malicious traffic, it can also cause issues with certain multi-NIC scenarios.",
+ "DescriptionHTML": "
Disables the check for invalid connections in conntrack. While the conntrack\ninvalid check helps to detect malicious traffic, it can also cause issues with certain multi-NIC scenarios.
Overrides the Drop action in Felix, optionally changing the behavior to Accept, and optionally adding Log.\nPossible values are Drop, LogAndDrop, Accept, LogAndAccept.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "EndpointStatusPathPrefix",
+ "NameEnvVar": "FELIX_EndpointStatusPathPrefix",
+ "NameYAML": "endpointStatusPathPrefix",
+ "NameGoAPI": "EndpointStatusPathPrefix",
+ "StringSchema": "Path to file",
+ "StringSchemaHTML": "Path to file",
+ "StringDefault": "/var/run/calico",
+ "ParsedDefault": "/var/run/calico",
+ "ParsedDefaultJSON": "\"/var/run/calico\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "/var/run/calico",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The path to the directory where endpoint status will be written. Endpoint status\nfile reporting is disabled if field is left empty.\n\nChosen directory should match the directory used by the CNI plugin for PodStartupDelay.",
+ "DescriptionHTML": "
The path to the directory where endpoint status will be written. Endpoint status\nfile reporting is disabled if field is left empty.
\n
Chosen directory should match the directory used by the CNI plugin for PodStartupDelay.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "ExternalNodesCIDRList",
+ "NameEnvVar": "FELIX_ExternalNodesCIDRList",
+ "NameYAML": "externalNodesList",
+ "NameGoAPI": "ExternalNodesCIDRList",
+ "StringSchema": "Comma-delimited list of CIDRs",
+ "StringSchemaHTML": "Comma-delimited list of CIDRs",
+ "StringDefault": "",
+ "ParsedDefault": "[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "[]string",
+ "YAMLType": "array",
+ "YAMLSchema": "List of strings: `[\"\", ...]`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of strings: [\"<string>\", ...].",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "A list of CIDR's of external, non-Calico nodes from which VXLAN/IPIP overlay traffic\nwill be allowed. By default, external tunneled traffic is blocked to reduce attack surface.",
+ "DescriptionHTML": "
A list of CIDR's of external, non-Calico nodes from which VXLAN/IPIP overlay traffic\nwill be allowed. By default, external tunneled traffic is blocked to reduce attack surface.
",
+ "UserEditable": true,
+ "GoType": "*[]string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "FailsafeInboundHostPorts",
+ "NameEnvVar": "FELIX_FailsafeInboundHostPorts",
+ "NameYAML": "failsafeInboundHostPorts",
+ "NameGoAPI": "FailsafeInboundHostPorts",
+ "StringSchema": "Comma-delimited list of numeric ports with optional protocol and CIDR:`(tcp|udp)::`, `(tcp|udp):` or ``. IPv6 CIDRs must be enclosed in square brackets.",
+ "StringSchemaHTML": "Comma-delimited list of numeric ports with optional protocol and CIDR:(tcp|udp):<cidr>:<port>, (tcp|udp):<port> or <port>. IPv6 CIDRs must be enclosed in square brackets.",
+ "StringDefault": "tcp:22,udp:68,tcp:179,tcp:2379,tcp:2380,tcp:5473,tcp:6443,tcp:6666,tcp:6667",
+ "ParsedDefault": "[{tcp 22 } {udp 68 } {tcp 179 } {tcp 2379 } {tcp 2380 } {tcp 5473 } {tcp 6443 } {tcp 6666 } {tcp 6667 }]",
+ "ParsedDefaultJSON": "[{\"protocol\":\"tcp\",\"port\":22},{\"protocol\":\"udp\",\"port\":68},{\"protocol\":\"tcp\",\"port\":179},{\"protocol\":\"tcp\",\"port\":2379},{\"protocol\":\"tcp\",\"port\":2380},{\"protocol\":\"tcp\",\"port\":5473},{\"protocol\":\"tcp\",\"port\":6443},{\"protocol\":\"tcp\",\"port\":6666},{\"protocol\":\"tcp\",\"port\":6667}]",
+ "ParsedType": "[]v3.ProtoPort",
+ "YAMLType": "array",
+ "YAMLSchema": "List of protocol/port objects with optional CIDR match: `[{protocol: \"TCP|UDP\", port: , net: \"\"}, ...]`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of protocol/port objects with optional CIDR match: [{protocol: \"TCP|UDP\", port: <port>, net: \"<cidr>\"}, ...].",
+ "YAMLDefault": "[{\"protocol\":\"tcp\",\"port\":22},{\"protocol\":\"udp\",\"port\":68},{\"protocol\":\"tcp\",\"port\":179},{\"protocol\":\"tcp\",\"port\":2379},{\"protocol\":\"tcp\",\"port\":2380},{\"protocol\":\"tcp\",\"port\":5473},{\"protocol\":\"tcp\",\"port\":6443},{\"protocol\":\"tcp\",\"port\":6666},{\"protocol\":\"tcp\",\"port\":6667}]",
+ "Required": false,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "A list of ProtoPort struct objects including UDP/TCP/SCTP ports and CIDRs that Felix will\nallow incoming traffic to host endpoints on irrespective of the security policy. This is useful to avoid accidentally\ncutting off a host with incorrect configuration. For backwards compatibility, if the protocol is not specified,\nit defaults to \"tcp\". If a CIDR is not specified, it will allow traffic from all addresses. To disable all inbound host ports,\nuse the value \"[]\". The default value allows ssh access, DHCP, BGP, etcd and the Kubernetes API.",
+ "DescriptionHTML": "
A list of ProtoPort struct objects including UDP/TCP/SCTP ports and CIDRs that Felix will\nallow incoming traffic to host endpoints on irrespective of the security policy. This is useful to avoid accidentally\ncutting off a host with incorrect configuration. For backwards compatibility, if the protocol is not specified,\nit defaults to \"tcp\". If a CIDR is not specified, it will allow traffic from all addresses. To disable all inbound host ports,\nuse the value \"[]\". The default value allows ssh access, DHCP, BGP, etcd and the Kubernetes API.
",
+ "UserEditable": true,
+ "GoType": "*[]v3.ProtoPort",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "FailsafeOutboundHostPorts",
+ "NameEnvVar": "FELIX_FailsafeOutboundHostPorts",
+ "NameYAML": "failsafeOutboundHostPorts",
+ "NameGoAPI": "FailsafeOutboundHostPorts",
+ "StringSchema": "Comma-delimited list of numeric ports with optional protocol and CIDR:`(tcp|udp)::`, `(tcp|udp):` or ``. IPv6 CIDRs must be enclosed in square brackets.",
+ "StringSchemaHTML": "Comma-delimited list of numeric ports with optional protocol and CIDR:(tcp|udp):<cidr>:<port>, (tcp|udp):<port> or <port>. IPv6 CIDRs must be enclosed in square brackets.",
+ "StringDefault": "udp:53,udp:67,tcp:179,tcp:2379,tcp:2380,tcp:5473,tcp:6443,tcp:6666,tcp:6667",
+ "ParsedDefault": "[{udp 53 } {udp 67 } {tcp 179 } {tcp 2379 } {tcp 2380 } {tcp 5473 } {tcp 6443 } {tcp 6666 } {tcp 6667 }]",
+ "ParsedDefaultJSON": "[{\"protocol\":\"udp\",\"port\":53},{\"protocol\":\"udp\",\"port\":67},{\"protocol\":\"tcp\",\"port\":179},{\"protocol\":\"tcp\",\"port\":2379},{\"protocol\":\"tcp\",\"port\":2380},{\"protocol\":\"tcp\",\"port\":5473},{\"protocol\":\"tcp\",\"port\":6443},{\"protocol\":\"tcp\",\"port\":6666},{\"protocol\":\"tcp\",\"port\":6667}]",
+ "ParsedType": "[]v3.ProtoPort",
+ "YAMLType": "array",
+ "YAMLSchema": "List of protocol/port objects with optional CIDR match: `[{protocol: \"TCP|UDP\", port: , net: \"\"}, ...]`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of protocol/port objects with optional CIDR match: [{protocol: \"TCP|UDP\", port: <port>, net: \"<cidr>\"}, ...].",
+ "YAMLDefault": "[{\"protocol\":\"udp\",\"port\":53},{\"protocol\":\"udp\",\"port\":67},{\"protocol\":\"tcp\",\"port\":179},{\"protocol\":\"tcp\",\"port\":2379},{\"protocol\":\"tcp\",\"port\":2380},{\"protocol\":\"tcp\",\"port\":5473},{\"protocol\":\"tcp\",\"port\":6443},{\"protocol\":\"tcp\",\"port\":6666},{\"protocol\":\"tcp\",\"port\":6667}]",
+ "Required": false,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "A list of PortProto struct objects including UDP/TCP/SCTP ports and CIDRs that Felix\nwill allow outgoing traffic from host endpoints to irrespective of the security policy. This is useful to avoid accidentally\ncutting off a host with incorrect configuration. For backwards compatibility, if the protocol is not specified, it defaults\nto \"tcp\". If a CIDR is not specified, it will allow traffic from all addresses. To disable all outbound host ports,\nuse the value \"[]\". The default value opens etcd's standard ports to ensure that Felix does not get cut off from etcd\nas well as allowing DHCP, DNS, BGP and the Kubernetes API.",
+ "DescriptionHTML": "
A list of PortProto struct objects including UDP/TCP/SCTP ports and CIDRs that Felix\nwill allow outgoing traffic from host endpoints to irrespective of the security policy. This is useful to avoid accidentally\ncutting off a host with incorrect configuration. For backwards compatibility, if the protocol is not specified, it defaults\nto \"tcp\". If a CIDR is not specified, it will allow traffic from all addresses. To disable all outbound host ports,\nuse the value \"[]\". The default value opens etcd's standard ports to ensure that Felix does not get cut off from etcd\nas well as allowing DHCP, DNS, BGP and the Kubernetes API.
Configures whether or not Felix will program non-OpenStack floating IP addresses. (OpenStack-derived\nfloating IPs are always programmed, regardless of this setting.)
",
+ "UserEditable": true,
+ "GoType": "*v3.FloatingIPType",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "IPForwarding",
+ "NameEnvVar": "FELIX_IPForwarding",
+ "NameYAML": "ipForwarding",
+ "NameGoAPI": "IPForwarding",
+ "StringSchema": "One of: `Disabled`, `Enabled`",
+ "StringSchemaHTML": "One of: Disabled, Enabled",
+ "StringDefault": "Enabled",
+ "ParsedDefault": "Enabled",
+ "ParsedDefaultJSON": "\"Enabled\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"Disabled\"`, `\"Enabled\"`.",
+ "YAMLEnumValues": [
+ "Disabled",
+ "Enabled"
+ ],
+ "YAMLSchemaHTML": "One of: \"Disabled\", \"Enabled\".",
+ "YAMLDefault": "Enabled",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether Felix sets the host sysctls to enable IP forwarding. IP forwarding is required\nwhen using Calico for workload networking. This should be disabled only on hosts where Calico is used solely for\nhost protection. In BPF mode, due to a kernel interaction, either IPForwarding must be enabled or BPFEnforceRPF\nmust be disabled.",
+ "DescriptionHTML": "
Controls whether Felix sets the host sysctls to enable IP forwarding. IP forwarding is required\nwhen using Calico for workload networking. This should be disabled only on hosts where Calico is used solely for\nhost protection. In BPF mode, due to a kernel interaction, either IPForwarding must be enabled or BPFEnforceRPF\nmust be disabled.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "IPv4ElevatedRoutePriority",
+ "NameEnvVar": "FELIX_IPv4ElevatedRoutePriority",
+ "NameYAML": "ipv4ElevatedRoutePriority",
+ "NameGoAPI": "IPv4ElevatedRoutePriority",
+ "StringSchema": "Integer: [1,2147483646]",
+ "StringSchemaHTML": "Integer: [1,2147483646]",
+ "StringDefault": "512",
+ "ParsedDefault": "512",
+ "ParsedDefaultJSON": "512",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer: [1,2147483646]",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer: [1,2147483646]",
+ "YAMLDefault": "512",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Route Priority value for an elevated priority Calico-programmed IPv4 route. Note, higher\nvalues mean lower priority. Elevated priority is used during VM live migration, and for\noptimal behaviour IPv4ElevatedRoutePriority must be less than IPv4NormalRoutePriority.",
+ "DescriptionHTML": "
Route Priority value for an elevated priority Calico-programmed IPv4 route. Note, higher\nvalues mean lower priority. Elevated priority is used during VM live migration, and for\noptimal behaviour IPv4ElevatedRoutePriority must be less than IPv4NormalRoutePriority.
Route Priority value for a normal priority Calico-programmed IPv4 route. Note, higher\nvalues mean lower priority.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "IPv6ElevatedRoutePriority",
+ "NameEnvVar": "FELIX_IPv6ElevatedRoutePriority",
+ "NameYAML": "ipv6ElevatedRoutePriority",
+ "NameGoAPI": "IPv6ElevatedRoutePriority",
+ "StringSchema": "Integer: [1,2147483646]",
+ "StringSchemaHTML": "Integer: [1,2147483646]",
+ "StringDefault": "512",
+ "ParsedDefault": "512",
+ "ParsedDefaultJSON": "512",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer: [1,2147483646]",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer: [1,2147483646]",
+ "YAMLDefault": "512",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Route Priority value for an elevated priority Calico-programmed IPv6 route. Note, higher\nvalues mean lower priority. Elevated priority is used during VM live migration, and for\noptimal behaviour IPv6ElevatedRoutePriority must be less than IPv6NormalRoutePriority.",
+ "DescriptionHTML": "
Route Priority value for an elevated priority Calico-programmed IPv6 route. Note, higher\nvalues mean lower priority. Elevated priority is used during VM live migration, and for\noptimal behaviour IPv6ElevatedRoutePriority must be less than IPv6NormalRoutePriority.
Route Priority value for a normal priority Calico-programmed IPv6 route. Note, higher\nvalues mean lower priority.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "InterfaceExclude",
+ "NameEnvVar": "FELIX_InterfaceExclude",
+ "NameYAML": "interfaceExclude",
+ "NameGoAPI": "InterfaceExclude",
+ "StringSchema": "Comma-delimited list of Linux interface names/regex patterns. Regex patterns must start/end with `/`.",
+ "StringSchemaHTML": "Comma-delimited list of Linux interface names/regex patterns. Regex patterns must start/end with /.",
+ "StringDefault": "kube-ipvs0",
+ "ParsedDefault": "[^kube-ipvs0$]",
+ "ParsedDefaultJSON": "[\"^kube-ipvs0$\"]",
+ "ParsedType": "[]*regexp.Regexp",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "kube-ipvs0",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "A comma-separated list of interface names that should be excluded when Felix is resolving\nhost endpoints. The default value ensures that Felix ignores Kubernetes' internal `kube-ipvs0` device. If you\nwant to exclude multiple interface names using a single value, the list supports regular expressions. For\nregular expressions you must wrap the value with `/`. For example having values `/^kube/,veth1` will exclude\nall interfaces that begin with `kube` and also the interface `veth1`.",
+ "DescriptionHTML": "
A comma-separated list of interface names that should be excluded when Felix is resolving\nhost endpoints. The default value ensures that Felix ignores Kubernetes' internal kube-ipvs0 device. If you\nwant to exclude multiple interface names using a single value, the list supports regular expressions. For\nregular expressions you must wrap the value with /. For example having values /^kube/,veth1 will exclude\nall interfaces that begin with kube and also the interface veth1.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "InterfacePrefix",
+ "NameEnvVar": "FELIX_InterfacePrefix",
+ "NameYAML": "interfacePrefix",
+ "NameGoAPI": "InterfacePrefix",
+ "StringSchema": "String matching regex `^[a-zA-Z0-9_-]{1,15}(,[a-zA-Z0-9_-]{1,15})*$`",
+ "StringSchemaHTML": "String matching regex ^[a-zA-Z0-9_-]{1,15}(,[a-zA-Z0-9_-]{1,15})*$",
+ "StringDefault": "cali",
+ "ParsedDefault": "cali",
+ "ParsedDefaultJSON": "\"cali\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "cali",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "The interface name prefix that identifies workload endpoints and so distinguishes\nthem from host endpoint interfaces. Note: in environments other than bare metal, the orchestrators\nconfigure this appropriately. For example our Kubernetes and Docker integrations set the 'cali' value,\nand our OpenStack integration sets the 'tap' value.",
+ "DescriptionHTML": "
The interface name prefix that identifies workload endpoints and so distinguishes\nthem from host endpoint interfaces. Note: in environments other than bare metal, the orchestrators\nconfigure this appropriately. For example our Kubernetes and Docker integrations set the 'cali' value,\nand our OpenStack integration sets the 'tap' value.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "InterfaceRefreshInterval",
+ "NameEnvVar": "FELIX_InterfaceRefreshInterval",
+ "NameYAML": "interfaceRefreshInterval",
+ "NameGoAPI": "InterfaceRefreshInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "90",
+ "ParsedDefault": "1m30s",
+ "ParsedDefaultJSON": "90000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "1m30s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The period at which Felix rescans local interfaces to verify their state.\nThe rescan can be disabled by setting the interval to 0.",
+ "DescriptionHTML": "
The period at which Felix rescans local interfaces to verify their state.\nThe rescan can be disabled by setting the interval to 0.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "Ipv6Support",
+ "NameEnvVar": "FELIX_Ipv6Support",
+ "NameYAML": "ipv6Support",
+ "NameGoAPI": "IPv6Support",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether Felix enables support for IPv6 (if supported by the in-use dataplane).",
+ "DescriptionHTML": "
Controls whether Felix enables support for IPv6 (if supported by the in-use dataplane).
Configures Felix to work together with Tigera's Istio distribution.
",
+ "UserEditable": true,
+ "GoType": "*v3.IstioAmbientMode",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "IstioDSCPMark",
+ "NameEnvVar": "FELIX_IstioDSCPMark",
+ "NameYAML": "istioDSCPMark",
+ "NameGoAPI": "IstioDSCPMark",
+ "StringSchema": "Numeric value: An integer from 0 to 63, representing the 6-bit DSCP code directly; Named value: A case-insensitive string corresponding to a standardized DSCP name (e.g., \"CS0\", \"AF11\", \"AF21\", \"EF\", etc.) as defined in the IANA registry for Differentiated Services Field Codepoints.",
+ "StringSchemaHTML": "Numeric value: An integer from 0 to 63, representing the 6-bit DSCP code directly; Named value: A case-insensitive string corresponding to a standardized DSCP name (e.g., \"CS0\", \"AF11\", \"AF21\", \"EF\", etc.) as defined in the IANA registry for Differentiated Services Field Codepoints.",
+ "StringDefault": "23",
+ "ParsedDefault": "23",
+ "ParsedDefaultJSON": "23",
+ "ParsedType": "numorstring.DSCP",
+ "YAMLType": "integer",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the value to use when directing traffic to Istio ZTunnel, when Istio is enabled. The mark is set only on\nSYN packets at the final hop to avoid interference with other protocols. This value is reserved by Calico and must not be used\nwith other Istio installation.",
+ "DescriptionHTML": "
Sets the value to use when directing traffic to Istio ZTunnel, when Istio is enabled. The mark is set only on\nSYN packets at the final hop to avoid interference with other protocols. This value is reserved by Calico and must not be used\nwith other Istio installation.
",
+ "UserEditable": true,
+ "GoType": "*numorstring.DSCP",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "KubeMasqueradeBit",
+ "NameEnvVar": "FELIX_KubeMasqueradeBit",
+ "NameYAML": "kubeMasqueradeBit",
+ "NameGoAPI": "KubeMasqueradeBit",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "14",
+ "ParsedDefault": "14",
+ "ParsedDefaultJSON": "14",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "14",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Should be set to the same value as --iptables-masquerade-bit of kube-proxy\nwhen TPROXY is used. The default is the same as kube-proxy default thus only needs a change\nif kube-proxy is using a non-standard setting. Must be within the range of 0-31.",
+ "DescriptionHTML": "
Should be set to the same value as --iptables-masquerade-bit of kube-proxy\nwhen TPROXY is used. The default is the same as kube-proxy default thus only needs a change\nif kube-proxy is using a non-standard setting. Must be within the range of 0-31.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "L7ObservabilityEnabled",
+ "NameEnvVar": "FELIX_L7ObservabilityEnabled",
+ "NameYAML": "l7ObservabilityEnabled",
+ "NameGoAPI": "L7ObservabilityEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Enables eBPF-based L7 HTTP and TLS observability.\nIt is dataplane-agnostic - works with eBPF, iptables, or nftables.\nRequires kernel 5.17+.",
+ "DescriptionHTML": "
Enables eBPF-based L7 HTTP and TLS observability.\nIt is dataplane-agnostic - works with eBPF, iptables, or nftables.\nRequires kernel 5.17+.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "LiveMigrationRouteConvergenceTime",
+ "NameEnvVar": "FELIX_LiveMigrationRouteConvergenceTime",
+ "NameYAML": "liveMigrationRouteConvergenceTime",
+ "NameGoAPI": "LiveMigrationRouteConvergenceTime",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "30",
+ "ParsedDefault": "30s",
+ "ParsedDefaultJSON": "30000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "30s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The time to keep elevated route priority after a\nVM live migration completes. This allows routes to converge across the cluster before\nreverting to normal priority.",
+ "DescriptionHTML": "
The time to keep elevated route priority after a\nVM live migration completes. This allows routes to converge across the cluster before\nreverting to normal priority.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "LocalSubnetL2Reachability",
+ "NameEnvVar": "FELIX_LocalSubnetL2Reachability",
+ "NameYAML": "localSubnetL2Reachability",
+ "NameGoAPI": "LocalSubnetL2Reachability",
+ "StringSchema": "One of: `Disabled`, `PodsAndLoadBalancers`",
+ "StringSchemaHTML": "One of: Disabled, PodsAndLoadBalancers",
+ "StringDefault": "Disabled",
+ "ParsedDefault": "Disabled",
+ "ParsedDefaultJSON": "\"Disabled\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"Disabled\"`, `\"PodsAndLoadBalancers\"`.",
+ "YAMLEnumValues": [
+ "Disabled",
+ "PodsAndLoadBalancers"
+ ],
+ "YAMLSchemaHTML": "One of: \"Disabled\", \"PodsAndLoadBalancers\".",
+ "YAMLDefault": "Disabled",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether Felix automatically responds to\nARP (IPv4) and NDP (IPv6) requests on host interfaces for local pod IPs and\nselected LoadBalancer VIPs that fall within the same subnet as the host\ninterface. When set to PodsAndLoadBalancers, pods and LB VIPs on the host\nsubnet are reachable from the local L2 segment without BGP.",
+ "DescriptionHTML": "
Controls whether Felix automatically responds to\nARP (IPv4) and NDP (IPv6) requests on host interfaces for local pod IPs and\nselected LoadBalancer VIPs that fall within the same subnet as the host\ninterface. When set to PodsAndLoadBalancers, pods and LB VIPs on the host\nsubnet are reachable from the local L2 segment without BGP.
",
+ "UserEditable": true,
+ "GoType": "*v3.LocalSubnetL2ReachabilityMode",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "LocalSubnetL2ReachabilityRefreshInterval",
+ "NameEnvVar": "FELIX_LocalSubnetL2ReachabilityRefreshInterval",
+ "NameYAML": "localSubnetL2ReachabilityRefreshInterval",
+ "NameGoAPI": "LocalSubnetL2ReachabilityRefreshInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "120",
+ "ParsedDefault": "2m0s",
+ "ParsedDefaultJSON": "120000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "2m0s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls how often Felix re-announces\n(gratuitous ARP / unsolicited NA) every IP it proxies ARP/NDP for when\nLocalSubnetL2Reachability is enabled, keeping neighbor caches and switch\nforwarding tables warm even when the set of proxied IPs is unchanged. Set to 0\nto disable periodic re-announcement, leaving only the one-shot announce when an\nIP is added.",
+ "DescriptionHTML": "
Controls how often Felix re-announces\n(gratuitous ARP / unsolicited NA) every IP it proxies ARP/NDP for when\nLocalSubnetL2Reachability is enabled, keeping neighbor caches and switch\nforwarding tables warm even when the set of proxied IPs is unchanged. Set to 0\nto disable periodic re-announcement, leaving only the one-shot announce when an\nIP is added.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "MTUIfacePattern",
+ "NameEnvVar": "FELIX_MTUIfacePattern",
+ "NameYAML": "mtuIfacePattern",
+ "NameGoAPI": "MTUIfacePattern",
+ "StringSchema": "Regular expression",
+ "StringSchemaHTML": "Regular expression",
+ "StringDefault": "^((en|wl|ww|sl|ib)[Pcopsvx].*|(eth|wlan|wwan).*)",
+ "ParsedDefault": "^((en|wl|ww|sl|ib)[Pcopsvx].*|(eth|wlan|wwan).*)",
+ "ParsedDefaultJSON": "\"^((en|wl|ww|sl|ib)[Pcopsvx].*|(eth|wlan|wwan).*)\"",
+ "ParsedType": "*regexp.Regexp",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "^((en|wl|ww|sl|ib)[Pcopsvx].*|(eth|wlan|wwan).*)",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "A regular expression that controls which interfaces Felix should scan in order\nto calculate the host's MTU.\nThis should not match workload interfaces (usually named cali...).",
+ "DescriptionHTML": "
A regular expression that controls which interfaces Felix should scan in order\nto calculate the host's MTU.\nThis should not match workload interfaces (usually named cali...).
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "NATOutgoingAddress",
+ "NameEnvVar": "FELIX_NATOutgoingAddress",
+ "NameYAML": "natOutgoingAddress",
+ "NameGoAPI": "NATOutgoingAddress",
+ "StringSchema": "IPv4 address",
+ "StringSchemaHTML": "IPv4 address",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "net.IP",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Specifies an address to use when performing source NAT for traffic in a natOutgoing pool that\nis leaving the network. By default the address used is an address on the interface the traffic is leaving on\n(i.e. it uses the iptables MASQUERADE target).",
+ "DescriptionHTML": "
Specifies an address to use when performing source NAT for traffic in a natOutgoing pool that\nis leaving the network. By default the address used is an address on the interface the traffic is leaving on\n(i.e. it uses the iptables MASQUERADE target).
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "NATOutgoingExclusions",
+ "NameEnvVar": "FELIX_NATOutgoingExclusions",
+ "NameYAML": "natOutgoingExclusions",
+ "NameGoAPI": "NATOutgoingExclusions",
+ "StringSchema": "One of: `IPPoolsAndHostIPs`, `IPPoolsOnly`",
+ "StringSchemaHTML": "One of: IPPoolsAndHostIPs, IPPoolsOnly",
+ "StringDefault": "IPPoolsOnly",
+ "ParsedDefault": "IPPoolsOnly",
+ "ParsedDefaultJSON": "\"IPPoolsOnly\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"IPPoolsAndHostIPs\"`, `\"IPPoolsOnly\"`.",
+ "YAMLEnumValues": [
+ "IPPoolsAndHostIPs",
+ "IPPoolsOnly"
+ ],
+ "YAMLSchemaHTML": "One of: \"IPPoolsAndHostIPs\", \"IPPoolsOnly\".",
+ "YAMLDefault": "IPPoolsOnly",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "When a IP pool setting `natOutgoing` is true, packets sent from Calico networked containers in this IP pool to destinations will be masqueraded.\nConfigure which type of destinations is excluded from being masqueraded.\n- IPPoolsOnly: destinations outside of this IP pool will be masqueraded.\n- IPPoolsAndHostIPs: destinations outside of this IP pool and all hosts will be masqueraded.",
+ "DescriptionHTML": "
When a IP pool setting natOutgoing is true, packets sent from Calico networked containers in this IP pool to destinations will be masqueraded.\nConfigure which type of destinations is excluded from being masqueraded.\n- IPPoolsOnly: destinations outside of this IP pool will be masqueraded.\n- IPPoolsAndHostIPs: destinations outside of this IP pool and all hosts will be masqueraded.
",
+ "UserEditable": true,
+ "GoType": "*v3.NATOutgoingExclusionsType",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "NATPortRange",
+ "NameEnvVar": "FELIX_NATPortRange",
+ "NameYAML": "natPortRange",
+ "NameGoAPI": "NATPortRange",
+ "StringSchema": "Port range: either a single number in [0,65535] or a range of numbers `n:m`",
+ "StringSchemaHTML": "Port range: either a single number in [0,65535] or a range of numbers n:m",
+ "StringDefault": "",
+ "ParsedDefault": "0",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "numorstring.Port",
+ "YAMLType": "integer or string",
+ "YAMLSchema": "Port range: either an integer in [0,65535] or a string, representing a range, in format `n:m`",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Port range: either an integer in [0,65535] or a string, representing a range, in format n:m",
+ "YAMLDefault": "0",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Specifies the range of ports that is used for port mapping when doing outgoing NAT. When unset the default behavior of the\nnetwork stack is used.",
+ "DescriptionHTML": "
Specifies the range of ports that is used for port mapping when doing outgoing NAT. When unset the default behavior of the\nnetwork stack is used.
",
+ "UserEditable": true,
+ "GoType": "*numorstring.Port",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "NFTablesDNSPolicyMode",
+ "NameEnvVar": "FELIX_NFTablesDNSPolicyMode",
+ "NameYAML": "nftablesDNSPolicyMode",
+ "NameGoAPI": "NFTablesDNSPolicyMode",
+ "StringSchema": "One of: `DelayDNSResponse`, `DelayDeniedPacket`, `NoDelay`",
+ "StringSchemaHTML": "One of: DelayDNSResponse, DelayDeniedPacket, NoDelay",
+ "StringDefault": "DelayDeniedPacket",
+ "ParsedDefault": "DelayDeniedPacket",
+ "ParsedDefaultJSON": "\"DelayDeniedPacket\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"DelayDNSResponse\"`, `\"DelayDeniedPacket\"`, `\"NoDelay\"`.",
+ "YAMLEnumValues": [
+ "DelayDNSResponse",
+ "DelayDeniedPacket",
+ "NoDelay"
+ ],
+ "YAMLSchemaHTML": "One of: \"DelayDNSResponse\", \"DelayDeniedPacket\", \"NoDelay\".",
+ "YAMLDefault": "DelayDeniedPacket",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Specifies how DNS policy programming will be handled for NFTables.\nDelayDeniedPacket - Felix delays any denied packet that traversed a policy that included egress domain matches,\nbut did not match. The packet is released after a fixed time, or after the destination IP address was programmed.\nDelayDNSResponse - Felix delays any DNS response until related IPSets are programmed. This introduces some\nlatency to all DNS packets (even when no IPSet programming is required), but it ensures policy hit statistics\nare accurate. This is the recommended setting when you are making use of staged policies or policy rule hit\nstatistics.\nNoDelay - Felix does not introduce any delay to the packets. DNS rules may not have been programmed by the time\nthe first packet traverses the policy rules. Client applications need to handle reconnection attempts if initial\nconnection attempts fail. This may be problematic for some applications or for very low DNS TTLs.",
+ "DescriptionHTML": "
Specifies how DNS policy programming will be handled for NFTables.\nDelayDeniedPacket - Felix delays any denied packet that traversed a policy that included egress domain matches,\nbut did not match. The packet is released after a fixed time, or after the destination IP address was programmed.\nDelayDNSResponse - Felix delays any DNS response until related IPSets are programmed. This introduces some\nlatency to all DNS packets (even when no IPSet programming is required), but it ensures policy hit statistics\nare accurate. This is the recommended setting when you are making use of staged policies or policy rule hit\nstatistics.\nNoDelay - Felix does not introduce any delay to the packets. DNS rules may not have been programmed by the time\nthe first packet traverses the policy rules. Client applications need to handle reconnection attempts if initial\nconnection attempts fail. This may be problematic for some applications or for very low DNS TTLs.
",
+ "UserEditable": true,
+ "GoType": "*v3.NFTablesMode",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "NetlinkTimeoutSecs",
+ "NameEnvVar": "FELIX_NetlinkTimeoutSecs",
+ "NameYAML": "netlinkTimeout",
+ "NameGoAPI": "NetlinkTimeout",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "10",
+ "ParsedDefault": "10s",
+ "ParsedDefaultJSON": "10000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "10s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The timeout when talking to the kernel over the netlink protocol, used for programming\nroutes, rules, and other kernel objects.",
+ "DescriptionHTML": "
The timeout when talking to the kernel over the netlink protocol, used for programming\nroutes, rules, and other kernel objects.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "NfNetlinkBufSize",
+ "NameEnvVar": "FELIX_NfNetlinkBufSize",
+ "NameYAML": "nfNetlinkBufSize",
+ "NameGoAPI": "NfNetlinkBufSize",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "65536",
+ "ParsedDefault": "65536",
+ "ParsedDefaultJSON": "65536",
+ "ParsedType": "int",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "65536",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls the size of NFLOG messages that the kernel will try to send to Felix. NFLOG messages\nare used to report flow verdicts from the kernel. Warning: currently increasing the value may cause errors\ndue to a bug in the netlink library.",
+ "DescriptionHTML": "
Controls the size of NFLOG messages that the kernel will try to send to Felix. NFLOG messages\nare used to report flow verdicts from the kernel. Warning: currently increasing the value may cause errors\ndue to a bug in the netlink library.
Used to by Felix to communicate policy changes to external services,\nlike Application layer policy.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "ProgramClusterRoutes",
+ "NameEnvVar": "FELIX_ProgramClusterRoutes",
+ "NameYAML": "programClusterRoutes",
+ "NameGoAPI": "ProgramClusterRoutes",
+ "StringSchema": "One of: `Disabled`, `Enabled`",
+ "StringSchemaHTML": "One of: Disabled, Enabled",
+ "StringDefault": "Disabled",
+ "ParsedDefault": "Disabled",
+ "ParsedDefaultJSON": "\"Disabled\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"Disabled\"`, `\"Enabled\"`.",
+ "YAMLEnumValues": [
+ "Disabled",
+ "Enabled"
+ ],
+ "YAMLSchemaHTML": "One of: \"Disabled\", \"Enabled\".",
+ "YAMLDefault": "Disabled",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls how a cluster node gets a route to a workload on another node,\nwhen that workload's IP comes from an IP Pool with vxlanMode: Never. When ProgramClusterRoutes is Disabled,\nit is expected that confd and BIRD will program that route. When ProgramClusterRoutes is Enabled, Felix program that route.\nFelix always programs such routes for IP Pools with vxlanMode: Always or vxlanMode: CrossSubnet.",
+ "DescriptionHTML": "
Controls how a cluster node gets a route to a workload on another node,\nwhen that workload's IP comes from an IP Pool with vxlanMode: Never. When ProgramClusterRoutes is Disabled,\nit is expected that confd and BIRD will program that route. When ProgramClusterRoutes is Enabled, Felix program that route.\nFelix always programs such routes for IP Pools with vxlanMode: Always or vxlanMode: CrossSubnet.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "RemoveExternalRoutes",
+ "NameEnvVar": "FELIX_RemoveExternalRoutes",
+ "NameYAML": "removeExternalRoutes",
+ "NameGoAPI": "RemoveExternalRoutes",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether Felix will remove unexpected routes to workload interfaces. Felix will\nalways clean up expected routes that use the configured DeviceRouteProtocol. To add your own routes, you must\nuse a distinct protocol (in addition to setting this field to false).",
+ "DescriptionHTML": "
Controls whether Felix will remove unexpected routes to workload interfaces. Felix will\nalways clean up expected routes that use the configured DeviceRouteProtocol. To add your own routes, you must\nuse a distinct protocol (in addition to setting this field to false).
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "RequireMTUFile",
+ "NameEnvVar": "FELIX_RequireMTUFile",
+ "NameYAML": "requireMTUFile",
+ "NameGoAPI": "RequireMTUFile",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Specifies whether mtu file is required to start the felix.\nOptional as to keep the same as previous behavior.",
+ "DescriptionHTML": "
Specifies whether mtu file is required to start the felix.\nOptional as to keep the same as previous behavior.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "RouteRefreshInterval",
+ "NameEnvVar": "FELIX_RouteRefreshInterval",
+ "NameYAML": "routeRefreshInterval",
+ "NameGoAPI": "RouteRefreshInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "90",
+ "ParsedDefault": "1m30s",
+ "ParsedDefaultJSON": "90000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "1m30s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The period at which Felix re-checks the routes\nin the dataplane to ensure that no other process has accidentally broken Calico's rules.\nSet to 0 to disable route refresh.",
+ "DescriptionHTML": "
The period at which Felix re-checks the routes\nin the dataplane to ensure that no other process has accidentally broken Calico's rules.\nSet to 0 to disable route refresh.
Configures where Felix gets its routing information.\n- WorkloadIPs: use workload endpoints to construct routes.\n- CalicoIPAM: the default - use IPAM data to construct routes.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "RouteSyncDisabled",
+ "NameEnvVar": "FELIX_RouteSyncDisabled",
+ "NameYAML": "routeSyncDisabled",
+ "NameGoAPI": "RouteSyncDisabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Will disable all operations performed on the route table. Set to true to\nrun in network-policy mode only.",
+ "DescriptionHTML": "
Will disable all operations performed on the route table. Set to true to\nrun in network-policy mode only.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "RouteTableRange",
+ "NameEnvVar": "FELIX_RouteTableRange",
+ "NameYAML": "routeTableRange",
+ "NameGoAPI": "RouteTableRange",
+ "StringSchema": "Range of route table indices `n-m`, where `n` and `m` are integers in [0,250].",
+ "StringSchemaHTML": "Range of route table indices n-m, where n and m are integers in [0,250].",
+ "StringDefault": "",
+ "ParsedDefault": "{0 0}",
+ "ParsedDefaultJSON": "{\"Min\":0,\"Max\":0}",
+ "ParsedType": "idalloc.IndexRange",
+ "YAMLType": "object",
+ "YAMLSchema": "Route table range: `{min:, max}`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Route table range: {min:<n>, max<m>}.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Deprecated in favor of RouteTableRanges.\nCalico programs additional Linux route tables for various purposes.\nRouteTableRange specifies the indices of the route tables that Calico should use.",
+ "DescriptionHTML": "
Deprecated in favor of RouteTableRanges.\nCalico programs additional Linux route tables for various purposes.\nRouteTableRange specifies the indices of the route tables that Calico should use.
",
+ "UserEditable": true,
+ "GoType": "*v3.RouteTableRange",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "RouteTableRanges",
+ "NameEnvVar": "FELIX_RouteTableRanges",
+ "NameYAML": "routeTableRanges",
+ "NameGoAPI": "RouteTableRanges",
+ "StringSchema": "Comma or space-delimited list of route table ranges of the form `n-m` where `n` and `m` are integers in [0,4294967295]. The sum of the sizes of all ranges may not exceed 65535.",
+ "StringSchemaHTML": "Comma or space-delimited list of route table ranges of the form n-m where n and m are integers in [0,4294967295]. The sum of the sizes of all ranges may not exceed 65535.",
+ "StringDefault": "",
+ "ParsedDefault": "[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "[]idalloc.IndexRange",
+ "YAMLType": "array",
+ "YAMLSchema": "List of route table ranges: `[{min:, max}, ...]`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of route table ranges: [{min:<n>, max<m>}, ...].",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Calico programs additional Linux route tables for various purposes.\nRouteTableRanges specifies a set of table index ranges that Calico should use.\nDeprecates`RouteTableRange`, overrides `RouteTableRange`.",
+ "DescriptionHTML": "
Calico programs additional Linux route tables for various purposes.\nRouteTableRanges specifies a set of table index ranges that Calico should use.\nDeprecatesRouteTableRange, overrides RouteTableRange.
",
+ "UserEditable": true,
+ "GoType": "*v3.RouteTableRanges",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "ServiceLoopPrevention",
+ "NameEnvVar": "FELIX_ServiceLoopPrevention",
+ "NameYAML": "serviceLoopPrevention",
+ "NameGoAPI": "ServiceLoopPrevention",
+ "StringSchema": "One of: `Disabled`, `Drop`, `Reject`",
+ "StringSchemaHTML": "One of: Disabled, Drop, Reject",
+ "StringDefault": "Drop",
+ "ParsedDefault": "Drop",
+ "ParsedDefaultJSON": "\"Drop\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Disabled`, `Drop`, `Reject`.",
+ "YAMLEnumValues": [
+ "Disabled",
+ "Drop",
+ "Reject"
+ ],
+ "YAMLSchemaHTML": "One of: Disabled, Drop, Reject.",
+ "YAMLDefault": "Drop",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "When service IP advertisement is enabled, prevent routing loops to service IPs that are\nnot in use, by dropping or rejecting packets that do not get DNAT'd by kube-proxy.\nUnless set to \"Disabled\", in which case such routing loops continue to be allowed.",
+ "DescriptionHTML": "
When service IP advertisement is enabled, prevent routing loops to service IPs that are\nnot in use, by dropping or rejecting packets that do not get DNAT'd by kube-proxy.\nUnless set to \"Disabled\", in which case such routing loops continue to be allowed.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "UseInternalDataplaneDriver",
+ "NameEnvVar": "FELIX_UseInternalDataplaneDriver",
+ "NameYAML": "useInternalDataplaneDriver",
+ "NameGoAPI": "UseInternalDataplaneDriver",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "If true, Felix will use its internal dataplane programming logic. If false, it\nwill launch an external dataplane driver and communicate with it over protobuf.",
+ "DescriptionHTML": "
If true, Felix will use its internal dataplane programming logic. If false, it\nwill launch an external dataplane driver and communicate with it over protobuf.
Configures the interval at which Felix exports WAFEvent logs.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Common",
+ "GroupWithSortPrefix": "10 Dataplane: Common",
+ "NameConfigFile": "WorkloadSourceSpoofing",
+ "NameEnvVar": "FELIX_WorkloadSourceSpoofing",
+ "NameYAML": "workloadSourceSpoofing",
+ "NameGoAPI": "WorkloadSourceSpoofing",
+ "StringSchema": "One of: `Any`, `Disabled`",
+ "StringSchemaHTML": "One of: Any, Disabled",
+ "StringDefault": "Disabled",
+ "ParsedDefault": "Disabled",
+ "ParsedDefaultJSON": "\"Disabled\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Any`, `Disabled`.",
+ "YAMLEnumValues": [
+ "Any",
+ "Disabled"
+ ],
+ "YAMLSchemaHTML": "One of: Any, Disabled.",
+ "YAMLDefault": "Disabled",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether pods can use the allowedSourcePrefixes annotation to send traffic with a source IP\naddress that is not theirs. This is disabled by default. When set to \"Any\", pods can request any prefix.",
+ "DescriptionHTML": "
Controls whether pods can use the allowedSourcePrefixes annotation to send traffic with a source IP\naddress that is not theirs. This is disabled by default. When set to \"Any\", pods can request any prefix.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Dataplane: iptables",
+ "Fields": [
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IpsetsRefreshInterval",
+ "NameEnvVar": "FELIX_IpsetsRefreshInterval",
+ "NameYAML": "ipsetsRefreshInterval",
+ "NameGoAPI": "IpsetsRefreshInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "90",
+ "ParsedDefault": "1m30s",
+ "ParsedDefaultJSON": "90000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "1m30s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls the period at which Felix re-checks all IP sets to look for discrepancies.\nSet to 0 to disable the periodic refresh.",
+ "DescriptionHTML": "
Controls the period at which Felix re-checks all IP sets to look for discrepancies.\nSet to 0 to disable the periodic refresh.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IptablesBackend",
+ "NameEnvVar": "FELIX_IptablesBackend",
+ "NameYAML": "iptablesBackend",
+ "NameGoAPI": "IptablesBackend",
+ "StringSchema": "One of: `auto`, `legacy`, `nft`",
+ "StringSchemaHTML": "One of: auto, legacy, nft",
+ "StringDefault": "auto",
+ "ParsedDefault": "auto",
+ "ParsedDefaultJSON": "\"auto\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"Auto\"`, `\"Legacy\"`, `\"NFT\"`.",
+ "YAMLEnumValues": [
+ "Auto",
+ "Auto",
+ "Legacy",
+ "Legacy",
+ "NFT",
+ "NFT"
+ ],
+ "YAMLSchemaHTML": "One of: \"Auto\", \"Legacy\", \"NFT\".",
+ "YAMLDefault": "Auto",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls which backend of iptables will be used. The default is `Auto`.\n\nWarning: changing this on a running system can leave \"orphaned\" rules in the \"other\" backend. These\nshould be cleaned up to avoid confusing interactions.",
+ "DescriptionHTML": "
Controls which backend of iptables will be used. The default is Auto.
\n
Warning: changing this on a running system can leave \"orphaned\" rules in the \"other\" backend. These\nshould be cleaned up to avoid confusing interactions.
",
+ "UserEditable": true,
+ "GoType": "*v3.IptablesBackend",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IptablesFilterAllowAction",
+ "NameEnvVar": "FELIX_IptablesFilterAllowAction",
+ "NameYAML": "iptablesFilterAllowAction",
+ "NameGoAPI": "IptablesFilterAllowAction",
+ "StringSchema": "One of: `ACCEPT`, `RETURN`",
+ "StringSchemaHTML": "One of: ACCEPT, RETURN",
+ "StringDefault": "ACCEPT",
+ "ParsedDefault": "ACCEPT",
+ "ParsedDefaultJSON": "\"ACCEPT\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Accept`, `Return`.",
+ "YAMLEnumValues": [
+ "Accept",
+ "Return"
+ ],
+ "YAMLSchemaHTML": "One of: Accept, Return.",
+ "YAMLDefault": "Accept",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Controls what happens to traffic that is accepted by a Felix policy chain in the\niptables filter table (which is used for \"normal\" policy). The default will immediately `Accept` the traffic. Use\n`Return` to send the traffic back up to the system chains for further processing.",
+ "DescriptionHTML": "
Controls what happens to traffic that is accepted by a Felix policy chain in the\niptables filter table (which is used for \"normal\" policy). The default will immediately Accept the traffic. Use\nReturn to send the traffic back up to the system chains for further processing.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IptablesFilterDenyAction",
+ "NameEnvVar": "FELIX_IptablesFilterDenyAction",
+ "NameYAML": "iptablesFilterDenyAction",
+ "NameGoAPI": "IptablesFilterDenyAction",
+ "StringSchema": "One of: `DROP`, `REJECT`",
+ "StringSchemaHTML": "One of: DROP, REJECT",
+ "StringDefault": "DROP",
+ "ParsedDefault": "DROP",
+ "ParsedDefaultJSON": "\"DROP\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Drop`, `Reject`.",
+ "YAMLEnumValues": [
+ "Drop",
+ "Reject"
+ ],
+ "YAMLSchemaHTML": "One of: Drop, Reject.",
+ "YAMLDefault": "Drop",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Controls what happens to traffic that is denied by network policy. By default Calico blocks traffic\nwith an iptables \"DROP\" action. If you want to use \"REJECT\" action instead you can configure it in here.",
+ "DescriptionHTML": "
Controls what happens to traffic that is denied by network policy. By default Calico blocks traffic\nwith an iptables \"DROP\" action. If you want to use \"REJECT\" action instead you can configure it in here.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IptablesLockProbeIntervalMillis",
+ "NameEnvVar": "FELIX_IptablesLockProbeIntervalMillis",
+ "NameYAML": "iptablesLockProbeInterval",
+ "NameGoAPI": "IptablesLockProbeInterval",
+ "StringSchema": "Milliseconds (floating point)",
+ "StringSchemaHTML": "Milliseconds (floating point)",
+ "StringDefault": "50",
+ "ParsedDefault": "50ms",
+ "ParsedDefaultJSON": "50000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "50ms",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Configures the interval between attempts to claim\nthe xtables lock. Shorter intervals are more responsive but use more CPU.",
+ "DescriptionHTML": "
Configures the interval between attempts to claim\nthe xtables lock. Shorter intervals are more responsive but use more CPU.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IptablesMangleAllowAction",
+ "NameEnvVar": "FELIX_IptablesMangleAllowAction",
+ "NameYAML": "iptablesMangleAllowAction",
+ "NameGoAPI": "IptablesMangleAllowAction",
+ "StringSchema": "One of: `ACCEPT`, `RETURN`",
+ "StringSchemaHTML": "One of: ACCEPT, RETURN",
+ "StringDefault": "ACCEPT",
+ "ParsedDefault": "ACCEPT",
+ "ParsedDefaultJSON": "\"ACCEPT\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Accept`, `Return`.",
+ "YAMLEnumValues": [
+ "Accept",
+ "Return"
+ ],
+ "YAMLSchemaHTML": "One of: Accept, Return.",
+ "YAMLDefault": "Accept",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Controls what happens to traffic that is accepted by a Felix policy chain in the\niptables mangle table (which is used for \"pre-DNAT\" policy). The default will immediately `Accept` the traffic.\nUse `Return` to send the traffic back up to the system chains for further processing.",
+ "DescriptionHTML": "
Controls what happens to traffic that is accepted by a Felix policy chain in the\niptables mangle table (which is used for \"pre-DNAT\" policy). The default will immediately Accept the traffic.\nUse Return to send the traffic back up to the system chains for further processing.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IptablesMarkMask",
+ "NameEnvVar": "FELIX_IptablesMarkMask",
+ "NameYAML": "iptablesMarkMask",
+ "NameGoAPI": "IptablesMarkMask",
+ "StringSchema": "32-bit bitmask (hex or deccimal allowed) with at least 2 bits set, example: `0xffff0000`",
+ "StringSchemaHTML": "32-bit bitmask (hex or deccimal allowed) with at least 2 bits set, example: 0xffff0000",
+ "StringDefault": "0xffff0000",
+ "ParsedDefault": "4294901760",
+ "ParsedDefaultJSON": "4294901760",
+ "ParsedType": "uint32",
+ "YAMLType": "integer",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "0xffff0000",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "The mask that Felix selects its IPTables Mark bits from. Should be a 32 bit hexadecimal\nnumber with at least 8 bits set, none of which clash with any other mark bits in use on the system.",
+ "DescriptionHTML": "
The mask that Felix selects its IPTables Mark bits from. Should be a 32 bit hexadecimal\nnumber with at least 8 bits set, none of which clash with any other mark bits in use on the system.
",
+ "UserEditable": true,
+ "GoType": "*int64",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IptablesNATOutgoingInterfaceFilter",
+ "NameEnvVar": "FELIX_IptablesNATOutgoingInterfaceFilter",
+ "NameYAML": "iptablesNATOutgoingInterfaceFilter",
+ "NameGoAPI": "IptablesNATOutgoingInterfaceFilter",
+ "StringSchema": "String matching regex `^[a-zA-Z0-9:._+-]{1,15}$`",
+ "StringSchemaHTML": "String matching regex ^[a-zA-Z0-9:._+-]{1,15}$",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "This parameter can be used to limit the host interfaces on which Calico will apply SNAT to traffic leaving a\nCalico IPAM pool with \"NAT outgoing\" enabled. This can be useful if you have a main data interface, where\ntraffic should be SNATted and a secondary device (such as the docker bridge) which is local to the host and\ndoesn't require SNAT. This parameter uses the iptables interface matching syntax, which allows + as a\nwildcard. Most users will not need to set this. Example: if your data interfaces are eth0 and eth1 and you\nwant to exclude the docker bridge, you could set this to eth+.",
+ "DescriptionHTML": "
This parameter can be used to limit the host interfaces on which Calico will apply SNAT to traffic leaving a\nCalico IPAM pool with \"NAT outgoing\" enabled. This can be useful if you have a main data interface, where\ntraffic should be SNATted and a secondary device (such as the docker bridge) which is local to the host and\ndoesn't require SNAT. This parameter uses the iptables interface matching syntax, which allows + as a\nwildcard. Most users will not need to set this. Example: if your data interfaces are eth0 and eth1 and you\nwant to exclude the docker bridge, you could set this to eth+.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IptablesPostWriteCheckIntervalSecs",
+ "NameEnvVar": "FELIX_IptablesPostWriteCheckIntervalSecs",
+ "NameYAML": "iptablesPostWriteCheckInterval",
+ "NameGoAPI": "IptablesPostWriteCheckInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "5",
+ "ParsedDefault": "5s",
+ "ParsedDefaultJSON": "5000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "5s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The period after Felix has done a write\nto the dataplane that it schedules an extra read back in order to check the write was not\nclobbered by another process. This should only occur if another application on the system\ndoesn't respect the iptables lock.",
+ "DescriptionHTML": "
The period after Felix has done a write\nto the dataplane that it schedules an extra read back in order to check the write was not\nclobbered by another process. This should only occur if another application on the system\ndoesn't respect the iptables lock.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "IptablesRefreshInterval",
+ "NameEnvVar": "FELIX_IptablesRefreshInterval",
+ "NameYAML": "iptablesRefreshInterval",
+ "NameGoAPI": "IptablesRefreshInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "180",
+ "ParsedDefault": "3m0s",
+ "ParsedDefaultJSON": "180000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "3m0s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The period at which Felix re-checks the IP sets\nin the dataplane to ensure that no other process has accidentally broken Calico's rules.\nSet to 0 to disable IP sets refresh. Note: the default for this value is lower than the\nother refresh intervals as a workaround for a Linux kernel bug that was fixed in kernel\nversion 4.11. If you are using v4.11 or greater you may want to set this to, a higher value\nto reduce Felix CPU usage.",
+ "DescriptionHTML": "
The period at which Felix re-checks the IP sets\nin the dataplane to ensure that no other process has accidentally broken Calico's rules.\nSet to 0 to disable IP sets refresh. Note: the default for this value is lower than the\nother refresh intervals as a workaround for a Linux kernel bug that was fixed in kernel\nversion 4.11. If you are using v4.11 or greater you may want to set this to, a higher value\nto reduce Felix CPU usage.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "KubeNodePortRanges",
+ "NameEnvVar": "FELIX_KubeNodePortRanges",
+ "NameYAML": "kubeNodePortRanges",
+ "NameGoAPI": "KubeNodePortRanges",
+ "StringSchema": "List of port ranges: comma-delimited list of either single numbers in range [0,65535] or a ranges of numbers `n:m`",
+ "StringSchemaHTML": "List of port ranges: comma-delimited list of either single numbers in range [0,65535] or a ranges of numbers n:m",
+ "StringDefault": "30000:32767",
+ "ParsedDefault": "[30000:32767]",
+ "ParsedDefaultJSON": "[\"30000:32767\"]",
+ "ParsedType": "[]numorstring.Port",
+ "YAMLType": "array",
+ "YAMLSchema": "List of ports: `[, ...]` where `` is a port number (integer) or range (string), for example `80`, `8080:8089`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of ports: [<port>, ...] where <port> is a port number (integer) or range (string), for example 80, 8080:8089.",
+ "YAMLDefault": "[\"30000:32767\"]",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Holds list of port ranges used for service node ports. Only used if felix detects kube-proxy running in ipvs mode.\nFelix uses these ranges to separate host and workload traffic. .",
+ "DescriptionHTML": "
Holds list of port ranges used for service node ports. Only used if felix detects kube-proxy running in ipvs mode.\nFelix uses these ranges to separate host and workload traffic. .
",
+ "UserEditable": true,
+ "GoType": "*[]numorstring.Port",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: iptables",
+ "GroupWithSortPrefix": "20 Dataplane: iptables",
+ "NameConfigFile": "MaxIpsetSize",
+ "NameEnvVar": "FELIX_MaxIpsetSize",
+ "NameYAML": "maxIpsetSize",
+ "NameGoAPI": "MaxIpsetSize",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "1048576",
+ "ParsedDefault": "1048576",
+ "ParsedDefaultJSON": "1048576",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "1048576",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The maximum number of IP addresses that can be stored in an IP set. Not applicable\nif using the nftables backend.",
+ "DescriptionHTML": "
The maximum number of IP addresses that can be stored in an IP set. Not applicable\nif using the nftables backend.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Dataplane: nftables",
+ "Fields": [
+ {
+ "Group": "Dataplane: nftables",
+ "GroupWithSortPrefix": "21 Dataplane: nftables",
+ "NameConfigFile": "NftablesFilterAllowAction",
+ "NameEnvVar": "FELIX_NftablesFilterAllowAction",
+ "NameYAML": "nftablesFilterAllowAction",
+ "NameGoAPI": "NftablesFilterAllowAction",
+ "StringSchema": "One of: `ACCEPT`, `RETURN`",
+ "StringSchemaHTML": "One of: ACCEPT, RETURN",
+ "StringDefault": "ACCEPT",
+ "ParsedDefault": "ACCEPT",
+ "ParsedDefaultJSON": "\"ACCEPT\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Accept`, `Return`.",
+ "YAMLEnumValues": [
+ "Accept",
+ "Return"
+ ],
+ "YAMLSchemaHTML": "One of: Accept, Return.",
+ "YAMLDefault": "Accept",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Controls the nftables action that Felix uses to represent the \"allow\" policy verdict\nin the filter table. The default is to `ACCEPT` the traffic, which is a terminal action. Alternatively,\n`RETURN` can be used to return the traffic back to the top-level chain for further processing by your rules.",
+ "DescriptionHTML": "
Controls the nftables action that Felix uses to represent the \"allow\" policy verdict\nin the filter table. The default is to ACCEPT the traffic, which is a terminal action. Alternatively,\nRETURN can be used to return the traffic back to the top-level chain for further processing by your rules.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: nftables",
+ "GroupWithSortPrefix": "21 Dataplane: nftables",
+ "NameConfigFile": "NftablesFilterDenyAction",
+ "NameEnvVar": "FELIX_NftablesFilterDenyAction",
+ "NameYAML": "nftablesFilterDenyAction",
+ "NameGoAPI": "NftablesFilterDenyAction",
+ "StringSchema": "One of: `DROP`, `REJECT`",
+ "StringSchemaHTML": "One of: DROP, REJECT",
+ "StringDefault": "DROP",
+ "ParsedDefault": "DROP",
+ "ParsedDefaultJSON": "\"DROP\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Drop`, `Reject`.",
+ "YAMLEnumValues": [
+ "Drop",
+ "Reject"
+ ],
+ "YAMLSchemaHTML": "One of: Drop, Reject.",
+ "YAMLDefault": "Drop",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Controls what happens to traffic that is denied by network policy. By default, Calico\nblocks traffic with a \"drop\" action. If you want to use a \"reject\" action instead you can configure it here.",
+ "DescriptionHTML": "
Controls what happens to traffic that is denied by network policy. By default, Calico\nblocks traffic with a \"drop\" action. If you want to use a \"reject\" action instead you can configure it here.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: nftables",
+ "GroupWithSortPrefix": "21 Dataplane: nftables",
+ "NameConfigFile": "NftablesMangleAllowAction",
+ "NameEnvVar": "FELIX_NftablesMangleAllowAction",
+ "NameYAML": "nftablesMangleAllowAction",
+ "NameGoAPI": "NftablesMangleAllowAction",
+ "StringSchema": "One of: `ACCEPT`, `RETURN`",
+ "StringSchemaHTML": "One of: ACCEPT, RETURN",
+ "StringDefault": "ACCEPT",
+ "ParsedDefault": "ACCEPT",
+ "ParsedDefaultJSON": "\"ACCEPT\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Accept`, `Return`.",
+ "YAMLEnumValues": [
+ "Accept",
+ "Return"
+ ],
+ "YAMLSchemaHTML": "One of: Accept, Return.",
+ "YAMLDefault": "Accept",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "Controls the nftables action that Felix uses to represent the \"allow\" policy verdict\nin the mangle table. The default is to `ACCEPT` the traffic, which is a terminal action. Alternatively,\n`RETURN` can be used to return the traffic back to the top-level chain for further processing by your rules.",
+ "DescriptionHTML": "
Controls the nftables action that Felix uses to represent the \"allow\" policy verdict\nin the mangle table. The default is to ACCEPT the traffic, which is a terminal action. Alternatively,\nRETURN can be used to return the traffic back to the top-level chain for further processing by your rules.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: nftables",
+ "GroupWithSortPrefix": "21 Dataplane: nftables",
+ "NameConfigFile": "NftablesMarkMask",
+ "NameEnvVar": "FELIX_NftablesMarkMask",
+ "NameYAML": "nftablesMarkMask",
+ "NameGoAPI": "NftablesMarkMask",
+ "StringSchema": "32-bit bitmask (hex or deccimal allowed) with at least 2 bits set, example: `0xffff0000`",
+ "StringSchemaHTML": "32-bit bitmask (hex or deccimal allowed) with at least 2 bits set, example: 0xffff0000",
+ "StringDefault": "0xffff0000",
+ "ParsedDefault": "4294901760",
+ "ParsedDefaultJSON": "4294901760",
+ "ParsedType": "uint32",
+ "YAMLType": "integer",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "0xffff0000",
+ "Required": true,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "The mask that Felix selects its nftables Mark bits from. Should be a 32 bit hexadecimal\nnumber with at least 8 bits set, none of which clash with any other mark bits in use on the system.",
+ "DescriptionHTML": "
The mask that Felix selects its nftables Mark bits from. Should be a 32 bit hexadecimal\nnumber with at least 8 bits set, none of which clash with any other mark bits in use on the system.
",
+ "UserEditable": true,
+ "GoType": "*int64",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: nftables",
+ "GroupWithSortPrefix": "21 Dataplane: nftables",
+ "NameConfigFile": "NftablesRefreshInterval",
+ "NameEnvVar": "FELIX_NftablesRefreshInterval",
+ "NameYAML": "nftablesRefreshInterval",
+ "NameGoAPI": "NftablesRefreshInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "180",
+ "ParsedDefault": "3m0s",
+ "ParsedDefaultJSON": "180000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "3m0s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls the interval at which Felix periodically refreshes the nftables rules.",
+ "DescriptionHTML": "
Controls the interval at which Felix periodically refreshes the nftables rules.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Dataplane: eBPF",
+ "Fields": [
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFAttachType",
+ "NameEnvVar": "FELIX_BPFAttachType",
+ "NameYAML": "bpfAttachType",
+ "NameGoAPI": "BPFAttachType",
+ "StringSchema": "One of: `TCX`, `TC`",
+ "StringSchemaHTML": "One of: TCX, TC",
+ "StringDefault": "TCX",
+ "ParsedDefault": "TCX",
+ "ParsedDefaultJSON": "\"TCX\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"TC\"`, `\"TCX\"`.",
+ "YAMLEnumValues": [
+ "TC",
+ "TCX"
+ ],
+ "YAMLSchemaHTML": "One of: \"TC\", \"TCX\".",
+ "YAMLDefault": "TCX",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls how are the BPF programs at the network interfaces attached.\nBy default `TCX` is used where available to enable easier coexistence with 3rd party programs.\n`TC` can force the legacy method of attaching via a qdisc. `TCX` falls back to `TC` if `TCX` is not available.",
+ "DescriptionHTML": "
Controls how are the BPF programs at the network interfaces attached.\nBy default TCX is used where available to enable easier coexistence with 3rd party programs.\nTC can force the legacy method of attaching via a qdisc. TCX falls back to TC if TCX is not available.
",
+ "UserEditable": true,
+ "GoType": "*v3.BPFAttachOption",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFCTLBLogFilter",
+ "NameEnvVar": "FELIX_BPFCTLBLogFilter",
+ "NameYAML": "bpfCTLBLogFilter",
+ "NameGoAPI": "BPFCTLBLogFilter",
+ "StringSchema": "One of: `all`",
+ "StringSchemaHTML": "One of: all",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Specifies, what is logged by connect time load balancer when BPFLogLevel is\ndebug. Currently has to be specified as 'all' when BPFLogFilters is set\nto see CTLB logs.",
+ "DescriptionHTML": "
Specifies, what is logged by connect time load balancer when BPFLogLevel is\ndebug. Currently has to be specified as 'all' when BPFLogFilters is set\nto see CTLB logs.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFConnectTimeLoadBalancing",
+ "NameEnvVar": "FELIX_BPFConnectTimeLoadBalancing",
+ "NameYAML": "bpfConnectTimeLoadBalancing",
+ "NameGoAPI": "BPFConnectTimeLoadBalancing",
+ "StringSchema": "One of: `Disabled`, `Enabled`, `TCP`",
+ "StringSchemaHTML": "One of: Disabled, Enabled, TCP",
+ "StringDefault": "TCP",
+ "ParsedDefault": "TCP",
+ "ParsedDefaultJSON": "\"TCP\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"Disabled\"`, `\"Enabled\"`, `\"TCP\"`.",
+ "YAMLEnumValues": [
+ "Disabled",
+ "Enabled",
+ "TCP"
+ ],
+ "YAMLSchemaHTML": "One of: \"Disabled\", \"Enabled\", \"TCP\".",
+ "YAMLDefault": "TCP",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "When in BPF mode, controls whether Felix installs the connect-time load\nbalancer. The connect-time load balancer is required for the host to be able to reach Kubernetes services\nand it improves the performance of pod-to-service connections.When set to TCP, connect time load balancing\nis available only for services with TCP ports.",
+ "DescriptionHTML": "
When in BPF mode, controls whether Felix installs the connect-time load\nbalancer. The connect-time load balancer is required for the host to be able to reach Kubernetes services\nand it improves the performance of pod-to-service connections.When set to TCP, connect time load balancing\nis available only for services with TCP ports.
",
+ "UserEditable": true,
+ "GoType": "*v3.BPFConnectTimeLBType",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFConnectTimeLoadBalancingEnabled",
+ "NameEnvVar": "FELIX_BPFConnectTimeLoadBalancingEnabled",
+ "NameYAML": "bpfConnectTimeLoadBalancingEnabled",
+ "NameGoAPI": "BPFConnectTimeLoadBalancingEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "When in BPF mode, controls whether Felix installs the connection-time load\nbalancer. The connect-time load balancer is required for the host to be able to reach Kubernetes services\nand it improves the performance of pod-to-service connections. The only reason to disable it is for debugging\npurposes.\n\nDeprecated: Use BPFConnectTimeLoadBalancing.",
+ "DescriptionHTML": "
When in BPF mode, controls whether Felix installs the connection-time load\nbalancer. The connect-time load balancer is required for the host to be able to reach Kubernetes services\nand it improves the performance of pod-to-service connections. The only reason to disable it is for debugging\npurposes.
\n
Deprecated: Use BPFConnectTimeLoadBalancing.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFConntrackCleanupMode",
+ "NameEnvVar": "FELIX_BPFConntrackCleanupMode",
+ "NameYAML": "bpfConntrackMode",
+ "NameGoAPI": "BPFConntrackCleanupMode",
+ "StringSchema": "One of: `Auto`, `BPFProgram`, `Userspace`",
+ "StringSchemaHTML": "One of: Auto, BPFProgram, Userspace",
+ "StringDefault": "Auto",
+ "ParsedDefault": "Auto",
+ "ParsedDefaultJSON": "\"Auto\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"Auto\"`, `\"BPFProgram\"`, `\"Userspace\"`.",
+ "YAMLEnumValues": [
+ "Auto",
+ "BPFProgram",
+ "Userspace"
+ ],
+ "YAMLSchemaHTML": "One of: \"Auto\", \"BPFProgram\", \"Userspace\".",
+ "YAMLDefault": "Auto",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls how BPF conntrack entries are cleaned up. `Auto` will use a BPF program if supported,\nfalling back to userspace if not. `Userspace` will always use the userspace cleanup code. `BPFProgram` will\nalways use the BPF program (failing if not supported).\n\n/To be deprecated in future versions as conntrack map type changed to\nlru_hash and userspace cleanup is the only mode that is supported.",
+ "DescriptionHTML": "
Controls how BPF conntrack entries are cleaned up. Auto will use a BPF program if supported,\nfalling back to userspace if not. Userspace will always use the userspace cleanup code. BPFProgram will\nalways use the BPF program (failing if not supported).
\n
/To be deprecated in future versions as conntrack map type changed to\nlru_hash and userspace cleanup is the only mode that is supported.
Controls the log level of the BPF conntrack cleanup program, which runs periodically\nto clean up expired BPF conntrack entries.\n.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFConntrackTimeouts",
+ "NameEnvVar": "FELIX_BPFConntrackTimeouts",
+ "NameYAML": "bpfConntrackTimeouts",
+ "NameGoAPI": "BPFConntrackTimeouts",
+ "StringSchema": "Comma-delimited list of key=value pairs",
+ "StringSchemaHTML": "Comma-delimited list of key=value pairs",
+ "StringDefault": "CreationGracePeriod=10s,TCPSynSent=20s,TCPEstablished=1h,TCPFinsSeen=Auto,TCPResetSeen=40s,UDPTimeout=60s,GenericTimeout=10m,ICMPTimeout=5s",
+ "ParsedDefault": "map[CreationGracePeriod:10s GenericTimeout:10m ICMPTimeout:5s TCPEstablished:1h TCPFinsSeen:Auto TCPResetSeen:40s TCPSynSent:20s UDPTimeout:60s]",
+ "ParsedDefaultJSON": "{\"CreationGracePeriod\":\"10s\",\"GenericTimeout\":\"10m\",\"ICMPTimeout\":\"5s\",\"TCPEstablished\":\"1h\",\"TCPFinsSeen\":\"Auto\",\"TCPResetSeen\":\"40s\",\"TCPSynSent\":\"20s\",\"UDPTimeout\":\"60s\"}",
+ "ParsedType": "map[string]string",
+ "YAMLType": "object",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "BPFConntrackTimers overrides the default values for the specified conntrack timer if\nset. Each value can be either a duration or `Auto` to pick the value from\na Linux conntrack timeout.\n\nConfigurable timers are: CreationGracePeriod, TCPSynSent,\nTCPEstablished, TCPFinsSeen, TCPResetSeen, UDPTimeout, GenericTimeout,\nICMPTimeout.\n\nUnset values are replaced by the default values with a warning log for\nincorrect values.",
+ "DescriptionHTML": "
BPFConntrackTimers overrides the default values for the specified conntrack timer if\nset. Each value can be either a duration or Auto to pick the value from\na Linux conntrack timeout.
Unset values are replaced by the default values with a warning log for\nincorrect values.
",
+ "UserEditable": true,
+ "GoType": "*v3.BPFConntrackTimeouts",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFDNSPolicyMode",
+ "NameEnvVar": "FELIX_BPFDNSPolicyMode",
+ "NameYAML": "bpfDNSPolicyMode",
+ "NameGoAPI": "BPFDNSPolicyMode",
+ "StringSchema": "One of: `Inline`, `NoDelay`",
+ "StringSchemaHTML": "One of: Inline, NoDelay",
+ "StringDefault": "Inline",
+ "ParsedDefault": "Inline",
+ "ParsedDefaultJSON": "\"Inline\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "Inline",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Specifies how DNS policy programming will be handled.\nInline - BPF parses DNS response inline with DNS response packet\nprocessing. This guarantees the DNS rules reflect any change immediately.\nNoDelay - Felix does not introduce any delay to the packets. DNS rules may not have been programmed by the time\nthe first packet traverses the policy rules. Client applications need to handle reconnection attempts if initial\nconnection attempts fail. This may be problematic for some applications or for very low DNS TTLs.",
+ "DescriptionHTML": "
Specifies how DNS policy programming will be handled.\nInline - BPF parses DNS response inline with DNS response packet\nprocessing. This guarantees the DNS rules reflect any change immediately.\nNoDelay - Felix does not introduce any delay to the packets. DNS rules may not have been programmed by the time\nthe first packet traverses the policy rules. Client applications need to handle reconnection attempts if initial\nconnection attempts fail. This may be problematic for some applications or for very low DNS TTLs.
",
+ "UserEditable": true,
+ "GoType": "*v3.BPFDNSPolicyMode",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFDSROptoutCIDRs",
+ "NameEnvVar": "FELIX_BPFDSROptoutCIDRs",
+ "NameYAML": "bpfDSROptoutCIDRs",
+ "NameGoAPI": "BPFDSROptoutCIDRs",
+ "StringSchema": "Comma-delimited list of CIDRs",
+ "StringSchemaHTML": "Comma-delimited list of CIDRs",
+ "StringDefault": "",
+ "ParsedDefault": "[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "[]string",
+ "YAMLType": "array",
+ "YAMLSchema": "List of CIDRs: `[\"\", ...]`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of CIDRs: [\"<cidr>\", ...].",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "A list of CIDRs which are excluded from DSR. That is, clients\nin those CIDRs will access service node ports as if BPFExternalServiceMode was set to\nTunnel.",
+ "DescriptionHTML": "
A list of CIDRs which are excluded from DSR. That is, clients\nin those CIDRs will access service node ports as if BPFExternalServiceMode was set to\nTunnel.
",
+ "UserEditable": true,
+ "GoType": "*[]string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFDataIfacePattern",
+ "NameEnvVar": "FELIX_BPFDataIfacePattern",
+ "NameYAML": "bpfDataIfacePattern",
+ "NameGoAPI": "BPFDataIfacePattern",
+ "StringSchema": "Regular expression",
+ "StringSchemaHTML": "Regular expression",
+ "StringDefault": "^((en|wl|ww|sl|ib)[Popsx].*|(eth|wlan|wwan|bond).*)",
+ "ParsedDefault": "^((en|wl|ww|sl|ib)[Popsx].*|(eth|wlan|wwan|bond).*)",
+ "ParsedDefaultJSON": "\"^((en|wl|ww|sl|ib)[Popsx].*|(eth|wlan|wwan|bond).*)\"",
+ "ParsedType": "*regexp.Regexp",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "^((en|wl|ww|sl|ib)[Popsx].*|(eth|wlan|wwan|bond).*)",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "A regular expression that controls which interfaces Felix should attach BPF programs to\nin order to catch traffic to/from the network. This needs to match the interfaces that Calico workload traffic\nflows over as well as any interfaces that handle incoming traffic to nodeports and services from outside the\ncluster. It should not match the workload interfaces (usually named cali...) or any other special device managed\nby Calico itself (e.g., tunnels).",
+ "DescriptionHTML": "
A regular expression that controls which interfaces Felix should attach BPF programs to\nin order to catch traffic to/from the network. This needs to match the interfaces that Calico workload traffic\nflows over as well as any interfaces that handle incoming traffic to nodeports and services from outside the\ncluster. It should not match the workload interfaces (usually named cali...) or any other special device managed\nby Calico itself (e.g., tunnels).
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFDisableGROForIfaces",
+ "NameEnvVar": "FELIX_BPFDisableGROForIfaces",
+ "NameYAML": "bpfDisableGROForIfaces",
+ "NameGoAPI": "BPFDisableGROForIfaces",
+ "StringSchema": "Regular expression",
+ "StringSchemaHTML": "Regular expression",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "*regexp.Regexp",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "A regular expression that controls which interfaces Felix should disable the\nGeneric Receive Offload [GRO] option. It should not match the workload interfaces (usually named cali...).",
+ "DescriptionHTML": "
A regular expression that controls which interfaces Felix should disable the\nGeneric Receive Offload [GRO] option. It should not match the workload interfaces (usually named cali...).
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFDisableUnprivileged",
+ "NameEnvVar": "FELIX_BPFDisableUnprivileged",
+ "NameYAML": "bpfDisableUnprivileged",
+ "NameGoAPI": "BPFDisableUnprivileged",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "If enabled, Felix sets the kernel.unprivileged_bpf_disabled sysctl to disable\nunprivileged use of BPF. This ensures that unprivileged users cannot access Calico's BPF maps and\ncannot insert their own BPF programs to interfere with Calico's.",
+ "DescriptionHTML": "
If enabled, Felix sets the kernel.unprivileged_bpf_disabled sysctl to disable\nunprivileged use of BPF. This ensures that unprivileged users cannot access Calico's BPF maps and\ncannot insert their own BPF programs to interfere with Calico's.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFEnabled",
+ "NameEnvVar": "FELIX_BPFEnabled",
+ "NameYAML": "bpfEnabled",
+ "NameGoAPI": "BPFEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "If enabled Felix will use the BPF dataplane.",
+ "DescriptionHTML": "
Enforce strict RPF on all host interfaces with BPF programs regardless of\nwhat is the per-interfaces or global setting. Possible values are Disabled, Strict\nor Loose.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFExcludeCIDRsFromNAT",
+ "NameEnvVar": "FELIX_BPFExcludeCIDRsFromNAT",
+ "NameYAML": "bpfExcludeCIDRsFromNAT",
+ "NameGoAPI": "BPFExcludeCIDRsFromNAT",
+ "StringSchema": "Comma-delimited list of CIDRs",
+ "StringSchemaHTML": "Comma-delimited list of CIDRs",
+ "StringDefault": "",
+ "ParsedDefault": "[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "[]string",
+ "YAMLType": "array",
+ "YAMLSchema": "List of CIDRs: `[\"\", ...]`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of CIDRs: [\"<cidr>\", ...].",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "A list of CIDRs that are to be excluded from NAT\nresolution so that host can handle them. A typical usecase is node local\nDNS cache.",
+ "DescriptionHTML": "
A list of CIDRs that are to be excluded from NAT\nresolution so that host can handle them. A typical usecase is node local\nDNS cache.
In BPF mode, controls the buffer size used for sending BPF events to felix.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFExtToServiceConnmark",
+ "NameEnvVar": "FELIX_BPFExtToServiceConnmark",
+ "NameYAML": "bpfExtToServiceConnmark",
+ "NameGoAPI": "BPFExtToServiceConnmark",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "0",
+ "ParsedDefault": "0",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "0",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "In BPF mode, controls a 32bit mark that is set on connections from an\nexternal client to a local service. This mark allows us to control how packets of that\nconnection are routed within the host and how is routing interpreted by RPF check.",
+ "DescriptionHTML": "
In BPF mode, controls a 32bit mark that is set on connections from an\nexternal client to a local service. This mark allows us to control how packets of that\nconnection are routed within the host and how is routing interpreted by RPF check.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFExternalServiceMode",
+ "NameEnvVar": "FELIX_BPFExternalServiceMode",
+ "NameYAML": "bpfExternalServiceMode",
+ "NameGoAPI": "BPFExternalServiceMode",
+ "StringSchema": "One of: `dsr`, `tunnel`",
+ "StringSchemaHTML": "One of: dsr, tunnel",
+ "StringDefault": "tunnel",
+ "ParsedDefault": "tunnel",
+ "ParsedDefaultJSON": "\"tunnel\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `DSR`, `Tunnel`.",
+ "YAMLEnumValues": [
+ "DSR",
+ "Tunnel"
+ ],
+ "YAMLSchemaHTML": "One of: DSR, Tunnel.",
+ "YAMLDefault": "Tunnel",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "In BPF mode, controls how connections from outside the cluster to services (node ports\nand cluster IPs) are forwarded to remote workloads. If set to \"Tunnel\" then both request and response traffic\nis tunneled to the remote node. If set to \"DSR\", the request traffic is tunneled but the response traffic\nis sent directly from the remote node. In \"DSR\" mode, the remote node appears to use the IP of the ingress\nnode; this requires a permissive L2 network.",
+ "DescriptionHTML": "
In BPF mode, controls how connections from outside the cluster to services (node ports\nand cluster IPs) are forwarded to remote workloads. If set to \"Tunnel\" then both request and response traffic\nis tunneled to the remote node. If set to \"DSR\", the request traffic is tunneled but the response traffic\nis sent directly from the remote node. In \"DSR\" mode, the remote node appears to use the IP of the ingress\nnode; this requires a permissive L2 network.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFForceTrackPacketsFromIfaces",
+ "NameEnvVar": "FELIX_BPFForceTrackPacketsFromIfaces",
+ "NameYAML": "bpfForceTrackPacketsFromIfaces",
+ "NameGoAPI": "BPFForceTrackPacketsFromIfaces",
+ "StringSchema": "Comma-delimited list of strings, each matching the regex `^[a-zA-Z0-9:._+-]{1,15}$`",
+ "StringSchemaHTML": "Comma-delimited list of strings, each matching the regex ^[a-zA-Z0-9:._+-]{1,15}$",
+ "StringDefault": "docker+",
+ "ParsedDefault": "[docker+]",
+ "ParsedDefaultJSON": "[\"docker+\"]",
+ "ParsedType": "[]string",
+ "YAMLType": "array",
+ "YAMLSchema": "List of interface names (may use `+` as a wildcard: `[\"\", ...]`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of interface names (may use + as a wildcard: [\"<name>\", ...].",
+ "YAMLDefault": "[\"docker+\"]",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "In BPF mode, forces traffic from these interfaces\nto skip Calico's iptables NOTRACK rule, allowing traffic from those interfaces to be\ntracked by Linux conntrack. Should only be used for interfaces that are not used for\nthe Calico fabric. For example, a docker bridge device for non-Calico-networked\ncontainers.",
+ "DescriptionHTML": "
In BPF mode, forces traffic from these interfaces\nto skip Calico's iptables NOTRACK rule, allowing traffic from those interfaces to be\ntracked by Linux conntrack. Should only be used for interfaces that are not used for\nthe Calico fabric. For example, a docker bridge device for non-Calico-networked\ncontainers.
",
+ "UserEditable": true,
+ "GoType": "*[]string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFHostConntrackBypass",
+ "NameEnvVar": "FELIX_BPFHostConntrackBypass",
+ "NameYAML": "bpfHostConntrackBypass",
+ "NameGoAPI": "BPFHostConntrackBypass",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether to bypass Linux conntrack in BPF mode for\nworkloads and services.",
+ "DescriptionHTML": "
Controls whether to bypass Linux conntrack in BPF mode for\nworkloads and services.
When in BPF mode, controls whether Felix does a NAT without CTLB. This along with BPFConnectTimeLoadBalancing\ndetermines the CTLB behavior.
",
+ "UserEditable": true,
+ "GoType": "*v3.BPFHostNetworkedNATType",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFIPFragTimeout",
+ "NameEnvVar": "FELIX_BPFIPFragTimeout",
+ "NameYAML": "bpfIPFragTimeout",
+ "NameGoAPI": "BPFIPFragTimeout",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "0",
+ "ParsedDefault": "0s",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "0s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "In BPF mode, controls the timeout for IP fragment reassembly.\nThis is the maximum time that the BPF dataplane will wait for all fragments of a\nfragmented IP packet to arrive before discarding them. If left unset, the value\nis read from the Linux kernel sysctl net.ipv4.ipfrag_time (which defaults to 30\nseconds).",
+ "DescriptionHTML": "
In BPF mode, controls the timeout for IP fragment reassembly.\nThis is the maximum time that the BPF dataplane will wait for all fragments of a\nfragmented IP packet to arrive before discarding them. If left unset, the value\nis read from the Linux kernel sysctl net.ipv4.ipfrag_time (which defaults to 30\nseconds).
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFIPFragmentReassemblyEnabled",
+ "NameEnvVar": "FELIX_BPFIPFragmentReassemblyEnabled",
+ "NameYAML": "bpfIPFragmentReassemblyEnabled",
+ "NameGoAPI": "BPFIPFragmentReassemblyEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether Felix loads the BPF program that\nreassembles out-of-order IP fragments from external networks. This program requires\na kernel newer than 5.10. When enabled (the default) and the program fails to load,\nFelix reports not-ready until the user sets this to false. When false, fragmented\npackets from external sources are dropped.",
+ "DescriptionHTML": "
Controls whether Felix loads the BPF program that\nreassembles out-of-order IP fragments from external networks. This program requires\na kernel newer than 5.10. When enabled (the default) and the program fails to load,\nFelix reports not-ready until the user sets this to false. When false, fragmented\npackets from external sources are dropped.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFJITHardening",
+ "NameEnvVar": "FELIX_BPFJITHardening",
+ "NameYAML": "bpfJITHardening",
+ "NameGoAPI": "BPFJITHardening",
+ "StringSchema": "One of: `Auto`, `Strict`",
+ "StringSchemaHTML": "One of: Auto, Strict",
+ "StringDefault": "Auto",
+ "ParsedDefault": "Auto",
+ "ParsedDefaultJSON": "\"Auto\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "Auto",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls BPF JIT hardening. When set to \"Auto\", Felix will set JIT hardening to 1\nif it detects the current value is 2 (strict mode that hurts performance). When set to \"Strict\",\nFelix will not modify the JIT hardening setting.",
+ "DescriptionHTML": "
Controls BPF JIT hardening. When set to \"Auto\", Felix will set JIT hardening to 1\nif it detects the current value is 2 (strict mode that hurts performance). When set to \"Strict\",\nFelix will not modify the JIT hardening setting.
",
+ "UserEditable": true,
+ "GoType": "*v3.BPFJITHardeningType",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFKubeProxyHealthzPort",
+ "NameEnvVar": "FELIX_BPFKubeProxyHealthzPort",
+ "NameYAML": "bpfKubeProxyHealthzPort",
+ "NameGoAPI": "BPFKubeProxyHealthzPort",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "10256",
+ "ParsedDefault": "10256",
+ "ParsedDefaultJSON": "10256",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "10256",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "In BPF mode, controls the port that Felix's embedded kube-proxy health check server binds to.\nThe health check server is used by external load balancers to determine if this node should receive traffic.\nSet to 0 to disable the health check server.",
+ "DescriptionHTML": "
In BPF mode, controls the port that Felix's embedded kube-proxy health check server binds to.\nThe health check server is used by external load balancers to determine if this node should receive traffic.\nSet to 0 to disable the health check server.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFKubeProxyIptablesCleanupEnabled",
+ "NameEnvVar": "FELIX_BPFKubeProxyIptablesCleanupEnabled",
+ "NameYAML": "bpfKubeProxyIptablesCleanupEnabled",
+ "NameGoAPI": "BPFKubeProxyIptablesCleanupEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "If enabled in BPF mode, Felix will proactively clean up the upstream\nKubernetes kube-proxy's iptables chains. Should only be enabled if kube-proxy is not running.",
+ "DescriptionHTML": "
If enabled in BPF mode, Felix will proactively clean up the upstream\nKubernetes kube-proxy's iptables chains. Should only be enabled if kube-proxy is not running.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFKubeProxyMinSyncPeriod",
+ "NameEnvVar": "FELIX_BPFKubeProxyMinSyncPeriod",
+ "NameYAML": "bpfKubeProxyMinSyncPeriod",
+ "NameGoAPI": "BPFKubeProxyMinSyncPeriod",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "1",
+ "ParsedDefault": "1s",
+ "ParsedDefaultJSON": "1000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "1s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "In BPF mode, controls the minimum time between updates to the dataplane for Felix's\nembedded kube-proxy. Lower values give reduced set-up latency. Higher values reduce Felix CPU usage by\nbatching up more work.",
+ "DescriptionHTML": "
In BPF mode, controls the minimum time between updates to the dataplane for Felix's\nembedded kube-proxy. Lower values give reduced set-up latency. Higher values reduce Felix CPU usage by\nbatching up more work.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFL3IfacePattern",
+ "NameEnvVar": "FELIX_BPFL3IfacePattern",
+ "NameYAML": "bpfL3IfacePattern",
+ "NameGoAPI": "BPFL3IfacePattern",
+ "StringSchema": "Regular expression",
+ "StringSchemaHTML": "Regular expression",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "*regexp.Regexp",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "A regular expression that allows to list tunnel devices like wireguard or vxlan (i.e., L3 devices)\nin addition to BPFDataIfacePattern. That is, tunnel interfaces not created by Calico, that Calico workload traffic flows\nover as well as any interfaces that handle incoming traffic to nodeports and services from outside the cluster.",
+ "DescriptionHTML": "
A regular expression that allows to list tunnel devices like wireguard or vxlan (i.e., L3 devices)\nin addition to BPFDataIfacePattern. That is, tunnel interfaces not created by Calico, that Calico workload traffic flows\nover as well as any interfaces that handle incoming traffic to nodeports and services from outside the cluster.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFLogFilters",
+ "NameEnvVar": "FELIX_BPFLogFilters",
+ "NameYAML": "bpfLogFilters",
+ "NameGoAPI": "BPFLogFilters",
+ "StringSchema": "Comma-delimited list of key=value pairs",
+ "StringSchemaHTML": "Comma-delimited list of key=value pairs",
+ "StringDefault": "",
+ "ParsedDefault": "map[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "map[string]string",
+ "YAMLType": "object",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "A map of key=values where the value is\na pcap filter expression and the key is an interface name with 'all'\ndenoting all interfaces, 'weps' all workload endpoints and 'heps' all host\nendpoints.\n\nWhen specified as an env var, it accepts a comma-separated list of\nkey=values.",
+ "DescriptionHTML": "
A map of key=values where the value is\na pcap filter expression and the key is an interface name with 'all'\ndenoting all interfaces, 'weps' all workload endpoints and 'heps' all host\nendpoints.
\n
When specified as an env var, it accepts a comma-separated list of\nkey=values.
Controls the log level of the BPF programs when in BPF dataplane mode. One of \"Off\", \"Info\", or\n\"Debug\". The logs are emitted to the BPF trace pipe, accessible with the command tc exec bpf debug.\n.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMaglevMaxEndpointsPerService",
+ "NameEnvVar": "FELIX_BPFMaglevMaxEndpointsPerService",
+ "NameYAML": "bpfMaglevMaxEndpointsPerService",
+ "NameGoAPI": "BPFMaglevMaxEndpointsPerService",
+ "StringSchema": "Integer: [1,3000]",
+ "StringSchemaHTML": "Integer: [1,3000]",
+ "StringDefault": "100",
+ "ParsedDefault": "100",
+ "ParsedDefaultJSON": "100",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer: [1,3000]",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer: [1,3000]",
+ "YAMLDefault": "100",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The maximum number of endpoints\nexpected to be part of a single Maglev-enabled service.\n\nInfluences the size of the per-service Maglev lookup-tables generated by Felix\nand thus the amount of memory reserved.",
+ "DescriptionHTML": "
The maximum number of endpoints\nexpected to be part of a single Maglev-enabled service.
\n
Influences the size of the per-service Maglev lookup-tables generated by Felix\nand thus the amount of memory reserved.
The maximum number of expected Maglev-enabled\nservices that Felix will allocate lookup-tables for.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMapSizeConntrack",
+ "NameEnvVar": "FELIX_BPFMapSizeConntrack",
+ "NameYAML": "bpfMapSizeConntrack",
+ "NameGoAPI": "BPFMapSizeConntrack",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "512000",
+ "ParsedDefault": "512000",
+ "ParsedDefaultJSON": "512000",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "512000",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the size for the conntrack map. This map must be large enough to hold\nan entry for each active connection. Warning: changing the size of the conntrack map can cause disruption.",
+ "DescriptionHTML": "
Sets the size for the conntrack map. This map must be large enough to hold\nan entry for each active connection. Warning: changing the size of the conntrack map can cause disruption.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMapSizeConntrackCleanupQueue",
+ "NameEnvVar": "FELIX_BPFMapSizeConntrackCleanupQueue",
+ "NameYAML": "bpfMapSizeConntrackCleanupQueue",
+ "NameGoAPI": "BPFMapSizeConntrackCleanupQueue",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "100000",
+ "ParsedDefault": "100000",
+ "ParsedDefaultJSON": "100000",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "100000",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the size for the map used to hold NAT conntrack entries that are queued\nfor cleanup. This should be big enough to hold all the NAT entries that expire within one cleanup interval.",
+ "DescriptionHTML": "
Sets the size for the map used to hold NAT conntrack entries that are queued\nfor cleanup. This should be big enough to hold all the NAT entries that expire within one cleanup interval.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMapSizeConntrackScaling",
+ "NameEnvVar": "FELIX_BPFMapSizeConntrackScaling",
+ "NameYAML": "bpfMapSizeConntrackScaling",
+ "NameGoAPI": "BPFMapSizeConntrackScaling",
+ "StringSchema": "One of: `Disabled`, `DoubleIfFull`",
+ "StringSchemaHTML": "One of: Disabled, DoubleIfFull",
+ "StringDefault": "DoubleIfFull",
+ "ParsedDefault": "DoubleIfFull",
+ "ParsedDefaultJSON": "\"DoubleIfFull\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Disabled`, `DoubleIfFull`.",
+ "YAMLEnumValues": [
+ "Disabled",
+ "DoubleIfFull"
+ ],
+ "YAMLSchemaHTML": "One of: Disabled, DoubleIfFull.",
+ "YAMLDefault": "DoubleIfFull",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether and how we scale the conntrack map size depending\non its usage. 'Disabled' make the size stay at the default or whatever is set by\nBPFMapSizeConntrack*. 'DoubleIfFull' doubles the size when the map is pretty much full even\nafter cleanups.",
+ "DescriptionHTML": "
Controls whether and how we scale the conntrack map size depending\non its usage. 'Disabled' make the size stay at the default or whatever is set by\nBPFMapSizeConntrack*. 'DoubleIfFull' doubles the size when the map is pretty much full even\nafter cleanups.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMapSizeIPSets",
+ "NameEnvVar": "FELIX_BPFMapSizeIPSets",
+ "NameYAML": "bpfMapSizeIPSets",
+ "NameGoAPI": "BPFMapSizeIPSets",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "1048576",
+ "ParsedDefault": "1048576",
+ "ParsedDefaultJSON": "1048576",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "1048576",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the size for ipsets map. The IP sets map must be large enough to hold an entry\nfor each endpoint matched by every selector in the source/destination matches in network policy. Selectors\nsuch as \"all()\" can result in large numbers of entries (one entry per endpoint in that case).",
+ "DescriptionHTML": "
Sets the size for ipsets map. The IP sets map must be large enough to hold an entry\nfor each endpoint matched by every selector in the source/destination matches in network policy. Selectors\nsuch as \"all()\" can result in large numbers of entries (one entry per endpoint in that case).
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMapSizeIfState",
+ "NameEnvVar": "FELIX_BPFMapSizeIfState",
+ "NameYAML": "bpfMapSizeIfState",
+ "NameGoAPI": "BPFMapSizeIfState",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "1000",
+ "ParsedDefault": "1000",
+ "ParsedDefaultJSON": "1000",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "1000",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the size for ifstate map. The ifstate map must be large enough to hold an entry\nfor each device (host + workloads) on a host.",
+ "DescriptionHTML": "
Sets the size for ifstate map. The ifstate map must be large enough to hold an entry\nfor each device (host + workloads) on a host.
Sets the size of the BPF map that stores the affinity of a connection (for services that\nenable that feature.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMapSizeNATBackend",
+ "NameEnvVar": "FELIX_BPFMapSizeNATBackend",
+ "NameYAML": "bpfMapSizeNATBackend",
+ "NameGoAPI": "BPFMapSizeNATBackend",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "262144",
+ "ParsedDefault": "262144",
+ "ParsedDefaultJSON": "262144",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "262144",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the size for NAT back end map.\nThis is the total number of endpoints. This is mostly\nmore than the size of the number of services.",
+ "DescriptionHTML": "
Sets the size for NAT back end map.\nThis is the total number of endpoints. This is mostly\nmore than the size of the number of services.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMapSizeNATFrontend",
+ "NameEnvVar": "FELIX_BPFMapSizeNATFrontend",
+ "NameYAML": "bpfMapSizeNATFrontend",
+ "NameGoAPI": "BPFMapSizeNATFrontend",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "65536",
+ "ParsedDefault": "65536",
+ "ParsedDefaultJSON": "65536",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "65536",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the size for NAT front end map.\nFrontendMap should be large enough to hold an entry for each nodeport,\nexternal IP and each port in each service.",
+ "DescriptionHTML": "
Sets the size for NAT front end map.\nFrontendMap should be large enough to hold an entry for each nodeport,\nexternal IP and each port in each service.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMapSizePerCPUConntrack",
+ "NameEnvVar": "FELIX_BPFMapSizePerCPUConntrack",
+ "NameYAML": "bpfMapSizePerCpuConntrack",
+ "NameGoAPI": "BPFMapSizePerCPUConntrack",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "0",
+ "ParsedDefault": "0",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "0",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Determines the size of conntrack map based on the number of CPUs. If set to a\nnon-zero value, overrides BPFMapSizeConntrack with `BPFMapSizePerCPUConntrack * (Number of CPUs)`.\nThis map must be large enough to hold an entry for each active connection. Warning: changing the size of the\nconntrack map can cause disruption.",
+ "DescriptionHTML": "
Determines the size of conntrack map based on the number of CPUs. If set to a\nnon-zero value, overrides BPFMapSizeConntrack with BPFMapSizePerCPUConntrack * (Number of CPUs).\nThis map must be large enough to hold an entry for each active connection. Warning: changing the size of the\nconntrack map can cause disruption.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFMapSizeRoute",
+ "NameEnvVar": "FELIX_BPFMapSizeRoute",
+ "NameYAML": "bpfMapSizeRoute",
+ "NameGoAPI": "BPFMapSizeRoute",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "262144",
+ "ParsedDefault": "262144",
+ "ParsedDefaultJSON": "262144",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "262144",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the size for the routes map. The routes map should be large enough\nto hold one entry per workload and a handful of entries per host (enough to cover its own IPs and\ntunnel IPs).",
+ "DescriptionHTML": "
Sets the size for the routes map. The routes map should be large enough\nto hold one entry per workload and a handful of entries per host (enough to cover its own IPs and\ntunnel IPs).
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFPSNATPorts",
+ "NameEnvVar": "FELIX_BPFPSNATPorts",
+ "NameYAML": "bpfPSNATPorts",
+ "NameGoAPI": "BPFPSNATPorts",
+ "StringSchema": "Port range: either a single number in [0,65535] or a range of numbers `n:m`",
+ "StringSchemaHTML": "Port range: either a single number in [0,65535] or a range of numbers n:m",
+ "StringDefault": "20000:29999",
+ "ParsedDefault": "20000:29999",
+ "ParsedDefaultJSON": "\"20000:29999\"",
+ "ParsedType": "numorstring.Port",
+ "YAMLType": "integer or string",
+ "YAMLSchema": "Port range: either an integer in [0,65535] or a string, representing a range, in format `n:m`",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Port range: either an integer in [0,65535] or a string, representing a range, in format n:m",
+ "YAMLDefault": "20000:29999",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Sets the range from which we randomly pick a port if there is a source port\ncollision. This should be within the ephemeral range as defined by RFC 6056 (1024–65535) and\npreferably outside the ephemeral ranges used by common operating systems. Linux uses\n32768–60999, while others mostly use the IANA defined range 49152–65535. It is not necessarily\na problem if this range overlaps with the operating systems. Both ends of the range are\ninclusive.",
+ "DescriptionHTML": "
Sets the range from which we randomly pick a port if there is a source port\ncollision. This should be within the ephemeral range as defined by RFC 6056 (1024–65535) and\npreferably outside the ephemeral ranges used by common operating systems. Linux uses\n32768–60999, while others mostly use the IANA defined range 49152–65535. It is not necessarily\na problem if this range overlaps with the operating systems. Both ends of the range are\ninclusive.
",
+ "UserEditable": true,
+ "GoType": "*numorstring.Port",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFPolicyDebugEnabled",
+ "NameEnvVar": "FELIX_BPFPolicyDebugEnabled",
+ "NameYAML": "bpfPolicyDebugEnabled",
+ "NameGoAPI": "BPFPolicyDebugEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "When true, Felix records detailed information\nabout the BPF policy programs, which can be examined with the calico-bpf command-line tool.",
+ "DescriptionHTML": "
When true, Felix records detailed information\nabout the BPF policy programs, which can be examined with the calico-bpf command-line tool.
Controls profiling of BPF programs. At the monent, it can be\nDisabled or Enabled.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: eBPF",
+ "GroupWithSortPrefix": "22 Dataplane: eBPF",
+ "NameConfigFile": "BPFRedirectToPeer",
+ "NameEnvVar": "FELIX_BPFRedirectToPeer",
+ "NameYAML": "bpfRedirectToPeer",
+ "NameGoAPI": "BPFRedirectToPeer",
+ "StringSchema": "One of: `Disabled`, `Enabled`",
+ "StringSchemaHTML": "One of: Disabled, Enabled",
+ "StringDefault": "Disabled",
+ "ParsedDefault": "Disabled",
+ "ParsedDefaultJSON": "\"Disabled\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"Disabled\"`, `\"Enabled\"`.",
+ "YAMLEnumValues": [
+ "Disabled",
+ "Enabled"
+ ],
+ "YAMLSchemaHTML": "One of: \"Disabled\", \"Enabled\".",
+ "YAMLDefault": "Disabled",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether traffic may be forwarded directly to the peer side of a workload’s device.\nNote that the legacy \"L2Only\" option is now deprecated and if set it is treated like \"Enabled\".\nSetting this option to \"Enabled\" allows direct redirection (including from L3 host devices such as IPIP tunnels or WireGuard),\nwhich can improve redirection performance but causes the redirected packets to bypass the host‑side ingress path.\nAs a result, packet‑capture tools on the host side of the workload device (for example, tcpdump) will not see that traffic.",
+ "DescriptionHTML": "
Controls whether traffic may be forwarded directly to the peer side of a workload’s device.\nNote that the legacy \"L2Only\" option is now deprecated and if set it is treated like \"Enabled\".\nSetting this option to \"Enabled\" allows direct redirection (including from L3 host devices such as IPIP tunnels or WireGuard),\nwhich can improve redirection performance but causes the redirected packets to bypass the host‑side ingress path.\nAs a result, packet‑capture tools on the host side of the workload device (for example, tcpdump) will not see that traffic.
The name of the file that Felix uses to preserve learnt DNS information when restarting. .
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Windows",
+ "GroupWithSortPrefix": "23 Dataplane: Windows",
+ "NameConfigFile": "WindowsDNSExtraTTL",
+ "NameEnvVar": "FELIX_WindowsDNSExtraTTL",
+ "NameYAML": "windowsDnsExtraTTL",
+ "NameGoAPI": "WindowsDNSExtraTTL",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "120",
+ "ParsedDefault": "2m0s",
+ "ParsedDefaultJSON": "120000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "2m0s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Extra time to keep IPs and alias names that are learnt from DNS, in addition to each name\nor IP's advertised TTL. The default value is 120s which is same as the default value of\nServicePointManager.DnsRefreshTimeout on .net framework. .",
+ "DescriptionHTML": "
Extra time to keep IPs and alias names that are learnt from DNS, in addition to each name\nor IP's advertised TTL. The default value is 120s which is same as the default value of\nServicePointManager.DnsRefreshTimeout on .net framework. .
Sets the directory where flow logs files are stored on Windows nodes. .
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: Windows",
+ "GroupWithSortPrefix": "23 Dataplane: Windows",
+ "NameConfigFile": "WindowsFlowLogsPositionFilePath",
+ "NameEnvVar": "FELIX_WindowsFlowLogsPositionFilePath",
+ "NameYAML": "windowsFlowLogsPositionFilePath",
+ "NameGoAPI": "WindowsFlowLogsPositionFilePath",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "c:\\TigeraCalico\\flowlogs\\flows.log.pos",
+ "ParsedDefault": "c:\\TigeraCalico\\flowlogs\\flows.log.pos",
+ "ParsedDefaultJSON": "\"c:\\\\TigeraCalico\\\\flowlogs\\\\flows.log.pos\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "c:\\TigeraCalico\\flowlogs\\flows.log.pos",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to specify the position of the external pipeline that reads flow logs on Windows nodes.\n.\nThis parameter only takes effect when FlowLogsDynamicAggregationEnabled is set to true.",
+ "DescriptionHTML": "
Used to specify the position of the external pipeline that reads flow logs on Windows nodes.\n.\nThis parameter only takes effect when FlowLogsDynamicAggregationEnabled is set to true.
Specifies which Windows HNS networks Felix should operate on. The default is to match\nnetworks that start with \"calico\". Supports regular expression syntax.
Used to specify the path of the stats dump file on Windows nodes.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Dataplane: OpenStack support",
+ "Fields": [
+ {
+ "Group": "Dataplane: OpenStack support",
+ "GroupWithSortPrefix": "25 Dataplane: OpenStack support",
+ "NameConfigFile": "EndpointReportingDelaySecs",
+ "NameEnvVar": "FELIX_EndpointReportingDelaySecs",
+ "NameYAML": "endpointReportingDelay",
+ "NameGoAPI": "EndpointReportingDelay",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "1",
+ "ParsedDefault": "1s",
+ "ParsedDefaultJSON": "1000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "1s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "**Open source-only parameter**; OpenStack is not supported in Calico Enterprise/Cloud.\n\nThe delay before Felix reports endpoint status to the datastore. This is only used\nby the OpenStack integration.",
+ "DescriptionHTML": "
Open source-only parameter; OpenStack is not supported in Calico Enterprise/Cloud.
\n
The delay before Felix reports endpoint status to the datastore. This is only used\nby the OpenStack integration.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": true
+ },
+ {
+ "Group": "Dataplane: OpenStack support",
+ "GroupWithSortPrefix": "25 Dataplane: OpenStack support",
+ "NameConfigFile": "EndpointReportingEnabled",
+ "NameEnvVar": "FELIX_EndpointReportingEnabled",
+ "NameYAML": "endpointReportingEnabled",
+ "NameGoAPI": "EndpointReportingEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "**Open source-only parameter**; OpenStack is not supported in Calico Enterprise/Cloud.\n\nControls whether Felix reports endpoint status to the datastore. This is only used\nby the OpenStack integration.",
+ "DescriptionHTML": "
Open source-only parameter; OpenStack is not supported in Calico Enterprise/Cloud.
\n
Controls whether Felix reports endpoint status to the datastore. This is only used\nby the OpenStack integration.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": true
+ },
+ {
+ "Group": "Dataplane: OpenStack support",
+ "GroupWithSortPrefix": "25 Dataplane: OpenStack support",
+ "NameConfigFile": "MetadataAddr",
+ "NameEnvVar": "FELIX_MetadataAddr",
+ "NameYAML": "metadataAddr",
+ "NameGoAPI": "MetadataAddr",
+ "StringSchema": "String matching regex `^[a-zA-Z0-9_.-]+$`",
+ "StringSchemaHTML": "String matching regex ^[a-zA-Z0-9_.-]+$",
+ "StringDefault": "127.0.0.1",
+ "ParsedDefault": "127.0.0.1",
+ "ParsedDefaultJSON": "\"127.0.0.1\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "127.0.0.1",
+ "Required": false,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "**Open source-only parameter**; OpenStack is not supported in Calico Enterprise/Cloud.\n\nThe IP address or domain name of the server that can answer VM queries for\ncloud-init metadata. In OpenStack, this corresponds to the machine running nova-api (or in\nUbuntu, nova-api-metadata). A value of none (case-insensitive) means that Felix should not\nset up any NAT rule for the metadata path.",
+ "DescriptionHTML": "
Open source-only parameter; OpenStack is not supported in Calico Enterprise/Cloud.
\n
The IP address or domain name of the server that can answer VM queries for\ncloud-init metadata. In OpenStack, this corresponds to the machine running nova-api (or in\nUbuntu, nova-api-metadata). A value of none (case-insensitive) means that Felix should not\nset up any NAT rule for the metadata path.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": true
+ },
+ {
+ "Group": "Dataplane: OpenStack support",
+ "GroupWithSortPrefix": "25 Dataplane: OpenStack support",
+ "NameConfigFile": "MetadataPort",
+ "NameEnvVar": "FELIX_MetadataPort",
+ "NameYAML": "metadataPort",
+ "NameGoAPI": "MetadataPort",
+ "StringSchema": "Integer: [0,65535]",
+ "StringSchemaHTML": "Integer: [0,65535]",
+ "StringDefault": "8775",
+ "ParsedDefault": "8775",
+ "ParsedDefaultJSON": "8775",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer: [0,65535]",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer: [0,65535]",
+ "YAMLDefault": "8775",
+ "Required": false,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "**Open source-only parameter**; OpenStack is not supported in Calico Enterprise/Cloud.\n\nThe port of the metadata server. This, combined with global.MetadataAddr (if\nnot 'None'), is used to set up a NAT rule, from 169.254.169.254:80 to MetadataAddr:MetadataPort.\nIn most cases this should not need to be changed .",
+ "DescriptionHTML": "
Open source-only parameter; OpenStack is not supported in Calico Enterprise/Cloud.
\n
The port of the metadata server. This, combined with global.MetadataAddr (if\nnot 'None'), is used to set up a NAT rule, from 169.254.169.254:80 to MetadataAddr:MetadataPort.\nIn most cases this should not need to be changed .
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": true
+ },
+ {
+ "Group": "Dataplane: OpenStack support",
+ "GroupWithSortPrefix": "25 Dataplane: OpenStack support",
+ "NameConfigFile": "OpenstackRegion",
+ "NameEnvVar": "FELIX_OpenstackRegion",
+ "NameYAML": "openstackRegion",
+ "NameGoAPI": "OpenstackRegion",
+ "StringSchema": "OpenStack region name (must be a valid DNS label)",
+ "StringSchemaHTML": "OpenStack region name (must be a valid DNS label)",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "Exit",
+ "AllowedConfigSources": "All",
+ "Description": "**Open source-only parameter**; OpenStack is not supported in Calico Enterprise/Cloud.\n\nThe name of the region that a particular Felix belongs to. In a multi-region\nCalico/OpenStack deployment, this must be configured somehow for each Felix (here in the datamodel,\nor in felix.cfg or the environment on each compute node), and must match the [calico]\nopenstack_region value configured in neutron.conf on each node.",
+ "DescriptionHTML": "
Open source-only parameter; OpenStack is not supported in Calico Enterprise/Cloud.
\n
The name of the region that a particular Felix belongs to. In a multi-region\nCalico/OpenStack deployment, this must be configured somehow for each Felix (here in the datamodel,\nor in felix.cfg or the environment on each compute node), and must match the [calico]\nopenstack_region value configured in neutron.conf on each node.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": true
+ },
+ {
+ "Group": "Dataplane: OpenStack support",
+ "GroupWithSortPrefix": "25 Dataplane: OpenStack support",
+ "NameConfigFile": "ReportingIntervalSecs",
+ "NameEnvVar": "FELIX_ReportingIntervalSecs",
+ "NameYAML": "reportingInterval",
+ "NameGoAPI": "ReportingInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "30",
+ "ParsedDefault": "30s",
+ "ParsedDefaultJSON": "30000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "30s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "**Open source-only parameter**; OpenStack is not supported in Calico Enterprise/Cloud.\n\nThe interval at which Felix reports its status into the datastore or 0 to disable.\nMust be non-zero in OpenStack deployments.",
+ "DescriptionHTML": "
Open source-only parameter; OpenStack is not supported in Calico Enterprise/Cloud.
\n
The interval at which Felix reports its status into the datastore or 0 to disable.\nMust be non-zero in OpenStack deployments.
Open source-only parameter; OpenStack is not supported in Calico Enterprise/Cloud.
\n
The time-to-live setting for process-wide status reports.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": true
+ }
+ ]
+ },
+ {
+ "Name": "Dataplane: XDP acceleration for iptables dataplane",
+ "Fields": [
+ {
+ "Group": "Dataplane: XDP acceleration for iptables dataplane",
+ "GroupWithSortPrefix": "25 Dataplane: XDP acceleration for iptables dataplane",
+ "NameConfigFile": "GenericXDPEnabled",
+ "NameEnvVar": "FELIX_GenericXDPEnabled",
+ "NameYAML": "genericXDPEnabled",
+ "NameGoAPI": "GenericXDPEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Enables Generic XDP so network cards that don't support XDP offload or driver\nmodes can use XDP. This is not recommended since it doesn't provide better performance than\niptables.",
+ "DescriptionHTML": "
Enables Generic XDP so network cards that don't support XDP offload or driver\nmodes can use XDP. This is not recommended since it doesn't provide better performance than\niptables.
Enables XDP acceleration for suitable untracked incoming deny rules.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Dataplane: XDP acceleration for iptables dataplane",
+ "GroupWithSortPrefix": "25 Dataplane: XDP acceleration for iptables dataplane",
+ "NameConfigFile": "XDPRefreshInterval",
+ "NameEnvVar": "FELIX_XDPRefreshInterval",
+ "NameYAML": "xdpRefreshInterval",
+ "NameGoAPI": "XDPRefreshInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "90",
+ "ParsedDefault": "1m30s",
+ "ParsedDefaultJSON": "90000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "1m30s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The period at which Felix re-checks all XDP state to ensure that no\nother process has accidentally broken Calico's BPF maps or attached programs. Set to 0 to\ndisable XDP refresh.",
+ "DescriptionHTML": "
The period at which Felix re-checks all XDP state to ensure that no\nother process has accidentally broken Calico's BPF maps or attached programs. Set to 0 to\ndisable XDP refresh.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Overlay: VXLAN overlay",
+ "Fields": [
+ {
+ "Group": "Overlay: VXLAN overlay",
+ "GroupWithSortPrefix": "31 Overlay: VXLAN overlay",
+ "NameConfigFile": "VXLANEnabled",
+ "NameEnvVar": "FELIX_VXLANEnabled",
+ "NameYAML": "vxlanEnabled",
+ "NameGoAPI": "VXLANEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "*bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Overrides whether Felix should create the VXLAN tunnel device for IPv4 VXLAN networking.\nOptional as Felix determines this based on the existing IP pools.",
+ "DescriptionHTML": "
Overrides whether Felix should create the VXLAN tunnel device for IPv4 VXLAN networking.\nOptional as Felix determines this based on the existing IP pools.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Overlay: VXLAN overlay",
+ "GroupWithSortPrefix": "31 Overlay: VXLAN overlay",
+ "NameConfigFile": "VXLANMTU",
+ "NameEnvVar": "FELIX_VXLANMTU",
+ "NameYAML": "vxlanMTU",
+ "NameGoAPI": "VXLANMTU",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "0",
+ "ParsedDefault": "0",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "0",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The MTU to set on the IPv4 VXLAN tunnel device. Optional as Felix auto-detects the MTU based on the\nMTU of the host's interfaces.",
+ "DescriptionHTML": "
The MTU to set on the IPv4 VXLAN tunnel device. Optional as Felix auto-detects the MTU based on the\nMTU of the host's interfaces.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Overlay: VXLAN overlay",
+ "GroupWithSortPrefix": "31 Overlay: VXLAN overlay",
+ "NameConfigFile": "VXLANMTUV6",
+ "NameEnvVar": "FELIX_VXLANMTUV6",
+ "NameYAML": "vxlanMTUV6",
+ "NameGoAPI": "VXLANMTUV6",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "0",
+ "ParsedDefault": "0",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "0",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The MTU to set on the IPv6 VXLAN tunnel device. Optional as Felix auto-detects the MTU based on the\nMTU of the host's interfaces.",
+ "DescriptionHTML": "
The MTU to set on the IPv6 VXLAN tunnel device. Optional as Felix auto-detects the MTU based on the\nMTU of the host's interfaces.
Controls the priority value to use for the Wireguard routing rule.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Overlay: Wireguard",
+ "GroupWithSortPrefix": "33 Overlay: Wireguard",
+ "NameConfigFile": "WireguardThreadingEnabled",
+ "NameEnvVar": "FELIX_WireguardThreadingEnabled",
+ "NameYAML": "wireguardThreadingEnabled",
+ "NameGoAPI": "WireguardThreadingEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether Wireguard has Threaded NAPI enabled. \nThis increases the maximum number of packets a Wireguard interface can process.\nConsider threaded NAPI only if you have high packets per second workloads that are causing dropping packets due to a saturated `softirq` CPU core.\nThere is a [known issue](https://lore.kernel.org/netdev/CALrw=nEoT2emQ0OAYCjM1d_6Xe_kNLSZ6dhjb5FxrLFYh4kozA@mail.gmail.com/T/) with this setting\nthat may cause NAPI to get stuck holding the global `rtnl_mutex` when a peer is removed.\nWorkaround: Make sure your Linux kernel [includes this patch](https://github.com/torvalds/linux/commit/56364c910691f6d10ba88c964c9041b9ab777bd6) to unwedge NAPI.",
+ "DescriptionHTML": "
Controls whether Wireguard has Threaded NAPI enabled. \nThis increases the maximum number of packets a Wireguard interface can process.\nConsider threaded NAPI only if you have high packets per second workloads that are causing dropping packets due to a saturated softirq CPU core.\nThere is a [known issue](https://lore.kernel.org/netdev/CALrw=nEoT2emQ0OAYCjM1d_6Xe_kNLSZ6dhjb5FxrLFYh4kozA@mail.gmail.com/T/) with this setting\nthat may cause NAPI to get stuck holding the global rtnl_mutex when a peer is removed.\nWorkaround: Make sure your Linux kernel [includes this patch](https://github.com/torvalds/linux/commit/56364c910691f6d10ba88c964c9041b9ab777bd6) to unwedge NAPI.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Overlay: IPSec",
+ "Fields": [
+ {
+ "Group": "Overlay: IPSec",
+ "GroupWithSortPrefix": "34 Overlay: IPSec",
+ "NameConfigFile": "IPSecAllowUnsecuredTraffic",
+ "NameEnvVar": "FELIX_IPSecAllowUnsecuredTraffic",
+ "NameYAML": "ipsecAllowUnsecuredTraffic",
+ "NameGoAPI": "IPSecAllowUnsecuredTraffic",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether non-IPsec traffic is allowed in addition to IPsec traffic. Enabling this\nnegates the anti-spoofing protections of IPsec but it is useful when migrating to/from IPsec.",
+ "DescriptionHTML": "
Controls whether non-IPsec traffic is allowed in addition to IPsec traffic. Enabling this\nnegates the anti-spoofing protections of IPsec but it is useful when migrating to/from IPsec.
The port that the Prometheus per-flow metrics reporter should bind to.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Flow logs: Syslog reports",
+ "Fields": [
+ {
+ "Group": "Flow logs: Syslog reports",
+ "GroupWithSortPrefix": "40 Flow logs: Syslog reports",
+ "NameConfigFile": "SyslogReporterAddress",
+ "NameEnvVar": "FELIX_SyslogReporterAddress",
+ "NameYAML": "syslogReporterAddress",
+ "NameGoAPI": "SyslogReporterAddress",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The address to dial to when writing to Syslog. For TCP and UDP networks, the address has\nthe form \"host:port\". The host must be a literal IP address, or a host name that can be resolved to IP addresses.\nThe port must be a literal port number or a service name. For more, see: https://pkg.go.dev/net#Dial.",
+ "DescriptionHTML": "
The address to dial to when writing to Syslog. For TCP and UDP networks, the address has\nthe form \"host:port\". The host must be a literal IP address, or a host name that can be resolved to IP addresses.\nThe port must be a literal port number or a service name. For more, see: https://pkg.go.dev/net#Dial.
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: Syslog reports",
+ "GroupWithSortPrefix": "40 Flow logs: Syslog reports",
+ "NameConfigFile": "SyslogReporterEnabled",
+ "NameEnvVar": "FELIX_SyslogReporterEnabled",
+ "NameYAML": "syslogReporterEnabled",
+ "NameGoAPI": "SyslogReporterEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Turns on the feature to write logs to Syslog. Please note that this can incur significant\ndisk space usage when running felix on non-cluster hosts.",
+ "DescriptionHTML": "
Turns on the feature to write logs to Syslog. Please note that this can incur significant\ndisk space usage when running felix on non-cluster hosts.
The network to dial to when writing to Syslog. Known networks are \"tcp\", \"tcp4\"\n(IPv4-only), \"tcp6\" (IPv6-only), \"udp\", \"udp4\" (IPv4-only), \"udp6\" (IPv6-only), \"ip\", \"ip4\" (IPv4-only), \"ip6\"\n(IPv6-only), \"unix\", \"unixgram\" and \"unixpacket\". For more, see: https://pkg.go.dev/net#Dial.
Used specify how far behind the external pipeline that reads flow logs can be. Default is 8192 bytes.\nThis parameter only takes effect when FlowLogsDynamicAggregationEnabled is set to true.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsCollectProcessInfo",
+ "NameEnvVar": "FELIX_FlowLogsCollectProcessInfo",
+ "NameYAML": "flowLogsCollectProcessInfo",
+ "NameGoAPI": "FlowLogsCollectProcessInfo",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "If enabled Felix will load the kprobe BPF programs to collect process info.",
+ "DescriptionHTML": "
If enabled Felix will load the kprobe BPF programs to collect process info.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsCollectProcessPath",
+ "NameEnvVar": "FELIX_FlowLogsCollectProcessPath",
+ "NameYAML": "flowLogsCollectProcessPath",
+ "NameGoAPI": "FlowLogsCollectProcessPath",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "When FlowLogsCollectProcessPath and FlowLogsCollectProcessInfo are\nboth enabled, each flow log will include information about the process\nthat is sending or receiving the packets in that flow: the\n`process_name` field will contain the full path of the process\nexecutable, and the `process_args` field will have the arguments with\nwhich the executable was invoked. Process information will not be\nreported for connections which use raw sockets.",
+ "DescriptionHTML": "
When FlowLogsCollectProcessPath and FlowLogsCollectProcessInfo are\nboth enabled, each flow log will include information about the process\nthat is sending or receiving the packets in that flow: the\nprocess_name field will contain the full path of the process\nexecutable, and the process_args field will have the arguments with\nwhich the executable was invoked. Process information will not be\nreported for connections which use raw sockets.
Enables Flow logs reporting for GlobalNetworkSets.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsFileAggregationKindForAllowed",
+ "NameEnvVar": "FELIX_FlowLogsFileAggregationKindForAllowed",
+ "NameYAML": "flowLogsFileAggregationKindForAllowed",
+ "NameGoAPI": "FlowLogsFileAggregationKindForAllowed",
+ "StringSchema": "Integer: [0,3]",
+ "StringSchemaHTML": "Integer: [0,3]",
+ "StringDefault": "2",
+ "ParsedDefault": "2",
+ "ParsedDefaultJSON": "2",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "One of: `0`, `1`, `2`.",
+ "YAMLEnumValues": [
+ "0",
+ "1",
+ "2"
+ ],
+ "YAMLSchemaHTML": "One of: 0, 1, 2.",
+ "YAMLDefault": "2",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the type of aggregation for flow log entries created for\nallowed connections. .\nAccepted values are 0, 1 and 2.\n0 - No aggregation.\n1 - Source port based aggregation.\n2 - Pod prefix name based aggreagation.",
+ "DescriptionHTML": "
Used to choose the type of aggregation for flow log entries created for\nallowed connections. .\nAccepted values are 0, 1 and 2.\n0 - No aggregation.\n1 - Source port based aggregation.\n2 - Pod prefix name based aggreagation.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsFileAggregationKindForDenied",
+ "NameEnvVar": "FELIX_FlowLogsFileAggregationKindForDenied",
+ "NameYAML": "flowLogsFileAggregationKindForDenied",
+ "NameGoAPI": "FlowLogsFileAggregationKindForDenied",
+ "StringSchema": "Integer: [0,3]",
+ "StringSchemaHTML": "Integer: [0,3]",
+ "StringDefault": "1",
+ "ParsedDefault": "1",
+ "ParsedDefaultJSON": "1",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "One of: `0`, `1`, `2`, `3`.",
+ "YAMLEnumValues": [
+ "0",
+ "1",
+ "2",
+ "3"
+ ],
+ "YAMLSchemaHTML": "One of: 0, 1, 2, 3.",
+ "YAMLDefault": "1",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the type of aggregation for flow log entries created for\ndenied connections. .\nAccepted values are 0, 1 and 2.\n0 - No aggregation.\n1 - Source port based aggregation.\n2 - Pod prefix name based aggregation.\n3 - No destination ports based aggregation.",
+ "DescriptionHTML": "
Used to choose the type of aggregation for flow log entries created for\ndenied connections. .\nAccepted values are 0, 1 and 2.\n0 - No aggregation.\n1 - Source port based aggregation.\n2 - Pod prefix name based aggregation.\n3 - No destination ports based aggregation.
Sets the directory where flow logs files are stored.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsFileDomainsLimit",
+ "NameEnvVar": "FELIX_FlowLogsFileDomainsLimit",
+ "NameYAML": "flowLogsFileDomainsLimit",
+ "NameGoAPI": "FlowLogsFileDomainsLimit",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "5",
+ "ParsedDefault": "5",
+ "ParsedDefaultJSON": "5",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "5",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to configure the number of (destination) domains to include in the flow log.\nThese are not included for workload or host endpoint destinations.",
+ "DescriptionHTML": "
Used to configure the number of (destination) domains to include in the flow log.\nThese are not included for workload or host endpoint destinations.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsFileEnabled",
+ "NameEnvVar": "FELIX_FlowLogsFileEnabled",
+ "NameYAML": "flowLogsFileEnabled",
+ "NameGoAPI": "FlowLogsFileEnabled",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "When set to true, enables logging flow logs to a file. If false no flow logging to file will occur.",
+ "DescriptionHTML": "
When set to true, enables logging flow logs to a file. If false no flow logging to file will occur.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsFileEnabledForAllowed",
+ "NameEnvVar": "FELIX_FlowLogsFileEnabledForAllowed",
+ "NameYAML": "flowLogsFileEnabledForAllowed",
+ "NameGoAPI": "FlowLogsFileEnabledForAllowed",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to enable/disable flow logs entries created for allowed connections. Default is true.\nThis parameter only takes effect when FlowLogsFileReporterEnabled is set to true.",
+ "DescriptionHTML": "
Used to enable/disable flow logs entries created for allowed connections. Default is true.\nThis parameter only takes effect when FlowLogsFileReporterEnabled is set to true.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsFileEnabledForDenied",
+ "NameEnvVar": "FELIX_FlowLogsFileEnabledForDenied",
+ "NameYAML": "flowLogsFileEnabledForDenied",
+ "NameGoAPI": "FlowLogsFileEnabledForDenied",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to enable/disable flow logs entries created for denied flows. Default is true.\nThis parameter only takes effect when FlowLogsFileReporterEnabled is set to true.",
+ "DescriptionHTML": "
Used to enable/disable flow logs entries created for denied flows. Default is true.\nThis parameter only takes effect when FlowLogsFileReporterEnabled is set to true.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsFileIncludeLabels",
+ "NameEnvVar": "FELIX_FlowLogsFileIncludeLabels",
+ "NameYAML": "flowLogsFileIncludeLabels",
+ "NameGoAPI": "FlowLogsFileIncludeLabels",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to configure if endpoint labels are included in a Flow log entry written to file.",
+ "DescriptionHTML": "
Used to configure if endpoint labels are included in a Flow log entry written to file.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsFileIncludePolicies",
+ "NameEnvVar": "FELIX_FlowLogsFileIncludePolicies",
+ "NameYAML": "flowLogsFileIncludePolicies",
+ "NameGoAPI": "FlowLogsFileIncludePolicies",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to configure if policy information are included in a Flow log entry written to file.",
+ "DescriptionHTML": "
Used to configure if policy information are included in a Flow log entry written to file.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsFileIncludeService",
+ "NameEnvVar": "FELIX_FlowLogsFileIncludeService",
+ "NameYAML": "flowLogsFileIncludeService",
+ "NameGoAPI": "FlowLogsFileIncludeService",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "false",
+ "ParsedDefault": "false",
+ "ParsedDefaultJSON": "false",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "false",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to configure if the destination service is included in a Flow log entry written to file.\nThe service information can only be included if the flow was explicitly determined to be directed at the service (e.g.\nwhen the pre-DNAT destination corresponds to the service ClusterIP and port).",
+ "DescriptionHTML": "
Used to configure if the destination service is included in a Flow log entry written to file.\nThe service information can only be included if the flow was explicitly determined to be directed at the service (e.g.\nwhen the pre-DNAT destination corresponds to the service ClusterIP and port).
Specifies the number of unique IP addresses (if relevant) that should be included in Flow logs.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsPolicyEvaluationMode",
+ "NameEnvVar": "FELIX_FlowLogsPolicyEvaluationMode",
+ "NameYAML": "flowLogsPolicyEvaluationMode",
+ "NameGoAPI": "FlowLogsPolicyEvaluationMode",
+ "StringSchema": "One of: `Continuous`, `OnNewConnection`",
+ "StringSchemaHTML": "One of: Continuous, OnNewConnection",
+ "StringDefault": "Continuous",
+ "ParsedDefault": "Continuous",
+ "ParsedDefaultJSON": "\"Continuous\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "Continuous",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Defines how policies are evaluated and reflected in flow logs.\nOnNewConnection - In this mode, staged policies are only evaluated when new connections are\nmade in the dataplane. Staged/active policy changes will not be reflected in the\n`pending_policies` field of flow logs for long lived connections.\nContinuous - Felix evaluates active flows on a regular basis to determine the rule\ntraces in the flow logs. Any policy updates that impact a flow will be reflected in the\npending_policies field, offering a near-real-time view of policy changes across flows.",
+ "DescriptionHTML": "
Defines how policies are evaluated and reflected in flow logs.\nOnNewConnection - In this mode, staged policies are only evaluated when new connections are\nmade in the dataplane. Staged/active policy changes will not be reflected in the\npending_policies field of flow logs for long lived connections.\nContinuous - Felix evaluates active flows on a regular basis to determine the rule\ntraces in the flow logs. Any policy updates that impact a flow will be reflected in the\npending_policies field, offering a near-real-time view of policy changes across flows.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Flow logs: file reports",
+ "GroupWithSortPrefix": "40 Flow logs: file reports",
+ "NameConfigFile": "FlowLogsPolicyScope",
+ "NameEnvVar": "FELIX_FlowLogsPolicyScope",
+ "NameYAML": "flowLogsPolicyScope",
+ "NameGoAPI": "FlowLogsPolicyScope",
+ "StringSchema": "One of: `AllPolicies`, `EndpointPolicies`",
+ "StringSchemaHTML": "One of: AllPolicies, EndpointPolicies",
+ "StringDefault": "EndpointPolicies",
+ "ParsedDefault": "EndpointPolicies",
+ "ParsedDefaultJSON": "\"EndpointPolicies\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "EndpointPolicies",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls which policies are included in flow logs.\nAllPolicies - Processes both transit policies for the local node and\nendpoint policies derived from packet source/destination IPs. Provides comprehensive\nvisibility into all policy evaluations but increases log volume.\nEndpointPolicies - Processes only policies for endpoints identified as the source\nor destination of the packet (whether workload or host endpoints).",
+ "DescriptionHTML": "
Controls which policies are included in flow logs.\nAllPolicies - Processes both transit policies for the local node and\nendpoint policies derived from packet source/destination IPs. Provides comprehensive\nvisibility into all policy evaluations but increases log volume.\nEndpointPolicies - Processes only policies for endpoints identified as the source\nor destination of the packet (whether workload or host endpoints).
Used specify the position of the external pipeline that reads flow logs. Default is /var/log/calico/flows.log.pos.\nThis parameter only takes effect when FlowLogsDynamicAggregationEnabled is set to true.
An arbitrary number that can be changed, at runtime, to tell Felix to discard all its\nlearnt DNS information. .
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSCacheFile",
+ "NameEnvVar": "FELIX_DNSCacheFile",
+ "NameYAML": "dnsCacheFile",
+ "NameGoAPI": "DNSCacheFile",
+ "StringSchema": "Path to file",
+ "StringSchemaHTML": "Path to file",
+ "StringDefault": "/var/run/calico/felix-dns-cache.txt",
+ "ParsedDefault": "/var/run/calico/felix-dns-cache.txt",
+ "ParsedDefaultJSON": "\"/var/run/calico/felix-dns-cache.txt\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "/var/run/calico/felix-dns-cache.txt",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The name of the file that Felix uses to preserve learnt DNS information when restarting. .",
+ "DescriptionHTML": "
The name of the file that Felix uses to preserve learnt DNS information when restarting. .
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSCacheSaveInterval",
+ "NameEnvVar": "FELIX_DNSCacheSaveInterval",
+ "NameYAML": "dnsCacheSaveInterval",
+ "NameGoAPI": "DNSCacheSaveInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "60",
+ "ParsedDefault": "1m0s",
+ "ParsedDefaultJSON": "60000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "1m0s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The periodic interval at which Felix saves learnt DNS information to the cache file. .",
+ "DescriptionHTML": "
The periodic interval at which Felix saves learnt DNS information to the cache file. .
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSExtraTTL",
+ "NameEnvVar": "FELIX_DNSExtraTTL",
+ "NameYAML": "dnsExtraTTL",
+ "NameGoAPI": "DNSExtraTTL",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "0",
+ "ParsedDefault": "0s",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "0s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Extra time to keep IPs and alias names that are learnt from DNS, in addition to each name\nor IP's advertised TTL. .",
+ "DescriptionHTML": "
Extra time to keep IPs and alias names that are learnt from DNS, in addition to each name\nor IP's advertised TTL. .
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSLogsFileAggregationKind",
+ "NameEnvVar": "FELIX_DNSLogsFileAggregationKind",
+ "NameYAML": "dnsLogsFileAggregationKind",
+ "NameGoAPI": "DNSLogsFileAggregationKind",
+ "StringSchema": "Integer: [0,1]",
+ "StringSchemaHTML": "Integer: [0,1]",
+ "StringDefault": "1",
+ "ParsedDefault": "1",
+ "ParsedDefaultJSON": "1",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "One of: `0`, `1`.",
+ "YAMLEnumValues": [
+ "0",
+ "1"
+ ],
+ "YAMLSchemaHTML": "One of: 0, 1.",
+ "YAMLDefault": "1",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the type of aggregation for DNS log entries.\n.\nAccepted values are 0 and 1.\n0 - No aggregation.\n1 - Aggregate over clients with the same name prefix.",
+ "DescriptionHTML": "
Used to choose the type of aggregation for DNS log entries.\n.\nAccepted values are 0 and 1.\n0 - No aggregation.\n1 - Aggregate over clients with the same name prefix.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSLogsFilePerNodeLimit",
+ "NameEnvVar": "FELIX_DNSLogsFilePerNodeLimit",
+ "NameYAML": "dnsLogsFilePerNodeLimit",
+ "NameGoAPI": "DNSLogsFilePerNodeLimit",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "0",
+ "ParsedDefault": "0",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "0",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Limit on the number of DNS logs that can be emitted within each flush interval. When\nthis limit has been reached, Felix counts the number of unloggable DNS responses within\nthe flush interval, and emits a WARNING log with that count at the same time as it\nflushes the buffered DNS logs.",
+ "DescriptionHTML": "
Limit on the number of DNS logs that can be emitted within each flush interval. When\nthis limit has been reached, Felix counts the number of unloggable DNS responses within\nthe flush interval, and emits a WARNING log with that count at the same time as it\nflushes the buffered DNS logs.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSLogsFlushInterval",
+ "NameEnvVar": "FELIX_DNSLogsFlushInterval",
+ "NameYAML": "dnsLogsFlushInterval",
+ "NameGoAPI": "DNSLogsFlushInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "300",
+ "ParsedDefault": "5m0s",
+ "ParsedDefaultJSON": "300000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "5m0s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Configures the interval at which Felix exports DNS logs.",
+ "DescriptionHTML": "
Configures the interval at which Felix exports DNS logs.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSLogsLatency",
+ "NameEnvVar": "FELIX_DNSLogsLatency",
+ "NameYAML": "dnsLogsLatency",
+ "NameGoAPI": "DNSLogsLatency",
+ "StringSchema": "Boolean: `true`, `1`, `yes`, `y`, `t` accepted as True; `false`, `0`, `no`, `n`, `f` accepted (case insensitively) as False.",
+ "StringSchemaHTML": "Boolean: true, 1, yes, y, t accepted as True; false, 0, no, n, f accepted (case insensitively) as False.",
+ "StringDefault": "true",
+ "ParsedDefault": "true",
+ "ParsedDefaultJSON": "true",
+ "ParsedType": "bool",
+ "YAMLType": "boolean",
+ "YAMLSchema": "Boolean.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Boolean.",
+ "YAMLDefault": "true",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Indicates to include measurements of DNS request/response latency in each DNS log.",
+ "DescriptionHTML": "
Indicates to include measurements of DNS request/response latency in each DNS log.
",
+ "UserEditable": true,
+ "GoType": "*bool",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSPacketsNfqueueID",
+ "NameEnvVar": "FELIX_DNSPacketsNfqueueID",
+ "NameYAML": "dnsPacketsNfqueueID",
+ "NameGoAPI": "DNSPacketsNfqueueID",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "101",
+ "ParsedDefault": "101",
+ "ParsedDefaultJSON": "101",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "101",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The NFQUEUE ID to use for capturing DNS packets to ensure programming IPSets occurs before\nthe response is released. Used when DNSPolicyMode is DelayDNSResponse.",
+ "DescriptionHTML": "
The NFQUEUE ID to use for capturing DNS packets to ensure programming IPSets occurs before\nthe response is released. Used when DNSPolicyMode is DelayDNSResponse.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSPacketsNfqueueMaxHoldDuration",
+ "NameEnvVar": "FELIX_DNSPacketsNfqueueMaxHoldDuration",
+ "NameYAML": "dnsPacketsNfqueueMaxHoldDuration",
+ "NameGoAPI": "DNSPacketsNfqueueMaxHoldDuration",
+ "StringSchema": "Milliseconds (floating point)",
+ "StringSchemaHTML": "Milliseconds (floating point)",
+ "StringDefault": "3000",
+ "ParsedDefault": "3s",
+ "ParsedDefaultJSON": "3000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "3s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The max length of time to hold on to a DNS response while waiting for the\nthe dataplane to be programmed. Used when DNSPolicyMode is DelayDNSResponse.",
+ "DescriptionHTML": "
The max length of time to hold on to a DNS response while waiting for the\nthe dataplane to be programmed. Used when DNSPolicyMode is DelayDNSResponse.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSPacketsNfqueueSize",
+ "NameEnvVar": "FELIX_DNSPacketsNfqueueSize",
+ "NameYAML": "dnsPacketsNfqueueSize",
+ "NameGoAPI": "DNSPacketsNfqueueSize",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "100",
+ "ParsedDefault": "100",
+ "ParsedDefaultJSON": "100",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "100",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The size of the NFQUEUE for captured DNS packets. This is the maximum number of DNS\npackets that may be queued awaiting programming in the dataplane. Used when DNSPolicyMode is DelayDNSResponse.",
+ "DescriptionHTML": "
The size of the NFQUEUE for captured DNS packets. This is the maximum number of DNS\npackets that may be queued awaiting programming in the dataplane. Used when DNSPolicyMode is DelayDNSResponse.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSPolicyMode",
+ "NameEnvVar": "FELIX_DNSPolicyMode",
+ "NameYAML": "dnsPolicyMode",
+ "NameGoAPI": "DNSPolicyMode",
+ "StringSchema": "One of: `DelayDNSResponse`, `DelayDeniedPacket`, `Inline`, `NoDelay`",
+ "StringSchemaHTML": "One of: DelayDNSResponse, DelayDeniedPacket, Inline, NoDelay",
+ "StringDefault": "DelayDeniedPacket",
+ "ParsedDefault": "DelayDeniedPacket",
+ "ParsedDefaultJSON": "\"DelayDeniedPacket\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"DelayDNSResponse\"`, `\"DelayDeniedPacket\"`, `\"Inline\"`, `\"NoDelay\"`.",
+ "YAMLEnumValues": [
+ "DelayDNSResponse",
+ "DelayDeniedPacket",
+ "Inline",
+ "NoDelay"
+ ],
+ "YAMLSchemaHTML": "One of: \"DelayDNSResponse\", \"DelayDeniedPacket\", \"Inline\", \"NoDelay\".",
+ "YAMLDefault": "DelayDeniedPacket",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Specifies how DNS policy programming will be handled.\nDelayDeniedPacket - Felix delays any denied packet that traversed a policy that included egress domain matches,\nbut did not match. The packet is released after a fixed time, or after the destination IP address was programmed.\nDelayDNSResponse - Felix delays any DNS response until related IPSets are programmed. This introduces some\nlatency to all DNS packets (even when no IPSet programming is required), but it ensures policy hit statistics\nare accurate. This is the recommended setting when you are making use of staged policies or policy rule hit\nstatistics.\nNoDelay - Felix does not introduce any delay to the packets. DNS rules may not have been programmed by the time\nthe first packet traverses the policy rules. Client applications need to handle reconnection attempts if initial\nconnection attempts fail. This may be problematic for some applications or for very low DNS TTLs.\n\nInline - Parses DNS response inline with DNS response packet processing within IPTables.\nThis guarantees the DNS rules reflect any change immediately.\nThis mode works for iptables only and matches the same mode for BPFDNSPolicyMode.\nThis setting is ignored on Windows and \"NoDelay\" is always used.\n\nThis setting is ignored by eBPF and BPFDNSPolicyMode is used instead.\n\nThis field has no effect in NFTables mode. Please use NFTablesDNSPolicyMode instead.",
+ "DescriptionHTML": "
Specifies how DNS policy programming will be handled.\nDelayDeniedPacket - Felix delays any denied packet that traversed a policy that included egress domain matches,\nbut did not match. The packet is released after a fixed time, or after the destination IP address was programmed.\nDelayDNSResponse - Felix delays any DNS response until related IPSets are programmed. This introduces some\nlatency to all DNS packets (even when no IPSet programming is required), but it ensures policy hit statistics\nare accurate. This is the recommended setting when you are making use of staged policies or policy rule hit\nstatistics.\nNoDelay - Felix does not introduce any delay to the packets. DNS rules may not have been programmed by the time\nthe first packet traverses the policy rules. Client applications need to handle reconnection attempts if initial\nconnection attempts fail. This may be problematic for some applications or for very low DNS TTLs.
\n
Inline - Parses DNS response inline with DNS response packet processing within IPTables.\nThis guarantees the DNS rules reflect any change immediately.\nThis mode works for iptables only and matches the same mode for BPFDNSPolicyMode.\nThis setting is ignored on Windows and \"NoDelay\" is always used.
\n
This setting is ignored by eBPF and BPFDNSPolicyMode is used instead.
\n
This field has no effect in NFTables mode. Please use NFTablesDNSPolicyMode instead.
",
+ "UserEditable": true,
+ "GoType": "*v3.DNSPolicyMode",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSPolicyNfqueueID",
+ "NameEnvVar": "FELIX_DNSPolicyNfqueueID",
+ "NameYAML": "dnsPolicyNfqueueID",
+ "NameGoAPI": "DNSPolicyNfqueueID",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "100",
+ "ParsedDefault": "100",
+ "ParsedDefaultJSON": "100",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "100",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The NFQUEUE ID to use for DNS Policy re-evaluation when the domains IP hasn't been programmed\nto ipsets yet. Used when DNSPolicyMode is DelayDeniedPacket.",
+ "DescriptionHTML": "
The NFQUEUE ID to use for DNS Policy re-evaluation when the domains IP hasn't been programmed\nto ipsets yet. Used when DNSPolicyMode is DelayDeniedPacket.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSPolicyNfqueueSize",
+ "NameEnvVar": "FELIX_DNSPolicyNfqueueSize",
+ "NameYAML": "dnsPolicyNfqueueSize",
+ "NameGoAPI": "DNSPolicyNfqueueSize",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "255",
+ "ParsedDefault": "255",
+ "ParsedDefaultJSON": "255",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "255",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "DNSPolicyNfqueueID is the size of the NFQUEUE for DNS policy re-evaluation. This is the maximum number of denied\npackets that may be queued up pending re-evaluation.\nUsed when DNSPolicyMode is DelayDeniedPacket.",
+ "DescriptionHTML": "
DNSPolicyNfqueueID is the size of the NFQUEUE for DNS policy re-evaluation. This is the maximum number of denied\npackets that may be queued up pending re-evaluation.\nUsed when DNSPolicyMode is DelayDeniedPacket.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "DNS logs / policy",
+ "GroupWithSortPrefix": "50 DNS logs / policy",
+ "NameConfigFile": "DNSTrustedServers",
+ "NameEnvVar": "FELIX_DNSTrustedServers",
+ "NameYAML": "dnsTrustedServers",
+ "NameGoAPI": "DNSTrustedServers",
+ "StringSchema": "Comma-delimited list of DNS servers. Each entry can be: ``, an `:` (IPv6 addresses must be wrapped in square brackets), or, a Kubernetes service name `k8s-service:(namespace/)service-name`.",
+ "StringSchemaHTML": "Comma-delimited list of DNS servers. Each entry can be: <IP address>, an <IP address>:<port> (IPv6 addresses must be wrapped in square brackets), or, a Kubernetes service name k8s-service:(namespace/)service-name.",
+ "StringDefault": "k8s-service:kube-dns",
+ "ParsedDefault": "[]",
+ "ParsedDefaultJSON": "[]",
+ "ParsedType": "[]config.ServerPort",
+ "YAMLType": "array",
+ "YAMLSchema": "List of strings: `[\"\", ...]`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "List of strings: [\"<string>\", ...].",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The DNS servers that Felix should trust. Each entry here must be `[:]` - indicating an\nexplicit DNS server IP - or `k8s-service:[/][:port]` - indicating a Kubernetes DNS\nservice. `` defaults to the first service port, or 53 for an IP, and `` to\n`kube-system`. An IPv6 address with a port must use the square brackets convention, for example\n`[fd00:83a6::12]:5353`.Note that Felix (calico-node) will need RBAC permission to read the details of\neach service specified by a `k8s-service:...` form. .",
+ "DescriptionHTML": "
The DNS servers that Felix should trust. Each entry here must be <ip>[:<port>] - indicating an\nexplicit DNS server IP - or k8s-service:[<namespace>/]<name>[:port] - indicating a Kubernetes DNS\nservice. <port> defaults to the first service port, or 53 for an IP, and <namespace> to\nkube-system. An IPv6 address with a port must use the square brackets convention, for example\n[fd00:83a6::12]:5353.Note that Felix (calico-node) will need RBAC permission to read the details of\neach service specified by a k8s-service:... form. .
",
+ "UserEditable": true,
+ "GoType": "*[]string",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "L7 logs",
+ "Fields": [
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationDestinationInfo",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationDestinationInfo",
+ "NameYAML": "l7LogsFileAggregationDestinationInfo",
+ "NameGoAPI": "L7LogsFileAggregationDestinationInfo",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "IncludeL7DestinationInfo",
+ "ParsedDefault": "IncludeL7DestinationInfo",
+ "ParsedDefaultJSON": "\"IncludeL7DestinationInfo\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `ExcludeL7DestinationInfo`, `IncludeL7DestinationInfo`.",
+ "YAMLEnumValues": [
+ "ExcludeL7DestinationInfo",
+ "IncludeL7DestinationInfo"
+ ],
+ "YAMLSchemaHTML": "One of: ExcludeL7DestinationInfo, IncludeL7DestinationInfo.",
+ "YAMLDefault": "IncludeL7DestinationInfo",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the type of aggregation for the destination metadata on L7 log entries.\n.\nAccepted values are IncludeL7DestinationInfo and ExcludeL7DestinationInfo.\nIncludeL7DestinationInfo - Include destination metadata in the logs.\nExcludeL7DestinationInfo - Aggregate over all other fields ignoring the destination aggregated name, namespace, and type.",
+ "DescriptionHTML": "
Used to choose the type of aggregation for the destination metadata on L7 log entries.\n.\nAccepted values are IncludeL7DestinationInfo and ExcludeL7DestinationInfo.\nIncludeL7DestinationInfo - Include destination metadata in the logs.\nExcludeL7DestinationInfo - Aggregate over all other fields ignoring the destination aggregated name, namespace, and type.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationHTTPHeaderInfo",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationHTTPHeaderInfo",
+ "NameYAML": "l7LogsFileAggregationHTTPHeaderInfo",
+ "NameGoAPI": "L7LogsFileAggregationHTTPHeaderInfo",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "ExcludeL7HTTPHeaderInfo",
+ "ParsedDefault": "ExcludeL7HTTPHeaderInfo",
+ "ParsedDefaultJSON": "\"ExcludeL7HTTPHeaderInfo\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `ExcludeL7HTTPHeaderInfo`, `IncludeL7HTTPHeaderInfo`.",
+ "YAMLEnumValues": [
+ "ExcludeL7HTTPHeaderInfo",
+ "IncludeL7HTTPHeaderInfo"
+ ],
+ "YAMLSchemaHTML": "One of: ExcludeL7HTTPHeaderInfo, IncludeL7HTTPHeaderInfo.",
+ "YAMLDefault": "ExcludeL7HTTPHeaderInfo",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the type of aggregation for HTTP header data on L7 log entries.\n.\nAccepted values are IncludeL7HTTPHeaderInfo and ExcludeL7HTTPHeaderInfo.\nIncludeL7HTTPHeaderInfo - Include HTTP header data in the logs.\nExcludeL7HTTPHeaderInfo - Aggregate over all other fields ignoring the user agent and log type.",
+ "DescriptionHTML": "
Used to choose the type of aggregation for HTTP header data on L7 log entries.\n.\nAccepted values are IncludeL7HTTPHeaderInfo and ExcludeL7HTTPHeaderInfo.\nIncludeL7HTTPHeaderInfo - Include HTTP header data in the logs.\nExcludeL7HTTPHeaderInfo - Aggregate over all other fields ignoring the user agent and log type.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationHTTPMethod",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationHTTPMethod",
+ "NameYAML": "l7LogsFileAggregationHTTPMethod",
+ "NameGoAPI": "L7LogsFileAggregationHTTPMethod",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "IncludeL7HTTPMethod",
+ "ParsedDefault": "IncludeL7HTTPMethod",
+ "ParsedDefaultJSON": "\"IncludeL7HTTPMethod\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `ExcludeL7HTTPMethod`, `IncludeL7HTTPMethod`.",
+ "YAMLEnumValues": [
+ "ExcludeL7HTTPMethod",
+ "IncludeL7HTTPMethod"
+ ],
+ "YAMLSchemaHTML": "One of: ExcludeL7HTTPMethod, IncludeL7HTTPMethod.",
+ "YAMLDefault": "IncludeL7HTTPMethod",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the type of aggregation for the HTTP request method on L7 log entries.\n.\nAccepted values are IncludeL7HTTPMethod and ExcludeL7HTTPMethod.\nIncludeL7HTTPMethod - Include HTTP method in the logs.\nExcludeL7HTTPMethod - Aggregate over all other fields ignoring the HTTP method.",
+ "DescriptionHTML": "
Used to choose the type of aggregation for the HTTP request method on L7 log entries.\n.\nAccepted values are IncludeL7HTTPMethod and ExcludeL7HTTPMethod.\nIncludeL7HTTPMethod - Include HTTP method in the logs.\nExcludeL7HTTPMethod - Aggregate over all other fields ignoring the HTTP method.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationNumURLPath",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationNumURLPath",
+ "NameYAML": "l7LogsFileAggregationNumURLPath",
+ "NameGoAPI": "L7LogsFileAggregationNumURLPath",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "5",
+ "ParsedDefault": "5",
+ "ParsedDefaultJSON": "5",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "5",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the number of components in the url path to display.\nThis allows for the url to be truncated in case parts of the path provide no value. Setting this value\nto negative will allow all parts of the path to be displayed.\n.",
+ "DescriptionHTML": "
Used to choose the number of components in the url path to display.\nThis allows for the url to be truncated in case parts of the path provide no value. Setting this value\nto negative will allow all parts of the path to be displayed.\n.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationResponseCode",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationResponseCode",
+ "NameYAML": "l7LogsFileAggregationResponseCode",
+ "NameGoAPI": "L7LogsFileAggregationResponseCode",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "IncludeL7ResponseCode",
+ "ParsedDefault": "IncludeL7ResponseCode",
+ "ParsedDefaultJSON": "\"IncludeL7ResponseCode\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `ExcludeL7ResponseCode`, `IncludeL7ResponseCode`.",
+ "YAMLEnumValues": [
+ "ExcludeL7ResponseCode",
+ "IncludeL7ResponseCode"
+ ],
+ "YAMLSchemaHTML": "One of: ExcludeL7ResponseCode, IncludeL7ResponseCode.",
+ "YAMLDefault": "IncludeL7ResponseCode",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the type of aggregation for the response code on L7 log entries.\n.\nAccepted values are IncludeL7ResponseCode and ExcludeL7ResponseCode.\nIncludeL7ResponseCode - Include the response code in the logs.\nExcludeL7ResponseCode - Aggregate over all other fields ignoring the response code.",
+ "DescriptionHTML": "
Used to choose the type of aggregation for the response code on L7 log entries.\n.\nAccepted values are IncludeL7ResponseCode and ExcludeL7ResponseCode.\nIncludeL7ResponseCode - Include the response code in the logs.\nExcludeL7ResponseCode - Aggregate over all other fields ignoring the response code.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationServiceInfo",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationServiceInfo",
+ "NameYAML": "l7LogsFileAggregationServiceInfo",
+ "NameGoAPI": "L7LogsFileAggregationServiceInfo",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "IncludeL7ServiceInfo",
+ "ParsedDefault": "IncludeL7ServiceInfo",
+ "ParsedDefaultJSON": "\"IncludeL7ServiceInfo\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `ExcludeL7ServiceInfo`, `IncludeL7ServiceInfo`.",
+ "YAMLEnumValues": [
+ "ExcludeL7ServiceInfo",
+ "IncludeL7ServiceInfo"
+ ],
+ "YAMLSchemaHTML": "One of: ExcludeL7ServiceInfo, IncludeL7ServiceInfo.",
+ "YAMLDefault": "IncludeL7ServiceInfo",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the type of aggregation for the service data on L7 log entries.\n.\nAccepted values are IncludeL7ServiceInfo and ExcludeL7ServiceInfo.\nIncludeL7ServiceInfo - Include service data in the logs.\nExcludeL7ServiceInfo - Aggregate over all other fields ignoring the service name, namespace, and port.",
+ "DescriptionHTML": "
Used to choose the type of aggregation for the service data on L7 log entries.\n.\nAccepted values are IncludeL7ServiceInfo and ExcludeL7ServiceInfo.\nIncludeL7ServiceInfo - Include service data in the logs.\nExcludeL7ServiceInfo - Aggregate over all other fields ignoring the service name, namespace, and port.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationSourceInfo",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationSourceInfo",
+ "NameYAML": "l7LogsFileAggregationSourceInfo",
+ "NameGoAPI": "L7LogsFileAggregationSourceInfo",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "IncludeL7SourceInfoNoPort",
+ "ParsedDefault": "IncludeL7SourceInfoNoPort",
+ "ParsedDefaultJSON": "\"IncludeL7SourceInfoNoPort\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `ExcludeL7SourceInfo`, `IncludeL7SourceInfo`, `IncludeL7SourceInfoNoPort`.",
+ "YAMLEnumValues": [
+ "ExcludeL7SourceInfo",
+ "IncludeL7SourceInfo",
+ "IncludeL7SourceInfoNoPort"
+ ],
+ "YAMLSchemaHTML": "One of: ExcludeL7SourceInfo, IncludeL7SourceInfo, IncludeL7SourceInfoNoPort.",
+ "YAMLDefault": "IncludeL7SourceInfoNoPort",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "L7LogsFileAggregationExcludeSourceInfo is used to choose the type of aggregation for the source metadata on L7 log entries.\n.\nAccepted values are IncludeL7SourceInfo, IncludeL7SourceInfoNoPort, and ExcludeL7SourceInfo.\nIncludeL7SourceInfo - Include source metadata in the logs.\nIncludeL7SourceInfoNoPort - Include source metadata in the logs excluding the source port.\nExcludeL7SourceInfo - Aggregate over all other fields ignoring the source aggregated name, namespace, and type.",
+ "DescriptionHTML": "
L7LogsFileAggregationExcludeSourceInfo is used to choose the type of aggregation for the source metadata on L7 log entries.\n.\nAccepted values are IncludeL7SourceInfo, IncludeL7SourceInfoNoPort, and ExcludeL7SourceInfo.\nIncludeL7SourceInfo - Include source metadata in the logs.\nIncludeL7SourceInfoNoPort - Include source metadata in the logs excluding the source port.\nExcludeL7SourceInfo - Aggregate over all other fields ignoring the source aggregated name, namespace, and type.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationTLSSNI",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationTLSSNI",
+ "NameYAML": "l7LogsFileAggregationTLSSNI",
+ "NameGoAPI": "L7LogsFileAggregationTLSSNI",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "IncludeL7TLSSNI",
+ "ParsedDefault": "IncludeL7TLSSNI",
+ "ParsedDefaultJSON": "\"IncludeL7TLSSNI\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `ExcludeL7TLSSNI`, `IncludeL7TLSSNI`.",
+ "YAMLEnumValues": [
+ "ExcludeL7TLSSNI",
+ "IncludeL7TLSSNI"
+ ],
+ "YAMLSchemaHTML": "One of: ExcludeL7TLSSNI, IncludeL7TLSSNI.",
+ "YAMLDefault": "IncludeL7TLSSNI",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether the TLS Server Name Indication (SNI)\nparticipates in the aggregation key for L7 logs.\n\nAccepted values:\nIncludeL7TLSSNI - Include the SNI in the aggregation key.\nExcludeL7TLSSNI - Aggregate over all other fields ignoring the SNI entirely.",
+ "DescriptionHTML": "
Controls whether the TLS Server Name Indication (SNI)\nparticipates in the aggregation key for L7 logs.
\n
Accepted values:\nIncludeL7TLSSNI - Include the SNI in the aggregation key.\nExcludeL7TLSSNI - Aggregate over all other fields ignoring the SNI entirely.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationTrimURL",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationTrimURL",
+ "NameYAML": "l7LogsFileAggregationTrimURL",
+ "NameGoAPI": "L7LogsFileAggregationTrimURL",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "IncludeL7FullURL",
+ "ParsedDefault": "IncludeL7FullURL",
+ "ParsedDefaultJSON": "\"IncludeL7FullURL\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `ExcludeL7URL`, `IncludeL7FullURL`, `TrimURLQuery`, `TrimURLQueryAndPath`.",
+ "YAMLEnumValues": [
+ "ExcludeL7URL",
+ "IncludeL7FullURL",
+ "TrimURLQuery",
+ "TrimURLQueryAndPath"
+ ],
+ "YAMLSchemaHTML": "One of: ExcludeL7URL, IncludeL7FullURL, TrimURLQuery, TrimURLQueryAndPath.",
+ "YAMLDefault": "IncludeL7FullURL",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to choose the type of aggregation for the url on L7 log entries.\n.\nAccepted values:\nIncludeL7FullURL - Include the full URL up to however many path components are allowed by L7LogsFileAggregationNumURLPath.\nTrimURLQuery - Aggregate over all other fields ignoring the query parameters on the URL.\nTrimURLQueryAndPath - Aggregate over all other fields and the base URL only.\nExcludeL7URL - Aggregate over all other fields ignoring the URL entirely.",
+ "DescriptionHTML": "
Used to choose the type of aggregation for the url on L7 log entries.\n.\nAccepted values:\nIncludeL7FullURL - Include the full URL up to however many path components are allowed by L7LogsFileAggregationNumURLPath.\nTrimURLQuery - Aggregate over all other fields ignoring the query parameters on the URL.\nTrimURLQueryAndPath - Aggregate over all other fields and the base URL only.\nExcludeL7URL - Aggregate over all other fields ignoring the URL entirely.
",
+ "UserEditable": true,
+ "GoType": "*string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFileAggregationURLCharLimit",
+ "NameEnvVar": "FELIX_L7LogsFileAggregationURLCharLimit",
+ "NameYAML": "l7LogsFileAggregationURLCharLimit",
+ "NameGoAPI": "L7LogsFileAggregationURLCharLimit",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "250",
+ "ParsedDefault": "250",
+ "ParsedDefaultJSON": "250",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "250",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Limit on the length of the URL collected in L7 logs. When a URL length reaches this limit\nit is sliced off, and the sliced URL is sent to log storage.",
+ "DescriptionHTML": "
Limit on the length of the URL collected in L7 logs. When a URL length reaches this limit\nit is sliced off, and the sliced URL is sent to log storage.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 logs",
+ "GroupWithSortPrefix": "50 L7 logs",
+ "NameConfigFile": "L7LogsFilePerNodeLimit",
+ "NameEnvVar": "FELIX_L7LogsFilePerNodeLimit",
+ "NameYAML": "l7LogsFilePerNodeLimit",
+ "NameGoAPI": "L7LogsFilePerNodeLimit",
+ "StringSchema": "Integer",
+ "StringSchemaHTML": "Integer",
+ "StringDefault": "1500",
+ "ParsedDefault": "1500",
+ "ParsedDefaultJSON": "1500",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer",
+ "YAMLDefault": "1500",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Limit on the number of L7 logs that can be emitted within each flush interval. When\nthis limit has been reached, Felix counts the number of unloggable L7 responses within\nthe flush interval, and emits a WARNING log with that count at the same time as it\nflushes the buffered L7 logs. A value of 0 means no limit.",
+ "DescriptionHTML": "
Limit on the number of L7 logs that can be emitted within each flush interval. When\nthis limit has been reached, Felix counts the number of unloggable L7 responses within\nthe flush interval, and emits a WARNING log with that count at the same time as it\nflushes the buffered L7 logs. A value of 0 means no limit.
Controls the priority that Felix will use for routing rules when programming\nthem for AWS Secondary IP support.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "AWS integration",
+ "GroupWithSortPrefix": "60 AWS integration",
+ "NameConfigFile": "AWSSecondaryIPSupport",
+ "NameEnvVar": "FELIX_AWSSecondaryIPSupport",
+ "NameYAML": "awsSecondaryIPSupport",
+ "NameGoAPI": "AWSSecondaryIPSupport",
+ "StringSchema": "One of: `Disabled`, `EnabledENIPerWorkload`, `Enabled`",
+ "StringSchemaHTML": "One of: Disabled, EnabledENIPerWorkload, Enabled",
+ "StringDefault": "Disabled",
+ "ParsedDefault": "Disabled",
+ "ParsedDefaultJSON": "\"Disabled\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Disabled`, `Enabled`, `EnabledENIPerWorkload`.",
+ "YAMLEnumValues": [
+ "Disabled",
+ "Enabled",
+ "EnabledENIPerWorkload"
+ ],
+ "YAMLSchemaHTML": "One of: Disabled, Enabled, EnabledENIPerWorkload.",
+ "YAMLDefault": "Disabled",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether Felix will try to provision AWS secondary ENIs for\nworkloads that have IPs from IP pools that are configured with an AWS subnet ID. If the field is set to\n\"EnabledENIPerWorkload\" then each workload with an AWS-backed IP will be assigned its own secondary ENI.\nIf set to \"Enabled\" then each workload with an AWS-backed IP pool will be allocated a secondary IP address\non a secondary ENI; this mode requires additional IP pools to be provisioned for the host to claim IPs for\nthe primary IP of the secondary ENIs. Accepted value must be one of \"Enabled\", \"EnabledENIPerWorkload\" or\n\"Disabled\".",
+ "DescriptionHTML": "
Controls whether Felix will try to provision AWS secondary ENIs for\nworkloads that have IPs from IP pools that are configured with an AWS subnet ID. If the field is set to\n\"EnabledENIPerWorkload\" then each workload with an AWS-backed IP will be assigned its own secondary ENI.\nIf set to \"Enabled\" then each workload with an AWS-backed IP pool will be allocated a secondary IP address\non a secondary ENI; this mode requires additional IP pools to be provisioned for the host to claim IPs for\nthe primary IP of the secondary ENIs. Accepted value must be one of \"Enabled\", \"EnabledENIPerWorkload\" or\n\"Disabled\".
",
+ "UserEditable": true,
+ "GoType": "string",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "AWS integration",
+ "GroupWithSortPrefix": "60 AWS integration",
+ "NameConfigFile": "AWSSrcDstCheck",
+ "NameEnvVar": "FELIX_AWSSrcDstCheck",
+ "NameYAML": "awsSrcDstCheck",
+ "NameGoAPI": "AWSSrcDstCheck",
+ "StringSchema": "One of: `Disable`, `DoNothing`, `Enable`",
+ "StringSchemaHTML": "One of: Disable, DoNothing, Enable",
+ "StringDefault": "DoNothing",
+ "ParsedDefault": "DoNothing",
+ "ParsedDefaultJSON": "\"DoNothing\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `\"Disable\"`, `\"DoNothing\"`, `\"Enable\"`.",
+ "YAMLEnumValues": [
+ "Disable",
+ "DoNothing",
+ "Enable"
+ ],
+ "YAMLSchemaHTML": "One of: \"Disable\", \"DoNothing\", \"Enable\".",
+ "YAMLDefault": "DoNothing",
+ "Required": true,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Controls whether Felix will try to change the \"source/dest check\" setting on the EC2 instance\non which it is running. A value of \"Disable\" will try to disable the source/dest check. Disabling the check\nallows for sending workload traffic without encapsulation within the same AWS subnet.",
+ "DescriptionHTML": "
Controls whether Felix will try to change the \"source/dest check\" setting on the EC2 instance\non which it is running. A value of \"Disable\" will try to disable the source/dest check. Disabling the check\nallows for sending workload traffic without encapsulation within the same AWS subnet.
The minimum number of poll failures before a remote Egress Gateway is considered\nto have failed.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Egress gateway",
+ "GroupWithSortPrefix": "70 Egress gateway",
+ "NameConfigFile": "EgressGatewayPollInterval",
+ "NameEnvVar": "FELIX_EgressGatewayPollInterval",
+ "NameYAML": "egressGatewayPollInterval",
+ "NameGoAPI": "EgressGatewayPollInterval",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "10",
+ "ParsedDefault": "10s",
+ "ParsedDefaultJSON": "10000000000",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "10s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "The interval at which Felix will poll remote egress gateways to check their\nhealth. Only Egress Gateways with a named \"health\" port will be polled in this way. Egress Gateways that\nfail the health check will be taken our of use as if they have been deleted.",
+ "DescriptionHTML": "
The interval at which Felix will poll remote egress gateways to check their\nhealth. Only Egress Gateways with a named \"health\" port will be polled in this way. Egress Gateways that\nfail the health check will be taken our of use as if they have been deleted.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Egress gateway",
+ "GroupWithSortPrefix": "70 Egress gateway",
+ "NameConfigFile": "EgressIPHostIfacePattern",
+ "NameEnvVar": "FELIX_EgressIPHostIfacePattern",
+ "NameYAML": "egressIPHostIfacePattern",
+ "NameGoAPI": "EgressIPHostIfacePattern",
+ "StringSchema": "Comma-delimited list of Linux interface names/regex patterns. Regex patterns must start/end with `/`.",
+ "StringSchemaHTML": "Comma-delimited list of Linux interface names/regex patterns. Regex patterns must start/end with /.",
+ "StringDefault": "",
+ "ParsedDefault": "[]",
+ "ParsedDefaultJSON": "null",
+ "ParsedType": "[]*regexp.Regexp",
+ "YAMLType": "string",
+ "YAMLSchema": "String.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "String.",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "A comma-separated list of interface names which might send and receive egress traffic\nacross the cluster boundary, after it has left an Egress Gateway pod. Felix will ensure `src_valid_mark` sysctl flags\nare set correctly for matching interfaces.\nTo target multiple interfaces with a single string, the list supports regular expressions.\nFor regular expressions, wrap the value with `/`.\nExample: `/^bond/,eth0` will match all interfaces that begin with `bond` and also the interface `eth0`.",
+ "DescriptionHTML": "
A comma-separated list of interface names which might send and receive egress traffic\nacross the cluster boundary, after it has left an Egress Gateway pod. Felix will ensure src_valid_mark sysctl flags\nare set correctly for matching interfaces.\nTo target multiple interfaces with a single string, the list supports regular expressions.\nFor regular expressions, wrap the value with /.\nExample: /^bond/,eth0 will match all interfaces that begin with bond and also the interface eth0.
Controls the priority value to use for the egress IP routing rule.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Egress gateway",
+ "GroupWithSortPrefix": "70 Egress gateway",
+ "NameConfigFile": "EgressIPSupport",
+ "NameEnvVar": "FELIX_EgressIPSupport",
+ "NameYAML": "egressIPSupport",
+ "NameGoAPI": "EgressIPSupport",
+ "StringSchema": "One of: `Disabled`, `EnabledPerNamespaceOrPerPod`, `EnabledPerNamespace`",
+ "StringSchemaHTML": "One of: Disabled, EnabledPerNamespaceOrPerPod, EnabledPerNamespace",
+ "StringDefault": "Disabled",
+ "ParsedDefault": "Disabled",
+ "ParsedDefaultJSON": "\"Disabled\"",
+ "ParsedType": "string",
+ "YAMLType": "string",
+ "YAMLSchema": "One of: `Disabled`, `EnabledPerNamespace`, `EnabledPerNamespaceOrPerPod`.",
+ "YAMLEnumValues": [
+ "Disabled",
+ "EnabledPerNamespace",
+ "EnabledPerNamespaceOrPerPod"
+ ],
+ "YAMLSchemaHTML": "One of: Disabled, EnabledPerNamespace, EnabledPerNamespaceOrPerPod.",
+ "YAMLDefault": "Disabled",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Defines three different support modes for egress IP function. \n- Disabled: Egress IP function is disabled.\n- EnabledPerNamespace: Egress IP function is enabled and can be configured on a per-namespace basis;\n per-pod egress annotations are ignored.\n- EnabledPerNamespaceOrPerPod: Egress IP function is enabled and can be configured per-namespace or per-pod,\n with per-pod egress annotations overriding namespace annotations.",
+ "DescriptionHTML": "
Defines three different support modes for egress IP function. \n- Disabled: Egress IP function is disabled.\n- EnabledPerNamespace: Egress IP function is enabled and can be configured on a per-namespace basis;\n per-pod egress annotations are ignored.\n- EnabledPerNamespaceOrPerPod: Egress IP function is enabled and can be configured per-namespace or per-pod,\n with per-pod egress annotations overriding namespace annotations.
Defines two different support modes for external network function. \n- Disabled: External network function is disabled.\n- Enabled: External network function is enabled.
Sets to which port proxied traffic should be redirected.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "L7 proxy",
+ "GroupWithSortPrefix": "90 L7 proxy",
+ "NameConfigFile": "TPROXYUpstreamConnMark",
+ "NameEnvVar": "FELIX_TPROXYUpstreamConnMark",
+ "NameYAML": "tproxyUpstreamConnMark",
+ "NameGoAPI": "TPROXYUpstreamConnMark",
+ "StringSchema": "32-bit bitmask (hex or deccimal allowed) with at least 2 bits set, example: `0xffff0000`",
+ "StringSchemaHTML": "32-bit bitmask (hex or deccimal allowed) with at least 2 bits set, example: 0xffff0000",
+ "StringDefault": "0x17",
+ "ParsedDefault": "23",
+ "ParsedDefaultJSON": "23",
+ "ParsedType": "uint32",
+ "YAMLType": "integer",
+ "YAMLSchema": "Unsigned 32-bit integer.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Unsigned 32-bit integer.",
+ "YAMLDefault": "0x17",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Tells Felix which mark is used by the proxy for its upstream\nconnections so that Felix can program the dataplane correctly.",
+ "DescriptionHTML": "
Tells Felix which mark is used by the proxy for its upstream\nconnections so that Felix can program the dataplane correctly.
",
+ "UserEditable": true,
+ "GoType": "*uint32",
+ "OpenSourceOnly": false
+ }
+ ]
+ },
+ {
+ "Name": "Debug/test-only (generally unsupported)",
+ "Fields": [
+ {
+ "Group": "Debug/test-only (generally unsupported)",
+ "GroupWithSortPrefix": "97 Debug/test-only (generally unsupported)",
+ "NameConfigFile": "DebugBPFCgroupV2",
+ "NameEnvVar": "FELIX_DebugBPFCgroupV2",
+ "NameYAML": "",
+ "NameGoAPI": "",
+ "StringSchema": "String",
+ "StringSchemaHTML": "String",
+ "StringDefault": "",
+ "ParsedDefault": "",
+ "ParsedDefaultJSON": "\"\"",
+ "ParsedType": "string",
+ "YAMLType": "",
+ "YAMLSchema": "",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "LocalOnly",
+ "Description": "Controls the cgroup v2 path that we apply the connect-time load balancer to. Most distros\nare configured for cgroup v1, which prevents all but the root cgroup v2 from working so this is only useful\nfor development right now.",
+ "DescriptionHTML": "
Controls the cgroup v2 path that we apply the connect-time load balancer to. Most distros\nare configured for cgroup v1, which prevents all but the root cgroup v2 from working so this is only useful\nfor development right now.
Unsupported diagnostic setting, used when testing Felix. Not exposed in FelixConfiguration.
",
+ "UserEditable": true,
+ "GoType": "",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Debug/test-only (generally unsupported)",
+ "GroupWithSortPrefix": "97 Debug/test-only (generally unsupported)",
+ "NameConfigFile": "DebugPort",
+ "NameEnvVar": "FELIX_DebugPort",
+ "NameYAML": "debugPort",
+ "NameGoAPI": "DebugPort",
+ "StringSchema": "Integer: [0,65535]",
+ "StringSchemaHTML": "Integer: [0,65535]",
+ "StringDefault": "",
+ "ParsedDefault": "0",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "int",
+ "YAMLType": "integer",
+ "YAMLSchema": "Integer: [0,65535]",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Integer: [0,65535]",
+ "YAMLDefault": "",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "If set, enables Felix's debug HTTP port, which allows memory and CPU profiles\nto be retrieved. The debug port is not secure, it should not be exposed to the internet.",
+ "DescriptionHTML": "
If set, enables Felix's debug HTTP port, which allows memory and CPU profiles\nto be retrieved. The debug port is not secure, it should not be exposed to the internet.
",
+ "UserEditable": true,
+ "GoType": "*int",
+ "OpenSourceOnly": false
+ },
+ {
+ "Group": "Debug/test-only (generally unsupported)",
+ "GroupWithSortPrefix": "97 Debug/test-only (generally unsupported)",
+ "NameConfigFile": "DebugSimulateCalcGraphHangAfter",
+ "NameEnvVar": "FELIX_DebugSimulateCalcGraphHangAfter",
+ "NameYAML": "debugSimulateCalcGraphHangAfter",
+ "NameGoAPI": "DebugSimulateCalcGraphHangAfter",
+ "StringSchema": "Seconds (floating point)",
+ "StringSchemaHTML": "Seconds (floating point)",
+ "StringDefault": "0",
+ "ParsedDefault": "0s",
+ "ParsedDefaultJSON": "0",
+ "ParsedType": "time.Duration",
+ "YAMLType": "string",
+ "YAMLSchema": "Duration string, for example `1m30s123ms` or `1h5m`.",
+ "YAMLEnumValues": null,
+ "YAMLSchemaHTML": "Duration string, for example 1m30s123ms or 1h5m.",
+ "YAMLDefault": "0s",
+ "Required": false,
+ "OnParseFailure": "ReplaceWithDefault",
+ "AllowedConfigSources": "All",
+ "Description": "Used to simulate a hang in the calculation graph after the specified duration.\nThis is useful in tests of the watchdog system only!",
+ "DescriptionHTML": "
Used to simulate a hang in the calculation graph after the specified duration.\nThis is useful in tests of the watchdog system only!
Unused in Calico Enterprise, usage reporting is permanently disabled.
",
+ "UserEditable": true,
+ "GoType": "*v1.Duration",
+ "OpenSourceOnly": true
+ }
+ ]
+ }
+ ]
+}
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/components/FelixConfig/index.js b/calico-cloud_versioned_docs/version-24-1/_includes/components/FelixConfig/index.js
new file mode 100644
index 0000000000..2c2ca6e2c7
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/components/FelixConfig/index.js
@@ -0,0 +1,108 @@
+import React, { useState, useEffect } from 'react';
+import jsonData from './config-params.json';
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import TableResource from './TableResource';
+import TableConfig from './TableConfig';
+import TableEnv from './TableEnv';
+import styles from './styles.module.css';
+
+const FelixConfigTable = ({ configType, fieldData }) => {
+ let table;
+
+ switch (configType) {
+ case 'yaml':
+ table = ;
+ break;
+ case 'config':
+ table = ;
+ break;
+ case 'env':
+ table = ;
+ break;
+ default:
+ table =
Unknown config type
;
+ }
+
+ return
{table}
;
+};
+
+const FelixConfig = ({ configType, name }) => {
+ const matchedGroup = jsonData.Groups.find((group) => group.Name === name);
+ // Debugging logs
+
+ if (!matchedGroup) {
+ // Fail the build loudly rather than silently dropping the group's fields.
+ // `name` must exactly match a group Name in config-params.json, which is
+ // auto-synced from the Felix source repos. A prose/casing sweep once
+ // restyled these lookup keys and silently dropped fields (DOCS-2970).
+ throw new Error(
+ `FelixConfig: no group named '${name}' in config-params.json. The 'name' `
+ + `prop must exactly match a group Name in config-params.json; do not `
+ + `restyle it as prose.`
+ );
+ }
+
+ let content;
+
+ if (configType === 'yaml') {
+ content = (
+
If you are using one of the recommended distributions, you will already satisfy these.
+
+
+ Due to the large number of distributions and kernel version out there, it’s hard to be precise about the names
+ of the particular kernel modules that are required to run {prodname}. However, in general, you’ll need:
+
+
+
+
+ The iptables modules (both the “legacy” and “nft” variants are supported). These are typically
+ broken up into many small modules, one for each type of match criteria and one for each type of action.{' '}
+ {prodname} requires:
+
+
+
The “base” modules (including the IPv6 versions if IPv6 is enabled in your cluster).
+
+ At least the following match criteria: set, rpfilter, addrtype,{' '}
+ comment, conntrack, icmp, tcp, udp,{' '}
+ ipvs, icmpv6 (if IPv6 is enabled in your kernel), mark,{' '}
+ multiport, rpfilter, sctp, ipvs (if using
+ kube-proxy in IPVS mode).
+
+
+ At least the following actions: REJECT, ACCEPT, DROP,{' '}
+ LOG.
+
+
+
+
+
IP sets support.
+
+
+
Netfilter Conntrack support compiled in (with SCTP support if using SCTP).
+
+
+
+ IPVS support if using kube-proxy in IPVS mode.
+
+
+
+
+ IPIP, VXLAN, Wireguard support, if using {prodname} networking in one of those modes.
+
+
+
+
+ eBPF (including the tc hook support) and XDP (if you want to use the eBPF data plane).
+
+
+
+ >
+ );
+}
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/components/ReqsSys.js b/calico-cloud_versioned_docs/version-24-1/_includes/components/ReqsSys.js
new file mode 100644
index 0000000000..07da9c3de2
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/components/ReqsSys.js
@@ -0,0 +1,434 @@
+import React from 'react';
+
+import Admonition from '@theme/Admonition';
+import Link from '@docusaurus/Link';
+import Heading from '@theme/Heading';
+
+import { orchestrators } from '@site/variables';
+import { prodname, baseUrl } from '../../variables';
+
+function NodeRequirementsEnt(props) {
+ return (
+ <>
+
+ Node requirements
+
+
+
+
x86-64 processor with at least 2 cores, 8.0GB RAM and 20 GB free disk space
+
+
+
+ Linux kernel 5.10 or later with required dependencies. The
+ following distributions have the required kernel, its dependencies, and are known to work well with{' '}
+ {prodname} and {props.orch}.
+
+ {prodname} must be able to manage cali*
+ interfaces on the host. When IPIP is enabled (the default),
+ {prodname} also needs to be able to manage tunl*
+ interfaces. When VXLAN is enabled, {prodname} also needs to be able to manage the vxlan.calico{' '}
+ interface.
+
+ {/*}
+
+
+ Many Linux distributions, such as most of the above, include NetworkManager. By default, NetworkManager
+ does not allow
+ {prodname} to manage interfaces. If your nodes have NetworkManager, complete the steps in{' '}
+
+ Preventing NetworkManager from controlling {prodname} interfaces
+ {' '}
+ before installing {prodname}.
+
+
+ */}
+
+
+
+ If your Linux distribution comes with installed Firewalld or another iptables manager it should be disabled.
+ These may interfere with rules added by {prodname} and result in unexpected behavior.
+
+
+
+ If a host firewall is needed, it can be configured by {prodname} HostEndpoint and GlobalNetworkPolicy.
+ More information about configuration at Security for host.
+
+
+
+
+
+ In order to properly run Elasticsearch, nodes must be configured according to the{' '}
+
+ Elasticsearch system configuration documentation.
+
+
+
+
+
+ The Typha autoscaler requires a minimum number of Linux worker nodes based on total number of schedulable
+ nodes.
+
+ {prodname} requires a key/value store accessible by all {prodname} components.
+ {
+ {
+ OpenShift: With OpenShift, the Kubernetes API datastore is used for the key/value store.,
+ Kubernetes: (
+
+ On Kubernetes, you can configure {prodname} to access an etcdv3 cluster directly or to use the
+ Kubernetes API datastore.
+
+ ),
+ OpenStack: (
+
+ For production you will likely want multiple nodes for greater performance and reliability. If you don’t
+ already have an etcdv3 cluster to connect to, please refer to{' '}
+ the upstream etcd docs for detailed advice and setup.
+
+ ),
+ 'host protection': The key/value store must be etcdv3.,
+ }[props.orch]
+ }
+
+ *{' '}
+
+ The value passed to kube-apiserver using the --secure-port
+ flag. If you cannot locate this, check the targetPort value returned by
+ kubectl get svc kubernetes -o yaml.
+
+
+ When installed as a Kubernetes daemon set, {prodname} meets this requirement by running as a privileged
+ container. This requires that the kubelet be allowed to run privileged containers. There are two ways this
+ can be achieved.
+
+
+
+ Specify --allow-privileged on the kubelet (deprecated).
+
+
+ Use a{' '}
+ pod security policy.
+
+
+ >
+ )}
+ >
+ );
+}
+
+export default function ReqsSys(props) {
+ return (
+ <>
+
+
+
+
+ >
+ );
+}
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_create-kubeconfig.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_create-kubeconfig.mdx
new file mode 100644
index 0000000000..7b47173e65
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_create-kubeconfig.mdx
@@ -0,0 +1,40 @@
+1. Create a service account
+
+ ```bash
+ SA_NAME=my-host
+ kubectl create serviceaccount $SA_NAME -n calico-system -o yaml
+ ```
+
+1. Obtain the token for the secret associated with your host
+
+ ```bash
+ kubectl describe secret -n calico-system $(kubectl get serviceaccount -n calico-system $SA_NAME -o=jsonpath="{.secrets[0].name}")
+ ```
+
+1. Use a text editor to create a kubeconfig file
+
+ ```yaml
+ apiVersion: v1
+ kind: Config
+
+ users:
+ - name: my-host
+ user:
+ token:
+
+ clusters:
+ - cluster:
+ certificate-authority-data:
+ server:
+ name:
+
+ contexts:
+ - context:
+ cluster: my-cluster
+ user: my-host
+ name: my-host
+
+ current-context: my-cluster
+ ```
+
+ Take the cluster information from an already existing kubeconfig.
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_determine-ipam.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_determine-ipam.mdx
new file mode 100644
index 0000000000..f44121d82a
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_determine-ipam.mdx
@@ -0,0 +1,9 @@
+If you are not sure which IPAM your cluster is using, the way to tell depends on install method.
+
+The IPAM plugin can be queried on the default Installation resource.
+
+```
+kubectl get installation default -o go-template --template {{.spec.cni.ipam.type}}
+```
+
+If your cluster is using Calico IPAM, the above command should return a result of `Calico`.
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_docker-container-service.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_docker-container-service.mdx
new file mode 100644
index 0000000000..afc446d97e
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_docker-container-service.mdx
@@ -0,0 +1,70 @@
+import NonClusterReadOnlyStep from '@site/calico-cloud_versioned_docs/version-24-1/_includes/content/_non-cluster-read-only-step.mdx';
+import EnvironmentFile from '@site/calico-cloud_versioned_docs/version-24-1/_includes/components/EnvironmentFile';
+
+This section describes how to run `$[nodecontainer]` as a Docker container.
+
+
+
+### Step 2: Create environment file
+
+
+
+### Step 3: Configure the init system
+
+Use an init daemon (like systemd or upstart) to start the $[nodecontainer] image as a service using the EnvironmentFile values.
+
+Sample systemd service file: `$[noderunning].service`
+
+```shell
+[Unit]
+Description=$[noderunning]
+After=docker.service
+Requires=docker.service
+
+[Service]
+EnvironmentFile=/etc/calico/calico.env
+ExecStartPre=-/usr/bin/docker rm -f $[noderunning]
+ExecStart=/usr/bin/docker run --net=host --privileged \
+ --name=$[noderunning] \
+ -e NODENAME=${CALICO_NODENAME} \
+ -e IP=${CALICO_IP} \
+ -e IP6=${CALICO_IP6} \
+ -e CALICO_NETWORKING_BACKEND=${CALICO_NETWORKING_BACKEND} \
+ -e AS=${CALICO_AS} \
+ -e NO_DEFAULT_POOLS=${NO_DEFAULT_POOLS} \
+ -e DATASTORE_TYPE=${DATASTORE_TYPE} \
+ -e KUBECONFIG=${KUBECONFIG} \
+ -v /var/log/calico:/var/log/calico \
+ -v /var/lib/calico:/var/lib/calico \
+ -v /var/run/calico:/var/run/calico \
+ -v /run/docker/plugins:/run/docker/plugins \
+ -v /lib/modules:/lib/modules \
+ -v /etc/pki:/pki \
+ $[registry]$[componentImage.cnxNode] /bin/calico-node -felix
+
+ExecStop=-/usr/bin/docker stop $[noderunning]
+
+Restart=on-failure
+StartLimitBurst=3
+StartLimitInterval=60s
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Upon start, the systemd service:
+
+- Confirms Docker is installed under the `[Unit]` section
+- Gets environment variables from the environment file above
+- Removes existing `$[nodecontainer]` container (if it exists)
+- Starts `$[nodecontainer]`
+
+The script also stops the `$[nodecontainer]` container when the service is stopped.
+
+:::note
+
+Depending on how you've installed Docker, the name of the Docker service
+under the `[Unit]` section may be different (such as `docker-engine.service`).
+Be sure to check this before starting the service.
+
+:::
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_domain-names.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_domain-names.mdx
new file mode 100644
index 0000000000..bf21e94ec9
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_domain-names.mdx
@@ -0,0 +1,23 @@
+When a configured domain name has no wildcard (`*`), it matches exactly that domain name. For example:
+
+- `microsoft.com`
+- `tigera.io`
+
+With a single asterisk in any part of the domain name, it matches 1 or more path components at that position. For example:
+
+- `*.google.com` matches `www.google.com` and `www.ipv6.google.com`, but not `google.com`
+- `www.*.com` matches `www.sun.com` and `www.apple.com`, but not `www.com`
+- `update.*.mycompany.com` matches `update.tools.mycompany.com`, `update.secure.suite.mycompany.com`, and so on
+
+**Not** supported are:
+
+- Multiple wildcards in the same domain, for example: `*.*.mycompany.com`
+- Asterisks that are not the entire component, for example: `www.g*.com`
+- A wildcard as the last component, for example: `www.mycompany.*`
+- More general wildcards, such as regular expressions
+
+:::note
+
+The `Inline` DNS policy mode only supports prefix wildcards like `*.example.com`. Non-prefix wildcards (for example, `www.*.com` or `update.*.mycompany.com`) are not matched in `Inline` mode and require `DelayDeniedPacket` or `NoDelay` mode. `Inline` is available for the eBPF data plane (`BPFDNSPolicyMode: Inline`, the default on kernels 5.17+ / RedHat 5.14+) and for the iptables data plane (`DNSPolicyMode: Inline`). See [DNSPolicyMode](../../reference/resources/felixconfig.mdx#dnspolicymode) and [BPFDNSPolicyMode](../../reference/resources/felixconfig.mdx#bpfdnspolicymode).
+
+:::
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_ebpf-value.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_ebpf-value.mdx
new file mode 100644
index 0000000000..fe2072d88f
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_ebpf-value.mdx
@@ -0,0 +1,12 @@
+The eBPF data plane mode has several advantages over standard Linux networking pipeline mode:
+
+- It scales to higher throughput.
+- It uses less CPU per GBit.
+- It has native support for Kubernetes services (without needing kube-proxy) that:
+
+ - Reduces first packet latency for packets to services.
+ - Preserves external client source IP addresses all the way to the pod.
+ - Supports DSR (Direct Server Return) for more efficient service routing.
+ - Uses less CPU than kube-proxy to keep the data plane in sync.
+
+To learn more and see performance metrics from our test environment, see the blog, [Introducing the Calico eBPF data plane](https://www.projectcalico.org/introducing-the-calico-ebpf-dataplane/).
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_endpointport.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_endpointport.mdx
new file mode 100644
index 0000000000..05dde33612
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_endpointport.mdx
@@ -0,0 +1,15 @@
+An EndpointPort associates a name with a particular TCP/UDP/SCTP port of the endpoint, allowing it to
+be referenced as a named port in [policy rules](../../reference/resources/networkpolicy.mdx#entityrule).
+
+| Field | Description | Accepted Values | Schema | Default |
+| -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------- | ------ | ------- |
+| name | The name to attach to this port, allowing it to be referred to in [policy rules](../../reference/resources/networkpolicy.mdx#entityrule). Names must be unique within an endpoint. | | string | |
+| protocol | The protocol of this named port. | `TCP`, `UDP`, `SCTP` | string | |
+| port | The workload port number. | `1`-`65535` | int | |
+
+:::note
+
+On their own, EndpointPort entries don't result in any change to the connectivity of the port.
+They only have an effect if they are referred to in policy.
+
+:::
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_entityrule.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_entityrule.mdx
new file mode 100644
index 0000000000..06adee8c36
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_entityrule.mdx
@@ -0,0 +1,101 @@
+import DomainNames from '@site/calico-cloud_versioned_docs/version-24-1/_includes/content/_domain-names.mdx';
+
+Entity rules specify the attributes of the source or destination of a packet that must match for the rule as a whole
+to match. Packets can be matched on combinations of:
+
+- Identity of the source/destination, by using [Selectors](#selectors) or by specifying a particular
+ Kubernetes `Service`. Selectors can match [workload endpoints](../../reference/resources/workloadendpoint.mdx),
+ [host endpoints](../../reference/resources/hostendpoint.mdx) and ([namespaced](../../reference/resources/networkset.mdx) or
+ [global](../../reference/resources/globalnetworkset.mdx)) network sets.
+- Source/destination IP address, protocol and port.
+
+If the rule contains multiple match criteria (for example, an IP and a port) then all match criteria must match
+for the rule as a whole to match a packet.
+
+| Field | Description | Accepted Values | Schema | Default |
+| ----------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | ------------------------------------------- | ------- |
+| nets | Match packets with IP in any of the listed CIDRs. | List of valid IPv4 CIDRs or list of valid IPv6 CIDRs (IPv4 and IPv6 CIDRs shouldn't be mixed in one rule) | list of cidrs |
+| notNets | Negative match on CIDRs. Match packets with IP not in any of the listed CIDRs. | List of valid IPv4 CIDRs or list of valid IPv6 CIDRs (IPv4 and IPv6 CIDRs shouldn't be mixed in one rule) | list of cidrs |
+| selector | Positive match on selected endpoints. If a `namespaceSelector` is also defined, the set of endpoints this applies to is limited to the endpoints in the selected namespaces. | Valid selector | [selector](#selector) | |
+| notSelector | Negative match on selected endpoints. If a `namespaceSelector` is also defined, the set of endpoints this applies to is limited to the endpoints in the selected namespaces. | Valid selector | [selector](#selector) | |
+| namespaceSelector | Positive match on selected namespaces. If specified, only workload endpoints in the selected Kubernetes namespaces are matched. Matches namespaces based on the labels that have been applied to the namespaces. Defines the scope that selectors will apply to, if not defined then selectors apply to the NetworkPolicy's namespace. Match a specific namespace by name using the `projectcalico.org/name` label. Select the non-namespaced resources like GlobalNetworkSet(s), host endpoints to which this policy applies by using `global()` selector. | Valid selector | [selector](#selector) | |
+| ports | Positive match on the specified ports | | list of [ports](#ports) | |
+| domains | Positive match on [domain names](#exact-and-wildcard-domain-names). | List of [exact or wildcard domain names](#exact-and-wildcard-domain-names) | list of strings |
+| notPorts | Negative match on the specified ports | | list of [ports](#ports) | |
+| serviceAccounts | Match endpoints running under service accounts. If a `namespaceSelector` is also defined, the set of service accounts this applies to is limited to the service accounts in the selected namespaces. | | [ServiceAccountMatch](#serviceaccountmatch) | |
+| services | Match the specified service(s). If specified on egress rule destinations, no other selection criteria can be set. If specified on ingress rule sources, only positive or negative matches on ports can be specified. | | [ServiceMatch](#servicematch) | |
+
+:::note
+
+You cannot mix IPv4 and IPv6 CIDRs in a single rule using `nets` or `notNets`. If you need to match both, create 2 rules.
+
+:::
+
+When using selectors in network policy, remember that selectors only match (known) resources, but _rules_ match packets.
+A rule with a selector `all()` won't match "all packets", it will match "packets from all in-scope endpoints and network sets".
+To match all packets, do not include a selector in the rule at all.
+
+#### Empty match fields
+
+An empty value in a match field is treated as if the field were not set at all, not as an empty set that matches nothing.
+For example, `nets: []` does not stop the rule from matching.
+It leaves the rule unconstrained by IP address, so the rule matches any source or destination address.
+The same is true of `notNets`, `ports`, and `notPorts`, and of an empty string in `selector`, `notSelector`, and `namespaceSelector`.
+$[prodname] typically drops the empty value when it stores the resource, so the field is absent when you read the policy back.
+
+#### Understanding `notSelector`
+
+`notSelector` is somewhat subtle because the `not` in `notSelector` negates the packet match rather than the selector:
+
+- `selector: !has(foo)` matches packets from/to endpoints and network sets that do not have the label "foo".
+- `notSelector: has(foo)` matches packets from/to **anywhere** (including outside the cluster), **except** traffic from/to endpoints and network sets that have the label "foo".
+
+#### Selector performance in EntityRules
+
+When rendering policy into the data plane, $[prodname] must identify the endpoints that match the selectors
+in all active rules. This calculation is optimized for certain common selector types.
+Using the optimized selector types reduces CPU usage (and policy rendering time) by orders of magnitude.
+This becomes important at high scale (hundreds of active rules, hundreds of thousands of endpoints).
+
+The optimized operators are as follows:
+
+- `label == "value"`
+- `label in { 'v1', 'v2' }`
+- `has(label)`
+- ` && ` is optimized if **either** `` or `` is
+ optimized.
+
+The following perform like `has(label)`. All endpoints with the label will be scanned to find matches:
+
+- `label contains 's'`
+- `label starts with 's'`
+- `label ends with 's'`
+
+The other operators, and in particular, `all()`, `!`, `||` and `!=` are not optimized.
+
+Examples:
+
+- `a == 'b'` - optimized
+- `a == 'b' && has(c)` - optimized
+- `a == 'b' || has(c)` - **not** optimized due to use of `||`
+- `c != 'd'` - **not** optimized due to use of `!=`
+- `!has(a)` - **not** optimized due to use of `!`
+- `a == 'b' && c != 'd'` - optimized, `a =='b'` is optimized so `a == 'b' && ` is optimized.
+- `c != 'd' && a == 'b'` - optimized, `a =='b'` is optimized so ` && a == 'b'` is optimized.
+
+### Exact and wildcard domain names
+
+The `domains` field is only valid for egress Allow rules. It restricts the
+rule to apply only to traffic to one of the specified domains. If this field is specified, the
+parent [Rule](#rule)'s `action` must be `Allow`, and `nets` and `selector` must both be left empty.
+
+
+
+:::note
+
+$[prodname] implements policy for domain names by learning the
+corresponding IPs from DNS, then programming rules to allow those IPs. This means that
+if multiple domain names A, B and C all map to the same IP, and there is domain-based
+policy to allow A, traffic to B and C will be allowed as well.
+
+:::
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_httpmatch.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_httpmatch.mdx
new file mode 100644
index 0000000000..4420e829e1
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_httpmatch.mdx
@@ -0,0 +1,45 @@
+An HTTPMatch matches attributes of an HTTP request. The presence of an HTTPMatch clause on a Rule will cause that rule to only match HTTP traffic. Other application layer protocols will not match the rule.
+
+Example:
+
+```yaml
+http:
+ methods: ['GET', 'PUT']
+ paths:
+ - exact: '/projects/calico'
+ - prefix: '/users'
+ headers:
+ - header: 'x-forwarded-for'
+ operator: 'HasPrefix'
+ values: ['192.168.0.1', '192.168.0.254']
+```
+
+| Field | Description | Schema |
+| ------- | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------- |
+| methods | Match HTTP methods. Case sensitive. [Standard HTTP method descriptions.](https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) | list of strings |
+| paths | Match HTTP paths. Case sensitive. | list of [HTTPPathMatch](#httppathmatch) |
+| headers | Match HTTP headers. | list of [HTTPHeaderMatch](#httpheadermatch) |
+
+### HTTPPathMatch
+
+| Syntax | Example | Description |
+| ------ | ------------------- | ------------------------------------------------------------------------------- |
+| exact | `exact: "/foo/bar"` | Matches the exact path as written, not including the query string or fragments. |
+| prefix | `prefix: "/keys"` | Matches any path that begins with the given prefix. |
+
+### HTTPHeaderMatch
+
+| Syntax | Example | Description |
+| -------- | ---------------------------------- | ------------------------------------------------------------------------------------------ |
+| header | `x-forwarded-for` | Name of a HTTP header. Header names are case insensitive, please use lowercase characters. |
+| operator | `In` | Operator name to apply to the HTTP header value. Case sensitive. |
+| values | `['192.168.0.1', '192.168.0.254']` | Values that the operator will test the HTTP header value against. Case sensitive. |
+
+The following operators are allowed:
+- `Exists`: matches the HTTP request header if the specified header exists. `values` are ignored.
+- `DoesNotExist`: matches the HTTP request header if the specified header does not exist. `values` are ignored.
+- `HasPrefix`: matches the HTTP request header if the specified header has a prefix from any the values provided.
+- `HasSuffix`: matches the HTTP request header if the specified header has a suffix from any the values provided.
+- `In`: matches the HTTP request header if its value is in the set of values provided.
+- `NotIn`: matches the HTTP request header if its value is not in the set of values provided.
+- `MatchesRegex`: matches the HTTP request header if its value matches any of the regular expressions in values field.
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_icmp.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_icmp.mdx
new file mode 100644
index 0000000000..1adb456472
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_icmp.mdx
@@ -0,0 +1,4 @@
+| Field | Description | Accepted Values | Schema | Default |
+| ----- | ------------------- | -------------------- | ------- | ------- |
+| type | Match on ICMP type. | Can be integer 0-254 | integer |
+| code | Match on ICMP code. | Can be integer 0-255 | integer |
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_ipnat.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_ipnat.mdx
new file mode 100644
index 0000000000..9cfa2fb904
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_ipnat.mdx
@@ -0,0 +1,6 @@
+IPNAT contains a single NAT mapping for a WorkloadEndpoint resource.
+
+| Field | Description | Accepted Values | Schema | Default |
+| ---------- | ------------------------------------------- | ------------------ | ------ | ------- |
+| internalIP | The internal IP address of the NAT mapping. | A valid IP address | string | |
+| externalIP | The external IP address. | A valid IP address | string | |
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_license.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_license.mdx
new file mode 100644
index 0000000000..9eff9db682
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_license.mdx
@@ -0,0 +1,22 @@
+**How long does it take to get a new $[prodname] license?**
+ After you submit a sales purchase order to Tigera, 1-2 days.
+
+**Is there a grace period?**
+ No.
+
+**Does the web console display license expiration?**
+Yes. The license indicator in the web console (top right banner) turns red when the license expires.
+
+
+
+**What happens when a license expires or is invalid?**
+ Users can log in to the web console with read/access for all previously-created resources, but they cannot create any new $[prodname] resources. The web console may appear to function, but actions will not be applied; so it is important to proactively managed your license.
+
+**What happens if I add nodes beyond what I'm licensed for?**
+
+- Node limits are not currently enforced
+- All $[prodname] features still work
+
+**How do I monitor my license?**
+
+- Use `kubectl` to get [license key information](../../reference/resources/licensekey.mdx#viewing-information-about-your-license-key)
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_non-cluster-binary-install.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_non-cluster-binary-install.mdx
new file mode 100644
index 0000000000..ccb93567fc
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_non-cluster-binary-install.mdx
@@ -0,0 +1,151 @@
+import NonClusterReadOnlyStep from '@site/calico-cloud_versioned_docs/version-24-1/_includes/content/_non-cluster-read-only-step.mdx';
+import EnvironmentFile from '@site/calico-cloud_versioned_docs/version-24-1/_includes/components/EnvironmentFile';
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+
+
+### Step 2: Download and extract the binary
+
+This step requires Docker, but it can be run from any machine with Docker installed. It doesn't have to be the host you will run it on (i.e your laptop is fine).
+
+1. Use the following command to download the $[nodecontainer] image.
+
+ ```bash
+ docker pull $[registry]$[componentImage.cnxNode]
+ ```
+
+1. Confirm that the image has loaded by typing `docker images`.
+
+ ```
+ REPOSITORY TAG IMAGE ID CREATED SIZE
+ $[registry]$[releases.0.components.cnx-node.image] $[releases.0.components.cnx-node.version] e07d59b0eb8a 2 minutes ago 42MB
+ ```
+
+1. Create a temporary $[nodecontainer] container.
+
+ ```bash
+ docker create --name container $[registry]$[componentImage.cnxNode]
+ ```
+
+1. Copy the calico-node binary from the container to the local file system.
+
+ ```bash
+ docker cp container:/bin/calico-node $[nodecontainer]
+ ```
+
+1. Delete the temporary container.
+
+ ```bash
+ docker rm container
+ ```
+
+1. Set the extracted binary file to be executable.
+
+ ```bash
+ chmod +x $[nodecontainer]
+ chown root:root $[nodecontainer]
+ ```
+
+### Step 3: Copy the `calico-node` binary
+
+Copy the binary from Step 2 to the target machine, using any means (`scp`, `ftp`, USB stick, etc.).
+
+### Step 4: Create environment file
+
+
+
+### Step 5: Start Felix
+
+There are a few ways to start Felix: create a startup script, or manually configure Felix.
+
+
+
+
+Felix should be started at boot by your init system and the init system
+**must** be configured to restart Felix if it stops. Felix relies on
+that behavior for certain configuration changes.
+
+If your distribution uses systemd, then you could use the following unit file:
+
+```bash
+[Unit]
+Description=Calico Felix agent
+After=syslog.target network.target
+
+[Service]
+User=root
+EnvironmentFile=/etc/calico/calico.env
+ExecStartPre=/usr/bin/mkdir -p /var/run/calico
+ExecStart=/usr/local/bin/$[nodecontainer] -felix
+KillMode=process
+Restart=on-failure
+LimitNOFILE=32000
+
+[Install]
+WantedBy=multi-user.target
+```
+
+Or, for upstart:
+
+```bash
+description "Felix (Calico agent)"
+author "Project Calico Maintainers "
+
+start on stopped rc RUNLEVEL=[2345]
+stop on runlevel [!2345]
+
+limit nofile 32000 32000
+
+respawn
+respawn limit 5 10
+
+chdir /var/run
+
+pre-start script
+ mkdir -p /var/run/calico
+ chown root:root /var/run/calico
+end script
+
+exec /usr/local/bin/$[nodecontainer] -felix
+```
+
+**Start Felix**
+
+After you've configured Felix, start it via your init system.
+
+```bash
+service calico-felix start
+```
+
+
+
+
+Configure Felix by creating a file at `/kubernetes/calico/felix.cfg`.
+{/*TODO-XREFS-CC
+See [Felix configuration](/reference/felix/configuration) for help with environment variables.
+*/}
+
+:::note
+
+Felix tries to detect whether IPv6 is available on your platform but
+the detection can fail on older (or more unusual) systems. If Felix
+exits soon after startup with `ipset` or `iptables` errors try
+setting the `Ipv6Support` setting to `false`.
+
+:::
+
+Next, configure Felix to interact with a Kubernetes datastore. You
+must set the `DatastoreType` setting to `kubernetes`. You must also set the environment variable `CALICO_KUBECONFIG`
+to point to a valid kubeconfig for your kubernetes cluster and `CALICO_NETWORKING_BACKEND` to `none`.
+
+:::note
+
+For the Kubernetes datastore, Felix works in policy-only mode. Even though pod networking is
+disabled on the baremetal host Felix is running on, policy can still be used to secure the host.
+
+:::
+
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_non-cluster-read-only-step.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_non-cluster-read-only-step.mdx
new file mode 100644
index 0000000000..84314c231f
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_non-cluster-read-only-step.mdx
@@ -0,0 +1,21 @@
+import CreateKubeconfig from '@site/calico-cloud_versioned_docs/version-24-1/_includes/content/_create-kubeconfig.mdx';
+
+### Step 1: (Optional) Configure access for the non-cluster-host
+
+To run Calico Node as a container, it will need a kubeconfig. You can skip this step if you already have a kubeconfig ready to use.
+
+
+
+Run the following two commands to create a cluster role with read-only access and a corresponding cluster role binding.
+
+```bash
+kubectl apply -f $[filesUrl_CE]/manifests/non-cluster-host-clusterrole.yaml
+kubectl create clusterrolebinding $SA_NAME --serviceaccount=calico-system:$SA_NAME --clusterrole=non-cluster-host-read-only
+```
+
+:::note
+
+We include examples for systemd, but the commands can be
+applied to other init daemons such as upstart.
+
+:::
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_ports.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_ports.mdx
new file mode 100644
index 0000000000..4517f59290
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_ports.mdx
@@ -0,0 +1,33 @@
+$[prodname] supports the following syntaxes for expressing ports.
+
+| Syntax | Example | Description |
+| --------- | ---------- | ------------------------------------------------------------------- |
+| int | 80 | The exact (numeric) port specified |
+| start:end | 6040:6050 | All (numeric) ports within the range start ≤ x ≤ end |
+| string | named-port | A named port, as defined in the ports list of one or more endpoints |
+
+An individual numeric port may be specified as a YAML/JSON integer. A port range or
+named port must be represented as a string. For example, this would be a valid list of ports:
+
+```yaml
+ports: [8080, '1234:5678', 'named-port']
+```
+
+#### Named ports
+
+Using a named port in an `EntityRule`, instead of a numeric port, gives a layer of indirection,
+allowing for the named port to map to different numeric values for each endpoint.
+
+For example, suppose you have multiple HTTP servers running as workloads; some exposing their HTTP
+port on port 80 and others on port 8080. In each workload, you could create a named port called
+`http-port` that maps to the correct local port. Then, in a rule, you could refer to the name
+`http-port` instead of writing a different rule for each type of server.
+
+:::note
+
+Since each named port may refer to many endpoints (and $[prodname] has to expand a named port into
+a set of endpoint/port combinations), using a named port is considerably more expensive in terms
+of CPU than using a simple numeric port. We recommend that they are used sparingly, only where
+the extra indirection is required.
+
+:::
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_rule.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_rule.mdx
new file mode 100644
index 0000000000..60b88de64f
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_rule.mdx
@@ -0,0 +1,46 @@
+A single rule matches a set of packets and applies some action to them. When multiple rules are specified, they
+are executed in order.
+
+| Field | Description | Accepted Values | Schema | Default |
+| ----------- | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------ | ----------------------------- | ------- |
+| metadata | Per-rule metadata. | | [RuleMetadata](#rulemetadata) | |
+| action | Action to perform when matching this rule. | `Allow`, `Deny`, `Log`, `Pass` | string | |
+| protocol | Positive protocol match. | `TCP`, `UDP`, `ICMP`, `ICMPv6`, `SCTP`, `UDPLite`, `1`-`255` | string \| integer | |
+| notProtocol | Negative protocol match. | `TCP`, `UDP`, `ICMP`, `ICMPv6`, `SCTP`, `UDPLite`, `1`-`255` | string \| integer | |
+| icmp | ICMP match criteria. | | [ICMP](#icmp) | |
+| notICMP | Negative match on ICMP. | | [ICMP](#icmp) | |
+| ipVersion | Positive IP version match. | `4`, `6` | integer | |
+| source | Source match parameters. | | [EntityRule](#entityrule) | |
+| destination | Destination match parameters. | | [EntityRule](#entityrule) | |
+| http | Match HTTP request parameters. Application layer policy must be enabled to use this field. | | HTTPMatch | |
+
+After a `Log` action, processing continues with the next rule; `Allow` and `Deny` are immediate
+and final and no further rules are processed.
+
+An `action` of `Pass` in a `NetworkPolicy` or `GlobalNetworkPolicy` will skip over the remaining policies and jump to the
+first profile assigned to the endpoint, applying the policy configured in the
+profile; if there are no Profiles configured for the endpoint the default applied action is `Deny`.
+
+### RuleMetadata
+
+Metadata associated with a specific rule (rather than the policy as a whole). The contents of the metadata does not affect how a rule is interpreted or enforced; it is
+simply a way to store additional information for use by operators or applications that interact with $[prodname].
+
+| Field | Description | Schema | Default |
+| ----------- | ----------------------------------- | ----------------------- | ------- |
+| annotations | Arbitrary non-identifying metadata. | map of string to string | |
+
+Example:
+
+```yaml
+metadata:
+ annotations:
+ app: database
+ owner: devops
+```
+
+Annotations follow the
+[same rules as Kubernetes for valid syntax and character set](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/#syntax-and-character-set).
+
+On Linux with the iptables data plane, rule annotations are rendered as comments in the form `-m comment --comment "="` on the iptables rule(s) that correspond
+to the $[prodname] rule.
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_selector-scopes.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_selector-scopes.mdx
new file mode 100644
index 0000000000..9d9fbc8c54
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_selector-scopes.mdx
@@ -0,0 +1,20 @@
+Understanding scopes and the `all()` and `global()` operators: selectors have a scope of resources
+that they are matched against, which depends on the context in which they are used. For example:
+
+- The `nodeSelector` in an `IPPool` selects over `Node` resources.
+
+- The top-level selector in a `NetworkPolicy` selects over the workloads _in the same namespace_ as the
+ `NetworkPolicy`.
+- The top-level selector in a `GlobalNetworkPolicy` doesn't have the same restriction, it selects over all endpoints
+ including namespaced `WorkloadEndpoint`s and non-namespaced `HostEndpoint`s.
+
+- The `namespaceSelector` in a `NetworkPolicy` (or `GlobalNetworkPolicy`) _rule_ selects over the labels on namespaces
+ rather than workloads.
+
+- The `namespaceSelector` determines the scope of the accompanying `selector` in the entity rule. If no `namespaceSelector`
+ is present then the rule's `selector` matches the default scope for that type of policy. (This is the same namespace
+ for `NetworkPolicy` and all endpoints/network sets for `GlobalNetworkPolicy`)
+- The `global()` operator can be used (only) in a `namespaceSelector` to change the scope of the main `selector` to
+ include non-namespaced resources such as [GlobalNetworkSet](../../reference/resources/globalnetworkset.mdx).
+ This allows namespaced `NetworkPolicy` resources to refer to global non-namespaced resources, which would otherwise
+ be impossible.
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_selectors.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_selectors.mdx
new file mode 100644
index 0000000000..52baf960ae
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_selectors.mdx
@@ -0,0 +1,50 @@
+A label selector is an expression which either matches or does not match a resource based on its labels.
+
+$[prodname] label selectors support a number of operators, which can be combined into larger expressions
+using the boolean operators and parentheses.
+
+| Expression | Meaning |
+| ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| **Logical operators** |
+| `( )` | Matches if and only if `` matches. (Parentheses are used for grouping expressions.) |
+| `! ` | Matches if and only if `` does not match. **Tip:** `!` is a special character at the start of a YAML string, if you need to use `!` at the start of a YAML string, enclose the string in quotes. |
+| ` && ` | "And": matches if and only if both ``, and, `` matches |
+| \ || \ | "Or": matches if and only if either ``, or, `` matches. |
+| **Match operators** |
+| `all()` | Match all in-scope resources. To match _no_ resources, combine this operator with `!` to form `!all()`. |
+| `global()` | Match all non-namespaced resources. Useful in a `namespaceSelector` to select global resources such as global network sets. |
+| `k == 'v'` | Matches resources with the label 'k' and value 'v'. |
+| `k != 'v'` | Matches resources without label 'k' or with label 'k' and value _not_ equal to `v` |
+| `has(k)` | Matches resources with label 'k', independent of value. To match pods that do not have label `k`, combine this operator with `!` to form `!has(k)` |
+| `k in { 'v1', 'v2' }` | Matches resources with label 'k' and value in the given set |
+| `k not in { 'v1', 'v2' }` | Matches resources without label 'k' or with label 'k' and value _not_ in the given set |
+| `k contains 's'` | Matches resources with label 'k' and value containing the substring 's' |
+| `k starts with 's'` | Matches resources with label 'k' and value starting with the substring 's' |
+| `k ends with 's'` | Matches resources with label 'k' and value ending with the substring 's' |
+
+Operators have the following precedence:
+
+- **Highest**: all the match operators
+- Parentheses `( ... )`
+- Negation with `!`
+- Conjunction with `&&`
+- **Lowest**: Disjunction with `||`
+
+For example, the expression
+
+```
+! has(my-label) || my-label starts with 'prod' && role in {'frontend','business'}
+```
+
+Would be "bracketed" like this:
+
+```
+((!(has(my-label)) || ((my-label starts with 'prod') && (role in {'frontend','business'}))
+```
+
+It would match:
+
+- Any resource that did not have label "my-label".
+- Any resource that both:
+ - Has a value for `my-label` that starts with "prod", and,
+ - Has a role label with value either "frontend", or "business".
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_serviceaccountmatch.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_serviceaccountmatch.mdx
new file mode 100644
index 0000000000..c3aff9c184
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_serviceaccountmatch.mdx
@@ -0,0 +1,6 @@
+A ServiceAccountMatch matches service accounts in an EntityRule.
+
+| Field | Description | Schema |
+| -------- | ------------------------------- | --------------------- |
+| names | Match service accounts by name | list of strings |
+| selector | Match service accounts by label | [selector](#selector) |
diff --git a/calico-cloud_versioned_docs/version-24-1/_includes/content/_servicematch.mdx b/calico-cloud_versioned_docs/version-24-1/_includes/content/_servicematch.mdx
new file mode 100644
index 0000000000..2d47fed02c
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/_includes/content/_servicematch.mdx
@@ -0,0 +1,6 @@
+A ServiceMatch matches a service in an EntityRule.
+
+| Field | Description | Schema |
+| --------- | ------------------------ | ------ |
+| name | The service's name. | string |
+| namespace | The service's namespace. | string |
diff --git a/calico-cloud_versioned_docs/version-24-1/about/calico-product-editions.mdx b/calico-cloud_versioned_docs/version-24-1/about/calico-product-editions.mdx
new file mode 100644
index 0000000000..d3507017e0
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/about/calico-product-editions.mdx
@@ -0,0 +1,132 @@
+---
+description: Side-by-side comparison of Calico Cloud against Calico Open Source and Calico Enterprise across SaaS management, networking, security, and observability features.
+---
+
+import { CheckIcon } from '@chakra-ui/icons';
+import { CalicoProducts } from '/src/___new___/components';
+
+# Calico product editions
+
+
+
+## Which product edition is right for me?
+
+| My needs | Calico product edition |
+| ----- | ----- |
+| I want open source, best-in-class networking, network security, and observability capabilities that can work across any Kubernetes distribution, for free. | Calico Open Source [Get Started](/calico/latest/getting-started) |
+| I’m a Calico Open Source user who wants to leverage some of the improved observability and policy management capabilities that are available in Calico Cloud, for free. | Calico Cloud Free Tier [Sign up](https://auth.calicocloud.io/u/signup/identifier?state=hKFo2SBoMWV0M1RBUDlvWU83V2pGOS1ybVpCdmJGcDJRXzRSdaFur3VuaXZlcnNhbC1sb2dpbqN0aWTZIEJMclZBR2NmZzFacHRMclRIOFBzVEdNdVozOFlOSkpio2NpZNkgcTZ4MVM2dHdxZ0pHOVZLSEQzRGR0S0tEQTB2MlNuYkU) |
+| My organization wants a **fully managed SaaS** platform for network security and observability. | Calico Cloud [Get Started](../get-started/index.mdx) |
+| My organization wants a **self-managed platform** for network security and observability. | Calico Enterprise [Get Started](/calico-enterprise/latest/getting-started/) |
+
+## Feature comparison matrix
+
+| | Calico Open Source | Calico Cloud Free Tier\* | Calico Cloud | Calico Enterprise |
+| ----- | :-----: | :-----: | :-----: | :-----: |
+| **Management and Support** | | | | |
+| Mutli-cluster security controls management | | | | |
+| Data retention | In-memory | 24 hours | 7 days | Unlimited |
+| Number of clusters | Unlimited | One | Unlimited | Unlimited |
+| Number of users | N/A | One | Unlimited | Unlimited |
+| Support and maintenance | Community-driven | Community-driven | Standard/Business | Standard/Business |
+| **Networking** | | | | |
+| High performance, scalable pod networking | | | | |
+| Advanced IP address management | | | | |
+| Direct infrastructure peering without the overlay | | | | |
+| eBPF data plane | | | | |
+| Windows data plane | | | | |
+| nftables data plane | | | | |
+| iptables data plane | | | | |
+| VPP data plane | | | | |
+| Multiple Calico networks on a pod | | | | |
+| Dual ToR peering | | | | |
+| Ingress gateway | | | | |
+| Egress gateway | | | | |
+| Cluster mesh | | | | |
+| **Network Security** | | | | |
+| Seamless support for Kubernetes network policy | | | | |
+| Label-based policies for K8s and non-K8s workloads | | | | |
+| Namespace and cluster-wide scope | | | | |
+| Global default deny policy design | | | | |
+| Application layer policy | | | | |
+| Policy for services | | | | |
+| Policy board | | View only | | |
+| DNS/FQDN-based policy | | | | |
+| Hierarchical tiered network policy | | | | |
+| Policy recommendations | | Manual workflow | | |
+| Staged network policy | | | | |
+| Preview staged policies | | | | |
+| Network sets to limit IP ranges for egress and ingress traffic to workloads | | | | |
+| Data-in-transit encryption | | | | |
+| Universal firewall integration | | | | |
+| Workload-based IDS/IPS | | | | |
+| Deep packet inspection | | | | |
+| DDoS protection | | | | |
+| Workload-centric WAF | | | | |
+| SIEM integrations | | | | |
+| **Network Security for VMs and Bare Metal** | | | | |
+| Restrict traffic to/from hosts and VMs using network policy | | | | |
+| Automatic host endpoints | | | | |
+| Apply policy to host-forwarded traffic | | | | |
+| **Observability** | | | | |
+| Flow logs API | | | | |
+| Calico Whisker web console | | | | |
+| Dynamic service and threat graph | | | | |
+| Application level observability | | | | |
+| Dynamic packet capture | | | | |
+| Flow visualizer | | | | |
+| Logs (flow) | | | | |
+| Logs (http traffic, audit, bgp, dns, events) | | | | |
+| Dashboards | | \*\* | | |
+| Alerts | | | | |
+
+\* Calico Cloud Free Tier requires a cluster with Calico Open Source 3.30 or higher.
+
+\*\* Calico Cloud Free Tier includes some of the dashboards that are available in Calico Cloud and Calico Enterprise.
+
+## How to get started with Calico
+
+Calico powers 100M+ containers across 8M+ nodes in 166 countries, and is supported across all major cloud providers and Kubernetes distributions.
+
+### Ready to get started?
+
+Start a free trial or request a demo to see Calico in action.
+
+* [Sign up for a Calico Cloud Free Tier account](https://www.calicocloud.io/?code=free)
+* [Schedule a 30-minute demo with our experts](https://www.tigera.io/demo/)
+
+### Installation guides
+
+* [Install Calico Open Source](/calico/latest/getting-started)
+* [Install Calico Cloud Free Tier](../free/connect-cluster-free.mdx)
+* [Install Calico Cloud](../get-started/install-cluster.mdx)
+* [Install Calico Enterprise](/calico-enterprise/latest/getting-started/)
+
+## How to engage
+
+### Learning resources
+
+* [Blog](https://www.tigera.io/blog/)
+* [Certifications](https://www.tigera.io/lp/calico-certification/) (self-paced)
+* [Product tutorials](https://www.tigera.io/tutorials/) (self-paced)
+* [Learn guides](https://www.tigera.io/learn/guides/kubernetes-networking/)
+* [Webinars and workshops](https://www.tigera.io/events/) (live and on demand)
+* [Resources](https://www.tigera.io/resources/)
+
+### Get involved
+
+* [Calico Open Source Community](https://www.tigera.io/project-calico/community/)
+* GitHub
+ * [Project Calico](https://github.com/projectcalico/calico)
+ * [Tigera](https://github.com/tigera)
+
+### Get in touch
+
+* [Slack](https://calicousers.slack.com/) (Calico Open Source users)
+* [YouTube](https://www.youtube.com/channel/UCFpTnXDNcBoXI4gqCDmegFA) (@ProjectCalico)
+* LinkedIn
+ * [Tigera](https://www.linkedin.com/company/tigera/)
+ * [Project Calico](https://www.linkedin.com/company/project-calico/)
+* X
+ * [Tigera](https://x.com/tigeraio)
+ * [Project Calico](https://x.com/projectcalico)
+* [Contact us](https://www.tigera.io/contact/)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/about/index.mdx b/calico-cloud_versioned_docs/version-24-1/about/index.mdx
new file mode 100644
index 0000000000..5e21e8f4c6
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/about/index.mdx
@@ -0,0 +1,260 @@
+---
+description: Overview of Calico Cloud, the Tigera-hosted managed SaaS for Kubernetes networking, network security, and observability across connected clusters.
+---
+
+import { DocCardLink, DocCardLinkLayout, PaidProductDocCardLink } from '/src/___new___/components';
+import { CheckIcon } from '@chakra-ui/icons';
+import { CalicoProducts } from '/src/___new___/components';
+
+# About Calico
+
+## What is Calico?
+
+Calico is a single platform for networking, network security, and observability for any Kubernetes distribution in the cloud, on-premises, or at the edge.
+Whether you're just starting with Kubernetes or operating at scale, Calico's open source, enterprise, and cloud editions provide the networking, security, and observability you need.
+
+The key advantages of Calico are:
+
+* A single platform to address all networking, network security, and observability needs for Kubernetes environments
+* Consistent networking and network security controls for any Kubernetes distribution, ensuring workload portability
+* Ability to scale networking and network security to multi-cluster applications, VMs, and bare metal servers without additional software
+
+The Calico portfolio of products includes Calico Open Source, Calico Enterprise (self-managed), and Calico Cloud (fully-managed SaaS).
+Calico Cloud Free Tier is a free version of Calico Cloud that focuses on observability and policy management for a single cluster.
+All of this is built on Calico Open Source, the most widely used container networking and security solution.
+
+## Calico overview
+
+### Networking
+
+
+
+
+
+ {/* We don't have a good docs page for this one.
+ */}
+
+
+### Network security
+
+
+{/* */}
+
+
+
+
+
+
+### Threat detection, observability, and incident response
+
+
+
+
+
+
+
+
+### CI/CD automation and tools
+
+
+ {/**/}
+
+
+
+
+
+
+## Calico product editions
+
+
+
+## Which product edition is right for me?
+
+| My needs | Calico product edition |
+| ----- | ----- |
+| I want open source, best-in-class networking, network security, and observability capabilities that can work across any Kubernetes distribution, for free. | Calico Open Source [Get Started](/calico/latest/getting-started) |
+| I’m a Calico Open Source user who wants to leverage some of the improved observability and policy management capabilities that are available in Calico Cloud, for free. | Calico Cloud Free Tier [Sign up](https://auth.calicocloud.io/u/signup/identifier?state=hKFo2SBoMWV0M1RBUDlvWU83V2pGOS1ybVpCdmJGcDJRXzRSdaFur3VuaXZlcnNhbC1sb2dpbqN0aWTZIEJMclZBR2NmZzFacHRMclRIOFBzVEdNdVozOFlOSkpio2NpZNkgcTZ4MVM2dHdxZ0pHOVZLSEQzRGR0S0tEQTB2MlNuYkU) |
+| My organization wants a **fully managed SaaS** platform for network security and observability. | Calico Cloud [Get Started](../get-started/index.mdx) |
+| My organization wants a **self-managed platform** for network security and observability. | Calico Enterprise [Get Started](/calico-enterprise/latest/getting-started/) |
+
+## Feature comparison matrix
+
+| | Calico Open Source | Calico Cloud Free Tier\* | Calico Cloud | Calico Enterprise |
+| ----- | :-----: | :-----: | :-----: | :-----: |
+| **Management and Support** | | | | |
+| Mutli-cluster security controls management | | | | |
+| Data retention | In-memory | 24 hours | 7 days | Unlimited |
+| Number of clusters | Unlimited | One | Unlimited | Unlimited |
+| Number of users | N/A | One | Unlimited | Unlimited |
+| Support and maintenance | Community-driven | Community-driven | Standard/Business | Standard/Business |
+| **Networking** | | | | |
+| High performance, scalable pod networking | | | | |
+| Advanced IP address management | | | | |
+| Direct infrastructure peering without the overlay | | | | |
+| eBPF data plane | | | | |
+| Windows data plane | | | | |
+| nftables data plane | | | | |
+| iptables data plane | | | | |
+| VPP data plane | | | | |
+| Multiple Calico networks on a pod | | | | |
+| Dual ToR peering | | | | |
+| Ingress gateway | | | | |
+| Egress gateway | | | | |
+| Cluster mesh | | | | |
+| **Network Security** | | | | |
+| Seamless support for Kubernetes network policy | | | | |
+| Label-based policies for K8s and non-K8s workloads | | | | |
+| Namespace and cluster-wide scope | | | | |
+| Global default deny policy design | | | | |
+| Application layer policy | | | | |
+| Policy for services | | | | |
+| Policy board | | View only | | |
+| DNS/FQDN-based policy | | | | |
+| Hierarchical tiered network policy | | | | |
+| Policy recommendations | | Manual workflow | | |
+| Staged network policy | | | | |
+| Preview staged policies | | | | |
+| Network sets to limit IP ranges for egress and ingress traffic to workloads | | | | |
+| Data-in-transit encryption | | | | |
+| Universal firewall integration | | | | |
+| Workload-based IDS/IPS | | | | |
+| Deep packet inspection | | | | |
+| DDoS protection | | | | |
+| Workload-centric WAF | | | | |
+| SIEM integrations | | | | |
+| **Network Security for VMs and Bare Metal** | | | | |
+| Restrict traffic to/from hosts and VMs using network policy | | | | |
+| Automatic host endpoints | | | | |
+| Apply policy to host-forwarded traffic | | | | |
+| **Observability** | | | | |
+| Flow logs API | | | | |
+| Calico Whisker web console | | | | |
+| Dynamic service and threat graph | | | | |
+| Application level observability | | | | |
+| Dynamic packet capture | | | | |
+| Flow visualizer | | | | |
+| Logs (flow) | | | | |
+| Logs (http traffic, audit, bgp, dns, events) | | | | |
+| Dashboards | | \*\* | | |
+| Alerts | | | | |
+
+\* Calico Cloud Free Tier requires a cluster with Calico Open Source 3.30 or higher.
+
+\*\* Calico Cloud Free Tier includes some of the dashboards that are available in Calico Cloud and Calico Enterprise.
+
+## How to get started with Calico
+
+Calico powers 100M+ containers across 8M+ nodes in 166 countries, and is supported across all major cloud providers and Kubernetes distributions.
+
+### Ready to get started?
+
+Start a free trial or request a demo to see Calico in action.
+
+* [Sign up for a Calico Cloud Free Tier account](https://www.calicocloud.io/?code=free)
+* [Schedule a 30-minute demo with our experts](https://www.tigera.io/demo/)
+
+### Installation guides
+
+* [Install Calico Open Source](/calico/latest/getting-started)
+* [Install Calico Cloud Free Tier](../free/connect-cluster-free.mdx)
+* [Install Calico Cloud](../get-started/install-cluster.mdx)
+* [Install Calico Enterprise](/calico-enterprise/latest/getting-started/)
+
+## How to engage
+
+### Learning resources
+
+* [Blog](https://www.tigera.io/blog/)
+* [Certifications](https://www.tigera.io/lp/calico-certification/) (self-paced)
+* [Product tutorials](https://www.tigera.io/tutorials/) (self-paced)
+* [Learn guides](https://www.tigera.io/learn/guides/kubernetes-networking/)
+* [Webinars and workshops](https://www.tigera.io/events/) (live and on demand)
+* [Resources](https://www.tigera.io/resources/)
+
+### Get involved
+
+* [Calico Open Source Community](https://www.tigera.io/project-calico/community/)
+* GitHub
+ * [Project Calico](https://github.com/projectcalico/calico)
+ * [Tigera](https://github.com/tigera)
+
+### Get in touch
+
+* [Slack](https://calicousers.slack.com/) (Calico Open Source users)
+* [YouTube](https://www.youtube.com/channel/UCFpTnXDNcBoXI4gqCDmegFA) (@ProjectCalico)
+* LinkedIn
+ * [Tigera](https://www.linkedin.com/company/tigera/)
+ * [Project Calico](https://www.linkedin.com/company/project-calico/)
+* X
+ * [Tigera](https://x.com/tigeraio)
+ * [Project Calico](https://x.com/projectcalico)
+* [Contact us](https://www.tigera.io/contact/)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/compliance/configure-http-proxy.mdx b/calico-cloud_versioned_docs/version-24-1/compliance/configure-http-proxy.mdx
new file mode 100644
index 0000000000..59883c8b69
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/compliance/configure-http-proxy.mdx
@@ -0,0 +1,99 @@
+---
+description: Route outbound container traffic through an HTTP proxy on clusters connected to Calico Cloud by configuring the Installation custom resource via the Tigera Operator.
+---
+
+# Configure an outbound HTTP proxy
+
+$[prodname] supports the use of HTTP proxies for connections that leave the cluster and originate from $[prodname] containers.
+
+`HTTP_PROXY`, `HTTPS_PROXY`, and `NO_PROXY` environment variables can be set on $[prodname] containers by using a mutating admission webhook, or by configuration through the Installation CR if preferred. In the latter case, the Tigera Operator will be responsible for setting proxy environment variables on $[prodname] containers that egress out of the cluster.
+
+With either environment variable configuration method, the Tigera Operator will detect the proxy environment variables that are set on $[prodname] containers that egress out of the cluster and ensure that network policy in the calico-system tier allows these connections.
+
+This page will outline how to configure an HTTP proxy using the Installation CR.
+
+:::caution
+
+$[prodname] assumes that you have exempted in-cluster destinations (including the Kubernetes API server) from proxying via the `NO_PROXY` variable.
+
+:::
+
+## Configuration via Helm
+If you wish to manually configure $[prodname] via Helm to set proxy environment variables on $[prodname] containers (rather than using a mutating admission webhook), you will first need to familiarize yourself with how to [customize the $[prodname] Helm chart using values.yaml](../get-started/install-automated#prepare-your-valuesyaml-with-customizations).
+
+Following the instructions linked above, retrieve your `.yaml`. Edit the file to set the `installer.components.installation.proxy` path, which configures the Installation CR with your proxy. This instructs the Tigera Operator to program your proxy on relevant containers that it deploys. e.g.:
+
+```yaml
+installer:
+ components:
+ installation:
+ proxy:
+ httpProxy:
+ httpsProxy:
+ noProxy:
+```
+
+In your `.yaml` file, you'll also need to set the `installer.components.ccInstaller.operatorDeployment.spec.template.spec.containers` path, which programs your proxy on the calico-cloud-controller-manager pod.
+
+```yaml
+installer:
+ components:
+ ccInstaller:
+ operatorDeployment:
+ spec:
+ template:
+ spec:
+ containers:
+ - name: calico-cloud
+ env:
+ - name: HTTP_PROXY
+ value:
+ - name: HTTPS_PROXY
+ value:
+ - name: NO_PROXY
+ value:
+
+```
+
+Once you've completed your edits to your `.yaml`, you can [install](../get-started/install-automated#install-calico-cloud-as-part-of-an-automated-workflow-1) $[prodname] using your customized values.
+
+:::caution
+
+Ensure that the other required values for the Helm chart are set in the values.yaml file, as indicated by the generated Helm install command.
+
+:::
+
+## Configuration via Manifest
+If you wish to manually configure $[prodname] via manifests to set proxy environment variables on $[prodname] containers (rather than using a mutating admission webhook), you’ll need to edit the manifests generated at install and reinstall time.
+
+First, you’ll need to edit the cc-operator deploy.yaml so that the `calico-cloud/calico-cloud-controller-manager` Deployment resource has your required environment variables (`HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY`) set in its `env` section.
+
+Second, you’ll need to edit the managed-cluster deploy.yaml so that the `calico-cloud/default` Installer resource has the Installation CR proxy configuration set. This is set at the `.spec.components.installation.proxy` path, e.g.
+
+```
+apiVersion: operator.calicocloud.io/v1
+kind: Installer
+metadata:
+ name: default
+ namespace: calico-cloud
+spec:
+ clusterName: "proxy-cluster"
+ resourceVersion: "20241209202443"
+ components:
+ installation:
+ proxy:
+ httpProxy:
+ httpsProxy:
+ noProxy:
+```
+
+## Validating Configuration
+Once your install or reinstall has completed, you can:
+* Check the Installation CR to validate that the `.spec.proxy` path has been set as expected
+* Check the calico-cloud-controller-manager Deployment to validate that the environment variables have been set on the container as expected
+
+:::caution
+
+You can manually edit the two places above to configure $[prodname] to use a proxy, but keep in mind that the reinstall process (via Helm or manifest) may overwrite your changes if you did not follow the steps in previous sections.
+
+:::
diff --git a/calico-cloud_versioned_docs/version-24-1/compliance/encrypt-cluster-pod-traffic.mdx b/calico-cloud_versioned_docs/version-24-1/compliance/encrypt-cluster-pod-traffic.mdx
new file mode 100644
index 0000000000..507bfd43eb
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/compliance/encrypt-cluster-pod-traffic.mdx
@@ -0,0 +1,233 @@
+---
+description: Turn on WireGuard for clusters connected to Calico Cloud to encrypt inter-node pod and host-network traffic, with IPv4 and IPv6 support via FelixConfiguration.
+---
+
+# Encrypt data in transit
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+## Big picture
+
+Enable WireGuard to secure on the wire in-cluster pod traffic in a $[prodname] cluster.
+
+## Value
+
+When this feature is enabled, $[prodname] automatically creates and manages WireGuard tunnels between nodes providing transport-level security for inter-node, in-cluster pod traffic. WireGuard provides [formally verified](https://www.wireguard.com/formal-verification/) secure and [performant tunnels](https://www.wireguard.com/performance/) without any specialized hardware. For a deep dive in to WireGuard implementation, see this [white paper](https://www.wireguard.com/papers/wireguard.pdf).
+
+$[prodname] supports WireGuard encryption for both IPv4 and IPv6 traffic. These can be independently enabled in the FelixConfiguration resource: `wireguardEnabled`
+enables encrypting IPv4 traffic over an IPv4 underlay network and `wireguardEnabledV6` enables encrypting IPv6 traffic over an IPv6 underlay network.
+
+## Before you begin
+
+**Terminology**
+
+ - Inter-node pod traffic: Traffic leaving a pod from one node destined to a pod on another node
+ - Inter-node, host-network traffic: traffic generated by the node itself or a host-networked-pod destined to another node or host-networked-pod
+ - Same-node pod traffic: Traffic between pods on the same node
+
+**Supported encryption**
+
+- Inter-node pod traffic: IPv4 only
+- Inter-node, host-network traffic, IPv4/IPv6: supported only on managed clusters deployed on EKS and AKS
+
+**Unsupported**
+
+- Encrypted same-node pod traffic
+- GKE
+- Using your own custom keys to encrypt traffic
+
+**Required**
+
+- On all nodes in the cluster that you want to participate in $[prodname] encryption, verify that the operating system(s) on the nodes are [installed with WireGuard](https://www.wireguard.com/install/).
+
+ :::note
+
+ Some node operating systems do not support WireGuard, or do not have it installed by default. Enabling $[prodname] WireGuard encryption does not require all nodes to be installed with WireGuard. However, traffic to or from a node that does not have WireGuard installed, will not be encrypted.
+
+ :::
+
+- IP addresses for every node in the cluster. This is required to establish secure tunnels between the nodes. $[prodname] can automatically do this using [IP autodetection methods](../networking/ipam/ip-autodetection.mdx).
+
+## How to
+
+- [Install WireGuard](#install-wireguard)
+- [Enable WireGuard for a cluster](#enable-wireguard-for-a-cluster)
+- [Verify encryption is enabled](#verify-encryption-is-enabled)
+- [Disable WireGuard for an individual node](#disable-wireguard-for-an-individual-node)
+- [Disable WireGuard for a cluster](#disable-wireguard-for-a-cluster)
+
+### Install WireGuard
+
+WireGuard is included in Linux 5.6+ kernels, and has been backported to earlier Linux kernels in some Linux distributions.
+
+Install WireGuard on cluster nodes using [instructions for your operating system](https://www.wireguard.com/install/). Note that you may need to reboot your nodes after installing WireGuard to make the kernel modules available on your system.
+
+Use the following instructions for these platforms that are not listed on the WireGuard installation page, before proceeding to [enabling WireGuard](#enable-wireguard-for-a-cluster).
+
+
+
+
+To install WireGuard on the default Amazon Machine Image (AMI):
+
+```bash
+sudo yum install kernel-devel-`uname -r` -y
+sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
+sudo curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
+sudo yum install wireguard-dkms wireguard-tools -y
+```
+
+
+
+
+AKS cluster nodes run Ubuntu with a kernel that has WireGuard installed already, so there is no manual installation required.
+
+
+
+
+To install WireGuard for OpenShift v4.8:
+
+1. Install requirements:
+
+ - [CoreOS Butane](https://coreos.github.io/butane/getting-started/)
+ - [OpenShift CLI](https://docs.openshift.com/container-platform/4.2/cli_reference/openshift_cli/getting-started-cli.html)
+
+1. Download and configure the tools needed for kmods.
+
+```bash
+FAKEROOT=$(mktemp -d)
+git clone https://github.com/tigera/kmods-via-containers
+cd kmods-via-containers
+make install FAKEROOT=${FAKEROOT}
+cd ..
+git clone https://github.com/tigera/kvc-wireguard-kmod
+cd kvc-wireguard-kmod
+make install FAKEROOT=${FAKEROOT}
+cd ..
+```
+
+1. Configure/edit `${FAKEROOT}/root/etc/kvc/wireguard-kmod.conf`.
+
+ a. You must then set the URLs for the `KERNEL_CORE_RPM`, `KERNEL_DEVEL_RPM` and `KERNEL_MODULES_RPM` packages in the conf file `$FAKEROOT/etc/kvc/wireguard-kmod.conf`. Obtain copies for `kernel-core`, `kernel-devel`, and `kernel-modules` rpms from [RedHat Access](https://access.redhat.com/downloads/content/package-browser) and host it in an http file server that is reachable by your OCP workers.
+
+ b. For help configuring `kvc-wireguard-kmod/wireguard-kmod.conf` and WireGuard version to kernel version compatibility, see the [kvc-wireguard-kmod README file](https://github.com/tigera/kvc-wireguard-kmod#quick-config-variables-guide).
+
+1. Get RHEL Entitlement data from your own RHEL8 system from a host in your cluster.
+
+ ```bash
+ tar -czf subs.tar.gz /etc/pki/entitlement/ /etc/rhsm/ /etc/yum.repos.d/redhat.repo
+ ```
+
+1. Copy the `subs.tar.gz` file to your workspace and then extract the contents using the following command.
+
+ ```bash
+ tar -x -C ${FAKEROOT}/root -f subs.tar.gz
+ ```
+
+1. Transpile your machine config using [CoreOS Butane](https://coreos.github.io/butane/getting-started/).
+
+ ```bash
+ cd kvc-wireguard-kmod
+ make ignition FAKEROOT=${FAKEROOT} > mc-wg.yaml
+ ```
+
+1. With the KUBECONFIG set for your cluster, run the following command to apply the MachineConfig which will install WireGuard across your cluster.
+ ```bash
+ oc create -f mc-wg.yaml
+ ```
+
+
+
+
+### Enable WireGuard for a cluster
+
+Enable IPv4 WireGuard encryption across all the nodes using the following command.
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true}}'
+```
+
+Enable IPv6 WireGuard encryption across all the nodes using the following command.
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabledV6":true}}'
+```
+
+To enable both IPv4 and IPv6 WireGuard encryption across all the nodes, use the following command.
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p '{"spec":{"wireguardEnabled":true,"wireguardEnabledV6":true}}'
+```
+
+{/*TODO-CC-XREFS For OpenShift, add the Felix configuration with WireGuard enabled [under custom resources](/getting-started/install-on-clusters/openshift/installation/#provide-additional-configuration).*/}
+
+:::note
+
+The above command can be used to change other WireGuard attributes. For a list of other WireGuard parameters and configuration evaluation, see the [Felix configuration](../reference/resources/felixconfig.mdx#felix-configuration-definition).
+
+:::
+
+We recommend that you review and modify the MTU used by $[prodname] networking when WireGuard is enabled to increase network performance. Follow the instructions in the [Configure MTU to maximize network performance](../networking/configuring/mtu.mdx) guide to set the MTU to a value appropriate for your network.
+
+### Verify encryption is enabled
+
+To verify that the nodes are configured for WireGuard encryption, check the node status set by Felix using `kubectl`. For example:
+
+```bash
+kubectl get node -o yaml
+...
+kind: Node
+metadata:
+ annotations:
+ projectcalico.org/WireguardPublicKey: jlkVyQYooZYzI2wFfNhSZez5eWh44yfq1wKVjLvSXgY=
+...
+```
+
+### Enable WireGuard statistics
+
+Since v3.11.1, WireGuard statistics are now automatically enabled with the enable WireGuard setting(s) mentioned above.
+
+### View WireGuard statistics
+
+To view WireGuard statistics in the web console, you must enable them. From the left navbar, click **Dashboard**, and the Layout Settings icon.
+
+
+
+### Disable WireGuard for an individual node
+
+To disable WireGuard on a specific node with WireGuard installed, modify the node-specific Felix configuration. e.g., to turn off encryption for pod traffic on node `my-node`, use the following command. This command disables WireGuard for both IPv4 and IPv6, modify it accordingly if disabling only either IP version:
+
+```bash
+cat <
+
+
+
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/compliance/istio/about-istio-ambient.mdx b/calico-cloud_versioned_docs/version-24-1/compliance/istio/about-istio-ambient.mdx
new file mode 100644
index 0000000000..b7fc6197fa
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/compliance/istio/about-istio-ambient.mdx
@@ -0,0 +1,53 @@
+---
+description: Overview of the bundled Istio Ambient Mode service mesh for clusters connected to Calico Cloud, with node-level zTunnel proxies and mTLS managed by the Tigera Operator.
+---
+
+# Istio Ambient Mode
+
+You can use $[prodname] to deploy and manage an Istio service mesh on your cluster.
+$[prodname] installs Istio in ambient mode, which conserves resources while providing the same robust mTLS encryption for your workloads.
+
+:::note
+
+Istio Ambient Mode is a tech preview feature.
+Tech preview features are subject to significant changes before they become GA.
+
+:::
+
+## About Istio Ambient Mode
+
+Istio is a service mesh that manages and secures communication between microservices.
+Typically, Istio uses sidecar proxies that are deployed alongside every pod in the service mesh.
+At scale, running these sidecar proxies can be difficult to manage and a drain on resources.
+
+Istio Ambient Mode is a simplified service mesh architecture that removes the need for a sidecar proxy next to every pod.
+Instead, it uses node-level components for shared security and a layered approach for advanced traffic management.
+This design saves on computing resources and simplifies operations.
+
+## About Istio Ambient Mode on Calico
+
+$[prodname] provides a bundled version of Istio that can be installed and managed by the Tigera Operator.
+
+This integration automates the lifecycle of the Istio components to reduce manual configuration overhead.
+CVEs are addressed as part of the regular $[prodname] patch release cadence.
+Administrators provision the Istio service mesh by defining a standard `Istio` custom resource.
+
+### The enhanced zTunnel proxy
+
+The zTunnel component in Istio Ambient Mode is a lightweight proxy that runs on every node.
+
+Its main job is to handle encryption, authentication, and policy enforcement for traffic at Layer 4.
+
+A challenge in the original Istio Ambient Mode is that when traffic is routed through the zTunnel, it gets placed into a tunnel on a specific port (15008).
+This change makes it impossible for existing Layer 3 or Layer 4 network policies (like those from Calico) to see the original destination port of the traffic.
+
+Calico addresses this by using an enhanced zTunnel that is modified to preserve the original destination port.
+This modification allows existing Calico and Kubernetes network policies to continue functioning exactly as they did before, without needing any rewrites, even though the traffic is now encrypted with mTLS.
+
+These zTunnel enhancements are not compatible with Istio's application-layer Waypoint proxy.
+If you deploy Waypoint, the reported destination ports will follow the original behavior.
+Existing network policies need to be adapted to allow communication to port 15008.
+
+## Additional resources
+* [Overview of Istio ambient mode](https://istio.io/latest/docs/ambient/overview/).
+* [Ambient and Kubernetes NetworkPolicy](https://istio.io/latest/docs/ambient/usage/networkpolicy/)
diff --git a/calico-cloud_versioned_docs/version-24-1/compliance/istio/deploy-istio-ambient.mdx b/calico-cloud_versioned_docs/version-24-1/compliance/istio/deploy-istio-ambient.mdx
new file mode 100644
index 0000000000..ec104f45a5
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/compliance/istio/deploy-istio-ambient.mdx
@@ -0,0 +1,161 @@
+---
+description: Deploy the bundled Istio Ambient Mode service mesh on clusters connected to Calico Cloud by applying the Istio custom resource, with prerequisites and limitations.
+---
+
+# Deploy Istio Ambient Mode on your cluster
+
+You can deploy Calico's bundled version of Istio in ambient mode to provide mTLS encryption to your workloads.
+
+:::note
+
+Istio Ambient Mode is a tech preview feature.
+Tech preview features are subject to significant changes before they become GA.
+
+:::
+
+## Limitations
+
+* [Application layer network policies](../../network-policy/application-layer-policies/alp.mdx) are not compatible with the Istio service mesh.
+* Istio Ambient Mode does not work together with [workload-based web application firewalls](../../threat/web-application-firewall.mdx).
+* The service mesh is not supported for use on clusters that are also part of a [cluster mesh](../../multicluster/index.mdx).
+* Destination ports are preserved only when Istio is deployed without Waypoint.
+ If you deploy Waypoint, all traffic through Waypoint will show port 15008 as its destination port.
+* Connect-time load balancing is not compatible with Istio Ambient Mode.
+
+## Prerequisites
+
+* $[prodname] is installed and managed by the Tigera Operator.
+
+## Install Istio in ambient mode on your cluster
+
+You can create an Istio service mesh in ambient mode by creating the `Istio` custom resource.
+
+* To install Istio in ambient mode, apply the `Istio` custom resource to your cluster:
+
+ ```bash
+ cat < istio.io/dataplane-mode=ambient
+ ```
+ Replace `` with the namespace you want to include in the mesh.
+
+ ```bash title='Adding a pod to the Istio service mesh'
+ kubectl label pod --namespace= istio.io/dataplane-mode=ambient
+ ```
+ Replace the following:
+ * ``: The name of the pod you want to include in the mesh.
+ * ``: The namespace your pod is in.
+
+## Removing Istio
+
+If you want to remove Istio, first remove the labels you applied to pods and namespaces.
+When that's done, you can delete the `Istio` custom resource.
+
+1. Remove the label from namespaces and pods by running the following commands:
+
+ ```bash
+ kubectl label namespaces --all istio.io/dataplane-mode=ambient-
+ kubectl label pods --all --all-namespaces istio.io/dataplane-mode=ambient-
+ ```
+1. Remove the `Istio` custom resource:
+
+ ```bash
+ kubectl delete istio.operator.tigera.io default
+ ```
+
+## Troubleshooting commands
+
+Check whether Istio pods are deployed:
+
+```bash
+kubectl get pods -n calico-system | grep 'istio\|ztunnel'
+```
+
+Check whether Istio CRDs are deployed:
+
+```bash
+kubectl get crd | grep istio
+```
+
+Check which pods and namespaces are in the mesh:
+
+* Requires [istioctl](https://istio.io/latest/docs/ops/diagnostic-tools/istioctl/).
+
+```bash
+istioctl ztunnel-config workloads -n calico-system
+```
+
+Check for errors logged by the zTunnel component:
+
+```bash
+ZTUNNEL_PODS=$(kubectl get pod -n calico-system \
+ -l app.kubernetes.io/name=ztunnel \
+ -o jsonpath='{.items[*].metadata.name}')
+
+for P in $ZTUNNEL_PODS; do
+ echo "--- Checking logs for pod: $P ---"
+ kubectl logs $P -n calico-system 2>/dev/null | \
+ grep -i error | \
+ grep -i app1
+done
+```
+
+## Additional resources
+
+* [Overview of Istio ambient mode](https://istio.io/latest/docs/ambient/overview/).
+* [Configuration options](../../reference/installation/api).
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/free/connect-cluster-free.mdx b/calico-cloud_versioned_docs/version-24-1/free/connect-cluster-free.mdx
new file mode 100644
index 0000000000..60715baa77
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/free/connect-cluster-free.mdx
@@ -0,0 +1,184 @@
+---
+description: Connect a Kubernetes cluster to Calico Cloud Free Tier so it reports network observability data to a Tigera-managed dashboard.
+title: Connect a cluster
+---
+
+# Connect a cluster to Calico Cloud Free Tier
+
+This page shows you how to connect your Kubernetes cluster to Calico Cloud Free Tier.
+
+:::tip
+Don't have a cluster ready to connect?
+Try the [Calico Cloud Free Tier quickstart guide](quickstart.mdx) to create a cluster locally and connect it to Calico Cloud Free Tier.
+:::
+
+## Prerequisites
+
+* You have a Kubernetes cluster.
+ * Your `kubectl` tool is configured to communicate with your cluster.
+ * If you're working in a restricted network environment, you are able to create allow rules for TCP egress traffic to the Calico Cloud management plane.
+* You [installed Calico Open Source 3.30 or later on your cluster](/calico/latest/getting-started).
+ * If you upgraded from an earlier version of Calico Open Source, you [enabled the `Goldmane` custom resource](/calico/latest/observability/enable-whisker).
+ * Calico Open Source was installed using the operator method.
+ Manifest- and Helm-based installations are not supported.
+
+ Check Calico compatibility
+
+ To confirm that you're on a compatible Calico setup, you can run the following command:
+
+ ```bash
+ kubectl get tigerastatus goldmane
+ ```
+
+ If you're running Calico Open Source 3.30+ with the `Goldmane` custom resource is enabled, you should see something like this:
+
+ ```bash title='Example output'
+ NAME AVAILABLE PROGRESSING DEGRADED SINCE
+ goldmane True False False 21h
+ ```
+ This cluster is ready to connect to Calico Cloud Free Tier.
+
+ If instead you get an error (`Error from server (NotFound): tigerastatuses.operator.tigera.io "goldmane" not found`), then you need to do one of the following:
+ * If you're already on 3.30+ [enable the `Goldmane` custom resource](/calico/latest/observability/enable-whisker).
+ * If you're on 3.29 or earlier, [upgrade your Calico installation to 3.30 or later](/calico/latest/operations/upgrading/kubernetes-upgrade#upgrading-an-installation-that-uses-the-operator) and then [enable the `Goldmane` custom resource](/calico/latest/observability/enable-whisker).
+
+* You have an active Calico Cloud Free Tier account.
+ To create an account, go to the [Calico Cloud Free Tier sign-up page](https://calicocloud.io/?code=free).
+* You are signed in to the $[prodname] web console.
+
+## Connect your cluster
+
+1. From the web console, click the **Connect a cluster** button on the welcome screen.
+1. Follow the prompts to create a name for your cluster and copy a `kubectl` command to run in your cluster.
+
+
+ What's happening in this command?
+
+ This command creates three resources in your cluster:
+ * **A `ManagementClusterConnection` resource**.
+ This resource specifies the address of the Calico Cloud management cluster.
+ * **A `Secret` resource (`tigera-managed-cluster-connection`)**.
+ This resource provides certificates for secure communication between your cluster and the Calico Cloud management cluster.
+ * **A `Secret` resource (`tigera-voltron-linseed-certs-public`)**.
+ This resource provides certificates for secure communications for the specific components that Calico Cloud uses for log data and observability.
+
+ ```bash title='Example of generated kubectl command to connect a cluster to Calico Cloud Free Tier'
+ kubectl apply -f - <
+
+1. To start the connection process, run the `kubectl` command in your terminal.
+
+ ```bash title='Sample output'
+ managementclusterconnection.operator.tigera.io/tigera-secure created
+ secret/tigera-managed-cluster-connection created
+ secret/tigera-voltron-linseed-certs-public created
+ ```
+
+1. After your run the command, click **I applied the manifest** to continue.
+
+## Verify your connection
+
+* From the web console, click **Managed clusters** to view a list of managed clusters.
+ If your cluster connected successfully, you'll see its connection status is **Connected**.
+
+## Troubleshooting
+
+This section describes solutions to common connection problems.
+
+### Connection status is **Connected**, but there is no data in my dashboards or Service Graph
+
+#### Cause: The `Goldmane` resource is not enabled
+
+Goldmane is the component that serves the flow logs API.
+Without it, your cluster may be able to connect to Calico Cloud Free Tier, but it won't be able to provide flow logs.
+
+To fix this problem:
+
+* [Enable `Goldmane` custom resource](/calico/latest/observability/enable-whisker).
+
+ A few minutes after you apply the `Goldmane` resource, you will begin to see data in your dashboards and Service Graph.
+
+### Connection status remains **Disconnected** after applying the connection manifest
+
+#### Cause 1: Your cluster is running Calico Open Source 3.29 or earlier
+
+Clusters with Calico Open Source 3.29 or earlier can't connect to Calico Cloud Free Tier.
+
+After applying the connection manifest, you may get output like this:
+
+```bash
+secret/tigera-managed-cluster-connection created
+secret/tigera-voltron-linseed-certs-public created
+error: resource mapping not found for name: "tigera-secure" namespace: "" from "STDIN": no matches for kind "ManagementClusterConnection" in version "operator.tigera.io/v1"
+ensure CRDs are installed first
+```
+
+To fix this problem:
+
+1. [Upgrade your cluster to Calico Open Source 3.30 or later](/calico/latest/operations/upgrading/kubernetes-upgrade#upgrading-an-installation-that-uses-the-operator) and [enable the `Goldmane` resource](/calico/latest/observability/enable-whisker).
+1. Reapply the connection manifest.
+
+#### Cause 2: Your network environment restricts egress traffic to the Calico Cloud management cluster
+
+If your network environment restricts egress traffic to the Calico Cloud management cluster, you need to create allow rules so your cluster can connect.
+
+To fix this problem:
+
+1. Locate the address of the Calico Cloud management cluster in the `ManagementClusterAddr` field of the `ManagementClusterConnection` resource:
+
+ ```bash
+ kubectl get managementclusterconnection tigera-secure -o jsonpath='{.spec.managementClusterAddr}'
+ ```
+
+ You'll see something like this:
+
+ ```bash title='Sample output'
+ oss-ui-01-management.calicocloud.io:443
+ ```
+
+1. Make sure your network allows TCP egress traffic to this address.
+
+
+## Next steps
+
+* To try out the observability tools with a demo application, follow the quickstart guide from [Step 4: Deploy the demo app](quickstart.mdx#step-4-deploy-the-demo-app).
+* [Remove a cluster from Calico Cloud Free Tier](disconnect-cluster-free.mdx)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/free/disconnect-cluster-free.mdx b/calico-cloud_versioned_docs/version-24-1/free/disconnect-cluster-free.mdx
new file mode 100644
index 0000000000..8871279d08
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/free/disconnect-cluster-free.mdx
@@ -0,0 +1,42 @@
+---
+description: Disconnect a Kubernetes cluster from Calico Cloud Free Tier and remove the Calico Cloud components it installed.
+title: Remove a cluster
+---
+
+# Remove a cluster from Calico Cloud Free Tier
+
+You can disconnect and remove your cluster from Calico Cloud Free Tier in minutes.
+When you remove your cluster, you will no longer be able to view or manage it from the Calico Cloud web console.
+All log data will be permanently deleted within 24 hours.
+
+## Prerequisites
+
+* You have a cluster that is connected to Calico Cloud Free Tier.
+* You are signed in to the $[prodname] web console.
+* You have `kubectl` access to the connected Kubernetes cluster.
+
+## Remove a cluster from Calico Cloud Free Tier
+
+1. Disconnect your cluster from Calico Cloud Free Tier by deleting the three resources you created to connect your cluster:
+
+ ```bash
+ kubectl delete managementclusterconnection tigera-secure
+ kubectl delete secret -n tigera-operator tigera-managed-cluster-connection
+ kubectl delete secret -n tigera-operator tigera-voltron-linseed-certs-public
+ ```
+ ```bash title='Sample output'
+ managementclusterconnection.operator.tigera.io "tigera-secure" deleted
+ secret "tigera-managed-cluster-connection" deleted
+ secret "tigera-voltron-linseed-certs-public" deleted
+ ```
+
+ On the **Managed Clusters** page, your cluster's connection status will change to **Disconnected**.
+
+
+
+1. To remove your cluster from Calico Cloud, click **Actions > Delete**.
+1. If you made changes to your network policies or firewall to allow egress traffic to Calico Cloud, you may want to revert those changes.
+
+## Next steps
+
+* [Connect a cluster to Calico Cloud Free Tier](connect-cluster-free.mdx)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/free/index.mdx b/calico-cloud_versioned_docs/version-24-1/free/index.mdx
new file mode 100644
index 0000000000..9fd29836b2
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/free/index.mdx
@@ -0,0 +1,14 @@
+---
+description: Connect a Kubernetes cluster to Calico Cloud Free Tier — a no-cost path to centralized network observability without a paid Calico Cloud subscription.
+---
+
+import { DocCardLink, DocCardLinkLayout } from '/src/___new___/components';
+
+# Calico Cloud Free Tier
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/free/overview.mdx b/calico-cloud_versioned_docs/version-24-1/free/overview.mdx
new file mode 100644
index 0000000000..e99e0984d1
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/free/overview.mdx
@@ -0,0 +1,99 @@
+---
+description: What Calico Cloud Free Tier includes and excludes versus paid Calico Cloud — limits, supported platforms, and the upgrade path to a paid subscription.
+title: Overview
+---
+
+import Screenshot from '/src/___new___/components/Screenshot';
+export let figCount = 1;
+
+# Calico Cloud Free Tier
+
+Learn about the observability tools available to you when you connect your Calico Open Source cluster to the Calico Cloud Free Tier web console.
+
+## About Calico Cloud Free Tier
+
+Calico Cloud Free Tier provides essential observability tools for understanding and securing your Kubernetes cluster.
+With these tools, you can monitor network traffic, visualize service interactions, and gain insights into the behavior of your network policies.
+
+A free account with Calico Cloud allows you to connect one cluster to the free-tier web console.
+The cluster must be running Calico Open Source 3.30 or later.
+
+Features available in the free-tier web console are similar to those in the pro-tier console, but with some limitations.
+For example, you can view your network policies, but you cannot edit them directly in the console, as you can with Calico Cloud Pro.
+As a general rule, the free-tier console allows you to view what's going on in your cluster.
+To make changes, such as creating or editing policies, you must use `kubectl` commands in your cluster.
+
+### What happens when you connect your cluster?
+
+Calico Open Source 3.30 introduced a new component, Goldmane, which exposes a gRPC API with aggregated flow logs from your cluster.
+This is the data source that feeds [Calico Whisker](/calico/latest/observability/view-flow-logs), an in-cluster web console that displays a stream of flows.
+
+Calico Cloud Free Tier uses the same flow logs API to receive data from your cluster.
+When you connect your cluster to Calico Cloud Free Tier, you apply manifests that establish a secure connection to the Calico Cloud management cluster.
+These manifests create a `ManagementClusterConnection` resource in your cluster, which specifies the address of the Calico Cloud management cluster, and two `Secret` resources that provide certificates for secure communication.
+
+Unlike Whisker, which can only display a stream of flows in real time, Calico Cloud Free Tier collects and retains flow logs for a 24-hour period.
+You can sign in to the console at any time to view data from the last 24 hours.
+If you choose to disconnect and remove your cluster from the console, your data is deleted after a day.
+
+And because you're not installing anything complicated in your cluster, you can easily remove the resources and restore you cluster to its previous state.
+
+## Feature overview
+
+Calico Cloud Free Tier provides a set of observability features that help you monitor and manage your cluster's network traffic.
+
+### Dashboards
+
+Dashboards help you see and understand the activity in your cluster using categorized graphs and charts.
+They visually represent data from your logs, providing a birds-eye view of cluster health, traffic volume, DNS activity, and performance metrics.
+This allows for quick assessment of the overall state of your cluster's network.
+
+
+*Figure {figCount++}: The traffic volume dashboard*
+
+### Service Graph
+
+Service Graph provides a point-to-point, topographical representation of network traffic within your cluster.
+It serves as the primary tool for visualizing how services communicate and for troubleshooting connectivity issues.
+You can click on nodes or connections to see detailed information and associated logs for targeted analysis.
+
+
+*Figure {figCount++}: The Service Graph page.*
+
+### Policies
+
+Network policy is the primary tool for securing a Kubernetes network by controlling traffic flow.
+Policies restrict network traffic (egress and ingress) in your cluster so only the traffic that you explicitly allow can flow.
+Calico Cloud supports standard Kubernetes policies and its own enhanced network policies for fine-grained control.
+
+
+*Figure {figCount++}: The Policies page.*
+
+For more information, see the Calico Open Source [network policy documentation](/calico/latest/network-policy/).
+
+### Policy recommendations
+
+Policy recommendations help you secure your Kubernetes environments by automatically suggesting network policies based on observed network traffic.
+This proactively identifies necessary communication flows and enables you to implement a least-privilege security model with minimal effort.
+The recommendations are generated by analyzing flow logs.
+You can activate the recommendations as staged network policies for testing before you use them in production.
+
+
+*Figure {figCount++}: The Policy Recommendations page.*
+
+### Network sets
+
+Network sets are resources for defining IP subnetworks or CIDRs, which can then be easily referenced in network policies using standard label selectors.
+They are a powerful feature for simplifying policy management, especially when dealing with external network ranges or grouping common IP addresses.
+Using network sets makes policies more reusable and scalable.
+
+For more information, see:
+* [Understanding network sets](../tutorials/calico-cloud-features/networksets.mdx).
+* Calico Open Source resource documentation on [Network set](/calico/latest/reference/resources/networkset) and [Global network set](/calico/latest/reference/resources/globalnetworkset).
+
+## Next steps
+
+* [Sign up for a free account with Calico Cloud](https://calicocloud.io/?code=free).
+* [Tutorial: Quickstart guide to Calico Cloud Free Tier](quickstart.mdx).
+* [Connect a cluster to Calico Cloud Free Tier](connect-cluster-free.mdx)
+* For an overview of the expanded feature set in Calico Cloud Pro, take a [tour of the full web console](../tutorials/calico-cloud-features/tour.mdx).
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/free/quickstart.mdx b/calico-cloud_versioned_docs/version-24-1/free/quickstart.mdx
new file mode 100644
index 0000000000..6f42333fda
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/free/quickstart.mdx
@@ -0,0 +1,174 @@
+---
+description: Quickstart that connects a Kubernetes cluster to Calico Cloud Free Tier for centralized network observability — no payment or trial required.
+title: Quickstart
+---
+
+import Screenshot from '/src/___new___/components/Screenshot';
+export let figCount = 1;
+
+# Calico Cloud Free Tier quickstart guide
+
+Get Calico Cloud running on a local Kind cluster, deploy a realistic microservices app, and explore your live Service Graph — all in a few minutes.
+
+## Before you begin
+
+* [Sign up for a Calico Cloud Free Tier account](https://calicocloud.io/?code=free).
+* Install [Kind](https://kind.sigs.k8s.io/docs/user/quick-start/), [Docker](https://docs.docker.com/desktop/), and [kubectl](https://kubernetes.io/docs/tasks/tools/#kubectl).
+
+## Step 1: Create a Kind cluster
+
+1. Create a file called `kind-config.yaml`:
+
+ ```yaml
+ kind: Cluster
+ apiVersion: kind.x-k8s.io/v1alpha4
+ nodes:
+ - role: control-plane
+ - role: worker
+ - role: worker
+ networking:
+ disableDefaultCNI: true
+ podSubnet: 192.168.0.0/16
+ ```
+
+ This tells Kind to create a three-node cluster without a default CNI, so you can install Calico in the next step.
+
+1. Create the cluster:
+
+ ```bash
+ kind create cluster --name=calico-cluster --config=kind-config.yaml
+ ```
+
+1. Verify the nodes are up (they'll show `NotReady` until Calico is installed):
+
+ ```bash
+ kubectl get nodes
+ ```
+
+ ```bash title="Expected output"
+ NAME STATUS ROLES AGE VERSION
+ calico-cluster-control-plane NotReady control-plane 60s v1.29.2
+ calico-cluster-worker NotReady 40s v1.29.2
+ calico-cluster-worker2 NotReady 40s v1.29.2
+ ```
+
+## Step 2: Install Calico
+
+1. Install the Tigera operator and custom resource definitions:
+
+ ```bash
+ kubectl create -f $[manifestsUrl]/manifests/tigera-operator.yaml
+ ```
+
+1. Install $[prodname] by creating the necessary custom resources:
+
+ ```bash
+ kubectl create -f $[manifestsUrl]/manifests/custom-resources.yaml
+ ```
+
+1. Wait for all components to become available:
+
+ ```bash
+ watch kubectl get tigerastatus
+ ```
+
+ After a few minutes, all components should show `True` in the `AVAILABLE` column.
+
+ ```bash title="Expected output"
+ NAME AVAILABLE PROGRESSING DEGRADED SINCE
+ apiserver True False False 4m9s
+ calico True False False 3m29s
+ goldmane True False False 3m39s
+ ippools True False False 6m4s
+ whisker True False False 3m19s
+ ```
+
+## Step 3: Connect to Calico Cloud Free Tier
+
+1. In the Calico Cloud web console, click **Connect a cluster**.
+1. Follow the prompts to name your cluster (for example, `quickstart-cluster`) and copy the generated `kubectl` command.
+
+
+ What's happening in this command?
+
+ This command creates three resources in your cluster:
+ * **A `ManagementClusterConnection` resource**.
+ This resource specifies the address of the Calico Cloud management cluster.
+ * **A `Secret` resource (`tigera-managed-cluster-connection`)**.
+ This resource provides certificates for secure communication between your cluster and the Calico Cloud management cluster.
+ * **A `Secret` resource (`tigera-voltron-linseed-certs-public`)**.
+ This resource provides certificates for secure communications for the specific components that Calico Cloud uses for log data and observability.
+
+
+1. Run the `kubectl` command in your terminal.
+1. Back in the console, click **I applied the manifest**.
+ When the **Managed Clusters** page shows your cluster as **Connected**, move to the next step.
+
+## Step 4: Deploy the demo app
+
+This step deploys [Google's Online Boutique](https://github.com/GoogleCloudPlatform/microservices-demo), a microservices demo with 12 services.
+Each service is deployed in its own namespace so that Service Graph displays a rich cross-namespace topology with realistic traffic patterns.
+
+1. Deploy the application:
+
+ ```bash
+ kubectl apply -f $[tutorialFilesURL]/online-boutique-namespaced.yaml
+ ```
+
+ :::note
+
+ The manifest includes a load generator that automatically drives traffic between all services.
+ No manual traffic generation is needed.
+
+ :::
+
+1. Wait for all pods to reach `Running` status:
+
+ ```bash
+ watch "kubectl get pods -A | grep -v Running | grep -v Completed"
+ ```
+
+ This may take 2–3 minutes. When the only output is the header line, all pods are ready.
+
+
+ What's in the demo app?
+
+ The Online Boutique is a cloud-native e-commerce app made up of 12 microservices:
+ `adservice`, `cartservice`, `checkoutservice`, `currencyservice`, `emailservice`, `frontend`, `loadgenerator`, `paymentservice`, `productcatalogservice`, `recommendationservice`, `redis-cart`, and `shippingservice`.
+
+ Each service runs in its own namespace.
+ A built-in load generator continuously sends requests through the frontend, creating realistic traffic across all services.
+
+
+## Step 5: Explore Service Graph
+
+In the Calico Cloud web console, go to **Service Graph**.
+Within a minute or two you'll see every service and namespace mapped as a live node, with directional traffic flows between them.
+
+Try clicking on a service — for example, `cartservice`. You'll see:
+* Which services send traffic to it (such as `checkoutservice` and `frontend`)
+* Which services it connects to (such as `redis-cart`)
+* Flow logs with details on allowed and denied connections
+
+
+*Figure {figCount++}: Service Graph showing cross-namespace traffic flows between the Online Boutique microservices.*
+
+## Step 6: Clean up
+
+1. Delete the Kind cluster:
+
+ ```bash
+ kind delete cluster --name=calico-cluster
+ ```
+
+1. In the Calico Cloud web console, go to **Managed Clusters**, click **Actions > Disconnect**, and then click **I ran the commands**.
+ (Because you already deleted the cluster, you don't need to run the disconnect commands.)
+
+1. Click **Actions > Remove** to fully remove the cluster from Calico Cloud.
+
+## Next steps
+
+* [Write a network policy](/calico-cloud/network-policy/beginners/calico-network-policy) to restrict traffic between services — for example, allow only `cartservice` to reach `redis-cart`.
+* [Set up alerts](/calico-cloud/observability/alerts) for unexpected traffic patterns.
+* [Explore the full feature set](/calico-cloud/free/overview) available on the Free Tier.
+* [Connect another cluster](/calico-cloud/free/connect-cluster-free) to Calico Cloud Free Tier.
diff --git a/calico-cloud_versioned_docs/version-24-1/get-help/support.mdx b/calico-cloud_versioned_docs/version-24-1/get-help/support.mdx
new file mode 100644
index 0000000000..deafae328a
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-help/support.mdx
@@ -0,0 +1,33 @@
+---
+description: Support and feedback channels for Calico Cloud users, including the Tigera support portal, in-console help, status page, and the Calico Cloud support policy.
+---
+
+import IconUser from '/img/icons/user-icon.svg';
+
+# Support and feedback
+
+## Contact Support
+
+You can find solutions to many common problems by following our [troubleshooting checklist](../get-started/checklist.mdx) or by consulting the [Tigera Help Center](https://www.tigera.io/calico-support/).
+
+For everything else, you can open a support ticket.
+
+### Paid Calico Cloud users
+
+Sign in to the [support portal](https://tigeraio.my.site.com/community/s/login/) to open a ticket.
+
+### Free trial users
+
+From the web console, click the user icon > **Contact Support**, and then complete the form.
+
+## Provide feedback
+
+We value your feedback and suggestions for improvement. Email us: help@calicocloud.io.
+
+## Support policy
+
+For details, see our [Support policy](https://www.tigera.io/legal/calico-cloud-support-policy).
+
+## Check the status of Calico Cloud services
+
+Go to [Calico Cloud Status](https://status.calicocloud.io) to view the current status of our sites and services.
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/cc-arch-diagram.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/cc-arch-diagram.mdx
new file mode 100644
index 0000000000..d15723edd0
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/cc-arch-diagram.mdx
@@ -0,0 +1,45 @@
+---
+description: Architecture overview of Calico Cloud — components that run in the connected cluster and the SaaS-side services they communicate with.
+---
+
+# Calico Cloud architecture
+
+## $[prodname] security
+
+$[prodname] architecture is based on the $[prodname] multi-cluster management feature. $[prodname] manages the control plane, and you connect your clusters (called **managed clusters**) to the control plane. Communication between the $[prodname] control plane and managed clusters is secured using TLS tunnels.
+
+
+
+The components that secure communications between the $[prodname] control plane and managed clusters are:
+
+- **$[prodname] tunnel server** - accepts secure TLS connections from managed clusters
+- **Guardian** - an agent that runs in each managed cluster that proxies communication between $[prodname] components and managed cluster components
+
+All connections go through the $[prodname] tunnel server and Guardian. The only exception is during installation and upgrade when managed clusters connect to $[prodname] using TLS connections to get install/update resources, register the cluster, and report the status of the install/update.
+
+The $[prodname] tunnel is initiated by Guardian on the managed cluster. The $[prodname] control plane does not initiate new connections to the managed cluster outside of the tunnel. However, there are connections that go through the $[prodname] tunnel server that are initiated from the control plane; for example, when a user interacts with the web console, or when configuration needs to be pushed into the managed cluster.
+
+## Managed cluster components
+
+The following diagram shows the major components in a managed cluster, followed by component descriptions.
+
+
+
+| Component | Description | Ports/Protocol |
+| ------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| $[prodname] controller | Deploys required resources for $[prodname]. | TCP 6443 to Kubernetes API server |
+| $[prodname] installer | Gets installation resources from the $[prodname] portal, registers a managed cluster, and reports installation or upgrade progress. | • TCP 443 to $[prodname] hosted service • TCP 6443 to Kubernetes API server |
+| $[prodname] tunnel server | Communicates with managed clusters by creating secure TLS tunnels. | Port 9000 from managed clusters |
+| calico-node | Bundles key components that are required for networking containers with $[prodname]:
• Felix • BIRD • confd | • TCP 5473 to Typha • TCP 9900 and 9081 from Prometheus API service |
+| Fluentd | Open-source data collector for unified logging. Collects and forwards $[prodname] logs (flows, DNS, L7) to log storage. | • TCP 8080 to Guardian • TCP 9080 from Prometheus API service |
+| Guardian | An agent running in each managed cluster that proxies communication between the $[prodname] tunnel server and your managed cluster. Secured using TLS tunnels. | • Port 9000 to tunnel server • TCP 6443 to Kubernetes API server • TCP 6443 from $[prodname] components |
+| Installation endpoints | Endpoints at `*.calicocloud.io` and `*.projectcalico.org`. | TCP 443 for both |
+| Intrusion detection controller | Handles integrations with threat intelligence feeds and $[prodname] custom alerts. | • TCP 8080 to Guardian • TCP 6443 to Kubernetes API server |
+| Kubernetes API server | A Kubernetes component that validates and configures data for the API objects (for example, pods, services, and others). | TCP 6443 (from all components) |
+| kube-controllers | Monitors the Kubernetes API and performs actions based on cluster state. $[prodname] kube-controllers container includes these controllers:
• Node • Service • Federated services • Authorization | • TCP 9094 from Prometheus API service • TCP 6443 to Kubernetes API server |
+| Log storage | Storage for logs (flows, L7, DNS, audit). Data for each managed cluster is isolated and protected against unauthorized access. | n/a |
+| Packet capture API | Retrieves capture files (pcap format) generated by a packet capture for use with network protocol analysis tools like Wireshark. Packet capture data is visible in the web console and Service Graph. | • TCP 8449 Guardian to Packet Capture API • TCP 6443 to Kubernetes API server |
+| Prometheus API service | Collects metrics from $[prodname] components and makes the metrics available to the web console. | • TCP 6443 to Kubernetes API server • TCP 9080 to Fluentd • TCP 9900 and 9081 to Prometheus API service |
+| Tigera API server | Allows users to manage $[prodname] resources such as policies and tiers through kubectl or the Kubernetes API server. | • TCP 9095 to Prometheus API service • TCP 8080 from Kubernetes API server |
+| Typha | Increases scale by reducing each node’s impact on the datastore. | TCP 5473 from calico-node to Typha |
+| User access to the web console | Authenticated users can access the browser-based the web console, which provides network traffic visibility and troubleshooting, centralized multi-cluster management, threat-defense, and policy lifecycle management for multiple roles/stakeholders. | Port 443 to $[prodname] tunnel server |
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/checklist.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/checklist.mdx
new file mode 100644
index 0000000000..7186a494f5
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/checklist.mdx
@@ -0,0 +1,82 @@
+---
+description: Gather information and run pre-flight checks before opening a Calico Cloud support ticket so triage moves quickly.
+---
+
+# Troubleshooting checklist
+
+## Check $[prodname] installation
+
+Installing $[prodname] on your Kubernetes cluster is managed by the $[prodname] operator. The $[prodname] operator is deployed as a Deployment in the `calico-cloud` namespace, and records status in a custom resource named `installer`.
+
+Check the `installer` status using the following command.
+
+```bash
+kubectl get installer default --namespace calico-cloud -o jsonpath --template '{.status}'
+```
+
+**Sample output**
+
+```
+{"clusterName":"my-new-cluster","state":"installing"}
+```
+
+After `state` is `complete`, $[prodname] is properly installed.
+
+## Check logs for fatal errors
+
+Check that the $[prodname] operator is running and that logs do not have any fatal errors.
+
+```bash
+kubectl logs -n calico-cloud deployment/calico-cloud-controller-manager
+2022-04-04T14:34:32.472Z INFO controller-runtime.metrics metrics server is starting to listen {"addr": "127.0.0.1:8080"}
+2022-04-04T14:34:32.472Z INFO setup starting manager
+2022-04-04T14:34:32.472Z INFO setup config {"ccBaseURL": "https://www.dev.calicocloud.io/api", "debug": false, "leader-elect": true}
+I0404 14:34:32.472586 1 leaderelection.go:243] attempting to acquire leader lease calico-cloud/c2ad41ce.calicocloud.io...
+2022-04-04T14:34:32.472Z INFO controller-runtime.manager starting metrics server {"path": "/metrics"}
+I0404 14:34:32.480870 1 leaderelection.go:253] successfully acquired lease calico-cloud/c2ad41ce.calicocloud.io
+<...>
+```
+
+## Check custom resources
+
+Verify that you have the **installer custom resource**, and that the values are appropriate for your environment.
+
+```bash
+kubectl get installers.operator.calicocloud.io --namespace calico-cloud -o yaml
+```
+
+```yaml
+apiVersion: v1
+items:
+ - apiVersion: operator.calicocloud.io/v1
+ kind: Installer
+ metadata:
+ annotations:
+ kubectl.kubernetes.io/last-applied-configuration: |
+ {"apiVersion":"operator.calicocloud.io/v1","kind":"Installer","metadata":{"annotations":{},"name":"my-new-cluster","namespace":"calico-cloud"}}
+ creationTimestamp: '2022-04-04T14:34:29Z'
+ generation: 1
+ name: my-new-cluster
+ namespace: calico-cloud
+ resourceVersion: '1102'
+ uid: eb1d1cd0-f01f-47b2-81fe-8eee46dbe712
+ status:
+ clusterName: my-new-cluster
+ message: ''
+ resourceVersion: ''
+ state: installing
+kind: List
+metadata:
+ resourceVersion: ''
+ selfLink: ''
+```
+
+## Send failed installation diagnostics to Calico Cloud support
+
+To upload diagnostics about a failed installation to $[prodname] support, run the following command:
+
+```bash
+kubectl patch installer -n calico-cloud default --type merge -p='{"spec":{"uploadDiags":true}}'
+```
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/connect-cluster.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/connect-cluster.mdx
new file mode 100644
index 0000000000..e4e4045eb6
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/connect-cluster.mdx
@@ -0,0 +1,66 @@
+---
+description: What happens when you connect a Kubernetes cluster to Calico Cloud — what is installed, what data leaves the cluster, and what changes in the cluster.
+---
+
+# What happens when you connect a cluster to Calico Cloud
+
+Although connecting your cluster to $[prodname] is easy, we also understand you may want details about what happens when your cluster is managed by $[prodname]. We hope this article, along with the other topics in this section, gives you the information you need to install $[prodname] with confidence. If you have other questions, let us know: [Support policy](https://www.tigera.io/legal/calico-cloud-support-policy) or email: feedback@calicocloud.io.
+
+## What happens when you connect your cluster
+
+- Your cluster is registered and connected to $[prodname]
+- Your Calico open source install is updated with resources for $[prodname] features
+- Tigera components and services are added to collect metrics and logs that are sent to the Calico Cloud management plane, which provides the basis for visibility and troubleshooting
+- Policies are added to secure communications between Tigera components
+- A global threat feed is added to alert on any egress traffic to addresses in the threat feed to protect the cluster
+- All of your existing network policies (Kubernetes and Calico) can be found in a single place: the default tier
+
+After your cluster is connected, it is listed in the Managed Clusters page where you can move between multiple clusters.
+
+
+
+## What happens when you disconnect your cluster
+
+Whether you’ve finished your $[prodname] Trial, or terminated your licensed $[prodname] subscription, we know you want your cluster to remain functional. $[prodname] provides a migration script that returns your cluster to a working state in open-source Calico. The migration script:
+
+- Removes and cleans up all $[prodname] components and services that have no equivalent in open-source Calico
+- Switches the operator configuration to open-source Calico, which migrates your cluster to a version of open-source Calico
+- Ensures all Calico policies are migrated to the default tier, or allows you to remove all Calico policies
+
+For details of the migration script, see [Uninstall $[prodname] from a cluster](../operations/disconnect.mdx).
+
+## What happens under the covers when you connect your cluster
+
+### Pre-check
+
+- Verifies that your cluster can be migrated, and validates that the cluster platform and version is supported by $[prodname]
+- Records the number of nodes and other basic attributes of your cluster. This data remains on your system and is used for troubleshooting in case there are issues connecting your cluster.
+
+### Install and connect
+
+- Based on the Calico install for your cluster, the manifest is upgraded/migrated to use the $[prodname] Tigera Operator. (Note that clusters installed using Helm are currently not supported.)
+- Tigera Operator installs the required $[prodname] Custom Defined Resources (CRDs), and a standard pull secret to allow access to $[prodname] images
+- Installs a Prometheus instance for component metrics (if it doesn’t already exist on the cluster)
+- Pushes a license to the cluster so components receive appropriate entitlements
+- Adds custom namespaces, service account, and role bindings to support cluster access and permissions to the $[prodname] user interface
+- Creates RBAC permissions to access these resources:
+ - Number of nodes in the cluster and stats for billing purposes
+ - Policies in the cluster, and pod information
+- Registers the cluster so it can connect to $[prodname]
+- Creates a global threat feed to alert on any egress traffic to addresses in the threat feed
+- Adds policies to secure communication for $[prodname] components, including safeguards that prevent any new network policies from impacting the vital functions of the cluster
+- Creates roles and bindings to allow the installer to operate and to allow Calico Cloud to operate after installation.
+ Each of these objects is given minimal permissions for its specific function.
+- Creates roles and bindings for two user types for access to the web console:
+ - **Admin** - full permissions for network policies and $[prodname] resources, and read permissions for namespace and pods
+ - **User** - read-only/view permissions to same resources above
+
+## How long does it take to connect a cluster?
+
+Typically, about 5 minutes.
+
+## Troubleshooting an installation
+
+- A checklist to [troubleshoot your installation](checklist.mdx)
+
+- Additional troubleshooting for the [Tigera Operator](operator-checklist.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/index.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/index.mdx
new file mode 100644
index 0000000000..f35b054054
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/index.mdx
@@ -0,0 +1,43 @@
+---
+description: Connect Kubernetes clusters to Calico Cloud and upgrade them — the entry point for the Calico Cloud onboarding flow.
+hide_table_of_contents: true
+---
+
+import { DocCardLink, DocCardLinkLayout } from '/src/___new___/components';
+
+# Install and upgrade
+
+Requirements and guides for connecting your Kubernetes cluster to Calico Cloud.
+
+## Before you begin
+
+
+
+
+
+
+
+
+
+## Connect your cluster
+
+
+
+
+
+
+
+
+
+## Troubleshooting
+
+
+
+
+
+
+## Upgrade
+
+
+
+
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/install-automated.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/install-automated.mdx
new file mode 100644
index 0000000000..8d302efd65
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/install-automated.mdx
@@ -0,0 +1,190 @@
+---
+description: Connect a Kubernetes cluster to Calico Cloud as part of an automated CI or provisioning workflow rather than the interactive UI flow.
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import IconUser from '/img/icons/user-icon.svg';
+
+# Install Calico Cloud as part of an automated workflow
+
+You can connect clusters to Calico Cloud as part of an automated workflow, using persistent client credentials and customized Helm charts.
+
+## Prerequisites
+
+* You have an paid Calico Cloud account.
+* You are signed in to the web console as a user with the **Owner** or **Admin**, role.
+* You have at least one cluster that meets our [system requirements](system-requirements.mdx).
+* You have kubectl access to the cluster.
+* You have installed Helm 3.0 or later on your workstation.
+
+## Create client credentials
+
+Create client credentials and generate a Kubernetes secret to use for automated Helm installations.
+
+1. Select the user icon **> Settings**.
+1. Under the **Client Credentials** tab, click **Add Client Credential**
+1. In the **Add Client Credential** dialog, enter a name and click **Create**.
+ Your new client credential will appear in the list on the **Manage Client Credentials** page.
+1. Locate the newly created client credential in the list and select **Action** > **Manage keys** > **Add Key**
+1. Enter a name, choose how long the key will be valid, and click **Create key**.
+1. Click **Download** to download the `.yaml` secret file and store it in a secure location.
+ You will not be able to retrieve this secret again.
+
+:::important
+
+To ensure that you always have a valid key, you should transition to a second key before the first key expires.
+Create a second key, download the secret, and then replace copies of the secret file for the first key with the secret file for the second key.
+When all the secrets from the first key have been replaced, you can safely delete the first key from the **Client Credentials** page.
+When the key is deleted, all API requests based on that key will be rejected.
+
+:::
+
+## About customizing your Helm installation
+
+You can customize your Calico Cloud installation for the following purposes:
+
+* to enable or disable certain features
+* to modify pod scheduling and resource management
+
+To do this, you can either edit the default `values.yaml` file or pass individual key-value pairs using the `--set` flag for the `helm upgrade` command.
+
+### Required parameters
+
+The following parameters are required for all Calico Cloud installations.
+
+| Parameter | Value | Example | Description |
+| -- | -- | -- | -- |
+| `installer.clusterName` | string | `cluster-name` | The name given to your managed cluster in Calico Cloud. |
+| `installer.calicoCloudVersion` | string | `$[cloudUserVersion]` | The version of Calico Cloud you're installing. |
+
+
+```yaml title="Example from values.yaml with clusterName and calicoCloudVersion"
+installer:
+ clusterName: example-cluster
+ calicoCloudVersion: $[cloudUserVersion]
+```
+
+### Optional parameters for private registries
+
+If you're using a private registry, you must set the following parameters.
+
+| Parameter | Value | Example | Description |
+| -- | -- | -- | -- |
+| `installer.registry` | string | `my.registry/` | The name of your private registry. |
+| `installer.imagePath` | string | `path/to/directory` | The path to a directory in your private registry that contains images required to install Calico Cloud. |
+| `imagePullSecrets.name` | string | `secret-name` | The name of the image pull secret you will use to allow access from the `calico-cloud` namespace to your private registry. |
+
+### Optional parameters for features
+
+The following parameters enable certain features in Calico Cloud.
+These features can be enabled or disabled only by setting them in your `values.yaml` file at installation.
+
+| Feature name | Parameter | Values |
+|---------|-----|--------|
+| Packet Capture | `installer.components.packetCaptureAPI.state` | `Enabled`, `Disabled` (default) |
+
+:::note
+
+If you're upgrading from Calico Cloud 19, the Packet Capture features will remain enabled unless you explicitly set them to `Disabled`.
+
+:::
+
+### Optional parameters for pod scheduling and resource management
+
+For many Calico Cloud components, you can specify node selectors, tolerations, and resource requests and limits.
+The full list of Calico Cloud components is available in the default `values.yaml` file.
+
+:::note
+Helm may overwrite previous customizations of custom resource fields available under the `installer.components` Helm parameter.
+For `installer.components`, you should define all your `values.yaml` customizations to be sure nothing is lost during Calico Cloud upgrades and reinstalls.
+:::
+
+## Prepare your values.yaml with customizations
+
+***Prerequisites***
+* You reviewed the information about available customizations in [About customizing your Helm installation](#about-customizing-your-helm-installation).
+* If you're installing from a private registry, you [added the Calico Cloud images to a private registry](setup-private-registry.mdx), and you have the following information about the registry:
+ * Registry secret name
+ :::note
+ If your private registry requires credentials, create a `calico-cloud` namespace on your cluster.
+ Then, create an image pull secret and use this name for the **Registry Secret Name**.
+ :::
+ * Image registry
+ * Image path
+
+1. Add the Calico Cloud Helm repository to your local client:
+
+ ```bash
+ helm repo add calico-cloud https://installer.calicocloud.io/charts --force-update
+ ```
+
+1. Save the default values definitions to your workstation so you can edit them locally:
+ ```bash
+ helm show values calico-cloud/calico-cloud > .yaml
+ ```
+ All editable values are provided in the default values definitions.
+
+1. Add values for the required parameters, `installer.clusterName` and `installer.calicoCloudVersion`.
+
+ ```yaml title="Example from values.yaml file with clusterName and calicoCloudVersion"
+ installer:
+ clusterName: example-cluster
+ calicoCloudVersion: $[cloudUserVersion]
+ ```
+
+1. Add values for the optional parameters.
+ For each resource you want to edit, uncomment the object, add a value, and save.
+
+ ```yaml title="Example from values.yaml file with Packet Capture enabled"
+ installer:
+ components:
+ packetCaptureAPI:
+ state: Enabled
+ ```
+
+## Install Calico Cloud as part of an automated workflow
+
+You can install Calico Cloud using repeatable kubectl or Helm commands together with valid client credentials.
+These commands can be added to any automated workflow.
+
+***Prerequisites***
+
+* You have generated a set of client credentials and you know the path to your secret.
+* You have a `values.yaml` file with your customizations.
+
+1. Add the Calico Cloud Helm repository to your local client.
+
+ ```bash
+ helm repo add calico-cloud https://installer.calicocloud.io/charts --force-update
+ ```
+
+1. Add the Calico Cloud custom resource definitions:
+
+ ```bash
+ helm upgrade --install calico-cloud-crds calico-cloud/calico-cloud-crds \
+ --namespace calico-cloud \
+ --create-namespace
+ ```
+
+1. Apply the client credentials secret to your cluster.
+
+ ```bash
+ kubectl apply -f
+ ```
+
+ :::important
+ You should keep track of this with a secret management system.
+ :::
+
+1. Apply the Calico Cloud installer custom resource with your customizations in the `values.yaml` file.
+
+ ```bash
+ helm upgrade --install calico-cloud calico-cloud/calico-cloud \
+ --namespace calico-cloud \
+ -f .yaml
+ ```
+
+## Additional resources
+
+* [Calico Cloud installation reference](https://docs.tigera.io/calico-cloud/reference/installation/api)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/install-cluster.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/install-cluster.mdx
new file mode 100644
index 0000000000..59365dd3e1
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/install-cluster.mdx
@@ -0,0 +1,64 @@
+---
+description: Connect a Kubernetes cluster to Calico Cloud using the standard install command from the management UI.
+title: Install Calico Cloud
+---
+
+# Connect a cluster to Calico Cloud
+
+You can quickly connect a cluster to Calico Cloud by generating a unique kubectl or Helm command in the web console and running it on your cluster.
+
+## Prerequisites
+
+* You have an paid Calico Cloud account.
+* You are signed in to the web console as a user with the **Owner**, **Admin**, or **DevOps** role.
+* You have at least one cluster that meets our [system requirements](system-requirements.mdx).
+* You have kubectl access to the cluster.
+* If you're using Helm, you installed Helm 3.0 or later on your workstation.
+
+## Connect a cluster to Calico Cloud with kubectl
+
+1. If your organization uses multiple projects to group managed clusters, click the **Project** menu and select the project you want your cluster to be part of.
+1. From the **Managed Clusters** page, click **Connect Cluster**.
+1. In the **Connect a Cluster** dialog, enter a **Cluster Name** and select a **Cluster Type**.
+1. Optional: If you must install a specific older release, select the Calico Cloud version you want to install.
+ We always recommend the latest version, which is installed by default.
+1. Click **Connect** to generate a unique kubectl command. Copy the command.
+1. From a terminal, paste and run the command.
+1. On the **Managed Clusters** page, you should immediately see your cluster in the list of managed clusters.
+ Monitor the status under **Connection Status**.
+ When the status changes to **Connected**, installation is complete and your cluster is connected to Calico Cloud.
+
+## Connect a cluster to Calico Cloud with Helm
+
+1. If your organization uses multiple projects to group managed clusters, click the **Project** menu and select the project you want your cluster to be part of.
+1. From the **Managed Clusters** page, click **Connect Cluster**.
+1. In the **Connect a Cluster** dialog, enter a **Cluster Name** and select a **Cluster Type**.
+1. Optional: If you must install a specific older release, select the Calico Cloud version you want to install.
+ We always recommend the latest version, which is installed by default.
+1. Click **Connect** to generate a unique Helm installation command. Copy the command.
+ ```bash title="Example of generated Helm installation command"
+ helm repo add calico-cloud https://installer.calicocloud.io/charts --force-update && helm upgrade --install calico-cloud-crds calico-cloud/calico-cloud-crds --namespace calico-cloud --create-namespace && helm upgrade --install calico-cloud calico-cloud/calico-cloud --namespace calico-cloud --set apiKey=ryl34elz8:9dav6eoag:ifk1uwruwlgp7vzn7ecijt5zjbf5p9p1il1ag8877ylwjo4muu19wzg2g8x5qa7x --set installer.clusterName=my-cluster --set installer.calicoCloudVersion=v19.1.0
+ ```
+1. Optional: If you want to enable the Packet Capture feature, you can append `--set installer.components.packetCaptureAPI.state=Enabled` to the generated Helm command.
+ You can change this option only by reinstalling or upgrading Calico Cloud and changing the values.
+ | Feature | Key | Values |
+ |---------|-----|--------|
+ | Packet Capture | `installer.components.packetCaptureAPI.state` | `Enabled`, `Disabled` (default\*) * The default for new clusters is `Disabled`. For upgrades for previously connected clusters, the default will retain the previous state. |
+
+
+ ```bash title="Example of generated Helm command with user-added parameters"
+ helm repo add calico-cloud https://installer.calicocloud.io/charts --force-update && helm upgrade --install calico-cloud-crds calico-cloud/calico-cloud-crds --namespace calico-cloud --create-namespace && helm upgrade --install calico-cloud calico-cloud/calico-cloud --namespace calico-cloud --set apiKey=ryl34elz8:9dav6eoag:ifk1uwruwlgp7vzn7ecijt5zjbf5p9p1il1ag8877ylwjo4muu19wzg2g8x5qa7x --set installer.clusterName=my-cluster --set installer.calicoCloudVersion=v19.1.0 \
+ --set installer.components.packetCaptureAPI.state=Enabled
+ ```
+
+ In this example, the command connects the cluster to Calico Cloud with the Packet Capture feature enabled.
+
+1. From a terminal, paste and run the command.
+1. On the **Managed Clusters** page, you should immediately see your cluster in the list of managed clusters.
+ Monitor the status under **Connection Status**.
+ When the status changes to **Connected**, installation is complete and your cluster is connected to Calico Cloud.
+
+## Additional resources
+
+* [Calico Cloud troubleshooting checklist](checklist.mdx)
+* [Tigera Operator troubleshooting checklist](operator-checklist.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/install-private-registry.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/install-private-registry.mdx
new file mode 100644
index 0000000000..90df29c75f
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/install-private-registry.mdx
@@ -0,0 +1,59 @@
+---
+description: Connect a Kubernetes cluster to Calico Cloud when its container images must be pulled from a private registry.
+title: Install using a private registry
+---
+
+# Connect a cluster to Calico Cloud using a private registry
+
+You can perform a Helm installation from images stored on a private registry.
+
+## Prerequisites
+
+* You have an paid Calico Cloud account.
+* You are signed in to the web console as a user with the **Owner**, **Admin**, or **DevOps** role.
+* You have at least one cluster that meets our [system requirements](system-requirements.mdx).
+* You have kubectl access to the cluster.
+* You have installed Helm 3.0 or later on your workstation.
+* You have [added the Calico Cloud images to a private registry](setup-private-registry.mdx), and you have the following information about the registry:
+ * Registry secret name
+ :::note
+ If your private registry requires credentials, create a `calico-cloud` namespace on your cluster.
+ Then, create an image pull secret and use this name for the **Registry Secret Name**.
+ :::
+ * Image registry
+ * Image path
+
+
+## Install Calico Cloud using a private registry
+
+1. If your organization uses multiple projects to group managed clusters, click the **Project** menu and select the project you want your cluster to be part of.
+1. From the **Managed Clusters** page, click **Connect Cluster**.
+1. In the **Connect a Cluster** dialog, enter a **Cluster Name** and select a **Cluster Type**.
+1. Optional: If you must install a specific older release, select the Calico Cloud version you want to install. We always recommend the latest version, which is installed by default.
+1. Click **Advanced Options**, and then select both **Install via Helm** and **Private registry**.
+1. Enter the **Registry Secret Name**, **Image registry**, and **Image path**.
+1. Click **Connect** to generate a unique Helm installation command. Copy the command.
+1. Optional: If you want to enable the Packet Capture feature, you can append `--set installer.components.packetCaptureAPI.state=Enabled` to the generated Helm command.
+ You can change this option only by reinstalling or upgrading Calico Cloud and changing the values.
+
+ | Feature | Key | Values |
+ |---------|-----|--------|
+ | Packet Capture | `installer.components.packetCaptureAPI.state` | `Enabled`, `Disabled` (default\*) * The default for new clusters is `Disabled`. For upgrades for previously connected clusters, the default will retain the previous state. |
+
+ ```bash title="Example of generated Helm command with user-added parameters"
+ helm repo add calico-cloud https://installer.calicocloud.io/charts --force-update && helm upgrade --install calico-cloud-crds calico-cloud/calico-cloud-crds --namespace calico-cloud --create-namespace && helm upgrade --install calico-cloud calico-cloud/calico-cloud --namespace calico-cloud --set apiKey=ryl34elz8:9dav6eoag:ifk1uwruwlgp7vzn7ecijt5zjbf5p9p1il1ag8877ylwjo4muu19wzg2g8x5qa7x --set installer.clusterName=my-cluster --set installer.calicoCloudVersion=v19.1.0 \
+ --set installer.components.packetCaptureAPI.state=Enabled
+ ```
+
+ In this example, the command connects the cluster to Calico Cloud with the Packet Capture feature enabled.
+
+1. From a terminal, paste and run the command.
+
+1. On the **Managed Clusters** page, you should immediately see your cluster in the list of managed clusters.
+ Monitor the status under **Connection Status**.
+ When the status changes to **Connected**, installation is complete and your cluster is connected to Calico Cloud.
+
+## Additional resources
+
+* [Calico Cloud troubleshooting checklist](checklist.mdx)
+* [Tigera Operator troubleshooting checklist](operator-checklist.mdx)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/operator-checklist.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/operator-checklist.mdx
new file mode 100644
index 0000000000..6063d98a32
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/operator-checklist.mdx
@@ -0,0 +1,644 @@
+---
+description: Troubleshoot the Tigera Operator on Calico Cloud connected clusters when the standard support checklist is not enough.
+---
+
+# Tigera Operator troubleshooting checklist
+
+If you have issues getting your cluster up and running, use this checklist.
+
+- [Check installation start errors](#check-installation-start-errors)
+- [Check Calico Cloud installation](#check-calico-cloud-installation)
+- [Check logs for fatal errors](#check-logs-for-fatal-errors)
+- [Check custom resources](#check-custom-resources)
+- [Check pod capacity](#check-pod-capacity)
+- [Check the web console dashboard for traffic](#check-the-web-console-dashboard-for-traffic)
+
+## Check installation start errors
+
+Are you seeing any of these issues at the start of installation?
+
+### [ERROR] Detected plugin ls: No such file or directory, it is currently not supported
+
+The cluster you are using to install $[prodname] does not have a CNI plugin installed, the CNI is incompatible. If your cluster has functional pod networking and you see this message, it is likely that kubelet has been configured to use kubenet networking, which is not compatible with $[prodname]. You can use a different cluster, or re-create your cluster with [compatible networking](system-requirements.mdx).
+
+### $[prodname] cannot be connected to a cluster with FIPS mode enabled
+
+At this time, FIPS mode is not supported in $[prodname]. Disable FIPS mode in the cluster and install again.
+
+### Install script is taking a long time
+
+If you are migrating a large cluster from a previous manifest-based Calico install, the script can take some time; this is normal.
+
+But, it could also mean that your cluster has an incompatibility. Go to the next step [Check Calico Cloud installation](#check-calico-cloud-installation).
+
+## Check Calico Cloud installation
+
+Installing $[prodname] on your Kubernetes cluster is managed by the Tigera Operator. The Tigera Operator is deployed as a ReplicaSet in the `tigera-operator` namespace, and records status in a custom resource named, `tigerastatus`. The operator get its configuration from several Custom Resources (CRs); the central one is the Installation CR.
+
+Check `tigerastatus` using the following command.
+
+```bash
+kubectl get tigerastatus
+```
+
+**Sample output**
+
+```
+NAME AVAILABLE PROGRESSING DEGRADED SINCE
+apiserver True False False 10m
+calico True False False 11m
+cloud-core True False False 11m
+compliance True False False 9m39s
+intrusion-detection True False False 9m49s
+log-collector True False False 9m29s
+management-cluster-connection True False False 9m54s
+monitor True False False 10m
+```
+
+If all components show a status of "Available" = TRUE, $[prodname] is properly installed.
+
+**Issue: $[prodname] is not installed**
+
+If $[prodname] is not installed, you'll get the following error. Install $[prodname] on the node using the `curl` command that you got from Support.
+
+```bash
+kubectl get tigerastatus
+error: the server doesn't have a resource type "tigerastatus"
+```
+
+**Issue: $[prodname] components are missing or are degraded**
+
+If some of the $[prodname] components are Available = FALSE or DEGRADED = TRUE, run the following command and contact Support with the following output.
+
+```bash
+kubectl get tigerastatus -o yaml
+```
+
+:::note
+
+If you are using the **AWS or Azure CNI plugin**, a degraded state is likely because you do not have enough pod capacity on your nodes. To fix this, see [Check pod capacity](#check-pod-capacity).
+
+:::
+
+**Sample output**
+
+In the following example, the typha component has an issue because it is showing `AVAILABLE: FALSE`, and `DEGRADED: TRUE`. To understand details of $[prodname] components, see [Deep dive into custom resources](#deep-dive-into-custom-resources).
+
+```yaml
+apiVersion: v1
+items:
+ - apiVersion: operator.tigera.io/v1
+ kind: TigeraStatus
+ metadata:
+ creationTimestamp: '2020-12-30T17:13:30Z'
+ generation: 1
+ managedFields:
+ - apiVersion: operator.tigera.io/v1
+ fieldsType: FieldsV1
+ fieldsV1:
+ f:spec: {}
+ f:status:
+ .: {}
+ f:conditions: {}
+ manager: operator
+ operation: Update
+ time: '2020-12-30T17:16:20Z'
+ name: calico
+ resourceVersion: '8166'
+ selfLink: /apis/operator.tigera.io/v1/tigerastatuses/calico
+ uid: 39a8a2d0-2074-418c-b52d-0baa0a48f4a1
+ spec: {}
+ status:
+ conditions:
+ - lastTransitionTime: '2020-12-30T17:13:30Z'
+ status: 'False'
+ type: Available
+ - lastTransitionTime: '2020-12-30T17:13:30Z'
+ message: DaemonSet "calico-system/calico-node" is not yet scheduled on any nodes
+ reason: Not all pods are ready
+ status: 'True'
+ type: Progressing
+ - lastTransitionTime: '2020-12-30T17:13:30Z'
+ message: 'failed to wait for operator typha deployment to be ready: waiting
+ for typha to have 4 replicas, currently at 3'
+ reason: error migrating resources to calico-system
+ status: 'True'
+ type: Degraded
+kind: List
+metadata:
+ resourceVersion: ''
+ selfLink: ''
+```
+
+## Check logs for fatal errors
+
+Check that the Tigera Operator is running and that logs do not have any fatal errors.
+
+```bash
+kubectl get pods -n tigera-operator
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+tigera-operator-8687585b66-68gmr 1/1 Running 0 139m
+```
+
+```bash
+kubectl logs -n tigera-operator tigera-operator-8687585b66-68gmr
+```
+
+```
+2020/12/30 17:38:54 [INFO] Version: 90975f4
+2020/12/30 17:38:54 [INFO] Go Version: go1.14.4
+2020/12/30 17:38:54 [INFO] Go OS/Arch: linux/amd64
+{"level":"info","ts":1609349935.2848425,"logger":"setup","msg":"Checking type of cluster","provider":""}
+{"level":"info","ts":1609349935.2868738,"logger":"setup","msg":"Checking if TSEE controllers are required","required":true}
+<...>
+```
+
+## Check custom resources
+
+Verify that you have the **installation custom resource**, and that the values are appropriate for your environment.
+
+```bash
+kubectl get installation.operator.tigera.io default -o yaml
+```
+
+```yaml
+apiVersion: operator.tigera.io/v1
+kind: Installation
+metadata:
+ annotations:
+ kubectl.kubernetes.io/last-applied-configuration: |
+ {"apiVersion":"operator.tigera.io/v1","kind":"Installation","metadata":{"annotations":{},"name":"default"},"spec":{"imagePullSecrets":[{"name":"tigera-pull-secret"}],"variant":"CalicoEnterprise"}}
+ creationTimestamp: '2021-01-20T19:50:23Z'
+ generation: 2
+ managedFields:
+ - apiVersion: operator.tigera.io/v1
+ fieldsType: FieldsV1
+ fieldsV1:
+ f:metadata:
+ f:annotations:
+ .: {}
+ f:kubectl.kubernetes.io/last-applied-configuration: {}
+ f:spec:
+ .: {}
+ f:imagePullSecrets: {}
+ f:variant: {}
+ manager: kubectl
+ operation: Update
+ time: '2021-01-20T19:50:23Z'
+ - apiVersion: operator.tigera.io/v1
+ fieldsType: FieldsV1
+ fieldsV1:
+ f:spec:
+ f:calicoNetwork:
+ .: {}
+ f:bgp: {}
+ f:hostPorts: {}
+ f:ipPools: {}
+ f:mtu: {}
+ f:multiInterfaceMode: {}
+ f:nodeAddressAutodetectionV4:
+ .: {}
+ f:firstFound: {}
+ f:cni:
+ .: {}
+ f:ipam:
+ .: {}
+ f:type: {}
+ f:type: {}
+ f:componentResources: {}
+ f:flexVolumePath: {}
+ f:nodeUpdateStrategy:
+ .: {}
+ f:rollingUpdate:
+ .: {}
+ f:maxUnavailable: {}
+ f:type: {}
+ f:status:
+ .: {}
+ f:variant: {}
+ manager: operator
+ operation: Update
+ time: '2021-01-20T19:55:10Z'
+ name: default
+ resourceVersion: '5195'
+ selfLink: /apis/operator.tigera.io/v1/installations/default
+ uid: 016c3f0b-39f0-48a0-9da8-a59a81ed9128
+spec:
+ calicoNetwork:
+ bgp: Enabled
+ hostPorts: Enabled
+ ipPools:
+ - blockSize: 26
+ cidr: 10.42.0.0/16
+ encapsulation: IPIP
+ natOutgoing: Enabled
+ nodeSelector: all()
+ mtu: 0
+ multiInterfaceMode: None
+ nodeAddressAutodetectionV4:
+ firstFound: true
+ cni:
+ ipam:
+ type: Calico
+ type: Calico
+ componentResources:
+ - componentName: Node
+ resourceRequirements:
+ requests:
+ cpu: 250m
+ flexVolumePath: /usr/libexec/kubernetes/kubelet-plugins/volume/exec/nodeagent~uds
+ imagePullSecrets:
+ - name: tigera-pull-secret
+ nodeUpdateStrategy:
+ rollingUpdate:
+ maxUnavailable: 1
+ type: RollingUpdate
+ variant: CalicoEnterprise
+status:
+ variant: CalicoEnterprise
+```
+
+Verify that you have the following custom resources. In the default installation, there is no configuration information.
+
+**Check API server**
+
+```bash
+kubectl get apiserver.operator.tigera.io tigera-secure
+```
+
+```
+NAME AGE
+tigera-secure 85m
+```
+
+**Check cloud core**
+
+```bash
+kubectl get cloudcore.operator.tigera.io tigera-secure
+```
+
+```
+NAME AGE
+tigera-secure 88m
+```
+
+**Check compliance**
+
+```bash
+kubectl get compliance.operator.tigera.io tigera-secure
+```
+
+```
+NAME AGE
+tigera-secure 90m
+```
+
+**Check intrusion detection**
+
+```bash
+kubectl get intrusiondetection.operator.tigera.io tigera-secure
+```
+
+```
+NAME AGE
+tigera-secure 93m
+```
+
+**Check log collector**
+
+```bash
+kubectl get logcollector.operator.tigera.io tigera-secure
+```
+
+```
+NAME AGE
+tigera-secure 96m
+```
+
+**Check management cluster**
+
+```bash
+kubectl get ManagementClusterConnection.operator.tigera.io tigera-secure -o yaml
+```
+
+```yaml
+apiVersion: operator.tigera.io/v1
+kind: ManagementClusterConnection
+metadata:
+ annotations:
+ kubectl.kubernetes.io/last-applied-configuration: |
+ {"apiVersion":"operator.tigera.io/v1","kind":"ManagementClusterConnection","metadata":{"annotations":{},"name":"tigera-secure"},"spec":{"managementClusterAddr":".tigera.io:9000"}}
+ creationTimestamp: '2021-01-20T19:55:40Z'
+ generation: 1
+ managedFields:
+ - apiVersion: operator.tigera.io/v1
+ fieldsType: FieldsV1
+ fieldsV1:
+ f:metadata:
+ f:annotations:
+ .: {}
+ f:kubectl.kubernetes.io/last-applied-configuration: {}
+ f:spec:
+ .: {}
+ f:managementClusterAddr: {}
+ manager: kubectl
+ operation: Update
+ time: '2021-01-20T19:55:40Z'
+ name: tigera-secure
+ resourceVersion: '5425'
+ selfLink: /apis/operator.tigera.io/v1/managementclusterconnections/tigera-secure
+ uid: b7a2093e-a4b6-4e76-b291-15f45bfa11cf
+spec:
+ managementClusterAddr: .tigera.io:9000
+```
+
+**Check monitor**
+
+```bash
+kubectl get monitor.operator.tigera.io tigera-secure
+```
+
+```
+NAME AGE
+tigera-secure 98m
+```
+
+For more information on operator custom resources see the [Tigera Operator API reference](../reference/installation/api.mdx).
+
+### Deep dive into custom resources
+
+Run the following command to see if you have required custom resources:
+
+```bash
+kubectl get tigerastatus
+```
+
+| | NAME | AVAILABLE | PROGRESSING | DEGRADED | SINCE |
+| --- | ----------------------------- | --------- | ----------- | -------- | ----- |
+| 1 | apiserver | TRUE | FALSE | FALSE | 10m |
+| 2 | calico | TRUE | FALSE | FALSE | 11m |
+| 3 | cloud-core | TRUE | FALSE | FALSE | 11m |
+| 4 | compliance | TRUE | FALSE | FALSE | 9m39s |
+| 5 | intrusion-detection | TRUE | FALSE | FALSE | 9m49s |
+| 6 | log-collector | TRUE | FALSE | FALSE | 9m29s |
+| 7 | management-cluster-connection | TRUE | FALSE | FALSE | 9m54s |
+| 8 | monitor | TRUE | FALSE | FALSE | 11m |
+
+**1 - api server**
+
+`apiserver` is a required component that is an aggregated api-server. It is required for things like applying the tigera license. If `tigerastatus` reports it as unavailable or degraded, check the pods and logs in the `calico-system`namespace. For example,
+
+```bash
+kubectl get pods -n calico-system
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+calico-apiserver-5c75bc8d4b-sbn6g 2/2 Running 0 45m
+```
+
+**2 - calico**
+
+`calico` is the core component for networking. If it is not available or degraded, check the pods and their logs in the `calico-system` namespace. There should be a calico-node pod running on each of your nodes. You should have at least one `calico-typha` pod and the number will scale with the number of nodes in your cluster. You should have a `calico-kube-controllers` pod running. For example,
+
+```bash
+kubectl get pods -n calico-system
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+calico-kube-controllers-5c77d4d559-hfl5d 1/1 Running 0 44m
+calico-node-6s2c9 1/1 Running 0 40m
+calico-node-8nf28 1/1 Running 0 41m
+calico-node-djlrg 1/1 Running 0 40m
+calico-node-ms8nv 1/1 Running 0 40m
+calico-node-t7pck 1/1 Running 0 40m
+calico-typha-bdb494458-76gcx 1/1 Running 0 41m
+calico-typha-bdb494458-847tr 1/1 Running 0 41m
+calico-typha-bdb494458-k8lhj 1/1 Running 0 40m
+calico-typha-bdb494458-vjbjz 1/1 Running 0 40m
+```
+
+**3 - cloud-core**
+
+`cloud-core` is responsible for predefined and custom roles for users. Check the pods and logs in the `calico-cloud` namespace with the label selector `k8s-app=cc-core-operator`.
+
+```bash
+$ kubectl get pods -n calico-cloud -l k8s-app=cc-core-operator
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+cc-core-operator-126dcd494a-9kj7g 1/1 Running 0 80m
+```
+
+**4 - compliance**
+
+`compliance` manages the compliance components that still run on your cluster, such as the CIS benchmarker.
+Check the pods and logs in the `tigera-compliance` namespace.
+
+```bash
+$ kubectl get pods -n tigera-compliance
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+compliance-benchmarker-bqvps 1/1 Running 0 65m
+compliance-benchmarker-h58hr 1/1 Running 0 65m
+compliance-benchmarker-kdtwp 1/1 Running 0 65m
+compliance-benchmarker-mzm2z 1/1 Running 0 65m
+compliance-benchmarker-s5mmf 1/1 Running 0 65m
+compliance-controller-77785646df-ws2cj 1/1 Running 0 65m
+compliance-snapshotter-6bcbdc65b-66k9v 1/1 Running 0 65m
+```
+
+**5 - intrusion-detection**
+
+`intrusion-detection` is responsible for the intrusion detection features. Check the pods and logs in the `tigera-intrusion-detection` namespace.
+
+```bash
+$ kubectl get pods -n tigera-intrusion-detection
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+intrusion-detection-controller-669bf45c75-grvz9 1/1 Running 0 66m
+intrusion-detection-es-job-installer-xm22v 1/1 Running 0 66m
+```
+
+**6 - log-collector**
+
+`log-collector` collects flow and other logs and forwards them to $[prodname]. Check the pods and logs in the `tigera-fluentd` namespace. You should have one pod running on each of your nodes.
+
+```bash
+kubectl get pods -n tigera-fluentd
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+fluentd-node-5mzh6 1/1 Running 0 70m
+fluentd-node-7vmxw 1/1 Running 0 70m
+fluentd-node-bbc4p 1/1 Running 0 70m
+fluentd-node-chfz4 1/1 Running 0 70m
+fluentd-node-d6f56 1/1 Running 0 70m
+```
+
+**7 - management-cluster-connection**
+
+The `management-cluster-connection` is required for your managed clusters to connect to the $[prodname] backend. If it is not available or degraded, check the pods and logs in the `tigera-guardian` namespace.
+
+```bash
+kubectl get pods -n tigera-guardian
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+tigera-guardian-7d5d94d5cc-49rg8 1/1 Running 0 48m
+```
+
+To verify that the guardian component has network connectivity to the management cluster:
+
+Find the URL to the management cluster:
+
+```bash
+kubectl get managementclusterconnection tigera-secure -o=jsonpath='{.spec.managementClusterAddr}'
+.tigera.io:9000
+```
+
+then, from a worker node, verify network connectivity to the management cluster:
+
+```bash
+openssl s_client -connect .tigera.io:9000
+```
+
+```
+CONNECTED(00000003)
+depth=0 CN = tigera-voltron
+verify error:num=18:self signed certificate
+verify return:1
+depth=0 CN = tigera-voltron
+verify return:1
+---
+Certificate chain
+ 0 s:CN = tigera-voltron
+ i:CN = tigera-voltron
+---
+Server certificate
+-----BEGIN CERTIFICATE-----
+MIIC5DCCAcygAwIBAgIBATANBgkqhkiG9w0BAQsFADAZMRcwFQYDVQQDEw50aWdl
+cmEtdm9sdHJvbjAeFw0yMDEyMjExOTA1MzhaFw0yNTEyMjAxOTA1MzhaMBkxFzAV
+<...>
+```
+
+**8 - monitor**
+
+`monitor` is responsible for configuring prometheus and associated custom resources. Check the pods and logs in the `tigera-prometheus` namespace.
+
+```bash
+$ kubectl get pods -n tigera-prometheus
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+alertmanager-calico-node-alertmanager-0 2/2 Running 0 125m
+alertmanager-calico-node-alertmanager-1 2/2 Running 0 125m
+alertmanager-calico-node-alertmanager-2 2/2 Running 0 125m
+calico-prometheus-operator-77bf897c9b-7f88x 1/1 Running 0 125m
+prometheus-calico-node-prometheus-0 3/3 Running 1 125m
+```
+
+### Check additional custom resources
+
+Check for the presence of other custom resources created by the Tigera Operator: FelixConfiguration, IPPool, Tigera License, and Prometheus for component metrics.
+
+`FelixConfiguration` contains configuration that are not configured as environment variables to the`calico-node` container.
+
+```bash
+kubectl get Felixconfiguration default
+```
+
+```
+NAME CREATED AT
+default 2021-01-20T19:49:35Z
+```
+
+The operator creates a default `IPPool` for your pod networking if it does not already exist; in this case, the CIDR is taken from the Installation CR.
+
+```bash
+kubectl get IPPool
+```
+
+```
+NAME CREATED AT
+default-ipv4-ippool 2021-01-20T19:49:35Z
+```
+
+A Tigera license is applied by the installation script.
+
+```bash
+kubectl get licensekeys.projectcalico.org
+```
+
+```
+NAME AGE
+default 120m
+```
+
+The installation script deploys a Prometheus operator and associated custom resources. If you already have a Prometheus operator running in your cluster, contact Tigera support.
+
+```bash
+kubectl get pods -n tigera-prometheus
+```
+
+```
+NAME READY STATUS RESTARTS AGE
+alertmanager-calico-node-alertmanager-0 2/2 Running 0 125m
+alertmanager-calico-node-alertmanager-1 2/2 Running 0 125m
+alertmanager-calico-node-alertmanager-2 2/2 Running 0 125m
+calico-prometheus-operator-77bf897c9b-7f88x 1/1 Running 0 125m
+prometheus-calico-node-prometheus-0 3/3 Running 1 125m
+```
+
+## Check pod capacity
+
+If cluster does not have enough capacity, it will not be able to deploy pods. There is no specific error associated with this condition.
+
+The high-level components $[prodname] needs to run are:
+
+- Per node: 1 fluentd, 1 compliance benchmarker
+- On top of per node: 3 alertmanager (from statefulset), 1 prometheus, 1 prometheus operator, 1 kube-controllers, 2 compliance snapshotter and controller, 1 guardian, 1 ids controller, 1 apiserver
+
+Some clusters have limited pod-networked pod capacity.
+
+- For the AWS CNI plugin, the [number of pods that can be networked is based on the size of the instance](https://docs.aws.amazon.com/eks/latest/userguide/pod-networking.html).
+- For AKS with the Azure CNI, the [number of pods that can be networked is set at cluster deployment time or when new node pools are created (default of 30)](https://docs.microsoft.com/en-us/azure/aks/configure-azure-cni#maximum-pods-per-node).
+- For GKE, there is a [hard limit of 110 pods per node](https://docs.cloud.google.com/kubernetes-engine/docs/concepts/planning-scalability).
+- For Calico CNI, the pod limit is based on the available IPs in the IPPool, and there is no specific per node limit.
+
+Verify you have the following pod-networked pod capacity.
+
+- Verify on each node in your cluster that there is capacity for at least 2 pods.
+- Verify there is capacity for at least 11 pods in the cluster in addition to the per node capacity.
+
+To check the capacity of individual nodes on AWS or AKS, query the node status and look at `Capacity.Pods` (which is the total capacity for the node). To get the number of pod-networked pods for a node, count the pods on the node that are pod-networked (non-hostNetworked pods).
+
+## Check pod security policy violation
+
+If your cluster is using Kubernetes version 1.24 or earlier, a pod security policy (PSP) violation may be blocking pods on the cluster.
+
+Search for the term `PodSecurityPolicy` in the status message of failed cluster deployments. If a PSP is present, install open source Calico in the cluster before you connect to $[prodname].
+
+## Check the web console dashboard for traffic
+
+### Web console main dashboard is missing traffic graphs
+
+When you log in to the web console, the first item in the left nav is the main Dashboard. This dashboard is a birds-eye view of your managed cluster activity for policy and networking. For the graphs to display traffic, you must have the Prometheus operator. If it is missing, the following message is displayed during installation:
+
+`Prometheus Operator detected in the cluster. Skipping Tigera Prometheus Operator`
+
+To install an appropriate Prometheus operator, contact Support below.
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/prepare-cluster.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/prepare-cluster.mdx
new file mode 100644
index 0000000000..ba852b3dd6
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/prepare-cluster.mdx
@@ -0,0 +1,78 @@
+---
+description: Prepare a Kubernetes cluster for connection to Calico Cloud — pre-flight checks, RBAC, and image-pull configuration.
+---
+
+# Prepare your cluster for Calico Cloud
+
+Get your cluster ready to connect to Calico Cloud.
+
+## Prerequisites
+
+* Your cluster meets the [system requirements](system-requirements.mdx) for Calico Cloud.
+
+## Allow outbound traffic from pods to Calico Cloud endpoints
+
+Pods running in your Kubernetes cluster must allow outbound traffic to the following endpoints:
+
+- `https://installer.calicocloud.io:443/*`
+- `https://www.calicocloud.io:443/api/*`
+- `https://client-auth.calicocloud.io:443/*`
+- TCP to `.calicocloud.io:9000`
+
+For each node, Docker must be able to pull images from the following endpoints:
+
+* `quay.io`
+* `cdn01.quay.io`
+* `cdn02.quay.io`
+* `us-docker.pkg.dev`
+
+## Make sure you have the right permissions for your platform user account
+
+If your cluster is installed on a managed service, you must have sufficient permissions from your identity and access management system.
+Check that you are authorized to create the following Kubernetes resource types:
+
+* `ClusterRole`
+* `ClusterRoleBinding`
+* `Deployment`
+* `ServiceAccount`
+* `CustomResourceDefinition`
+
+## Prepare your cluster on Azure Kubernetes Service
+
+### Remove taints from Linux node pools
+
+If you have a hybrid clusters with both Windows and Linux nodes, the Linux nodes may have taints that prevent Calico Cloud from scheduling pods on those nodes.
+These taints must be removed before you connect your cluster to Calico Cloud.
+
+You can check whether any node pools in your cluster have taints by running the following command:
+
+```bash
+az aks nodepool list --resource-group --cluster-name --query "[].{name:name nodeTaints:nodeTaints}"
+```
+
+Remove any taints in the Linux node pools by running the command:
+
+```bash
+az aks nodepool update --resource-group --cluster-name --name --node-taints ""
+```
+
+## Prepare your cluster Google Kubernetes Engine
+
+### Turn on intranode visibility for your cluster
+
+Verify that intranode visibility is set to `Enabled` by running the following command:
+
+```bash
+gcloud container clusters describe --flatten networkConfig.enableIntraNodeVisibility
+```
+
+If intranode visibility is not enabled, you must enable it by following running the following command:
+
+```bash
+gcloud container clusters update --enable-intra-node-visibility
+```
+
+## Next steps
+
+* [Connect your cluster to Calico Cloud](install-cluster.mdx)
+* [Connect your cluster using a private registry](install-private-registry.mdx)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/setup-private-registry.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/setup-private-registry.mdx
new file mode 100644
index 0000000000..054f945842
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/setup-private-registry.mdx
@@ -0,0 +1,103 @@
+---
+description: Mirror Calico Cloud container images into a private registry so air-gapped clusters can install without reaching the public registry.
+---
+
+# Set up a private registry
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+import VersionedCloudImageList from '@site/src/___new___/components/VersionedCloudImageList';
+
+## Big picture
+
+Add $[prodname] images to a private registry to install new clusters or update existing ones.
+
+## Value
+
+In some deployments, installing $[prodname] in clusters from third-party repos is not an option. Before you can install $[prodname] from a private registry, you must first add $[prodname] images to the registry.
+
+## Concepts
+
+A **container image registry** (often known as a **registry**), is a service where you can push, pull, and store container images. In Kubernetes, a registry is considered _private_ if it is not publicly available.
+
+A **private registry** is not publicly available. It must be accessible on a private network or with an **image pull secret** for authenticated access.
+
+An **image path** is a directory in a registry that contains images required to install $[prodname].
+
+## Before you begin
+
+**Required**
+
+- [Helm CLI](https://helm.sh/docs/intro/install/) command
+- Use the [Crane command](https://github.com/google/go-containerregistry/blob/main/cmd/crane/README.md) to follow steps in this guide. (Other tools can be used, but commands be adjusted accordingly.)
+- Image registry
+ - Must be private (accessible only on a private network or using log in credentials)
+ - Images copied to the registry must not be made publicly available
+ - Push access to your registry
+
+## How to
+
+Add the required $[prodname] images to a private registry.
+
+### Set up registry credentials
+
+1. Log into $[prodname] and navigate to "Managed Clusters".
+1. If your organization uses multiple projects to group managed clusters, click the **Project** menu and select the project you want your cluster to be part of.
+1. Get the "Registry Credentials" by clicking on the icon. 
+1. Apply the credentials so the $[prodname] images can be accessed.
+
+### Create the list of required images
+
+
+
+### Set up the private registry
+
+```bash
+REGISTRY=
+```
+
+If you want all images to come from the same path in your registry, set this image path value. Otherwise unset this environment variable or set it to the empty string.
+
+```bash
+IMAGEPATH=""
+```
+
+#### Image examples
+
+| Original image | Image Registry | Image Path | Private registry image |
+| ----------------------------------- | -------------- | ------------- | -------------------------------------------- |
+| `quay.io/tigera/typha:v1.2.3` | `my.registry/` | | `my.registry/tigera/typha:v1.2.3` |
+| `quay.io/tigera/typha:v1.2.3` | `my.registry/` | `custom-path` | `my.registry/custom-path/typha:v1.2.3` |
+| `quay.io/tigera/cc-operator:v4.5.6` | `my.registry/` | | `my.registry/tigera/cc-operator:v4.5.6` |
+| `quay.io/tigera/cc-operator:v4.5.6` | `my.registry/` | `custom-path` | `my.registry/custom-path/cc-operator:v4.5.6` |
+
+### Copy images to your registry
+
+For $[prodname] to install images from your registry, copy the images from the standard registries into your own registry.
+
+
+
+
+```bash
+for image in ${IMAGES[@]}; do
+ img_base=$(echo ${image} | sed "s#^.*/\([^/]*/[^/]*$\)#\1#")
+ crane cp ${image} ${REGISTRY}${img_base} || break
+done
+```
+
+
+
+
+```bash
+for image in ${IMAGES[@]}; do
+ img_base=$(echo ${image} | sed "s#^.*/##")
+ crane cp ${image} ${REGISTRY}${IMAGEPATH}/${img_base} || break
+done
+```
+
+
+
+
+## Install using the private registry
+
+Follow the directions [to connect a cluster to Calico Cloud](install-cluster.mdx).
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/system-requirements.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/system-requirements.mdx
new file mode 100644
index 0000000000..75baaeddc5
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/system-requirements.mdx
@@ -0,0 +1,194 @@
+---
+description: Cluster, platform, and version requirements a Kubernetes cluster must meet before it can connect to Calico Cloud.
+---
+
+# System requirements
+
+Before you connect your cluster to Calico Cloud, make sure your cluster meets the system requirements.
+Your cluster must already have a CNI installed before you can connect to Calico Cloud.
+
+{/* This file is referenced in the web console and its location should not be changed with accounting for references from pendo/manager UI. A symlink so this file exists at install/system-requirements. */}
+
+## Kubernetes distributions and CNIs
+
+Calico Cloud works with Kubernetes on self-provisioned infrastructure and on managed Kubernetes distributions.
+To use Calico Cloud for both networking and network policy, your cluster must have Calico Open Source installed before you connect to Calico Cloud.
+For most managed distributions, you can use the provider's CNI for networking and use Calico Cloud for network policy.
+
+| Distribution | Supported CNIs |
+| --- | --- |
+| Kubernetes on self-provisioned infrastructure | - Calico Open Source 3.20 or later |
+| Amazon Elastic Kubernetes Service | - Calico Open Source 3.20 or later - Amazon VPC CNI |
+| Azure Kubernetes Service | - Calico Open Source 3.20 or later - Azure CNI |
+| Google Kubernetes Engine | - Calico Open Source 3.20 or later - GKE CNI |
+| Rancher Kubernetes Engine 2 | - Calico Open Source 3.20 or later |
+
+:::note
+
+The Kubernetes distributions listed above are those that Tigera currently tests and supports for Calico Cloud.
+You may be able to connect clusters on other distributions with Calico Open Source installed as the CNI.
+For more information about connecting other cluster types to Calico Cloud, [contact Support](https://tigeraio.my.site.com/community/s/login/).
+
+:::
+
+### Other distributions
+
+The Calico Cloud installer may be able to successfully connect
+
+## Kubernetes versions
+
+To install Calico Cloud $[cloudUserVersion], your Kubernetes distribution must be based on one of the following Kubernetes versions:
+
+* Kubernetes 1.36
+* Kubernetes 1.35
+* Kubernetes 1.34
+
+
+ Kubernetes compatibility for older versions of Calico Cloud
+
+ | Calico Cloud version | Kubernetes versions |
+ |-----------------------|---------------------|
+ | 23.0.0 | 1.34-1.36 |
+ | 22.5.0 | 1.31-1.35 |
+ | 22.4.1 | 1.31-1.35 |
+ | 22.4.0 | 1.31-1.34 |
+ | 22.3.0 | 1.31-1.34 |
+ | 22.2.0 | 1.31-1.34 |
+ | 22.1.0 | 1.31-1.34 |
+ | 22.0.1 | 1.31-1.33 |
+ | 22.0.0 | 1.31-1.33 |
+ | 21.3.0 | 1.31-1.33 |
+ | 21.2.0 | 1.30-1.31 |
+ | 21.1.0 | 1.30-1.31 |
+ | 21.0.0 | 1.30-1.31 |
+ | 20.4.0 | 1.29-1.31 |
+ | 20.3.1 | 1.29-1.30 |
+ | 20.2.0 | 1.28-1.30 |
+ | 20.1.0 | 1.28-1.30 |
+ | 20.0.1 | 1.28-1.30 |
+ | 20.0.0 | 1.28-1.30 |
+
+
+
+:::tip
+
+You can connect a cluster that uses a more recent (and unsupported) version of Kubernetes, but only for testing and development purposes.
+Connecting such a cluster is not suitable for production or any other workloads.
+To connect a cluster with an unsupported version of Kubernetes, start by following the standard installation procedure.
+When the installation fails, follow the instructions in the error message to connect your cluster.
+
+:::
+
+## Architectures
+
+Calico Cloud can be installed on nodes based on the following chip architectures:
+* x86-64
+* ARM64
+
+## Windows node support for hybrid clusters
+
+Calico Cloud supports hybrid Kubernetes clusters that use a Linux control plane with Windows nodes.
+You can install Calico Cloud on clusters of this type on the following managed distributions:
+* Amazon Elastic Kubernetes Service
+* Azure Kubernetes Service
+
+## Browser support for the web console
+
+To access the web console, you can use latest two versions of the following web browsers:
+* Chrome
+* Safari
+
+## Kubernetes reconcilers
+
+* $[prodname] cannot be usually be installed on clusters that are managed by any kind of Kubernetes reconciler (for example, the Kubernetes `addon-manager` component). To verify, look for an annotation called `addonmanager.kubernetes.io/mode` on either of the following resources. (The resources may not exist).
+
+ * `tigera-operator` deployment in the `tigera-operator` namespace
+ * `calico-node` daemonset in the `kube-system` namespace
+
+ If the following command finds addonmanager on either of the resources, then the `addon-manager` component is being used. Find a different cluster to use.
+
+ ```bash
+ kubectl get -n -o yaml | grep ' addonmanager.kubernetes.io/mode:'
+ ```
+* Some AKS clusters with the `addon-manager` component are compatible with Calico Cloud.
+ If output from the following command includes "EnsureExists", then the install is compatible with $[prodname].
+
+ ```bash
+ kubectl get CustomResourceDefinition installations.operator.tigera.io -o yaml | grep ' addonmanager.kubernetes.io/mode:'
+ ```
+
+ :::note
+
+ If the command output does not include "EnsureExists" and you are on a recent version of AKS your cluster might still be compatible.
+ You can [contact Support](https://tigeraio.my.site.com/community/s/login/) for more information.
+
+ :::
+
+ :::warning
+
+ If your cluster already has Calico installed by AKS and managed by the `addon-manager` component, the standard [uninstall](../operations/disconnect.mdx)
+ is not supported. You will need to reach out to support to create a plan to uninstall $[prodname].
+
+ :::
+
+
+## Distribution-specific requirements
+
+### Azure Kubernetes Service
+
+* Your cluster uses a supported combination of the `networkPlugin` and `networkPolicy` configurations:
+ - `"networkPlugin": "none"` and `"networkPolicy": null`
+ - `"networkPlugin": "azure"` and `"networkPolicy": null`
+ - `"networkPlugin": "azure"` and `"networkPolicy": "calico"`
+
+ You can check your configuration by running the following command:
+
+ ```bash
+ az aks show --query 'networkProfile'
+ ```
+
+* If your cluster uses the Azure CNI, your cluster's CNI is set to [transparent mode](https://docs.microsoft.com/en-us/azure/aks/faq#what-is-azure-cni-transparent-mode-vs-bridge-mode).
+
+ ```bash
+ az vmss run-command invoke -g -n --scripts "cat /etc/cni/net.d/*" --command-id RunShellScript --instance-id 0 --query 'value[0].message'
+ ```
+
+ If the Azure CNI is enabled, the output should include `"mode": "transparent"`.
+
+### Google Kubernetes Service
+
+* Your cluster's network policy is disabled.
+ To verify, run the following command:
+
+ ```bash
+ gcloud container clusters describe --flatten addonsConfig.networkPolicyConfig.disabled
+ ```
+
+{/* vale CalicoStyle.Substitutions = NO */}
+* Your cluster's Dataplane V2 is set to `null`.
+{/* vale CalicoStyle.Substitutions = YES */}
+ To verify, run the following command:
+
+ ```bash
+ gcloud container clusters describe --flatten networkConfig.datapathProvider
+ ```
+
+### Rancher Kubernetes Engine 2
+
+* The Calico Open Source CNI must not be provisioned by the RKE2 installer.
+ You can connect an RKE2 cluster to Calico Cloud only if:
+ * the RKE2 cluster was installed without a CNI
+ * Calico Open Source was installed manually
+
+ To verify, run this command to see the configuration on your control-plane node:
+
+ ```bash
+ cat /etc/rancher/rke2/config.yaml
+ ```
+ You should see `cni: none`.
+
+ If you're creating a new RKE2 cluster, you can set this configuration as an environment variable (`RKE2_CNI=none`) when you run the installation script.
+
+## Next steps
+
+* [Prepare your cluster for Calico Cloud](prepare-cluster.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/upgrade-cluster.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/upgrade-cluster.mdx
new file mode 100644
index 0000000000..4504383550
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/upgrade-cluster.mdx
@@ -0,0 +1,19 @@
+---
+description: Upgrade a connected Calico Cloud cluster to the latest released version of the in-cluster components.
+---
+
+# Upgrade Calico Cloud
+
+To upgrade a managed cluster to the latest version of $[prodname]:
+
+1. From the web console, go to the **Managed Clusters** page.
+1. If your organization uses multiple projects to group managed clusters, click the **Project** menu and select the project you want your cluster to be part of.
+1. For the cluster you want to upgrade, select **Actions** > **Reinstall**.
+1. In the **Reinstall Cluster** dialog, select a newer version of $[prodname] from the list, click **Reinstall**, and copy the generated kubectl command.
+1. From a terminal, paste and run the command.
+ The cluster's status under **Connection Status** changes to **Disconnected: Installing**.
+ When the upgrade is complete, the status changes to **Connected**.
+
+
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/get-started/windows-limitations.mdx b/calico-cloud_versioned_docs/version-24-1/get-started/windows-limitations.mdx
new file mode 100644
index 0000000000..bd2f0a15ad
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/get-started/windows-limitations.mdx
@@ -0,0 +1,204 @@
+---
+description: Known limitations for Calico Cloud on Windows worker nodes that you should review before planning a connection.
+---
+
+# Limitations and known issues for Windows nodes
+
+## $[prodname] feature limitations
+
+| Feature | Unsupported in this release |
+| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Platforms | - GKE |
+| Install and upgrade | - Typha component for scaling (Linux-based feature) |
+| Networking | - Overlay mode with BGP peering - IP in IP overlay with BGP routing - Cross-subnet support and MTU setting for VXLAN - IPv6 and dual stack - Dual-ToR - Service advertisement - Multiple networks to pods |
+| Policy | - Staged network-policy - Firewall integrations - Policy for hosts (host endpoints, including automatic host endpoints) - Tiered policy: TKG, GKE, AKS - WAF integration - AWS firewall integration - Fortinet integration |
+| Visibility and troubleshooting | - Packet capture - DNS logs - iptables logs - L7 logs |
+| Threat defense | - No threat defense features are supported. |
+| Multi-cluster management | - Multi-cluster management federated identity endpoints and services - Federated endpoint identity and services |
+| Security | - WireGuard encryption for pod-to-pod traffic and host-to-host traffic |
+| Data plane | - eBPF is a Linux-based feature |
+
+## $[prodname] BGP networking limitations
+
+If you are using $[prodname] with BGP, note these current limitations with Windows.
+
+| Feature | Limitation |
+| ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| IP mobility/ borrowing | $[prodname] IPAM allocates IPs to host in blocks for aggregation purposes. If the IP pool is full, nodes can also "borrow" IPs from another node's block. In BGP terms, the borrower then advertises a more specific "/32" route for the borrowed IP and traffic for that IP is only routed to the borrowing host.
Windows nodes do not support this borrowing mechanism; they will not borrow IPs even if the IP pool is full and they mark their blocks so that Linux nodes will not borrow from them. |
+| IPs reserved for Windows | $[prodname] IPAM allocates IPs in CIDR blocks. Due to networking requirements on Windows, four IPs per Windows node-owned block must be reserved for internal purposes.
For example, with the default block size of /26, each block contains 64 IP addresses, 4 are reserved for Windows, leaving 60 for pod networking.
To reduce the impact of these reservations, a larger block size can be configured at the IP pool scope (before any pods are created). |
+| Single IP block per host | $[prodname] IPAM is designed to allocate blocks of IPs (default size /26) to hosts on demand. While the $[prodname] CNI plugin was written to do the same, kube-proxy for Windows currently only supports a single IP block per host.
To work around the default limit of one /26 per host there some options:
- Use $[prodname] BGP networking with the kubernetes datastore. In that mode, $[prodname] IPAM is not used and the CNI host-local IPAM plugin is used with the node's Pod CIDR.
To allow multiple IPAM blocks per host (at the expense of kube-proxy compatibility), set the `windows_use_single_network` flag to `false` in the `cni.conf.template` before installing $[prodname]. Changing that setting after pods are networked is not recommended because it may leak HNS endpoints. |
+| IP-in-IP overlay | $[prodname]'s IPIP overlay mode cannot be used in clusters that contain Windows nodes because Windows does not support IP-in-IP. |
+| NAT-outgoing | $[prodname] IP pools support a "NAT outgoing" setting with the following behaviour:
- Traffic between $[prodname] workloads (in any IP pools) is not NATted. - Traffic leaving the configured IP pools is NATted if the workload has an IP within an IP pool that has NAT outgoing enabled. $[prodname] honors the above setting but it is only applied at pod creation time. If the IP pool configuration is updated after a pod is created, the pod's traffic will continue to be NATted (or not) as before. NAT policy for newly-networked pods will honor the new configuration. $[prodname] automatically adds the host itself and its subnet to the NAT exclusion list. This behaviour can be disabled by setting flag `windows_disable_host_subnet_nat_exclusion` to `true` in `cni.conf.template` before running the install script. |
+| Service IP advertisement | This $[prodname] feature is not supported on Windows. |
+
+### Check your network configuration
+
+If you are using a networking type that requires layer 2 reachability (such as $[prodname] with a BGP mesh and no peering to your fabric), you can check that your network has layer 2 reachability as follows:
+
+On each of your nodes, check the IP network of the network adapter that you plan to use for pod networking. For example, on Linux, assuming your network adapter is eth0, you can run:
+
+```
+$ ip addr show eth0
+ 2: eth0: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
+
+ link/ether 00:0c:29:cb:c8:19 brd ff:ff:ff:ff:ff:ff
+ inet 192.168.171.136/24 brd 192.168.171.255 scope
+
+ global eth0
+ valid_lft forever preferred_lft forever
+ inet6 fe80::20c:29ff:fecb:c819/64 scope
+ link
+
+ valid_lft forever preferred_lft
+ forever
+```
+
+In this case, the IPv4 is 192.168.171.136/24; which, after applying the /24 mask gives 192.168.171.0/24 for the IP network.
+
+Similarly, on Windows, you can run
+
+```
+PS C:\> ipconfig
+
+Windows IP Configuration
+
+Ethernet adapter vEthernet (Ethernet 2):
+
+ Connection-specific DNS Suffix . :
+ us-west-2.compute.internal Link-local IPv6 Address . . . .
+ . : fe80::6d10:ccdd:bfbe:bce2%15 IPv4 Address. . . . . . .
+ . . . . : 172.20.41.103 Subnet Mask . . . . . . . . . . .
+ : 255.255.224.0 Default Gateway . . . . . . . . . :
+ 172.20.32.1
+
+```
+
+In this case, the IPv4 address is 172.20.41.103 and the mask is represented as bytes 255.255.224.0 rather than CIDR notation. Applying the mask, we get a network address 172.20.32.0/19.
+
+Because the Linux node has network 192.168.171.136/24 and the Windows node has a different network, 172.20.32.0/19, they are unlikely to be on the same layer 2 network.
+
+## VXLAN networking limitations
+
+Because of differences between the Linux and Windows data plane feature sets, the following $[prodname] features are not supported on Windows.
+
+| Feature | Limitation |
+| ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| IPs reserved for Windows | $[prodname] IPAM allocates IPs in CIDR blocks. Due to networking requirements on Windows, four IPs per Windows node-owned block must be reserved for internal purposes.
For example, with the default block size of /26, each block contains 64 IP addresses, 4 are reserved for Windows, leaving 60 for pod networking.
To reduce the impact of these reservations, a larger block size can be configured at the IP pool scope (before any pods are created). |
+| Single IP block per host | $[prodname] IPAM is designed to allocate blocks of IPs (default size /26) to hosts on demand. While the $[prodname] CNI plugin was written to do the same, kube-proxy currently only supports a single IP block per host. To allow multiple IPAM blocks per host (at the expense of kube-proxy compatibility), set the `windows_use_single_network` flag to `false` in the `cni.conf.template` before installing $[prodname]. Changing that setting after pods are networked is not recommended because it may leak HNS endpoints. |
+
+## Routes are lost in cloud providers
+
+If you create a Windows host with a cloud provider (AWS for example), the creation of the vSwitch at $[prodname] install time can remove the cloud provider's metadata route. If your application relies on the metadata service, you may need to examine the routing table before and after installing $[prodname] to reinstate any lost routes.
+
+## VXLAN limitations
+
+**VXLAN support**
+
+- Windows 1903 build 18317 and above
+- Windows 1809 build 17763 and above
+
+**Configuration updates**
+
+Certain configuration changes will not be honored after the first pod is networked. This is because Windows does not currently support updating the VXLAN subnet parameters after the network is created so updating those parameters requires the node to be drained:
+
+One example is the VXLAN VNI setting. To change such parameters:
+
+- Drain the node of all pods
+- Delete the $[prodname] HNS network:
+
+ ```powershell
+ Import-Module -DisableNameChecking $[rootDirWindows]\libs\hns\hns.psm1
+ Get-HNSNetwork | ? Name -EQ "$[prodname]" | Remove-HNSNetwork
+ ```
+
+- Update the configuration in `config.ps1`, run `uninstall-calico.ps1` and then `install-calico.ps1` to regenerate the CNI configuration.
+
+## Pod-to-pod connections are dropped with TCP reset packets
+
+Restarting Felix or changes to policy (including changes to endpoints referred to in policy) can cause pod-to-pod connections to be dropped with TCP reset packets when one of the following occurs:
+
+- The policy that applies to a pod is updated
+- Some ingress or egress policy that applies to a pod contains selectors and the set of endpoints that those selectors match changes
+
+Felix must reprogram the HNS ACL policy attached to the pod. This reprogramming can cause TCP resets. Microsoft has confirmed this is a HNS issue, and they are investigating.
+
+## Service ClusterIPs incompatible with selectors on pod IPs in network policy
+
+**Windows 1809 prior to build 17763.1432**
+
+On Windows nodes, kube-proxy unconditionally applies source NAT to traffic from local pods to service ClusterIPs. This means that, at the destination pod, where policy is applied, the traffic appears to come from the source host rather than the source pod. In turn, this means that a network policy with a source selector matching the source pod will not match the expected traffic.
+
+## Network policy and using selectors
+
+Under certain conditions, relatively simple $[prodname] policies can require significant Windows data plane resources, that can cause significant CPU and memory usage, and large policy programming latency.
+
+We recommend avoiding policies that contain rules with both a source and destination selector. The following is an example of a policy that would be inefficient. The policy applies to all workloads, and it only allows traffic from workloads labeled as clients to workloads labeled as servers:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: calico-dest-selector
+spec:
+ selector: all()
+ order: 500
+ ingress:
+ - action: Allow
+ destination:
+ selector: role == "webserver"
+ source:
+ selector: role == "client"
+```
+
+Because the policy applies to all workloads, it will be rendered once per workload (even if the workload is not labeled as a server), and then the selectors will be expanded into many individual data plane rules to capture the allowed connectivity.
+
+Here is a much more efficient policy that still allows the same traffic:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: calico-dest-selector
+spec:
+ selector: role == "webserver"
+ order: 500
+ ingress:
+ - action: Allow
+ source:
+ selector: role == "client"
+```
+
+The destination selector is moved into the policy selector, so this policy is only rendered for workloads that have the `role: webserver` label. In addition, the rule is simplified so that it only matches on the source of the traffic. Depending on the number of webserver pods, this change can reduce the data plane resource usage by several orders of magnitude.
+
+## Network policy with tiers
+
+Because of the way the Windows data plane handles rules, the following limitations are required to avoid performance issues:
+
+- Tiers: maximum of 5
+- `pass` rules: maximum of 10 per tier
+- If each tier contains a large number of rules, and has pass rules, you may need to reduce the number of tiers further.
+
+## Flow log limitations
+
+$[prodname] supports flow logs with these limitations:
+
+- No packet/bytes stats for denied traffics
+- Inaccurate `num_flows_started` and `num_flows_completed` stats with VXLAN networking
+- No DNS stats
+- No HTTP stats
+- No RuleTrace for tiers
+- No BGP logs
+
+## DNS Policy limitations
+
+:::note
+
+DNS Policy is a tech preview feature. Tech preview features may be subject to significant changes before they become GA.
+
+:::
+
+$[prodname] supports DNS policy on Windows with these limitations:
+
+- It could take up to 5 seconds for the first TCP SYN packet to go through, for a connection to a DNS domain name. This is because DNS policies are dynamically programmed. The first TCP packet could be dropped since there is no policy to allow it until $[prodname] detects domain IPs from DNS response and programs DNS policy rules. The Windows TCPIP stack will send SYN again after TCP Retransmission timeout (RTO) if previous SYN has been dropped.
+- Some runtime libraries do not honour DNS TTL. Instead, they manage their own DNS cache which has a different TTL value for DNS entries. On .NET Framework, the value to control DNS TTL is ServicePointManager.DnsRefreshTimeout which has default value of 120 seconds - [DNS refresh timeout](https://docs.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.dnsrefreshtimeout). It is important that $[prodname] uses a longer TTL value than the one used by the application, so that DNS policy will be in place when the application is making outbound connections. The configuration item “WindowsDNSExtraTTL” should have a value bigger than the maximum value of DNS TTL used by the runtime libraries for your applications.
+- Due to the limitations of Windows container networking, a policy update could have an impact on performance. Programming DNS policy may result in more policy updates. Setting “WindowsDNSExtraTTL” to a bigger number will reduce the performance impact.
diff --git a/calico-cloud_versioned_docs/version-24-1/multicluster/aws.mdx b/calico-cloud_versioned_docs/version-24-1/multicluster/aws.mdx
new file mode 100644
index 0000000000..bdfaf19a16
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/multicluster/aws.mdx
@@ -0,0 +1,68 @@
+---
+description: Sample Calico Cloud cluster mesh configuration that peers an on-premises cluster with an AWS VPC cluster using BGP, NLB, and the Federated Services Controller.
+---
+
+# Cluster mesh example for clusters in AWS
+
+## Big picture
+
+A sample configuration for cluster mesh using AWS clusters.
+
+## Tutorial
+
+**Set up**
+
+The cluster is installed on real hardware where node and pod IPs are routable, using an edge VPN router to peer with the AWS cluster.
+
+
+
+**Calico Cloud configuration**
+
+- IP pool resource is configured for the on-premise IP assignment with IPIP is disabled
+- BGP peering to the VPN router
+- A Remote Cluster Configuration resource references the AWS cluster
+- Service discovery of the AWS cluster services uses the Calico Cloud Federated Services Controller
+
+**Notes**
+
+- If VPN Router is configured as a route reflector for the on-premise cluster, you would:
+ - Configure the default BGP Configuration resource to disable node-to-node mesh
+ - Configure a global BGP Peer resource to peer with the VPN router
+- If the IP Pool has `Outgoing NAT` enabled, then you must add an IP Pool covering the AWS cluster VPC with disabled set to `true`. When set to `true` the pool is not used for IP allocations, and SNAT is not performed for traffic to the AWS cluster.
+
+**AWS configuration**
+
+- A VPC CIDR is chosen that does not overlap with the on-premise IP ranges.
+- There are 4 subnets within the VPC, split across two AZs (for availability) such that each AZ has a public and private subnet. In this particular example, the split of responsibility is:
+ - The private subnet is used for node and pod IP allocation
+ - The public subnet is used to home a NAT gateway for pod-to-internet traffic.
+- The VPC is peered to an on-premise network using a VPN. This is configured as a VPN gateway for the AWS side, and a classic VPN for the customer side. BGP is used for route distribution.
+- Routing table for private subnet has:
+ - "propagate" set to "true" to ensure BGP-learned routes are distributed
+ - Default route to the NAT gateway for public internet traffic
+ - Local VPC traffic
+- Routing table for public subnet has default route to the internet gateway.
+- Security group for the worker nodes has:
+ - Rule to allow traffic from the peered networks
+ - Other rules required for settings up VPN peering (refer to the AWS docs for details).
+
+To automatically create a Network Load Balancer (NLB) for the AWS deployment, we apply a service with the correct annotation.
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ annotations:
+ service.beta.kubernetes.io/aws-load-balancer-type: nlb
+ name: nginx-external
+spec:
+ externalTrafficPolicy: Local
+ ports:
+ - name: http
+ port: 80
+ protocol: TCP
+ targetPort: 80
+ selector:
+ run: nginx
+ type: LoadBalancer
+```
diff --git a/calico-cloud_versioned_docs/version-24-1/multicluster/index.mdx b/calico-cloud_versioned_docs/version-24-1/multicluster/index.mdx
new file mode 100644
index 0000000000..58be3bb57d
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/multicluster/index.mdx
@@ -0,0 +1,17 @@
+---
+description: Form a Calico Cloud cluster mesh across clusters connected to the SaaS management plane with identity-aware policy and cross-cluster service discovery.
+hide_table_of_contents: true
+---
+
+import { DocCardLink, DocCardLinkLayout } from '/src/___new___/components';
+
+# Cluster mesh
+
+With cluster mesh, you can secure cross-cluster connections using identity-aware network policy and federate services for cross-cluster service discovery.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/multicluster/kubeconfig.mdx b/calico-cloud_versioned_docs/version-24-1/multicluster/kubeconfig.mdx
new file mode 100644
index 0000000000..94d26b27d7
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/multicluster/kubeconfig.mdx
@@ -0,0 +1,404 @@
+---
+description: Connect Calico Cloud connected clusters into a cluster mesh by generating per-cluster kubeconfig credentials and RemoteClusterConfiguration with VXLAN or WireGuard.
+---
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+# Creating the cluster mesh
+In this page, we will create a $[prodname] cluster mesh by connecting clusters together. Once created, $[prodname] cluster mesh enables multi-cluster networking, network policy for cross-cluster connections, cross-cluster services, and encryption via WireGuard.
+
+## Requirements
+$[prodname] multi-cluster networking provides routing between clusters that preserves pod IPs. This section outlines the requirements for this routing to be established. If your network already provides routing between clusters that preserves pod IPs, you can skip this section.
+
+### Prerequisites for $[prodname] multi-cluster networking:
+- All nodes participating in the cluster mesh must be able to establish connections to each other via their private IP.
+- All nodes participating in the cluster mesh must have unique node names.
+- Pod CIDRs between clusters must not overlap.
+- All clusters must have at least one overlay network in common (VXLAN and/or WireGuard).
+- All clusters must have the same `routeSource` setting on `FelixConfiguration`.
+
+If using VXLAN:
+- The `vxlan*` settings on `FelixConfiguration` must be the same across clusters participating in the mesh.
+- The underlying network must allow traffic on `vxlanPort` between clusters participating in the mesh.
+- All clusters must use Calico CNI.
+
+If using WireGuard:
+- The `wireguard*` settings on `FelixConfiguration` must be the same across clusters participating in the mesh.
+- The underlying network must allow traffic on `wireguardListeningPort` between clusters participating in the mesh.
+- All clusters must use Calico CNI OR All clusters must use non-Calico CNI (mixing non-Calico CNI types is supported).
+
+Note: much like intra-cluster routing in $[prodname], cross-cluster routing can utilize both VXLAN and WireGuard at the same time. If both are enabled and a WireGuard peer is not ready, communication with that peer will fall back to VXLAN.
+
+## Setup
+
+### Generate credentials for cross-cluster resource synchronization
+:::tip[mental model]
+The basis of cluster mesh is the ability for a cluster to connect to a remote cluster and sync data from it. This enables each $[prodname] cluster to have a view into the datastore that includes both local and remote cluster pods.
+:::
+
+In this section, we will create a `kubeconfig` for each cluster. This `kubeconfig` is what other clusters will use to connect to a given cluster and synchronize data from it.
+
+**For each** cluster in the cluster mesh, utilizing an existing `kubeconfig` with administrative privileges, follow these steps:
+
+1. Create the ServiceAccount used by remote clusters for authentication:
+
+ ```bash
+ kubectl apply -f $[filesUrl_CE]/manifests/federation-remote-sa.yaml
+ ```
+
+1. Create the ClusterRole and ClusterRoleBinding used by remote clusters for authorization:
+
+ ```bash
+ kubectl apply -f $[filesUrl_CE]/manifests/federation-rem-rbac-kdd.yaml
+ ```
+1. Create the ServiceAccount token that will be used in the `kubeconfig`:
+
+ ```yaml
+ kubectl apply -f - < $KUBECONFIG_NAME
+ ```
+
+1. Verify that the `kubeconfig` file works:
+
+ Issue the following command to validate the `kubeconfig` file can be used to connect to the current cluster and access resources:
+ ```bash
+ kubectl --kubeconfig=$KUBECONFIG_NAME get nodes
+ ```
+
+Once you've created a `kubeconfig` for **each** cluster, you can proceed to the next section to establish the cluster connections that form the mesh.
+
+### Establish cross-cluster resource synchronization
+:::tip[mental model]
+The cluster mesh is formed when each cluster connects to every other cluster to synchronize data. A cluster connects to another cluster using a RemoteClusterConfiguration, which references a kubeconfig created for the remote cluster.
+:::
+
+In this section, within each cluster, we will create a RemoteClusterConfiguration for each other cluster in the mesh. This RemoteClusterConfiguration instructs the cluster to connect to a cluster using a kubeconfig.
+
+With each cluster being connected to each other cluster, a full cluster mesh will be formed.
+
+
+
+
+:::tip[mental model]
+$[prodname] achieves cross-cluster routing by extending the overlay network of a cluster to include nodes from remote clusters. This is made possible by each cluster having a view into the datastore that now includes remote pods and nodes.
+:::
+**For each pair** of clusters in the cluster mesh (e.g. \{A,B\}, \{A,C\}, \{B,C\} for clusters A,B,C):
+
+1. In cluster 1, create a secret that contains the `kubeconfig` for cluster 2:
+
+ Determine the namespace (``) for the secret to replace in all steps.
+ The simplest method to create a secret for a remote cluster is to use the `kubectl` command because it correctly encodes the data and formats the file.
+ ```bash
+ kubectl create secret generic remote-cluster-secret-name -n \
+ --from-literal=datastoreType=kubernetes \
+ --from-file=kubeconfig=
+ ```
+
+1. If RBAC is enabled in cluster 1, create a Role and RoleBinding for $[prodname] to use to access the secret that contains the `kubeconfig` for cluster 2:
+ ```bash
+ kubectl create -f - <
+ rules:
+ - apiGroups: [""]
+ resources: ["secrets"]
+ verbs: ["watch", "list", "get"]
+ ---
+ apiVersion: rbac.authorization.k8s.io/v1
+ kind: RoleBinding
+ metadata:
+ name: remote-cluster-secret-access
+ namespace:
+ roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: remote-cluster-secret-access
+ subjects:
+ - kind: ServiceAccount
+ name: calico-typha
+ namespace: calico-system
+ EOF
+ ```
+
+1. Create the RemoteClusterConfiguration in cluster 1:
+
+ Within the RemoteClusterConfiguration, we specify the secret used to access cluster 2, and the overlay routing mode which toggles the establishment of cross-cluster overlay routes.
+ ```bash
+ kubectl create -f - <
+ kind: Secret
+ syncOptions:
+ overlayRoutingMode: Enabled
+ EOF
+ ```
+
+1. [Validate](#check-remote-cluster-connection) the that the remote cluster connection can be established.
+
+1. Repeat the above steps, switching cluster 1 and cluster 2.
+
+
+
+In this setup, the cluster mesh will rely on the underlying network to provides cross-cluster routing that preserves pod IPs.
+
+**For each pair** of clusters in the cluster mesh (e.g. \{A,B\}, \{A,C\}, \{B,C\} for clusters A,B,C):
+
+1. In cluster 1, create a secret that contains the `kubeconfig` for cluster 2:
+
+ Determine the namespace (``) for the secret to replace in all steps.
+ The simplest method to create a secret for a remote cluster is to use the `kubectl` command because it correctly encodes the data and formats the file.
+ ```bash
+ kubectl create secret generic remote-cluster-secret-name -n \
+ --from-literal=datastoreType=kubernetes \
+ --from-file=kubeconfig=
+ ```
+
+1. If RBAC is enabled in cluster 1, create a Role and RoleBinding for $[prodname] to use to access the secret that contains the `kubeconfig` for cluster 2:
+ ```bash
+ kubectl create -f - <
+ rules:
+ - apiGroups: [""]
+ resources: ["secrets"]
+ verbs: ["watch", "list", "get"]
+ ---
+ apiVersion: rbac.authorization.k8s.io/v1
+ kind: RoleBinding
+ metadata:
+ name: remote-cluster-secret-access
+ namespace:
+ roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: remote-cluster-secret-access
+ subjects:
+ - kind: ServiceAccount
+ name: calico-typha
+ namespace: calico-system
+ EOF
+ ```
+
+1. Create the RemoteClusterConfiguration in cluster 1:
+
+ Within the RemoteClusterConfiguration, we specify the secret used to access cluster 2, and the overlay routing mode which toggles the establishment of cross-cluster overlay routes.
+ ```bash
+ kubectl create -f - <
+ kind: Secret
+ syncOptions:
+ overlayRoutingMode: Disabled
+ EOF
+ ```
+
+1. If you have no IP pools in cluster 1 with NAT-outgoing enabled, skip this step.
+
+ Otherwise, if you have IP pools in cluster 1 with NAT-outgoing enabled, and workloads in that pool will egress to workloads in cluster 2, you need to instruct $[prodname] to not perform NAT on traffic destined for IP pools in cluster 2.
+
+ You can achieve this by creating a disabled IP pool in cluster 1 for each CIDR in cluster 2. This IP pool should have NAT-outgoing disabled. For example:
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: IPPool
+ metadata:
+ name: cluster2-main-pool
+ spec:
+ cidr:
+ disabled: true
+ ```
+
+1. [Validate](#check-remote-cluster-connection) the that the remote cluster connection can be established.
+
+1. Repeat the above steps, switching cluster 1 and cluster 2.
+
+
+
+
+#### 🎉 Done!
+After completing the above steps for all cluster pairs in the cluster mesh, your clusters should now be forming a cluster mesh! You should now be able to route traffic between clusters, and write policy that can select remote workloads.
+
+:::tip[mental model]
+A cluster in the mesh can write policy rules that select pods from other clusters in the mesh. This is because traffic from remote clusters has pod IPs preserved, and the local cluster can associate remote pod IPs with the pod specs it synchronized from remote clusters.
+:::
+
+## How to
+
+### Switch to multi-cluster networking
+The steps above assume that you are configuring both federated endpoint identity and multi-cluster networking for the first time. If you already have federated endpoint identity, and want to use multi-cluster networking, follow these steps:
+
+1. Validate that all [requirements](#prerequisites-for-calico-cloud-multi-cluster-networking) for multi-cluster networking have been met.
+2. Update the ClusterRole in each cluster in the cluster mesh using the RBAC manifest found in [Generate credentials for cross-cluster authentication](#generate-credentials-for-cross-cluster-resource-synchronization)
+3. In all RemoteClusterConfigurations, set `Spec.OverlayRoutingMode` to `Enabled`.
+4. Verify that all RemoteClusterConfigurations are bidirectional (in both directions for each cluster pair) using these [instructions](#establish-cross-cluster-resource-synchronization).
+5. If you had previously created disabled IP pools to prevent NAT outgoing from applying to remote cluster destinations, those disabled IP pools are no longer needed when using multi-cluster networking and must be deleted.
+
+### Validate federated endpoint identity & multi-cluster networking
+#### Validate RemoteClusterConfiguration and federated endpoint identity
+##### Check remote cluster connection
+
+You can check the Typha logs for remote cluster connection status. Run the following command:
+
+```bash
+kubectl logs deployment/calico-typha -n calico-system | grep "Sending in-sync update"
+```
+You should see an entry for each RemoteClusterConfiguration in the local cluster.
+
+If either output contains unexpected results, proceed to the [troubleshooting](#troubleshoot) section.
+
+#### Validate multi-cluster networking
+If all requirements were met for $[prodname] to establish multi-cluster networking, you can test the functionality by establishing a connection from a pod in a local cluster to the IP of a pod in a remote cluster. Ensure that there is no policy in either cluster that may block this connection.
+
+If the connection fails, proceed to the [troubleshooting](#troubleshoot) section.
+
+### Create remote-identity-aware network policy
+With federated endpoint identity and routing between clusters established, you can now use labels to reference endpoints on a remote cluster in local policy rules, rather than referencing them by IP address.
+
+The main policy selector still refers only to local endpoints; and that selector chooses which local endpoints to apply the policy.
+However, rule selectors can now refer to both local and remote endpoints.
+
+In the following example, cluster A (an application cluster) has a network policy that governs outbound connections to cluster B (a database cluster).
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: default.app-to-db
+ namespace: myapp
+spec:
+ # The main policy selector selects endpoints from the local cluster only.
+ selector: app == 'backend-app'
+ tier: default
+ egress:
+ - destination:
+ # Rule selectors can select endpoints from local AND remote clusters.
+ selector: app == 'postgres'
+ protocol: TCP
+ ports: [5432]
+ action: Allow
+```
+
+### Troubleshoot
+#### Troubleshoot RemoteClusterConfiguration and federated endpoint identity
+
+##### Verify configuration
+For each impacted remote cluster pair (between cluster A and cluster B):
+1. Retrieve the `kubeconfig` from the secret stored in cluster A. Manually verify that it can be used to connect to cluster B.
+ ```bash
+ kubectl get secret -n remote-cluster-secret-name -o=jsonpath="{.data.kubeconfig}" | base64 -d > verify_kubeconfig_b
+ kubectl --kubeconfig=verify_kubeconfig_b get nodes
+ ```
+ This validates that the credentials used by Typha to connect to cluster B's API server are stored in the correct location and provide sufficient access.
+
+ The command above should yield a result like the following:
+ ```
+ NAME STATUS ROLES AGE VERSION
+ clusterB-master Ready master 7d v1.27.0
+ clusterB-worker-1 Ready worker 7d v1.27.0
+ clusterB-worker-2 Ready worker 7d v1.27.0
+ ```
+
+ If you do not see the nodes of cluster B listed in response to the command above, verify that you [created](#generate-credentials-for-cross-cluster-resource-synchronization) the `kubeconfig` for cluster B correctly, and that you [stored](#establish-cross-cluster-resource-synchronization) it in cluster A correctly.
+
+ If you do see the nodes of cluster B listed in response to the command above, you can run this test (or a similar test) on a node in cluster A to verify that cluster A nodes can connect to the API server of cluster B.
+
+2. Validate that the Typha service account in Cluster A is authorized to retrieve the `kubeconfig` secret for cluster B.
+ ```bash
+ kubectl auth can-i list secrets --namespace --as=system:serviceaccount:calico-system:calico-typha
+ ```
+
+ This command should yield the following output:
+ ```
+ yes
+ ```
+
+ If the command does not return this output, verify that you correctly [configured RBAC](#establish-cross-cluster-resource-synchronization) in cluster A.
+
+3. Repeat the above, switching cluster A to cluster B.
+
+##### Check logs
+Validate that querying Typha logs yield the expected result outlined in the [validation](#validate-federated-endpoint-identity--multi-cluster-networking) section.
+
+If the Typha logs do not yield the expected result, review the warning or error-related logs in `typha` or `calico-node` for insights.
+
+#### Troubleshoot multi-cluster networking
+##### Basic validation
+* Ensure that RemoteClusterConfiguration and federated endpoint identity are [functioning correctly](#validate-federated-endpoint-identity--multi-cluster-networking)
+* Verify that you have met the [prerequisites](#prerequisites-for-calico-cloud-multi-cluster-networking) for multi-cluster networking
+* If you had previously set up RemoteClusterConfigurations without multi-cluster networking, and are upgrading to use the feature, review the [switching considerations](#switch-to-multi-cluster-networking)
+* Verify that traffic between clusters is not being denied by network policy
+
+##### Check overlayRoutingMode
+Ensure that `overlayRoutingMode` is set to `"Enabled"` on all RemoteClusterConfigurations.
+
+If overlay routing is successfully enabled, you can view the logs of a Typha instance using:
+```bash
+kubectl logs deployment/calico-typha -n calico-system
+```
+
+You should see an output for each connected remote cluster that looks like this:
+```
+18:49:35.394 [INFO][14] wrappedcallbacks.go 443: Creating syncer for RemoteClusterConfiguration(my-cluster)
+18:49:35.394 [INFO][14] watchercache.go 186: Full resync is required ListRoot="/calico/ipam/v2/assignment/"
+18:49:35.395 [INFO][14] watchercache.go 186: Full resync is required ListRoot="/calico/resources/v3/projectcalico.org/workloadendpoints"
+18:49:35.396 [INFO][14] watchercache.go 186: Full resync is required ListRoot="/calico/resources/v3/projectcalico.org/hostendpoints"
+18:49:35.396 [INFO][14] watchercache.go 186: Full resync is required ListRoot="/calico/resources/v3/projectcalico.org/profiles"
+18:49:35.396 [INFO][14] watchercache.go 186: Full resync is required ListRoot="/calico/resources/v3/projectcalico.org/nodes"
+18:49:35.397 [INFO][14] watchercache.go 186: Full resync is required ListRoot="/calico/resources/v3/projectcalico.org/ippools"
+```
+
+If you do not see the each of the resource types above, overlay routing was not successfully enabled in your cluster. Verify that you followed the [setup](#establish-cross-cluster-resource-synchronization) correctly for overlay routing, and that the cluster is using a version of $[prodname] that supports multi-cluster networking.
+
+###### Check logs
+Warning or error logs in `typha` or `calico-node` may provide insight into where issues are occurring.
+
+## Next steps
+
+[Configure federated services](services-controller.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/multicluster/overview.mdx b/calico-cloud_versioned_docs/version-24-1/multicluster/overview.mdx
new file mode 100644
index 0000000000..a93d613050
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/multicluster/overview.mdx
@@ -0,0 +1,54 @@
+---
+description: Calico Cloud cluster mesh concepts for connected clusters including pod IP routability, federated endpoint identity, federated services, and overlay networking.
+---
+
+# Overview
+
+## Big picture
+
+Secure cross-cluster connections with identity-aware network policy, and federate services for cross-cluster service discovery.
+
+Utilize $[prodname] to establish cross-cluster connectivity.
+
+## Value
+
+At some point in your Kubernetes journey, you may have applications that need to access services and workloads running in another cluster.
+
+By default, pods can only communicate with pods within the same cluster. Additionally, services and network policy only select pods from within the same cluster. $[prodname] can help overcome these barriers by forming a cluster mesh that provides the following features:
+- **Federated endpoint identity**
+
+ Allow a local Kubernetes cluster to include the workload endpoints (pods) and host endpoints of a remote cluster in the calculation of local network policies applied on each node of the local cluster.
+
+- **Federated services**
+
+ Enable a local Kubernetes Service to populate with Endpoints selected from both local cluster and remote cluster Services.
+
+- **Multi-cluster networking**
+
+ Establish an overlay network between clusters to provide cross-cluster connectivity with $[prodname].
+
+## Concepts
+
+### Pod IP routability
+
+$[prodname] cluster mesh is implemented at Kubernetes at the network layer, based on pod IPs.
+
+Taking advantage of federated workload endpoint identity and federated services requires that pod IPs are routable between clusters. This is because identity-aware network policy requires source and destination pod IPs to be preserved to establish pod identity. Additionally, the Endpoint IPs of pods selected by a federated Service must be routable in order for that Service to be of value.
+
+You can utilize $[prodname] multi-cluster networking to establish pod IP routability between clusters via overlay. Alternatively, you can manually set up pod IP routability between clusters without encapsulation (e.g. VPC routing, BGP routing).
+
+### Federated endpoint identity
+
+Federated endpoint identity in a cluster mesh allows a local Kubernetes cluster to include the workload endpoints (pods) and host endpoints of a remote cluster in the calculation of the local policies for each node, e.g. Cluster A network policy allows its application pods to talk to database pods in Cluster B.
+
+This feature does not _federate network policies_; policies from a remote cluster are not applied to the endpoints on the local cluster, and the policy from the local cluster is rendered only locally and applied to the local endpoints.
+
+### Federated services
+
+Federated services in a cluster mesh works with federated endpoint identity, providing cross-cluster service discovery for a local cluster. If you have an existing service discovery mechanism, this feature is optional.
+
+Federated services use the Tigera Federated Services Controller to federate all Kubernetes endpoints (workload and host endpoints) across all of the clusters. The Federated Services Controller accesses service and endpoints data in the remote clusters directly through the Kubernetes API.
+
+## Next steps
+
+[Configure remote-aware policy and multi-cluster networking](kubeconfig.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/multicluster/services-controller.mdx b/calico-cloud_versioned_docs/version-24-1/multicluster/services-controller.mdx
new file mode 100644
index 0000000000..2c8435578d
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/multicluster/services-controller.mdx
@@ -0,0 +1,209 @@
+---
+description: Configure a Calico Cloud federated service with the Tigera Federated Services Controller to surface endpoints from connected clusters in the SaaS plane.
+---
+
+# Configure federated services
+
+## Big picture
+
+Configure local clusters to discover services across multiple clusters.
+
+## Value
+
+Use cluster mesh and federated services discovery along with federated endpoint identity to extend and automate endpoints sharing. (Optional if you have your own service discovery mechanism.)
+
+## Concepts
+
+### Federated services
+
+A federated service (also called a backing service), is a set of services with consolidated endpoints. $[prodname] discovers services across a cluster mesh (both local cluster and remote clusters) and creates a "federated service" on the local cluster that encompasses all of the individual services.
+
+Federated services are managed by the Tigera Federated Service Controller, which monitors and maintains endpoints for each locally-federated service. The controller does not change configuration on remote clusters.
+
+A federated service looks similar to a regular Kubernetes service, but instead of using a pod selector, it uses an annotation. For example:
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ name: my-app-federated
+ namespace: default
+ annotations:
+ federation.tigera.io/serviceSelector: run == "my-app"
+spec:
+ ports:
+ - name: my-app-ui
+ port: 8080
+ protocol: TCP
+ type: ClusterIP
+```
+
+| Annotation | Description |
+| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `federation.tigera.io/serviceSelector` | Required field that specifies the services used in the federated service. Format is a standard $[prodname] selector (i.e. the same as $[prodname] policy resources) and selects services based on their labels. The selector annotation selects services, not pods.
Only services in the same namespace as the federated service are included. This implies namespace names across clusters are linked (this is a basic premise of federated endpoint identity).
If the value is incorrectly specified, the service is not federated and endpoint data is removed from the service. View the warning logs in the controller for any issues processing this value. |
+
+**Syntax and rules**
+
+- Services that you specify in the federated service must be in the same namespace or they are ignored. A basic assumption of federated endpoint identity is that namespace names are linked across clusters.
+- If you specify a `spec.Selector` in a federated service, the service is not federated.
+- You cannot federate another federated service. If a service has a federated services annotation, it is not included as a backing service of another federated service.
+- The target port number in the federated service ports is not used.
+
+**Match services using a label**
+
+You can also match services using a label. The label is implicitly added to each service, but it does not appear in `kubectl` when viewing the service.
+
+| Label | Description |
+| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `federation.tigera.io/remoteClusterName` | Label added to all remote services that correspond to the Remote Cluster Configuration name for the remote cluster. Use this label to restrict the clusters selected by the services. **Note**: The label is not added for services in the local cluster. |
+
+**About endpoints**
+
+- Do not manually create or manage endpoints resources; let the Tigera controller do all of the work. User updates to endpoint resources are ignored.
+- Endpoints are selected only when the service port name and protocol in the federated service matches the port name and protocol in the backing service.
+- Endpoint data configured in the federated service is slightly modified from the original data of the backing service. For backing services on remote clusters, the `targetRef.name` field in the federated service adds the ``. For example, `/`.
+
+## Before you begin
+
+**Required**
+
+- [Configure federated endpoint identity](kubeconfig.mdx)
+
+## How to
+
+- [Create service resources](#create-service-resources)
+- [Create a federated service](#create-a-federated-service)
+- [Access a federated service](#access-a-federated-service)
+
+### Create service resources
+
+On each cluster in the mesh that is providing a particular service, create your service resources as you normal would with the following requirements:
+
+- Services must all be in the same namespace.
+- Configure each service with a common label key and value to identify the common set of services across your clusters (for example, `run=my-app`).
+
+Kubernetes manages the service by populating the service endpoints from the pods that match the selector configured in the service spec.
+
+### Configure a federated service
+
+1. On a cluster that needs to access the federated set of pods that are running an application, create a
+ service on that cluster leaving the `spec selector` blank.
+1. Set the `federation.tigera.io/serviceSelector` annotation to be a $[prodname] selector that selects the previously-configured services using the matching label match (for example, `run == "my-app"`).
+
+The Federated Services Controller manages this service, populating the service endpoints from all of the services that match the service selector configured in the annotation.
+
+### Access a federated service
+
+Any application can access the federated service using the local DNS name for that service. The simplest way to access a federated service is through its corresponding DNS name.
+
+By default, Kubernetes adds DNS entries to access a service locally. For a service called `my-svc` in the namespace
+`my-namespace`, the following DNS entry would be added to access the service within the local cluster:
+
+```
+my-svc.my-namespace.svc.cluster.local
+```
+
+DNS lookup for this name returns the fixed ClusterIP address assigned for the federated service. The ClusterIP is translated in iptables to one of the federated service endpoint IPs, and is load balanced across all of the endpoints.
+
+## Tutorial
+
+### Create a service
+
+In the following example, the remote cluster defines the following service.
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ run: my-app
+ name: my-app
+ namespace: default
+spec:
+ selector:
+ run: my-app
+ ports:
+ - name: my-app-ui
+ port: 80
+ protocol: TCP
+ targetPort: 9000
+ - name: my-app-console
+ port: 81
+ protocol: TCP
+ targetPort: 9001
+ type: ClusterIP
+```
+
+This service definition exposes two ports for the application `my-app`. One port for accessing a UI, and the other for accessing a management console. The service specifies a Kubernetes selector, which means the endpoints for this service are automatically populated by Kubernetes from matching pods within the services own cluster.
+
+### Create a federated service
+
+To create a federated service on your local cluster that federates the web access port for both the local and remote service, you would create a service resource on your local cluster as follows:
+
+```yaml
+apiVersion: v1
+kind: Service
+metadata:
+ name: my-app-federated
+ namespace: default
+ annotations:
+ federation.tigera.io/serviceSelector: run == "my-app"
+spec:
+ ports:
+ - name: my-app-ui
+ port: 8080
+ protocol: TCP
+ type: ClusterIP
+```
+
+The `spec.selector` is not specified so it will not be managed by Kubernetes. Instead, we use a `federation.tigera.io/selector` annotation, indicating that this is a federated service managed by the Federated Services Controller.
+
+The controller matches the `my-app` services (matching the run label) on both the local and remote clusters, and consolidates endpoints from the `my-app-ui` TCP port for both of those services. Because the federated service does not specify the `my-app-console` port, the controller does not include these endpoints in the federated service.
+
+The endpoints data for the federated service is similar to the following. Note that the name of the remote cluster is included in `targetRef.name`.
+
+```yaml
+apiVersion: v1
+kind: Endpoints
+metadata:
+ creationTimestamp: 2018-07-03T19:41:38Z
+ annotations:
+ federation.tigera.io/serviceSelector: run == "my-app"
+ name: my-app-federated
+ namespace: default
+ resourceVersion: '701812'
+ selfLink: /api/v1/namespaces/default/endpoints/my-app-federated
+ uid: 1a0427e8-7ef9-11e8-a24c-0259d75c6290
+subsets:
+ - addresses:
+ - ip: 192.168.93.12
+ nodeName: node1.localcluster.tigera.io
+ targetRef:
+ kind: Pod
+ name: my-app-59cf48cdc7-frf2t
+ namespace: default
+ resourceVersion: '701655'
+ uid: 19f5e914-7ef9-11e8-a24c-0259d75c6290
+ ports:
+ - name: my-app-ui
+ port: 80
+ protocol: TCP
+ - addresses:
+ - ip: 192.168.0.28
+ nodeName: node1.remotecluster.tigera.io
+ targetRef:
+ kind: Pod
+ name: remotecluster/my-app-7b6f758bd5-ctgbh
+ namespace: default
+ resourceVersion: '701648'
+ uid: 19e2c841-7ef9-11e8-a24c-0259d75c6290
+ ports:
+ - name: my-app-ui
+ port: 80
+ protocol: TCP
+```
+
+## Additional resources
+
+- [Cluster mesh example for AWS](aws.mdx)
+- [Federated services controller](../reference/resources/kubecontrollersconfig.mdx#federatedservicescontroller)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/application-layer-policies/alp-tutorial.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/application-layer-policies/alp-tutorial.mdx
new file mode 100644
index 0000000000..4a1bce5fb7
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/application-layer-policies/alp-tutorial.mdx
@@ -0,0 +1,168 @@
+---
+description: Step-by-step tutorial for applying Calico Cloud application-layer policy to workloads in a connected cluster — control ingress traffic by HTTP attributes.
+---
+
+# Application layer policy tutorial
+
+This tutorial shows how to use $[prodname] application layer policy to restrict ingress traffic for applications and microservices.
+
+### Install the demo application
+
+We will use a simple microservice application to demonstrate $[prodname]
+application layer policy. The [YAO Bank](https://github.com/projectcalico/yaobank) application creates a
+customer-facing web application, a microservice that serves up account
+summaries, and an [etcd](https://github.com/coreos/etcd) datastore.
+
+```bash
+kubectl apply -f $[tutorialFilesURL]/10-yaobank.yaml
+```
+```bash
+namespace/yaobank configured
+service/database created
+serviceaccount/database created
+deployment.apps/database created
+service/summary created
+serviceaccount/summary created
+deployment.apps/summary created
+service/customer created
+serviceaccount/customer created
+deployment.apps/customer created
+```
+
+:::note
+
+You can also
+[view the manifest in your browser](/files/10-yaobank.yaml).
+
+:::
+
+Verify that the application pods have been created and are ready.
+```bash
+ kubectl rollout status deploy/summary deploy/customer deploy/database
+```
+
+When the demo application is displayed, you will see three pods.
+
+```
+NAME READY STATUS RESTARTS AGE
+customer-2809159614-qqfnx 3/3 Running 0 21h
+database-1601951801-m4w70 3/3 Running 0 21h
+summary-2817688950-g1b3n 3/3 Running 0 21h
+```
+
+## Set up
+- A $[prodname] cluster is running with application layer policy enabled
+- Cluster has three microservices: customer, database, summary
+- The customer web service should not have access to the backend database, but should have access to clients outside the cluster
+
+Imagine what would happen if an attacker were to gain control of the customer web pod in our
+application. Let's simulate this by executing a remote shell inside that pod.
+
+```bash
+kubectl exec -ti customer- -c customer -- bash
+```
+
+Notice that from here, we get direct access to the backend database. For example, we can list all the entries in the database like this:
+
+```bash
+curl http://database:2379/v2/keys?recursive=true | python -m json.tool
+```
+
+(Piping to `python -m json.tool` nicely formats the output.)
+
+## Apply application layer policy
+
+In this step, we get the application layer policy YAML and apply it. Note that the policy scope is cluster-wide.
+
+With a $[prodname] policy, you can mitigate risks to the banking application.
+
+```bash
+wget $[tutorialFilesURL]/30-policy.yaml
+kubectl create -f 30-policy.yaml
+```
+
+Let's examine this policy piece by piece. First, notice that an application layer policy looks like a regular $[prodname] global network policy.
+The only difference you'll see is the ability to use the application layer policy parameters in global network policy. Another important difference
+is that you'll see HTTP traffic flows in the web console in features like Service Graph.
+
+Next, there are three policy objects, one for each microservice.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: customer
+spec:
+ selector: app == 'customer'
+ ingress:
+ - action: Allow
+ http:
+ methods: ['GET']
+ egress:
+ - action: Allow
+```
+
+The first policy protects the customer web app. Because this application is customer-facing, we do not
+restrict what can communicate with it. We do, however, restrict its communications to HTTP `GET`
+requests.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: summary
+spec:
+ selector: app == 'summary'
+ ingress:
+ - action: Allow
+ source:
+ serviceAccounts:
+ names: ['customer']
+ egress:
+ - action: Allow
+```
+
+The second policy protects the account summary microservice. We know the only consumer of this
+service is the customer web app, so we restrict the source of incoming connections to the service
+account for the customer web app.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: database
+spec:
+ selector: app == 'database'
+ ingress:
+ - action: Allow
+ source:
+ serviceAccounts:
+ names: ["summary"]
+ egress:
+ - action: Allow
+```
+
+The third policy protects the database. Only the summary microservice should have direct access to
+the database.
+
+### Verify the policy is working
+
+Let's verify our policy is working as intended. First, return to your browser and refresh to
+ensure policy enforcement has not broken the application.
+
+Next, return to the customer web app. Recall that we simulated an attacker gaining control of that
+pod by executing a remote shell inside it.
+
+```bash
+kubectl exec -ti customer- -c customer bash
+```
+
+Repeat our attempt to access the database.
+
+```bash
+curl -I http://database:2379/v2/keys?recursive=true
+```
+
+We omitted the JSON formatting because we do not expect to get a valid JSON response. This
+time we should get a `403 Forbidden` response. Only the account summary microservice has database
+access according to our policy.
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/application-layer-policies/alp.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/application-layer-policies/alp.mdx
new file mode 100644
index 0000000000..6955c3d05c
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/application-layer-policies/alp.mdx
@@ -0,0 +1,96 @@
+---
+description: Configure access controls based on Layer-7 attributes by enforcing Calico Cloud application-layer policy in connected clusters.
+---
+
+# Enable and enforce application layer policies
+
+:::warning[deprecation and removal notice]
+
+Application layer policy based on Envoy is deprecated and will be removed in an upcoming release.
+For similar functionality, try [Istio Ambient Mode](../../compliance/istio/about-istio-ambient.mdx) with [Istio authorization policies](https://istio.io/latest/docs/ambient/getting-started/enforce-auth-policies/).
+
+:::
+
+Application layer policies let you configure access controls based on L7 attributes.
+
+## Before you begin
+
+### Limitations
+
+* Application layer policy is not compatible with a service mesh such as Istio.
+* Application layer policy can restrict only _ingress_ traffic.
+ It can not restrict egress traffic.
+* Support for L7 attributes is limited to HTTP method and URL exact/prefix path.
+* Supported protocols are limited to TCP-based protocols (for example, HTTP, HTTPS, or gRPC).
+* Application layer policies apply to the entire cluster.
+ They can not be namespaced.
+* Logs for application layer polices are not included with other L7 logs in Service Graph.
+* Application layer policy is supported only on Kubernetes 1.29 and later.
+
+:::important
+
+When you enable application layer policy for a deployment, all of that deployment's pods will restart
+Active connections may be disrupted.
+
+:::
+
+### Enable application layer policy (ALP)
+
+Create an (or edit an existing ApplicationLayer) resource with the `sidecarInjection` field to `Enabled`:
+
+```bash
+kubectl apply -f - < -n -p '{"spec":{"template":{"metadata":{"labels":{"applicationlayer.projectcalico.org/sidecar":"true"},"annotations":{"applicationlayer.projectcalico.org/policy":"Enabled"}}}}}'
+```
+
+### Enforce application layer policies for ingress traffic
+
+You can restrict ingress traffic using HTTP match criteria using Global network policy.
+For a list of all HTTP match parameters, see [Global network policy](/reference/resources/globalnetworkpolicy.mdx).
+
+In the following example, the trading app is allowed ingress traffic only for HTTP GET requests that match the exact path /projects/calico, or that begins with the prefix, /users.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: customer
+spec:
+ selector: app == 'tradingapp'
+ ingress:
+ - action: Allow
+ http:
+ methods: ["GET"]
+ paths:
+ - exact: "/projects/calico"
+ - prefix: "/users"
+ egress:
+ - action: Allow
+```
+
+### Disable application layer policies
+
+To disable the policies, do one of the following steps:
+* Recreate your application pods without the sidecar label and annotations.
+* Remove the `applicationLayerPolicy` field entirely.
+* Remove the `sidecarInjection` field entirely, if sidecar mode was being used only for ALP.
+* Delete the ApplicationLayer` custom resource if only ALP was enabled on it.
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/application-layer-policies/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/application-layer-policies/index.mdx
new file mode 100644
index 0000000000..7318cabe91
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/application-layer-policies/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Restrict ingress traffic to Calico Cloud workloads by HTTP method, path, or other Layer-7 attributes using application-layer policy.
+hide_table_of_contents: true
+---
+
+# Application layer policies to control ingress traffic
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/calico-labels.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/calico-labels.mdx
new file mode 100644
index 0000000000..6a1c279ddc
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/calico-labels.mdx
@@ -0,0 +1,87 @@
+---
+description: Reference list of automatic labels Calico Cloud attaches to resources, useful as selectors in policy rules.
+---
+
+# Calico Cloud automatic labels
+
+As a convenience, $[prodname] provides immutable labels that are used for specific resources when evaluating selectors in policies, and works with the labels Kubernetes applies automatically. The labels make it easier to match resources in common ways (such as matching a namespace by name).
+
+## Labels for matching namespaces
+
+Kubernetes sets the label `kubernetes.io/metadata.name` to the name of the namespace. This allows for matching namespaces by name when using a `namespaceSelector` field.
+
+For example, the following GlobalNetworkPolicy applies to workloads with label, `color: red` in namespaces named, `"foo"` and `"bar"`. The policy allows ingress traffic to port 8080 from all workloads in a third namespace named, `"baz"`:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: foo-and-bar
+spec:
+ namespaceSelector: kubernetes.io/metadata.name in {"foo", "bar"}
+ selector: color == "red"
+ types:
+ - Ingress
+ ingress:
+ - action: Allow
+ source:
+ namespaceSelector: kubernetes.io/metadata.name == "baz"
+ destination:
+ ports:
+ - 8080
+```
+
+Be aware that the default values for `namespaceSelector` for NetworkPolicy and GlobalNetworkPolicy are different. For example:
+
+**In a network policy**,
+
+ ```yaml
+ namespaceSelector:
+ selector: foo == "bar"
+ ```
+means "resources in the same namespace as the network policy that matches foo == 'bar'".
+
+**In a global network policy**,
+
+ ```yaml
+ namespaceSelector:
+ selector: foo == "bar"
+ ```
+means "resources in any namespace and non-namespaced resources that match foo == 'bar'".
+
+Further,
+
+ ```yaml
+ namespaceSelector: kubernetes.io/metadata.name == "some-namespace"
+ selector: foo == "bar"
+ ```
+is equivalent to:
+
+ ```yaml
+ namespaceSelector:
+ selector: (foo == "bar") && (projectcalico.org/namespace == "some-namespace")
+ ```
+
+### Labels for matching service accounts
+
+The `projectcalico.org/name` label is applied to ServiceAccounts and allows for matching by name in a `serviceAccountSelector`. Kubernetes has no equivalent automatic label for ServiceAccounts, so use `projectcalico.org/name` here.
+
+### The projectcalico.org/name label for namespaces {/* #projectcalico-name-label-for-namespaces */}
+
+$[prodname] also sets `projectcalico.org/name` to the name of the namespace, and it can be used in a `namespaceSelector` in the same way. It predates the Kubernetes [automatic labeling](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/#automatic-labelling), and $[prodname] derives it as it reads the namespace rather than storing it on the object, so `kubectl get namespace --show-labels` does not show it. For matching namespaces, prefer `kubernetes.io/metadata.name`.
+
+## Labels for matching host endpoints
+
+[Automatic HostEndpoints](../../network-policy/hosts/kubernetes-nodes) use the following label to differentiate them from regular HostEndpoints:
+
+- `projectcalico.org/created-by: calico-kube-controllers`
+
+## Use the correct selector with labels in policies
+
+$[prodname] labels must be used with the correct selector or the policy will not work as designed (and there are no error messages in the web console or when applying the YAML).
+
+| Label | Usage requirements | Use in these resources... |
+| --------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| `kubernetes.io/metadata.name` | Use with a **namespaceSelector**. | - Network policy - Staged network policy
Namespaced resources that apply only to workload endpoint resources in the namespace. |
+| `projectcalico.org/name` | Use with a **serviceAccountSelector**, or with a **namespaceSelector** (prefer `kubernetes.io/metadata.name` for namespaces). | - Network policy - Staged network policy
Namespaced resources that apply only to workload endpoint resources in the namespace. |
+| `projectcalico.org/namespace` | Use only with selectors.
Use the label as the label name, and a namespace name as the value to compare against (for example projectcalico.org/namespace == "default"). | - Global network policy - Staged global network policy
Cluster-wide (non-namespaced) resources that apply to workload endpoint resources in all namespaces, and to host endpoint resources. |
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/calico-network-policy.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/calico-network-policy.mdx
new file mode 100644
index 0000000000..8781e0b9ff
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/calico-network-policy.mdx
@@ -0,0 +1,256 @@
+---
+description: Write your first Calico Cloud NetworkPolicy — sample policies that exercise the rich rule features beyond Kubernetes NetworkPolicy.
+---
+
+# Get started with Calico network policy
+
+## Big picture
+
+Enforce which network traffic that is allowed or denied using rules in Calico network policy.
+
+## Value
+
+### Extends Kubernetes network policy
+
+Calico network policy provides a richer set of policy capabilities than Kubernetes including: policy ordering/priority, deny rules, and more flexible match rules. While Kubernetes network policy applies only to pods, Calico network policy can be applied to multiple types of endpoints including pods, VMs, and host interfaces.
+
+### Write once, works everywhere
+
+No matter which cloud provider you use now, adopting Calico network policy means you write the policy once and it is portable. If you move to a different cloud provider, you don’t need to rewrite your Calico network policy. Calico network policy is a key feature to avoid cloud provider lock-in.
+
+### Works seamlessly with Kubernetes network policies
+
+You can use Calico network policy in addition to Kubernetes network policy, or exclusively. For example, you could allow developers to define Kubernetes network policy for their microservices. For broader and higher-level access controls that developers cannot override, you could allow only security or Ops teams to define Calico network policies.
+
+## Concepts
+
+### Endpoints
+
+Calico network policies apply to **endpoints**. In Kubernetes, each pod is a Calico endpoint. However, Calico can support other kinds of endpoints. There are two types of Calico endpoints: **workload endpoints** (such as a Kubernetes pod or OpenStack VM) and **host endpoints** (an interface or group of interfaces on a host).
+
+### Namespaced and global network policies
+
+**Calico network policy** is a namespaced resource that applies to pods/containers/VMs in that namespace.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-tcp-port-6379
+ namespace: production
+```
+
+**Calico global network policy** is a non-namespaced resource and can be applied to any kind of endpoint (pods, VMs, host interfaces) independent of namespace.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-tcp-port-6379
+```
+
+Because global network policies use **kind: GlobalNetworkPolicy**, they are grouped separately from **kind: NetworkPolicy**. For example, global network policies will not be returned from `kubectl get networkpolicy.p`, and are rather returned from `kubectl get globalnetworkpolicy`.
+
+### Ingress and egress
+
+Each network policy rule applies to either **ingress** or **egress** traffic. From the point of view of an endpoint (pod, VM, host interface), **ingress** is incoming traffic to the endpoint, and **egress** is outgoing traffic from the endpoint. In a Calico network policy, you create ingress and egress rules independently (egress, ingress, or both).
+
+You can specify whether policy applies to ingress, egress, or both using the **types** field. If you do not use the types field, Calico defaults to the following values.
+
+| Ingress rule present? | Egress rule present? | Value |
+| :-------------------: | :------------------: | :-------------: |
+| No | No | Ingress |
+| Yes | No | Ingress |
+| No | Yes | Egress |
+| Yes | Yes | Ingress, Egress |
+
+### Network traffic behaviors: deny and allow
+
+The Kubernetes network policy specification defines the following behavior:
+
+- If no network policies apply to a pod, then all traffic to/from that pod is allowed.
+- If one or more network policies apply to a pod containing ingress rules, then only the ingress traffic specifically allowed by those policies is allowed.
+- If one or more network policies apply to a pod containing egress rules, then only the egress traffic specifically allowed by those policies is allowed.
+
+For compatibility with Kubernetes, **Calico network policy** follows the same behavior for Kubernetes pods. For other endpoint types (VMs, host interfaces), Calico network policy is default deny. That is, only traffic specifically allowed by network policy is allowed, even if no network policies apply to the endpoint.
+
+{/*//TODO-CC-XREFS
+## Before you begin
+
+`calicoctl` must be **installed** and **configured** before use. `calicoctl` will use Kubernetes as the datastore. You can find more information on how to configure `calicoctl` in the following link:
+
+- [Configure `calicoctl`](/operations/clis/calicoctl/configure/overview)
+*/}
+
+## How to
+
+- [Control traffic to/from endpoints in a namespace](#control-traffic-tofrom-endpoints-in-a-namespace)
+- [Control traffic to/from endpoints independent of namespace](#control-traffic-tofrom-endpoints-independent-of-namespace)
+- [Control traffic to/from endpoints using IP addresses or CIDR ranges](#control-traffic-tofrom-endpoints-using-ip-addresses-or-cidr-ranges)
+- [Apply network policies in specific order](#apply-network-policies-in-specific-order)
+- [Generate logs for specific traffic](#generate-logs-for-specific-traffic)
+
+### Control traffic to/from endpoints in a namespace
+
+In the following example, ingress traffic to endpoints in the **namespace: production** with label **color: red** is allowed, only if it comes from a pod in the same namespace with **color: blue**, on port **6379**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-tcp-port-6379
+ namespace: production
+spec:
+ selector: color == 'red'
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: color == 'blue'
+ destination:
+ ports:
+ - 6379
+```
+
+To allow ingress traffic from endpoints in other namespaces, use a **namespaceSelector** in the policy rule. A namespaceSelector matches namespaces based on the labels that are applied in the namespace. In the following example, ingress traffic is allowed from endpoints in namespaces that match **shape == circle**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-tcp-port-6379
+ namespace: production
+spec:
+ selector: color == 'red'
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: color == 'blue'
+ namespaceSelector: shape == 'circle'
+ destination:
+ ports:
+ - 6379
+```
+
+### Control traffic to/from endpoints independent of namespace
+
+The following Calico network policy is similar to the previous example, but uses **kind: GlobalNetworkPolicy** so it applies to all endpoints, regardless of namespace.
+
+In the following example, incoming TCP traffic to any pods with label **color: red** is denied if it comes from a pod with **color: blue**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: deny-blue
+spec:
+ selector: color == 'red'
+ ingress:
+ - action: Deny
+ protocol: TCP
+ source:
+ selector: color == 'blue'
+```
+
+As with **kind: NetworkPolicy**, you can allow or deny ingress traffic from endpoints in specific namespaces using a namespaceSelector in the policy rule:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: deny-circle-blue
+spec:
+ selector: color == 'red'
+ ingress:
+ - action: Deny
+ protocol: TCP
+ source:
+ selector: color == 'blue'
+ namespaceSelector: shape == 'circle'
+```
+
+### Control traffic to/from endpoints using IP addresses or CIDR ranges
+
+Instead of using a selector to define which traffic is allowed to/from the endpoints in a network policy, you can also specify an IP block in CIDR notation.
+
+In the following example, outgoing traffic is allowed from pods with the label **color: red** if it goes to an IP address in the **1.2.3.4/24** CIDR block.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-egress-external
+ namespace: production
+spec:
+ selector: color == 'red'
+ types:
+ - Egress
+ egress:
+ - action: Allow
+ destination:
+ nets:
+ - 1.2.3.0/24
+```
+
+### Apply network policies in specific order
+
+To control the order/sequence of applying network policies, you can use the **order** field (with precedence from the lowest value to highest). Defining policy **order** is important when you include both **action: allow** and **action: deny** rules that may apply to the same endpoint.
+
+In the following example, the policy **allow-cluster-internal-ingress** (order: 10) will be applied before the **policy drop-other-ingress** (order: 20).
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: drop-other-ingress
+spec:
+ order: 20
+ #...deny policy rules here...
+```
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-cluster-internal-ingress
+spec:
+ order: 10
+ #...allow policy rules here...
+```
+
+### Generate logs for specific traffic
+
+In the following example, incoming TCP traffic to an application is denied, and each connection attempt is logged to syslog.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-tcp-port-6379
+ namespace: production
+spec:
+ selector: role == 'database'
+ types:
+ - Ingress
+ - Egress
+ ingress:
+ - action: Log
+ protocol: TCP
+ source:
+ selector: role == 'frontend'
+ - action: Deny
+ protocol: TCP
+ source:
+ selector: role == 'frontend'
+```
+
+### Create policy for established connections
+
+Policies are immediately applied to any new connections. However, for existing connections that are already open, the policy changes will only take effect after the connection has been reestablished. This means that any ongoing sessions may not immediately reflect policy changes until they are initiated again.
+
+## Additional resources
+
+- For additional Calico network policy features, see [Calico network policy](../../reference/resources/networkpolicy.mdx) and [Calico global network policy](../../reference/resources/globalnetworkpolicy.mdx)
+- For an alternative to using IP addresses or CIDRs in policy, see [Network sets](../../reference/resources/networkset.mdx)
+- For details on how to stage network policy, see [Staged network policies](../staged-network-policies.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/index.mdx
new file mode 100644
index 0000000000..5332df5a00
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Beginner-friendly path for writing your first Calico Cloud network policies — a tour of the basic resource types and rule patterns.
+hide_table_of_contents: true
+---
+
+# Calico Cloud network policy for beginners
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/kubernetes-default-deny.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/kubernetes-default-deny.mdx
new file mode 100644
index 0000000000..fd43d0ddfd
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/kubernetes-default-deny.mdx
@@ -0,0 +1,149 @@
+---
+description: Apply a default-deny network policy in a Calico Cloud connected cluster so unprotected pods are denied traffic until explicit policy is written.
+---
+
+# Enable a default deny policy for Kubernetes pods
+
+## Big picture
+
+Enable a default deny policy for Kubernetes pods using Kubernetes or $[prodname] network policy.
+
+## Value
+
+A **default deny** network policy provides an enhanced security posture so pods without policy (or incorrect policy) are not allowed traffic until appropriate network policy is defined.
+
+## Features
+
+This how-to guide uses the following $[prodname] features:
+
+- **NetworkPolicy**
+- **GlobalNetworkPolicy**
+
+## Concepts
+
+### Default deny/allow behavior
+
+**Default allow** means all traffic is allowed by default, unless otherwise specified. **Default deny** means all traffic is denied by default, unless explicitly allowed. **Kubernetes pods are default allow**, unless network policy is defined to specify otherwise.
+
+For compatibility with Kubernetes, **$[prodname] network policy** enforcement follows the standard convention for Kubernetes pods:
+
+- If no network policies apply to a pod, then all traffic to/from that pod is allowed.
+- If one or more network policies apply to a pod with type ingress, then only the ingress traffic specifically allowed by those policies is allowed.
+- If one or more network policies apply to a pod with type egress, then only the egress traffic specifically allowed by those policies is allowed.
+
+For other endpoint types (VMs, host interfaces), the default behavior is to deny traffic. Only traffic specifically allowed by network policy is allowed, even if no network policies apply to the endpoint.
+
+## How to
+
+- [Create a default deny network policy](#create-a-default-deny-network-policy)
+- [Create a global default deny network policy](#create-a-global-default-deny-policy)
+
+### Create a default deny network policy
+
+Immediately after installation, a best practice is to create a namespaced default deny network policy to secure pods without policy or incorrect policy until you can put policies in place and test them.
+
+In the following example, we create a $[prodname] default deny **NetworkPolicy** for all workloads in the namespace, **engineering**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: default-deny
+ namespace: engineering
+spec:
+ selector: all()
+ types:
+ - Ingress
+ - Egress
+```
+
+Here's an equivalent default deny **Kubernetes network policy** for all pods in the namespace, **engineering**
+
+```yaml
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: default-deny
+ namespace: engineering
+spec:
+ podSelector: {}
+ policyTypes:
+ - Ingress
+ - Egress
+```
+
+### Create a global default deny policy
+
+A default deny policy ensures that unwanted traffic (ingress and egress) is denied by default without you having to remember default deny/allow behavior of Kubernetes and $[prodname] policies. This policy can also help mitigate risks of lateral malicious attacks.
+
+#### Best practice #1: Allow, stage, then deny
+
+We recommend that you create a global default deny policy after you complete writing policy for the traffic that you want to allow. The following steps summarizes the best practice to test and lock down the cluster to block unwanted traffic:
+
+1. Create a global default deny policy and test it in a staging environment. (The policy will show all the traffic that would be blocked if it were converted into a deny.)
+1. Create network policies to individually allow the traffic shown as blocked in step 1 until no connections are denied.
+1. Enforce the global default deny policy.
+
+#### Best practice #2: Keep the scope to non-system pods
+
+A global default deny policy applies to the entire cluster including all workloads in all namespaces, hosts (computers that run the hypervisor for VMs or container runtime for containers), including Kubernetes control plane and $[prodname] control plane nodes and pods.
+
+For this reason, the best practice is to create a global default deny policy for **non-system pods** as shown in the following example.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: deny-app-policy
+spec:
+ namespaceSelector: kubernetes.io/metadata.name not in {"calico-system", "kube-public", "kube-system", "tigera-operator"}
+ types:
+ - Ingress
+ - Egress
+ egress:
+ # allow all namespaces to communicate to DNS pods
+ - action: Allow
+ protocol: UDP
+ destination:
+ selector: 'k8s-app == "kube-dns"'
+ ports:
+ - 53
+ - action: Allow
+ protocol: TCP
+ destination:
+ selector: 'k8s-app == "kube-dns"'
+ ports:
+ - 53
+```
+
+Note the following:
+
+- Even though we call this policy "global default deny", the above policy is not explicitly denying traffic. By selecting the traffic with the `namespaceSelector` but not specifying an allow, the traffic is denied after all other policy is evaluated. This design also makes it unnecessary to ensure any specific order (priority) for the default-deny policy.
+- Allowing access to `kube-dns` simplifies per-pod policies because you don't need to duplicate the DNS rules in every policy
+- This policy uses a negative selector for the `spec.namespaceselector` field to exclude control plane namespaces.
+ In this example, those namespaces include the `calico-system`, `kube-public`, `kube-system`, and `tigera-operator` namespaces.
+ Because your installation may have different components, make sure to check what you have installed before implementing a similar policy.
+
+In a staging environment, verify that the policy does not block any necessary traffic before enforcing it.
+
+### Don't try this!
+
+The following policy works and looks fine on the surface. But as described in Best practices #2, the policy is too broad in scope and could break your cluster. Therefore, we do not recommend adding this type of policy, even if you have verified allowed traffic in your staging environment.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: default.default-deny
+spec:
+ tier: default
+ selector: all()
+ types:
+ - Ingress
+ - Egress
+```
+
+## Additional resources
+
+- [Network policy](../../reference/resources/networkpolicy.mdx)
+- [Global network policy](../../reference/resources/globalnetworkpolicy.mdx)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/external-ips-policy.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/external-ips-policy.mdx
new file mode 100644
index 0000000000..ea6a34950f
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/external-ips-policy.mdx
@@ -0,0 +1,112 @@
+---
+description: Restrict egress and ingress to specific IP ranges in Calico Cloud policy, either inline or via reusable network sets.
+---
+
+# Use external IPs or networks rules in policy
+
+## Big picture
+
+Use $[prodname] network policy to limit traffic to/from external non-$[prodname] workloads or networks.
+
+## Value
+
+Modern applications often integrate with third-party APIs and SaaS services that live outside Kubernetes clusters. To securely enable access to those integrations, network security teams must be able to limit IP ranges for egress and ingress traffic to workloads. This includes using IP lists or ranges to deny-list bad actors or embargoed countries.
+
+Using $[prodname] network policy, you can define IP addresses/CIDRs directly in policy to limit traffic to external networks. Or using $[prodname] network sets, you can easily scale out by using the same set of IPs in multiple policies.
+
+## Concepts
+
+### IP addresses/CIDRs
+
+IP addresses and CIDRs can be specified directly in both Kubernetes and $[prodname] network policy rules. $[prodname] network policy supports IPV4 and IPV6 CIDRs.
+
+### Network sets
+
+A **network set** resource is an arbitrary set of IP subnetworks/CIDRs that can be matched by standard label selectors in Kubernetes or $[prodname] network policy. This is useful to reference a set of IP addresses using a selector from a namespaced network policy resource. It is typically used when you want to scale/reuse the same set of IP addresses in policy.
+
+A **global network set** resource is similar, but can be selected only by $[prodname] global network policies.
+
+## How to
+
+- [Limit traffic to or from external networks, IPs in network policy](#limit-traffic-to-or-from-external-networks-ips-in-network-policy)
+- [Limit traffic to or from external networks, global network set](#limit-traffic-to-or-from-external-networks-global-network-set)
+
+### Limit traffic to or from external networks, IPs in network policy
+
+In the following example, a $[prodname] NetworkPolicy allows egress traffic from pods with the label **color: red**, if it goes to an IP address in the 192.0.2.0/24 CIDR block.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-egress-external
+ namespace: production
+spec:
+ selector: color == 'red'
+ types:
+ - Egress
+ egress:
+ - action: Allow
+ destination:
+ nets:
+ - 192.0.2.0/24
+```
+
+### Limit traffic to or from external networks, global network set
+
+In this example, we use a $[prodname] **GlobalNetworkSet** and reference it in a **GlobalNetworkPolicy**.
+
+In the following example, a $[prodname] **GlobalNetworkSet** deny-lists the CIDR ranges 192.0.2.55/32 and 203.0.113.0/24:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkSet
+metadata:
+ name: ip-protect
+ labels:
+ ip-deny-list: 'true'
+spec:
+ nets:
+ - 192.0.2.55/32
+ - 203.0.113.0/24
+```
+
+Next, we create two $[prodname] **GlobalNetworkPolicy** objects. The first is a high “order” policy that allows traffic as a default for things that don’t match our second policy, which is low “order” and uses the **GlobalNetworkSet** label as a selector to deny ingress traffic (IP-deny-list in the previous step). In the label selector, we also include the term **!has(projectcalico.org/namespace)**, which prevents this policy from matching pods or NetworkSets that also have this label. To more quickly enforce the denial of forwarded traffic to the host at the packet level, use the **doNotTrack** and **applyOnForward** options.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: forward-default-allow
+spec:
+ selector: apply-ip-protect == 'true'
+ order: 1000
+ doNotTrack: true
+ applyOnForward: true
+ types:
+ - Ingress
+ ingress:
+ - action: Allow
+---
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: ip-protect
+spec:
+ selector: apply-ip-protect == 'true'
+ order: 0
+ doNotTrack: true
+ applyOnForward: true
+ types:
+ - Ingress
+ ingress:
+ - action: Deny
+ source:
+ selector: ip-deny-list == 'true' && !has(projectcalico.org/namespace)
+```
+
+## Additional resources
+
+- To understand how to use global network sets to mitigate common threats, see [Defend against DoS attacks](../../extreme-traffic/defend-dos-attack.mdx)
+- [Global network sets](../../../reference/resources/globalnetworkset.mdx)
+- [Global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/icmp-ping.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/icmp-ping.mdx
new file mode 100644
index 0000000000..40dc912146
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/icmp-ping.mdx
@@ -0,0 +1,130 @@
+---
+description: Allow or deny ICMP and ping traffic for Calico Cloud workloads and host endpoints using policy rules.
+---
+
+# Use ICMP/ping rules in policy
+
+## Big picture
+
+Use $[prodname] network policy to allow and deny ICMP/ping messages.
+
+## Value
+
+The **Internet Control Message Protocol (ICMP)** provides valuable network diagnostic functions, but it can also be used maliciously. Attackers can use
+it to learn about your network, or for DoS attacks. Using $[prodname] network policy, you can control where ICMP is used. For example, you can:
+
+- Allow ICMP ping, but only for workloads, host endpoints (or both)
+- Allow ICMP for pods launched by operators for diagnostic purposes, but block other uses
+- Temporarily enable ICMP to diagnose a problem, then disable it after the problem is resolved
+- Deny/allow ICMPv4 and/or ICMPv6
+
+## Concepts
+
+### ICMP packet type and code
+
+$[prodname] network policy also lets you deny and allow ICMP traffic based on specific types and codes. For example, you can specify ICMP type 5, code 2 to match specific ICMP redirect packets.
+
+For details, see [ICMP type and code](https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Control_messages).
+
+## How to
+
+- [Deny all ICMP, all workloads and host endpoints](#deny-all-icmp-all-workloads-and-host-endpoints)
+- [Allow ICMP ping, all workloads and host endpoints](#allow-icmp-ping-all-workloads-and-host-endpoints)
+- [Allow ICMP matching protocol type and code, all Kubernetes pods](#allow-icmp-matching-protocol-type-and-code-all-kubernetes-pods)
+
+### Deny all ICMP, all workloads and host endpoints
+
+In this example, we introduce a "deny all ICMP" **GlobalNetworkPolicy**.
+
+This policy **selects all workloads and host endpoints**. It enables a default deny for all workloads and host endpoints, in addition to the explicit ICMP deny rules specified in the policy.
+
+If your ultimate goal is to allow some traffic, have your regular "allow" policies in place before applying a global deny-all ICMP traffic policy.
+
+In this example, all workloads and host endpoints are blocked from sending or receiving **ICMPv4** and **ICMPv6** messages.
+
+If **ICMPv6** messages are not used in your deployment, it is still good practice to deny them specifically as shown below.
+
+In any "deny-all" $[prodname] network policy, be sure to specify a lower order (**order:200**) than regular policies that might allow traffic.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: block-icmp
+spec:
+ order: 200
+ selector: all()
+ types:
+ - Ingress
+ - Egress
+ ingress:
+ - action: Deny
+ protocol: ICMP
+ - action: Deny
+ protocol: ICMPv6
+ egress:
+ - action: Deny
+ protocol: ICMP
+ - action: Deny
+ protocol: ICMPv6
+```
+
+### Allow ICMP ping, all workloads and host endpoints
+
+In this example, workloads and host endpoints can receive **ICMPv4 type 8** and **ICMPv6 type 128** ping requests that come from other workloads and host endpoints.
+
+All other traffic may be allowed by other policies. If traffic is not explicitly allowed, it will be denied by default.
+
+The policy applies only to **ingress** traffic. (Egress traffic is not affected, and default deny is not enforced for egress.)
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-ping-in-cluster
+spec:
+ selector: all()
+ types:
+ - Ingress
+ ingress:
+ - action: Allow
+ protocol: ICMP
+ source:
+ selector: all()
+ icmp:
+ type: 8 Ping request
+ - action: Allow
+ protocol: ICMPv6
+ source:
+ selector: all()
+ icmp:
+ type: 128 Ping request
+```
+
+### Allow ICMP matching protocol type and code, all Kubernetes pods
+
+In this example, only Kubernetes pods that match the selector **projectcalico.org/orchestrator == 'kubernetes'** are allowed to receive ICMPv4 **code: 1 host unreachable** messages.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-host-unreachable
+spec:
+ selector: projectcalico.org/orchestrator == 'kubernetes'
+ types:
+ - Ingress
+ ingress:
+ - action: Allow
+ protocol: ICMP
+ icmp:
+ type: 3 Destination unreachable
+ code: 1 Host unreachable
+```
+
+## Additional resources
+
+For more on the ICMP match criteria, see:
+
+- [Global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
+- [Network policy](../../../reference/resources/networkpolicy.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/index.mdx
new file mode 100644
index 0000000000..38032939ca
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Control traffic to and from endpoints using Calico Cloud network policy rules — selectors, actions, and egress/ingress directions.
+hide_table_of_contents: true
+---
+
+# Policy rules
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/namespace-policy.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/namespace-policy.mdx
new file mode 100644
index 0000000000..2511a1a13b
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/namespace-policy.mdx
@@ -0,0 +1,89 @@
+---
+description: Group or separate workloads in Calico Cloud policy using namespaces and namespace selectors so policies apply only to specified namespaces.
+---
+
+# Use namespace rules in policy
+
+## Big picture
+
+Use $[prodname] network policies to reference pods in other namespaces.
+
+## Value
+
+Kubernetes namespaces let you group/separate resources to meet a variety of use cases. For example, you can use namespaces to separate development, production, and QA environments, or allow different teams to use the same cluster. You can use namespace selectors in $[prodname] network policies to allow or deny traffic to/from pods in specific namespaces.
+
+## How to
+
+- [Control traffic to/from endpoints in a namespace](#control-traffic-tofrom-endpoints-in-a-namespace)
+- [Use Kubernetes RBAC to control namespace label assignment](#use-kubernetes-rbac-to-control-namespace-label-assignment)
+
+### Control traffic to/from endpoints in a namespace
+
+In the following example, ingress traffic is allowed to endpoints in the **namespace: production** with label **color: red**, and only from a pod in the same namespace with **color: blue**, on **port 6379**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-tcp-6379
+ namespace: production
+spec:
+ selector: color == 'red'
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: color == 'blue'
+ destination:
+ ports:
+ - 6379
+```
+
+To allow ingress traffic from endpoints in other namespaces, use a **namespaceSelector** in the policy rule. A namespaceSelector matches one or more namespaces based on the labels that are applied on the namespace. In the following example, ingress traffic is also allowed from endpoints with **color: blue** in namespaces with **shape: circle**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-tcp-6379
+ namespace: production
+spec:
+ selector: color == 'red'
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: color == 'blue'
+ namespaceSelector: shape == 'circle'
+ destination:
+ ports:
+ - 6379
+```
+
+### Use Kubernetes RBAC to control namespace label assignment
+
+Network policies can be applied to endpoints using selectors that match labels on the endpoint, the endpoint's namespace, or the endpoint's service account. By applying selectors based on the endpoint's namespace, you can use Kubernetes RBAC to control which users can assign labels to namespaces. This allows you to separate groups who can deploy pods from those who can assign labels to namespaces.
+
+In the following example, users in the development environment can communicate only with pods that have a namespace labeled, `environment == "development"`.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: restrict-development-access
+spec:
+ namespaceSelector: 'environment == "development"'
+ ingress:
+ - action: Allow
+ source:
+ namespaceSelector: 'environment == "development"'
+ egress:
+ - action: Allow
+ destination:
+ namespaceSelector: 'environment == "development"'
+```
+
+## Additional resources
+
+- For more network policies, see [Network policy](../../../reference/resources/networkpolicy.mdx)
+- To apply policy to all namespaces, see [Global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/policy-rules-overview.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/policy-rules-overview.mdx
new file mode 100644
index 0000000000..16988f5f1e
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/policy-rules-overview.mdx
@@ -0,0 +1,22 @@
+---
+description: How to write policy rules in Calico Cloud — label selectors, source and destination match criteria, and rule actions.
+---
+
+# Basic rules
+
+## Big picture
+
+Use Calico policy rules and label selectors that match Calico endpoints (pods, OpenStack VMs, and host interfaces) to define network connectivity.
+
+## Value
+
+Using label selectors to identify the endpoints (pods, OpenStack VMs, host interfaces) that a policy applies to, or that should be selected by policy rules, means you can define policy without knowing the IP addresses of the endpoints. This is ideal for handling dynamic workloads with ephemeral IPs (such as Kubernetes pods).
+
+## How to
+
+Read [Get started with Calico policy](../calico-network-policy.mdx) and [Kubernetes policy](../../../tutorials/kubernetes-tutorials/kubernetes-network-policy.mdx), which cover all the basics of using label selectors in policies to select endpoints the policies apply to, or in policy rules.
+
+## Additional resources
+
+- [Global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
+- [Network policy](../../../reference/resources/networkpolicy.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/service-accounts.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/service-accounts.mdx
new file mode 100644
index 0000000000..5fe275ef6b
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/service-accounts.mdx
@@ -0,0 +1,116 @@
+---
+description: Match on Kubernetes service accounts in Calico Cloud policy rules to validate workload identity and apply RBAC-controlled rules.
+---
+
+# Use service accounts rules in policy
+
+## Big picture
+
+Use $[prodname] network policy to allow/deny traffic for Kubernetes service accounts.
+
+## Value
+
+Using $[prodname] network policy, you can leverage Kubernetes service accounts with RBAC for flexible control over how policies are applied in a cluster. For example, the security team can have RBAC permissions to:
+
+- Control which service accounts the developer team can use within a namespace
+- Write high-priority network policies for those service accounts (that the developer team cannot override)
+
+The network security team can maintain full control of security, while selectively allowing developer operations where it makes sense.
+
+## Concepts
+
+### Use smallest set of permissions required
+
+Operations on service accounts are controlled by RBAC, so you can grant permissions only to trusted entities (code and/or people) to create, modify, or delete service accounts. To perform any operation in a workload, clients are required to authenticate with the Kubernetes API server.
+
+If you do not explicitly assign a service account to a pod, it uses the default ServiceAccount in the namespace.
+
+You should not grant broad permissions to the default service account for a namespace. If an application needs access to the Kubernetes API, create separate service accounts with the smallest set of permissions required.
+
+### Service account labels
+
+Like all other Kubernetes objects, service accounts have labels. You can use labels to create ‘groups’ of service accounts. $[prodname] network policy lets you select workloads by their service account using:
+
+- An exact match on service account name
+- A service account label selector expression
+
+## Before you begin...
+
+Configure unique Kubernetes service accounts for your applications.
+
+## How to
+
+- [Limit ingress traffic for workloads by service account name](#limit-ingress-traffic-for-workloads-by-service-account-name)
+- [Limit ingress traffic for workloads by service account label](#limit-ingress-traffic-for-workloads-by-service-account-label)
+- [Use Kubernetes RBAC to control service account label assignment](#use-kubernetes-rbac-to-control-service-account-label-assignment)
+
+### Limit ingress traffic for workloads by service account name
+
+In the following example, ingress traffic is allowed from any workload whose service account matches the names **api-service** or **user-auth-service**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: demo-calico
+ namespace: prod-engineering
+spec:
+ ingress:
+ - action: Allow
+ source:
+ serviceAccounts:
+ names:
+ - api-service
+ - user-auth-service
+ selector: 'app == "db"'
+```
+
+### Limit ingress traffic for workloads by service account label
+
+In the following example, ingress traffic is allowed from any workload whose service account matches the label selector, **app == web-frontend**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-web-frontend
+ namespace: prod-engineering
+spec:
+ ingress:
+ - action: Allow
+ source:
+ serviceAccounts:
+ selector: 'app == "web-frontend"'
+ selector: 'app == "db"'
+```
+
+### Use Kubernetes RBAC to control service account label assignment
+
+Network policies can be applied to endpoints using selectors that match labels on the endpoint, the endpoint's namespace, or the endpoint's service account. By applying selectors based on the endpoint's service account, you can use Kubernetes RBAC to control which users can assign labels to service accounts. This allows you to separate groups who can deploy pods from those who can assign labels to service accounts.
+
+In the following example, pods with an intern service account can communicate only with pods with service accounts labeled, `role: intern`.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: restrict-intern-access
+ namespace: prod-engineering
+spec:
+ serviceAccountSelector: 'role == "intern"'
+ ingress:
+ - action: Allow
+ source:
+ serviceAccounts:
+ selector: 'role == "intern"'
+ egress:
+ - action: Allow
+ destination:
+ serviceAccounts:
+ selector: 'role == "intern"'
+```
+
+## Additional resources
+
+- [Network policy](../../../reference/resources/networkpolicy.mdx)
+- [Global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/service-policy.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/service-policy.mdx
new file mode 100644
index 0000000000..f778334f71
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/policy-rules/service-policy.mdx
@@ -0,0 +1,119 @@
+---
+description: Match on Kubernetes Service names in Calico Cloud policy rules instead of specific pod selectors.
+---
+
+# Use service rules in policy
+
+## Big picture
+
+Use $[prodname] network policy to allow/deny traffic for Kubernetes services.
+
+## Value
+
+Using $[prodname] network policy, you can leverage Kubernetes Service names to easily define access to Kubernetes services. Using service names in policy enables you to:
+
+- Allow or deny access to the Kubernetes API service.
+- Reference port information already declared by the application, making it easier to keep policy up-to-date as application requirements change.
+
+## How to
+
+- [Allow access to the Kubernetes API for a specific namespace](#allow-access-to-the-kubernetes-api-for-a-specific-namespace)
+- [Allow access to Kubernetes DNS for the entire cluster](#allow-access-to-kubernetes-dns-for-the-entire-cluster)
+- [Allow access from a specified service](#allow-access-from-a-specified-service)
+
+### Allow access to the Kubernetes API for a specific namespace
+
+In the following example, egress traffic is allowed to the `kubernetes` service in the `default` namespace for all pods in the namespace `my-app`. This service is the typical
+access point for the Kubernetes API server.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-api-access
+ namespace: my-app
+spec:
+ selector: all()
+ egress:
+ - action: Allow
+ destination:
+ services:
+ name: kubernetes
+ namespace: default
+```
+
+Endpoint addresses and ports to allow will be automatically detected from the service.
+
+### Allow access to Kubernetes DNS for the entire cluster
+
+In the following example, a GlobalNetworkPolicy is used to select all pods in the cluster to apply a rule which ensures
+all pods can access the Kubernetes DNS service.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-kube-dns
+spec:
+ selector: all()
+ egress:
+ - action: Allow
+ destination:
+ services:
+ name: kube-dns
+ namespace: kube-system
+```
+
+:::note
+
+This policy also enacts a default-deny behavior for all pods, so make sure any other required application traffic is allowed by a policy.
+
+:::
+
+## Allow access from a specified service
+
+In the following example, ingress traffic is allowed from the `frontend-service` service in the `frontend` namespace for all pods in the namespace `backend`.
+This allows all pods that back the `frontend-service` service to send traffic to all pods in the `backend` namespace.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-frontend-service-access
+ namespace: backend
+spec:
+ selector: all()
+ ingress:
+ - action: Allow
+ source:
+ services:
+ name: frontend-service
+ namespace: frontend
+```
+
+We can also further specify the ports that the `frontend-service` service is allowed to access. The following example limits access from the `frontend-service`
+service to port 80.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-frontend-service-access
+ namespace: backend
+spec:
+ selector: all()
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ services:
+ name: frontend-service
+ namespace: frontend
+ destination:
+ ports: [80]
+```
+
+## Additional resources
+
+- [Network policy](../../../reference/resources/networkpolicy.mdx)
+- [Global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/services/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/services/index.mdx
new file mode 100644
index 0000000000..65c9a0223d
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/services/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Apply Calico Cloud policy to Kubernetes Services — node ports, ClusterIPs, and externally exposed services.
+hide_table_of_contents: true
+---
+
+# Policy for Kubernetes services
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/services/kubernetes-node-ports.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/services/kubernetes-node-ports.mdx
new file mode 100644
index 0000000000..74a2979189
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/services/kubernetes-node-ports.mdx
@@ -0,0 +1,135 @@
+---
+description: Restrict access to Kubernetes NodePort services using a Calico Cloud GlobalNetworkPolicy at the host endpoint.
+---
+
+# Apply Calico Cloud policy to Kubernetes node ports
+
+## Big picture
+
+Restrict access to node ports to specific external clients.
+
+## Value
+
+Exposing services to external clients using node ports is a standard Kubernetes feature. However, if you want to restrict access to node ports to specific external clients, you need to use Calico global network policy.
+
+## Concepts
+
+### Network policy with preDNAT field
+
+In a Kubernetes cluster, kube-proxy will DNAT a request to the node's port and IP address to one of the pods that backs the service. For Calico global network policy to both allow normal ingress cluster traffic and deny other general ingress traffic, it must take effect before DNAT. To do this, you simply add a **preDNAT** field to a Calico global network policy. The preDNAT field:
+
+- Applies before DNAT
+- Applies only to ingress rules
+- Enforces all ingress traffic through a host endpoint, regardless of destination
+ The destination can be a locally hosted pod, a pod on another node, or a process running on the host.
+
+## Before you begin...
+
+For services that you want to expose to external clients, configure Kubernetes services with type **NodePort**.
+
+## How to
+
+To securely expose a Kubernetes service to external clients, you must implement all of the following steps.
+
+- [Allow cluster ingress traffic, but deny general ingress traffic](#allow-cluster-ingress-traffic-but-deny-general-ingress-traffic)
+- [Allow local host egress traffic](#allow-local-host-egress-traffic)
+- [Create host endpoints with appropriate network policy](#create-host-endpoints-with-appropriate-network-policy)
+- [Allow ingress traffic to specific node ports](#allow-ingress-traffic-to-specific-node-ports)
+
+### Allow cluster ingress traffic but deny general ingress traffic
+
+In the following example, we create a global network policy to allow cluster ingress traffic (**allow-cluster-internal-ingress**): for the nodes’ IP addresses (**1.2.3.4/16**), and for pod IP addresses assigned by Kubernetes (**100.100.100.0/16**). By adding a preDNAT field, Calico global network policy is applied before regular DNAT on the Kubernetes cluster.
+
+In this example, we use the **selector: has(kubernetes-host)** -- so the policy is applicable to any endpoint with a **kubernetes-host** label (but you can easily specify particular nodes).
+
+Finally, when you specify a preDNAT field, you must also add the **applyOnForward: true** field.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-cluster-internal-ingress-only
+spec:
+ order: 20
+ preDNAT: true
+ applyOnForward: true
+ ingress:
+ - action: Allow
+ source:
+ nets: [1.2.3.4/16, 100.100.100.0/16]
+ - action: Deny
+ selector: has(kubernetes-host)
+```
+
+### Allow local host egress traffic
+
+We also need a global network policy to allow egress traffic through each node's external interface. Otherwise, when we define host endpoints for those interfaces, no egress traffic will be allowed from local processes (except for traffic that is allowed by the [Failsafe rules](../../../reference/host-endpoints/failsafe.mdx).
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-outbound-external
+spec:
+ order: 10
+ egress:
+ - action: Allow
+ selector: has(kubernetes-host)
+```
+
+### Create host endpoints with appropriate network policy
+
+In this example, we assume that you have already defined Calico host endpoints with network policy that is appropriate for the cluster. (For example, you wouldn’t want a host endpoint with a “default deny all traffic to/from this host” network policy because that is counter to the goal of allowing/denying specific traffic.) For help, see [host endpoints](../../../reference/resources/hostendpoint.mdx).
+
+All of our previously-defined global network policies have a selector that makes them applicable to any endpoint with a **kubernetes-host label**; so we will include that label in our definitions. For example, for **eth0** on **node1**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: HostEndpoint
+metadata:
+ name: node1-eth0
+ labels:
+ kubernetes-host: ingress
+spec:
+ interfaceName: eth0
+ node: node1
+ expectedIPs:
+ - INSERT_IP_HERE
+```
+
+When creating each host endpoint, replace `INSERT_IP_HERE` with the IP address on eth0. The `expectedIPs` field is required so that any selectors within ingress or egress rules can properly match the host endpoint.
+
+### Allow ingress traffic to specific node ports
+
+Now we can allow external access to the node ports by creating a global network policy with the preDNAT field. In this example, **ingress traffic is allowed** for any host endpoint with **port: 31852**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-nodeport
+spec:
+ preDNAT: true
+ applyOnForward: true
+ order: 10
+ ingress:
+ - action: Allow
+ protocol: TCP
+ destination:
+ selector: has(kubernetes-host)
+ ports: [31852]
+ selector: has(kubernetes-host)
+```
+
+To make the NodePort accessible only through particular nodes, give the nodes a particular label. For example:
+
+```yaml
+nodeport-external-ingress: true
+```
+
+Then, use **nodeport-external-ingress: true** as the selector of the **allow-nodeport** policy, instead of **has(kubernetes-host)**.
+
+## Additional resources
+
+- [Global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
+- [Host endpoints](../../../reference/resources/hostendpoint.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/services/services-cluster-ips.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/services/services-cluster-ips.mdx
new file mode 100644
index 0000000000..09d376055e
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/services/services-cluster-ips.mdx
@@ -0,0 +1,193 @@
+---
+description: Expose Kubernetes Service ClusterIPs over BGP using Calico Cloud and restrict who can reach them with network policy.
+---
+
+# Apply Calico Cloud policy to services exposed externally as cluster IPs
+
+## Big picture
+
+Control access to services exposed through clusterIPs that are advertised outside the cluster using BGP.
+
+## Value
+
+$[prodname] network policy uses standard Kubernetes Services that allow you to expose services within clusters to external clients in the following ways:
+
+- [Apply policy to Kubernetes nodeports](kubernetes-node-ports.mdx)
+- Using cluster IPs over BGP (described in this article)
+
+## Concepts
+
+### Advertise cluster IPs outside the cluster
+
+A **cluster IP** is a virtual IP address that represents a Kubernetes Service. Kube Proxy on each host translates the clusterIP into a pod IP for one of the pods backing the service, acting as a reverse proxy and load balancer.
+
+Cluster IPs were originally designed for use within the Kubernetes cluster. $[prodname] allows you to advertise Cluster IPs externally -- so external clients can use them to access services hosted inside the cluster. This means that $[prodname] ingress policy can be applied at **one or both** of the following locations:
+
+- Host interface, when the traffic destined for the clusterIP first ingresses the cluster
+- Pod interface of the backend pod
+
+### Traffic routing: local versus cluster modes
+
+$[prodname] implements [Kubernetes service external traffic policy](https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip), which controls whether external traffic is routed to node-local or cluster-wide endpoints. The following table summarizes key differences between these settings. The default is **cluster mode**.
+
+| **Service setting** | **Traffic is load balanced...** | **Pros and cons** | **Required service type** |
+| ------------------------------------------- | --------------------------------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- |
+| **externalTrafficPolicy: Cluster**(default) | Across all nodes in the cluster | Equal distribution of traffic among all pods running a service.
Possible unnecessary network hops between nodes for ingress external traffic.When packets are rerouted to pods on another node, traffic is SNAT’d (source network address translation).
Destination pod can see the proxying node’s IP address rather than the actual client IP. | **ClusterIP** |
+| **externalTrafficPolicy: Local** | Across the nodes with the endpoints for the service | Avoids extra hops so better for apps that ingress a lot external traffic.
Traffic is not SNAT’d so actual client IPs are preserved.
Traffic distributed among pods running a service may be imbalanced. | **LoadBalancer** (for cloud providers), or **NodePort** (for node’s static port) |
+
+## Before you begin...
+
+[Configure Calico to advertise cluster IPs over BGP](../../../networking/configuring/advertise-service-ips.mdx).
+
+## How to
+
+Selecting which mode to use depends on your goals and resources. At an operational level, **local mode** simplifies policy, but load balancing may be uneven in certain scenarios. **Cluster mode** requires more work to manage clusterIPs, SNAT, and create policies that reference specific IP addresses, but you always get even load balancing.
+
+- [Secure externally exposed cluster IPs, local mode](#secure-externally-exposed-cluster-ips-local-mode)
+- [Secure externally exposed cluster IPs, cluster mode](#secure-externally-exposed-cluster-ips-cluster-mode)
+
+### Secure externally exposed cluster IPs, local mode
+
+Using **local mode**, the original source address of external traffic is preserved, and you can define policy directly using standard $[prodname] network policy.
+
+1. Create $[prodname] **NetworkPolicies** or **GlobalNetworkPolicies** that select the same set of pods as your Kubernetes Service.
+1. Add rules to allow the external traffic.
+1. If desired, add rules to allow in-cluster traffic.
+
+### Secure externally exposed cluster IPs, cluster mode
+
+In the following steps, we define **GlobalNetworkPolicy** and **HostEndpoints**.
+
+#### Step 1: Verify Kubernetes Service manifest
+
+Ensure that your Kubernetes Service manifest explicitly lists the clusterIP; do not allow Kubernetes to automatically assign the clusterIP because you need it for your policies in the following steps.
+
+#### Step 2: Create global network policy at the host interface
+
+In this step, you create a **GlobalNetworkPolicy** that selects all **host endpoints**. It controls access to the cluster IP, and prevents unauthorized clients from outside the cluster from accessing it. The hosts then forwards only authorized traffic.
+
+**Set policy to allow external traffic for cluster IPs**
+
+Add rules to allow the external traffic for each clusterIP. The following example allows connections to two cluster IPs. Make sure you add **applyOnForward** and **preDNAT** rules.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-cluster-ips
+spec:
+ selector: k8s-role == 'node'
+ types:
+ - Ingress
+ applyOnForward: true
+ preDNAT: true
+ ingress:
+ # Allow 50.60.0.0/16 to access Cluster IP A
+ - action: Allow
+ source:
+ nets:
+ - 50.60.0.0/16
+ destination:
+ nets:
+ - 10.20.30.40/32 Cluster IP A
+ # Allow 70.80.90.0/24 to access Cluster IP B
+ - action: Allow
+ source:
+ nets:
+ - 70.80.90.0/24
+ destination:
+ nets:
+ - 10.20.30.41/32 Cluster IP B
+```
+
+**Add a rule to allow traffic destined for the pod CIDR**
+
+Without this rule, normal pod-to-pod traffic is blocked because the policy applies to forwarded traffic.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-to-pods
+spec:
+ selector: k8s-role == 'node'
+ types:
+ - Ingress
+ applyOnForward: true
+ preDNAT: true
+ ingress:
+ # Allow traffic forwarded to pods
+ - action: Allow
+ destination:
+ nets:
+ - 192.168.0.0/16 Pod CIDR
+```
+
+**Add a rule to allow traffic destined for all host endpoints**
+
+Or, you can add rules that allow specific host traffic including Kubernetes and $[prodname]. Without this rule, normal host traffic is blocked.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-traffic-hostendpoints
+spec:
+ selector: k8s-role == 'node'
+ types:
+ - Ingress
+ # Allow traffic to the node (not nodePorts, TCP) (not nodePorts, TCP)
+ - action: Allow
+ protocol: TCP
+ destination:
+ selector: k8s-role == 'node'
+ notPorts: ["30000:32767"] #nodePort range
+ # Allow traffic to the node (not nodePorts, TCP) (not nodePorts, UDP)
+ - action: Allow
+ protocol: UDP
+ destination:
+ selector: k8s-role == 'node'
+ notPorts: ["30000:32767"] #nodePort range
+```
+
+#### Step 3: Create a global network policy that selects pods
+
+In this step, you create a **GlobalNetworkPolicy** that selects the **same set of pods as your Kubernetes Service**. Add rules that allow host endpoints to access the service ports.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-nodes-svc-a
+spec:
+ selector: k8s-svc == 'svc-a'
+ types:
+ - Ingress
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: k8s-role == 'node'
+ destination:
+ ports: [80, 443]
+ - action: Allow
+ protocol: UDP
+ source:
+ selector: k8s-role == 'node'
+ destination:
+ ports: [80, 443]
+```
+
+#### Step 4: (Optional) Create network polices or global network policies that allow in-cluster traffic to access the service
+
+#### Step 5: Create HostEndpoints
+
+Create HostEndpoints for the interface of each host that will receive traffic for the clusterIPs. Be sure to label them so they are selected by the policy in Step 2 (Add a rule to allow traffic destined for the pod CIDR), and the rules in Step 3.
+
+In the previous example policies, the label **k8s-role: node** is used to identify these HostEndpoints.
+
+## Additional resources
+
+- [Enable service IP advertisement](../../../networking/configuring/advertise-service-ips.mdx)
+- [Defend against DoS attacks](../../extreme-traffic/defend-dos-attack.mdx)
+- [Global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/simple-policy-cnx.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/simple-policy-cnx.mdx
new file mode 100644
index 0000000000..fdb7654ba2
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/beginners/simple-policy-cnx.mdx
@@ -0,0 +1,331 @@
+---
+description: Tour of the additional features Calico Cloud adds to Kubernetes policy that make it suitable for production environments.
+---
+
+# Calico Cloud for Kubernetes demo
+
+This guide is a variation of the [simple policy demo](../../tutorials/kubernetes-tutorials/kubernetes-policy-basic.mdx) intended to introduce the extra features of $[prodname] to people already familiar with Project Calico for Kubernetes.
+
+It requires a Kubernetes cluster configured with Calico networking and $[prodname], and expects that you have `kubectl` configured to interact with the cluster.
+
+{/*//TODO-CC-XREFS
+You can quickly and easily obtain such a cluster by following one of the
+[installation guides](/getting-started/install-on-clusters/kubernetes/index),
+or by [upgrading an existing cluster](/getting-started/upgrading/upgrading-calico-to-calico-enterprise/upgrade-to-tsee/index).
+
+The key steps in moving to $[prodname] are to change to the $[prodname] version of calico-node, update its configuration, download [calicoq](/reference/clis/calicoq/index) and deploy Prometheus.
+*/}
+
+This guide assumes that you have installed all the $[prodname] components from the
+guides above and that your cluster consists of the following nodes:
+
+- k8s-node1
+- k8s-node2
+- k8s-master
+
+Where you see references to these in the text below, substitute for your actual node names. You can find what nodes are on your cluster with `kubectl get nodes`
+
+## Configure Namespaces
+
+This guide will deploy pods in a Kubernetes namespace. Let's create the `Namespace` object for this guide.
+
+```
+kubectl create ns policy-demo
+```
+
+## Create demo pods
+
+We'll use Kubernetes `Deployment` objects to easily create pods in the namespace.
+
+1. Create some nginx pods in the `policy-demo` namespace.
+
+ ```shell
+ kubectl create deployment --namespace=policy-demo nginx --image=nginx
+ ```
+
+1. Expose them through a service.
+
+ ```shell
+ kubectl expose --namespace=policy-demo deployment nginx --port=80
+ ```
+
+1. Ensure the nginx service is accessible.
+
+ ```shell
+ kubectl run --namespace=policy-demo access --rm -ti --image busybox /bin/sh
+ ```
+
+ This should open up a shell session inside the `access` pod, as shown below.
+
+ ```
+ Waiting for pod policy-demo/access-472357175-y0m47 to be running, status is Pending, pod ready: false
+
+ If you don't see a command prompt, try pressing enter.
+
+ / #
+ ```
+
+1. From inside the `access` pod, attempt to reach the `nginx` service.
+
+ ```shell
+ wget -q nginx -O -
+ ```
+
+ You should see a response from `nginx`. Great! Our service is accessible. You can exit the pod now.
+
+1. Inspect the network policies using calicoq. The `host` command displays
+ information about the policies for endpoints on a given host.
+
+ :::note
+
+ calicoq complements calicoctl by inspecting the
+ dynamic aspects of $[prodname] Policy: in particular displaying the endpoints actually affected by policies,
+ and the policies that actually apply to endpoints.
+ {/*//TODO-CC-XREFS The full calicoq documentation is [here](/reference/clis/calicoq/index). */}
+
+ :::
+
+ ```
+ DATASTORE_TYPE=kubernetes calicoq host k8s-node1
+ ```
+
+ You should see the following output.
+
+ ```
+ Policies and profiles for each endpoint on host "k8s-node1":
+
+ Workload endpoint k8s/tigera-prometheus.alertmanager-calico-node-alertmanager-0/eth0
+ Policies:
+ Policy "tigera-prometheus/knp.default.calico-node-alertmanager" (order 1000; selector "(projectcalico.org/orchestrator == 'k8s' && alertmanager == 'calico-node-alertmanager' && app == 'alertmanager') && projectcalico.org/namespace == 'tigera-prometheus'")
+ Policy "tigera-prometheus/knp.default.calico-node-alertmanager-mesh" (order 1000; selector "(projectcalico.org/orchestrator == 'k8s' && alertmanager == 'calico-node-alertmanager' && app == 'alertmanager') && projectcalico.org/namespace == 'tigera-prometheus'")
+ Policy "tigera-prometheus/knp.default.default-deny" (order 1000; selector "(projectcalico.org/orchestrator == 'k8s') && projectcalico.org/namespace == 'tigera-prometheus'")
+ Profiles:
+ Profile "kns.tigera-prometheus"
+ Rule matches:
+ Policy "tigera-prometheus/knp.default.calico-node-alertmanager-mesh" inbound rule 1 source match; selector "(projectcalico.org/namespace == 'tigera-prometheus') && (projectcalico.org/orchestrator == 'k8s' && app in { 'alertmanager' } && alertmanager in { 'calico-node-alertmanager' })"
+
+ ...
+
+ Workload endpoint k8s/policy-demo.nginx-8586cf59-5bxvh/eth0
+ Policies:
+ Profiles:
+ Profile "kns.policy-demo"
+ ```
+
+ For each workload endpoint, the `Policies:` section lists the policies that
+ apply to that endpoint, in the order they apply. calicoq displays both
+ $[prodname] Policies and Kubernetes NetworkPolicies, although this
+ example focuses on the latter. The `Rule matches:` section lists the
+ policies that match that endpoint in their rules, in other words that have
+ rules that deny or allow that endpoint as a packet source or destination.
+
+ Focusing on the
+ `k8s/tigera-prometheus.alertmanager-calico-node-alertmanager-0/eth0` endpoint:
+
+ - The first two policies are defined in the monitor-calico.yaml manifest.
+ The selectors here have been translated from the original NetworkPolicies to
+ the $[prodname] format (note the addition of the namespace test).
+
+ - The third policy and the following profile are created automatically by the
+ policy controller.
+
+1. Use kubectl to see the detail of any particular policy or profile. For
+ example, for the `kns.policy-demo` profile, which defines default behavior for
+ pods in the `policy-demo` namespace:
+
+ ```shell
+ kubectl get profile kns.policy-demo -o yaml
+ ```
+
+ You should see the following output.
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: Profile
+ metadata:
+ creationTimestamp: '2022-01-06T21:32:05Z'
+ name: kns.policy-demo
+ resourceVersion: 435026/
+ uid: 75dd2ed4-d3a6-41ca-a106-db073bfa946a
+ spec:
+ egress:
+ - action: Allow
+ destination: {}
+ source: {}
+ ingress:
+ - action: Allow
+ destination: {}
+ source: {}
+ labelsToApply:
+ pcns.projectcalico.org/name: policy-demo
+ ```
+
+ Alternatively, you may also use the $[prodname] web console to inspect and view information and metrics associated with policies, endpoints, and nodes.
+
+## Enable isolation
+
+Let's turn on isolation in our policy-demo namespace. $[prodname] will then prevent connections to pods in this namespace.
+
+Running the following command creates a NetworkPolicy which implements a default deny behavior for all pods in the `policy-demo` namespace.
+
+```shell
+kubectl create -f - <
+
+### Workload and host endpoints
+
+Policy with domain names can be enforced on workload or host endpoints. When a policy with domain names applies to a workload endpoint, it
+allows that workload to connect out to the specified domains. When policy with domain names applies to a host endpoint, it allows clients
+directly on the relevant host (including any host-networked workloads) to connect out to the specified domains.
+
+### Trusted DNS servers
+
+$[prodname] trusts DNS information only from its list of DNS trusted servers. Using trusted DNS servers to back domain names in
+policy, prevents a malicious workload from using IPs returned by a fake DNS server to hijack domain names in policy rules.
+
+By default, $[prodname] trusts the Kubernetes cluster’s DNS service (kube-dns or CoreDNS). For workload endpoints, these
+out-of-the-box defaults work with standard Kubernetes installs, so normally you won’t change them. For host endpoints you will need to add
+the IP addresses that the cluster nodes use for DNS resolution.
+
+## Before you begin
+
+**Not supported**
+
+DNS policy is not supported at egress of egress gateway pods. Domain-based rules will either never match in
+that hook, or, they may match intermittently. Intermittent matches occur when a pod on the same node as the
+egress gateway pod happens to make a matching DNS query. This is because the DNS-to-IP cache used to render
+the policy is shared node-wide.
+
+## How to
+
+You can specify allowed domain names directly in a **global network policy** or **namespaced network policy**, or specify domain names in a **global network set** (and then
+reference the global network set in a global network policy).
+
+- [Use domain names in a global network policy](#use-domain-names-in-a-global-network-policy)
+- [Use domain names in a namespaced network policy](#use-domain-names-in-a-namespaced-network-policy)
+- [Use domain names in a global network set, reference the set in a global network policy](#use-domain-names-in-a-global-network-set)
+
+### Best practice
+
+Use a **global network set** when the same set of domains needs to be referenced in multiple policies, or when you want the allowed
+destinations to be a mix of domains and IPs from global network sets, or IPs from workload endpoints and host endpoints. By using a single
+destination selector in a global network set, you can potentially match all of these resources.
+
+### Use domain names in a global network policy
+
+In this method, you create a **GlobalNetworkPolicy** with egress rules with `action: Allow` and a `destination.domains` field specifying the
+domain names to which egress traffic is allowed.
+
+In the following example, the first rule allows DNS traffic, and the second rule allows connections outside the cluster to domains
+**api.alice.com** and **\*.example.com** (which means `.example.com`, such as **bob.example.com**).
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-egress-to-domains
+spec:
+ order: 1
+ selector: my-pod-label == 'my-value'
+ types:
+ - Egress
+ egress:
+ - action: Allow
+ protocol: UDP
+ destination:
+ ports:
+ - 53
+ - dns
+ - action: Allow
+ destination:
+ domains:
+ - api.alice.com
+ - '*.example.com'
+```
+
+### Use domain names in a namespaced network policy
+
+In this method, you create a **NetworkPolicy** with egress rules with `action: Allow` and a `destination.domains` field specifying the
+domain names to which egress traffic is allowed.
+
+In the following example, the first rule allows DNS traffic, and the second rule allows connections outside the cluster to domains
+**api.alice.com** and **\*.example.com** (which means `.example.com`, such as **bob.example.com**).
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-egress-to-domains
+ namespace: rollout-test
+spec:
+ order: 1
+ selector: my-pod-label == 'my-value'
+ types:
+ - Egress
+ egress:
+ - action: Allow
+ protocol: UDP
+ destination:
+ ports:
+ - 53
+ - dns
+ - action: Allow
+ destination:
+ domains:
+ - api.alice.com
+ - '*.example.com'
+```
+
+The difference between this and the **GlobalNetworkPolicy** example is that this namespaced NetworkPolicy can only grant egress access, to the specified domains, to workload endpoints in the `rollout-test` namespace.
+
+### Use domain names in a global network set
+
+In this method, you create a **GlobalNetworkSet** with the allowed destination domain names in the `allowedEgressDomains` field. Then,
+you create a **GlobalNetworkPolicy** with a `destination.selector` that matches that GlobalNetworkSet.
+
+In the following example, the allowed egress domains (`api.alice.com` and `*.example.com`) are specified in the GlobalNetworkSet.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkSet
+metadata:
+ name: allowed-domains-1
+ labels:
+ color: red
+spec:
+ allowedEgressDomains:
+ - api.alice.com
+ - '*.example.com'
+```
+
+Then, you reference the global network set in a **GlobalNetworkPolicy** using a destination label selector.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-egress-to-domain
+spec:
+ order: 1
+ selector: my-pod-label == 'my-value'
+ types:
+ - Egress
+ egress:
+ - action: Allow
+ destination:
+ selector: color == 'red'
+```
+
+### Use domain names in a network set
+
+In this method, you create a **NetworkSet** with the allowed destination domain names in the `allowedEgressDomains` field. Then,
+you create a **NetworkPolicy** with a `destination.selector` that matches that NetworkSet.
+
+In the following example, the allowed egress domains (`api.alice.com` and `*.example.com`) are specified in the NetworkSet.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkSet
+metadata:
+ name: allowed-domains-1
+ namespace: rollout-test
+ labels:
+ color: red
+spec:
+ allowedEgressDomains:
+ - api.alice.com
+ - '*.example.com'
+```
+
+Then, you reference the network set in a **NetworkPolicy** using a destination label selector.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: allow-egress-to-domain
+ namespace: rollout-test
+spec:
+ order: 1
+ selector: my-pod-label == 'my-value'
+ types:
+ - Egress
+ egress:
+ - action: Allow
+ destination:
+ selector: color == 'red'
+```
+
+### Tuning performance and latency
+
+$[prodname] supports different DNS policy modes with different performance and latency implications.
+The default mode for the iptables and nftables data planes is `DelayDeniedPacket`.
+The eBPF data plane defaults to `Inline` on kernels 5.17 (or RedHat 5.14) and newer and to `NoDelay` on older kernels.
+The Windows data plane support only `NoDelay` mode.
+
+With `NoDelay` mode, new pods sometimes fail to connect to domains that are allowed by a DNS policy.
+In these cases, the pod tries to connect to a domain before $[prodname] has finished processing the DNS policy that allows the connection.
+As soon as the processing is complete, the pod is able to connect.
+
+For more information, see [DNSPolicyMode](../reference/resources/felixconfig#dnspolicymode) and [BPFDNSPolicyMode](../reference/resources/felixconfig#bpfdnspolicymode).
+
+## Additional resources
+
+To change the default DNS trusted servers, use the [DNSTrustedServers parameter](../reference/component-resources/node/felix/configuration.mdx).
+
+For more detail about the relevant resources, see
+[GlobalNetworkSet](../reference/resources/globalnetworkset.mdx),
+[GlobalNetworkPolicy](../reference/resources/globalnetworkpolicy.mdx),
+[NetworkPolicy](../reference/resources/networkpolicy.mdx)
+and
+[NetworkSet](../reference/resources/networkset.mdx).
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/extreme-traffic/defend-dos-attack.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/extreme-traffic/defend-dos-attack.mdx
new file mode 100644
index 0000000000..a89587e152
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/extreme-traffic/defend-dos-attack.mdx
@@ -0,0 +1,107 @@
+---
+description: Define DoS mitigation rules in Calico Cloud policy that drop connections at the eBPF or XDP layer, with hardware offload when available.
+---
+
+# Defend against DoS attacks
+
+## Big picture
+
+Calico automatically enforces specific types of deny-list policies at the earliest possible point in the packet processing pipeline, including offloading to NIC hardware whenever possible.
+
+## Value
+
+During a DoS attack, a cluster can receive massive numbers of connection requests from attackers. The faster these connection requests are dropped, the less flooding and overloading to your hosts. When you define DoS mitigation rules in Calico network policy, Calico enforces the rules as efficiently as possible to minimize the impact.
+
+## Concepts
+
+### Earliest packet processing
+
+The earliest point in the packet processing pipeline that packets can be dropped, depends on the Linux kernel version and the capabilities of the NIC driver and NIC hardware. Calico automatically uses the fastest available option.
+
+| Processed by... | Used by Calico if... | Performance |
+| --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
+| NIC hardware | The NIC supports **XDP offload** mode. | Fastest |
+| NIC driver | The NIC driver supports **XDP native** mode. | Faster |
+| Kernel | The kernel supports **XDP generic mode** and Calico is configured to explicitly use it. This mode is rarely used and has no performance benefits over iptables raw mode below. To enable, see [Felix Configuration](../../reference/resources/felixconfig.mdx). | Fast |
+| Kernel | If none of the modes above are available, **iptables raw** mode is used. | Fast |
+
+:::note
+
+XDP modes require Linux kernel v4.16 or later.
+
+:::
+
+## How to
+
+The high-level steps to defend against a DoS attack are:
+
+- [Step 1: Create host endpoints](#step-1-create-host-endpoints)
+- [Step 2: Add CIDRs to deny-list in a global network set](#step-2-add-cidrs-to-deny-list-in-a-global-network-set)
+- [Step 3: Create deny incoming traffic global network policy](#step-3-create-deny-incoming-traffic-global-network-policy)
+
+### Best practice
+
+The following procedure covers the required steps, assuming no prior configuration is in place. A best practice is to proactively do these steps before an attack (create the host endpoints, network policy, and global network set). In the event of a DoS attack, you can quickly respond by just adding the CIDRs that you want to deny-list to the global network set.
+
+### Step 1: Create host endpoints
+
+First, you create the HostEndpoints corresponding to the network interfaces where you want to enforce DoS mitigation rules. In the following example, the HostEndpoint secures the interface named **eth0** with IP **10.0.0.1** on node **jasper**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: HostEndpoint
+metadata:
+ name: production-host
+ labels:
+ apply-dos-mitigation: 'true'
+spec:
+ interfaceName: eth0
+ node: jasper
+ expectedIPs: ['10.0.0.1']
+```
+
+### Step 2: Add CIDRs to deny-list in a global network set
+
+Next, you create a Calico **GlobalNetworkset**, adding the CIDRs that you want to deny-list. In the following example, the global network set deny-lists the CIDR ranges **1.2.3.4/32** and **5.6.0.0/16**:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkSet
+metadata:
+ name: dos-mitigation
+ labels:
+ dos-deny-list: 'true'
+spec:
+ nets:
+ - '1.2.3.4/32'
+ - '5.6.0.0/16'
+```
+
+### Step 3: Create deny incoming traffic global network policy
+
+Finally, create a Calico GlobalNetworkPolicy adding the GlobalNetworkSet label (**dos-deny-list** in the previous step) as a selector to deny ingress traffic. To more quickly enforce the denial of forwarded traffic to the host at the packet level, use the **doNotTrack** and **applyOnForward** options.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: dos-mitigation
+spec:
+ selector: apply-dos-mitigation == 'true'
+ doNotTrack: true
+ applyOnForward: true
+ types:
+ - Ingress
+ ingress:
+ - action: Deny
+ source:
+ selector: dos-deny-list == 'true'
+```
+
+## Additional resources
+
+- [Global network sets](../../reference/resources/globalnetworkset.mdx)
+- [Global network policy](../../reference/resources/globalnetworkpolicy.mdx)
+- [Create a host endpoint](../../reference/resources/hostendpoint.mdx)
+- [Introduction to XDP](https://www.iovisor.org/technology/xdp)
+- [Advanced XDP documentation](https://prototype-kernel.readthedocs.io/en/latest/networking/XDP/index.html)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/extreme-traffic/high-connection-workloads.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/extreme-traffic/high-connection-workloads.mdx
new file mode 100644
index 0000000000..941db9113b
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/extreme-traffic/high-connection-workloads.mdx
@@ -0,0 +1,89 @@
+---
+description: Bypass Linux conntrack with a Calico Cloud policy rule for workloads that handle an extreme number of concurrent connections.
+---
+
+# Enable extreme high-connection workloads
+
+## Big picture
+
+Use a $[prodname] network policy rule to bypass Linux conntrack for traffic to workloads that experience extremely large number of connections.
+
+## Value
+
+When the number of connections on a node exceeds the number of connections that Linux conntrack can track, connections can be rejected or dropped. $[prodname] network policy can be used to selectively bypass Linux conntrack for traffic to/from these types of workloads.
+
+## Concepts
+
+### Linux conntrack
+
+Connection tracking (“conntrack”) is a core feature of the Linux kernel’s networking stack. It allows the kernel to keep track of all logical network connections or flows, and thereby identify all of the packets that make up each flow so they can be handled consistently together. Conntrack is an essential part of the mainline Linux network processing pipeline, normally improving performance, and enabling NAT and stateful access control.
+
+### Extreme high-connection workloads
+
+Some niche workloads handling extremely high number of simultaneous connections, or very high rate of short lived connections, can exceed the maximum number of connections Linux conntrack is able to track. One real world example of such a workload is an extreme scale memcached server handling 50k+ connections per second.
+
+### $[prodname] doNotTrack network policy
+
+The $[prodname] global network policy option, **doNotTrack**, indicates to apply the rules in the policy before connection tracking, and that packets allowed by these rules should not be tracked. The policy is applied early in the Linux packet processing pipeline, before any regular network policy rules, and independent of the policy order field.
+
+Unlike normal network policy rules, doNotTrack network policy rules are stateless, meaning you must explicitly specify rules to allow return traffic that would normally be automatically allowed by conntrack. For example, for a server on port 999, the policy must include an ingress rule allowing inbound traffic to port 999, and an egress rule to allow outbound traffic from port 999.
+
+In a doNotTrack policy:
+
+- Ingress rules apply to all incoming traffic through a host endpoint, regardless of where the traffic is going
+- Egress rules apply only to traffic that is sent from the host endpoint (not a local workload)
+
+Finally, you must add an **applyOnForward: true expression** for a **doNotTrack policy** to work.
+
+## Before you begin...
+
+Before creating a **doNotTrack** network policy, read this [blog](https://www.tigera.io/blog/when-linux-conntrack-is-no-longer-your-friend/) to understand use cases, benefits, and trade offs.
+
+## How to
+
+### Bypass connection traffic for high connection server
+
+In the following example, a memcached server pod with **hostNetwork: true** was scheduled on the node memcached-node-1. We create a HostEndpoint for the node. Next, we create a GlobalNetwork Policy with symmetrical rules for ingress and egress with doNotTrack and applyOnForward set to true.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: HostEndpoint
+metadata:
+ name: memcached-node-1-eth0
+ labels:
+ memcached: server
+spec:
+ interfaceName: eth0
+ node: memcached-node-1
+ expectedIPs:
+ - 10.128.0.162
+---
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: memcached-server
+spec:
+ selector: memcached == 'server'
+ applyOnForward: true
+ doNotTrack: true
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: memcached == 'client'
+ destination:
+ ports:
+ - 12211
+ egress:
+ - action: Allow
+ protocol: TCP
+ source:
+ ports:
+ - 12211
+ destination:
+ selector: memcached == 'client'
+```
+
+## Additional resources
+
+[Global network policy](../../reference/resources/globalnetworkpolicy.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/extreme-traffic/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/extreme-traffic/index.mdx
new file mode 100644
index 0000000000..03ea89212f
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/extreme-traffic/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Apply Calico Cloud network policy early in the Linux packet-processing pipeline to handle DoS, high-connection, and other extreme traffic scenarios.
+hide_table_of_contents: true
+---
+
+# Policy for extreme traffic
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/hosts/host-forwarded-traffic.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/hosts/host-forwarded-traffic.mdx
new file mode 100644
index 0000000000..98ee8b428a
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/hosts/host-forwarded-traffic.mdx
@@ -0,0 +1,292 @@
+---
+description: Apply Calico Cloud network policy to traffic forwarded through hosts acting as routers or NAT gateways.
+---
+
+# Apply policy to forwarded traffic
+
+## Big picture
+
+Enforce $[prodname] policy on traffic transiting a host that is used as a router or NAT gateway.
+
+## Value
+
+If your host has multiple network interfaces, and is configured as a router, or NAT gateway between two different networks, you may want to enforce policy on traffic as it moves between the networks. In this configuration, often neither the source or destination is a $[prodname] endpoint, so policy enforcement at the endpoint is not available. You can centrally manage the firewall policy on a fleet of such hosts using the same policy language as the rest of $[prodname].
+
+## Concepts
+
+### Workload endpoints and host endpoints
+
+The following figure shows a host with two network interfaces: eth0 and eth1. We call these **host endpoints (HEPs)**. The host also runs two guest workloads (VMs or containers). We call the virtual interfaces to the guests, **workload endpoints (WEPs)**. Each has a corresponding configuration object on the $[prodname] API called HostEndpoint and WorkloadEndpoint, respectively.
+
+The `HostEndpoint API` object is optional, and $[prodname] does not enforce any policy on the HEP if the API object is missing. The `WorkloadEndpoint API` object is required, and is automatically managed by the cluster orchestrator plugin (for example, Kubernetes or OpenStack).
+
+Several connections are shown in the figure, numbered 1 through 4. For example, connection 1 ingresses over HEP eth0, is forwarded, and then ingresses Workload A’s WEP. Calico policies select which WEPs or HEPs they apply to. So, for example an ingress policy that selects Workload A’s WEP will apply to connections as shown in number 1.
+
+
+
+### applyOnForward
+
+By default, $[prodname] global network policies set **applyOnForward to false**. When set to false on policies that select HEPs, the policies are applied only to traffic that originates or terminates on the host, for example: connection 4 (Node process). Connections 1-3 are unaffected by policies that select the HEP, but have applyOnForward set to false.
+
+In contrast, if applyOnForward is set to true for a policy that selects a HEP, that policy can apply to all connections 1-4. For example:
+
+- Ingress policy on HEP eth0 affects connections 1 and 2
+- Egress policy on HEP eth1 affects connections 2, 3, and 4
+
+There are also different default action semantics for **applyOnForward: true policy** versus **applyOnForward: false policy**.
+An applyOnForward: true policy affects all traffic through the HEP (connections 1-4). If no applyOnForward policy selects the HEP and direction (ingress versus egress), then forwarded traffic is allowed. If no policy (regardless of applyOnForward) selects the HEP and direction, then local traffic is denied.
+
+| **HEP defined?** | **Traffic Type** | **applyOnForward defined?** | **Any policy defined?** | **Default Action** |
+| ---------------- | ---------------- | --------------------------- | ----------------------- | ------------------ |
+| No | Any | n/a | n/a | Allow |
+| Yes | Forwarded | No | Any | Allow |
+| Yes | Forwarded | Yes | Yes | Deny |
+| Yes | Local | n/a | No | Deny |
+| Yes | Local | n/a | Yes | Deny |
+
+**$[prodname] namespaced network policies** do not have an applyOnForward setting. HEPs are always cluster global, not namespaced, so network policies cannot select them.
+
+### preDNAT policy
+
+Hosts are often configured to perform Destination Network Address Translation before forwarding certain packets. A common example of this in cloud computing is when the host acts as a reverse-proxy to load balance service requests for a set of backend workload instances. To apply policy to a specific example of such a reverse-proxy, see [Kubernetes nodePorts](../beginners/services/kubernetes-node-ports.mdx).
+
+When preDNAT is set to false on a global network policy, the policy rules are evaluated on the connection after DNAT is performed. False is the default. When preDNAT is set to true, the policy rules are evaluated on the connection before DNAT has been performed.
+
+If you set preDNAT policy to true, you must set applyOnForward to true, and preDNAT policy must only include Ingress policies.
+
+### Host endpoints with interfaceName: `*`
+
+HostEndpoint API objects can be created with the name of the host interface (as reported by ip link or similar), or they can be created with interfaceName set to `*`, which means all host interfaces on the given node, including the interfaces between the host to any WEPs on that host.
+
+With interfaceName set to a particular interface, any policies that select the HEP apply only if the traffic goes through the named interface. With it set to `*`, policies that select the HEP apply regardless of the interface.
+
+This is particularly relevant when you want to enforce policy for a host that also runs guest workloads like VMs or Pods. Traffic from local workloads to reverse-proxy IPs or ports do not traverse any external interfaces, and thus a HEP with interfaceName set to \* is required in order for policy to apply to them.
+
+## How to
+
+### Control forwarded traffic in or out of particular networks
+
+1. Choose a labeling scheme for your Host Endpoints (network interfaces).
+ For example, if you have an application network and management network, you might choose the labels **network = application** and **network = management**.
+1. Write GlobalNetworkPolicies expressing your desired rules.
+ - applyOnForward set to true.
+ - Use the **selector:** to choose which Host Endpoints to apply policy.
+1. Create the HostEndpoint objects on the `$[prodname] API`.
+ - Label the HostEndpoints according to the label scheme you developed in step 1.
+ - We recommend that you create policies before you create the Host Endpoints. This ensures that all policies exist before $[prodname] starts enforcing.
+
+## Tutorial
+
+Let’s say I have a host that has two network interfaces:
+
+- eth0 - connects to the main datacenter network for application traffic
+- eth1 - connects to a special maintenance network
+
+My goal is to allow SSH traffic to be forwarded to the maintenance network, but to drop all other traffic.
+
+I choose the following label scheme:
+
+- network = application for the main datacenter network for application traffic
+- network = maintenance for the maintenance network
+
+I create the GlobalNetworkPolicy that allows SSH traffic (default deny is implicit in this case).
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-ssh-maintenance
+spec:
+ selector: network == 'maintenance'
+ applyOnForward: true
+ types:
+ - Ingress
+ ingress:
+ # Allow SSH
+ - action: Allow
+ protocol: TCP
+ destination:
+ ports:
+ - 22
+```
+
+Save this as allow-ssh-maintenance.yaml.
+
+Apply the policy to the cluster:
+
+```bash
+kubectl create -f allow-ssh-maintenance.yaml
+```
+
+Finally, create the host endpoint for the interface that connects to the maintenance network.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: HostEndpoint
+metadata:
+ name: myhost.eth1
+ labels:
+ network: maintenance
+spec:
+ interfaceName: eth1
+ node: myhost
+ expectedIPs:
+ - 192.168.0.45
+```
+
+Replace myhost with the node name $[prodname] uses, and the expected IPs with the actual interface IP address(es). Save this file as hep.yaml.
+
+Apply the host endpoint to the cluster:
+
+```bash
+kubectl create -f hep.yaml
+```
+
+For completeness, you could also create a HostEndpoint for eth0, but because we have not written any policies for the application network yet, you can omit this step.
+
+## Viewing flow logs for host forwarded traffic
+
+When using `applyOnForward` and `preDNAT` policies with host endpoints, you can monitor and troubleshoot policy enforcement by examining flow logs. $[prodname] captures detailed information about how policies are applied to forwarded traffic.
+
+### Configure policy information in flow logs
+
+To see policy information in flow logs, you must enable flow logs for forwarding decisions in the FelixConfiguration resource:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: FelixConfiguration
+metadata:
+ name: default
+spec:
+ flowLogsPolicyScope: AllPolicies
+```
+
+This configuration enables tracking the flows transiting through the node interfaces within `policies` field in flow logs. The `policies` field contains detailed information about which policies acted on the traffic.
+
+### Understanding the `transit_policies` field in flow logs
+
+The `policies` field in flow logs contains sub-fields that show different policy evaluation results:
+
+- **`transit_policies`**: All host endpoint policies with `applyOnForward: true` that applied an action to the flow while in transit through the node (for forwarded traffic between network interfaces). Note that policies with `preDNAT: true` will also appear here when they apply to ingress traffic before DNAT processing.
+
+Each policy entry in these fields follows this format:
+```
+||.||
+```
+
+### Example flow log for applyOnForward policy
+
+Using the tutorial example from this document (SSH traffic to maintenance network), here's what a flow log entry might look like:
+
+```json
+{
+ "source_ip": "10.0.0.1",
+ "source_name": "client-pods-gkh45",
+ "source_name_aggr": "client-pods-*",
+ "source_namespace": "client-pods-namespace",
+ "dest_ip": "192.168.1.10",
+ "dest_name": "maintenance-server-gkh45",
+ "dest_name_aggr": "maintenance-server-*",
+ "dest_namespace": "maintenance-server-namespace",
+ "dest_port": 22,
+ "dest_type": "wep",
+ "proto": "tcp",
+ "action": "allow",
+ "reporter": "dst, fwd",
+ "policies": {
+ "all_policies": [
+ "0|__PROFILE__|__PROFILE__.kns.maintenance-server|allow|0"
+ ],
+ "enforced_policies": [
+ "0|__PROFILE__|__PROFILE__.kns.maintenance-server|allow|0"
+ ],
+ "pending_policies": [
+ "0|__PROFILE__|__PROFILE__.kns.maintenance-server|allow|0"
+ ],
+ "transit_policies": [
+ "0|default|default.allow-ssh-maintenance|allow|0"
+ ]
+ },
+ "bytes_in": 1234,
+ "bytes_out": 5678,
+ "packets_in": 10,
+ "packets_out": 8,
+ "host": "my-host"
+}
+```
+
+**Key points about this flow log:**
+- `reporter` is `dst, fwd`, indicating this flow was reported by both the destination workload endpoint and the forwarding node. The `enforced_policies` shows policies that applied to the destination workload's ingress traffic, while `transit_policies` shows the host endpoint policy that applied as the traffic was forwarded through the node.
+- The `policies.transit_policies` field shows that the `allow-ssh-maintenance` GlobalNetworkPolicy allowed the traffic
+- The rule index `0` indicates the first rule in the policy matched (the SSH allow rule)
+
+### Example flow log for preDNAT policy
+
+Here's an example of a GlobalNetworkPolicy with `preDNAT: true` that allows HTTP traffic incoming to the cluster from external sources:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: allow-external-http
+spec:
+ selector: network = 'maintenance'
+ applyOnForward: true
+ preDNAT: true
+ types:
+ - Ingress
+ ingress:
+ # Allow HTTP from external sources to NodePort services
+ - action: Allow
+ protocol: TCP
+ source:
+ nets:
+ - 34.0.113.0/24 # External network
+ destination:
+ ports:
+ - 30080 # NodePort
+```
+
+For preDNAT policies, flow logs display the original destination IP and port before DNAT is performed. When traffic originates from outside the cluster (for example, an external client accesses a NodePort service), the flow log captures the pre-DNAT source and destination details. Here's an example:
+
+```json
+{
+ "source_ip": "34.0.113.100",
+ "source_name": "-",
+ "source_name_aggr": "pub",
+ "source_namespace": "-",
+ "source_type": "net",
+ "dest_ip": "66.11.155.1",
+ "dest_name": "-",
+ "dest_name_aggr": "pub",
+ "dest_namespace": "-",
+ "dest_type": "net",
+ "dest_port": 30080,
+ "proto": "tcp",
+ "action": "allow",
+ "reporter": "fwd",
+ "policies": {
+ "transit_policies": [
+ "0|default|default.allow-external-http|allow|0"
+ ]
+ },
+ "bytes_in": 2048,
+ "bytes_out": 4096,
+ "packets_in": 15,
+ "packets_out": 12,
+ "host": "my-host"
+}
+```
+
+**Key points about this preDNAT flow log:**
+- `source_name_aggr` is `pub`, indicating external traffic from outside the cluster
+- `dest_name_aggr` is `pub`, indicating the NodePort's external facing IP
+- `dest_port` shows the original NodePort (30080) before DNAT translation to the service port
+- The `reporter` is `fwd`, indicating this policy acted on forwarded ingress traffic at the host endpoint
+- The `policies.transit_policies` field shows the preDNAT policy that allowed the traffic before DNAT processing
+
+## Additional resources
+
+- [Host endpoint](../../reference/resources/hostendpoint.mdx)
+- [Workload endpoint](../../reference/resources/workloadendpoint.mdx)
+- [Global network policy](../../reference/resources/globalnetworkpolicy.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/hosts/kubernetes-nodes.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/hosts/kubernetes-nodes.mdx
new file mode 100644
index 0000000000..5e7f813b3b
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/hosts/kubernetes-nodes.mdx
@@ -0,0 +1,296 @@
+---
+description: Protect Kubernetes node interfaces with Calico Cloud host endpoints to extend network policy to the node itself.
+---
+
+# Protect Kubernetes nodes
+
+## Big picture
+
+Secure Kubernetes nodes with host endpoints managed by $[prodname].
+
+## Value
+
+$[prodname] can automatically create host endpoints for your Kubernetes nodes. This means $[prodname] can manage the lifecycle of host endpoints as your cluster evolves, ensuring nodes are always protected by policy.
+
+## Concepts
+
+## Host endpoints
+
+Each host has one or more network interfaces that it uses to communicate externally. You can represent these interfaces in $[prodname] using host endpoints and then use network policy to secure them.
+
+$[prodname] host endpoints can have labels, and they work the same as labels on workload endpoints. The network policy rules can apply to both workload and host endpoints using label selectors.
+
+Automatic host endpoints secure all of the host's interfaces (i.e. in Linux, all the interfaces in the host network namespace). They are created by setting `interfaceName: "*"`.
+
+## Automatic host endpoints
+
+$[prodname] creates a wildcard host endpoint for each node, with the host endpoint containing the same labels and IP addresses as its corresponding node.
+$[prodname] will ensure these managed host endpoints maintain the same labels and IP addresses as its node by periodic syncs.
+This means that policy targeting these automatic host endpoints will function correctly with the policy put in place to select those nodes, even if over time the node's IPs or labels change.
+
+$[prodname] is also able to create and manage custom host endpoints for nodes, based on user specified templates.
+This allows you to fine-tune which interfaces should be included in the host endpoint and for which nodes these host endpoints should be created.
+The host endpoint templates can be enabled by updating [KubeControllersConfig](../../reference/resources/kubecontrollersconfig.mdx).
+
+Automatic host endpoints are differentiated from other host endpoints by the label `projectcalico.org/created-by: calico-kube-controllers`.
+Enable or disable automatic host endpoints by configuring the default KubeControllersConfiguration resource.
+
+## Before you begin
+
+**Unsupported**
+
+- GKE
+
+## How to
+
+- [Enable automatic host endpoints](#enable-automatic-host-endpoints)
+- [Apply network policy to automatic host endpoints](#apply-network-policy-to-automatic-host-endpoints)
+
+### Enable automatic host endpoints
+
+To enable automatic host endpoints, edit the default KubeControllersConfiguration instance, and set `spec.controllers.node.hostEndpoint.autoCreate` to `true`:
+
+```bash
+kubectl patch kubecontrollersconfiguration default --patch='{"spec": {"controllers": {"node": {"hostEndpoint": {"autoCreate": "Enabled"}}}}}'
+```
+
+If successful, host endpoints are created for each of your cluster's nodes:
+
+```bash
+kubectl get heps -o wide
+```
+
+The output may look similar to this:
+
+```
+kubectl get heps -o wide
+NAME CREATED AT
+ip-172-16-101-147.us-west-2.compute.internal-auto-hep 2021-05-12T22:16:47Z
+ip-172-16-101-54.us-west-2.compute.internal-auto-hep 2021-05-12T22:16:47Z
+ip-172-16-101-79.us-west-2.compute.internal-auto-hep 2021-05-12T22:16:47Z
+ip-172-16-101-9.us-west-2.compute.internal-auto-hep 2021-05-12T22:16:47Z
+ip-172-16-102-63.us-west-2.compute.internal-auto-hep 2021-05-12T22:16:47Z
+```
+
+### Use custom templates for host endpoints
+
+Template HostEndpoints allow for tailored, automatic HostEndpoint generation. Defined in spec.controllers.node.hostEndpoint.templates, they enable creation based on specific Node or interface criteria, offering greater customization compared to default automatic HostEndpoints.
+
+To enable template host endpoints and disable default host endpoints, edit the default KubeControllersConfiguration instance, and update `spec.controllers.node.hostEndpoint.templates` with your custom templates spec.
+
+1. Create a custom templates spec:
+ ```bash
+ cat << 'EOF' > hostEndpointTemplate.yaml
+ spec:
+ controllers:
+ node:
+ hostEndpoint:
+ autoCreate: Enabled
+ createDefaultHostEndpoint: Disabled
+ templates:
+ - generateName: custom-host-endpoint
+ interfaceCIDRs:
+ - 192.168.0.0/16
+ nodeSelector: "!has(node-role.kubernetes.io/control-plane)"
+ labels:
+ custom-label: template-host-endpoint
+ annotations:
+ custom-annotation: template-host-endpoint
+ EOF
+ ```
+
+2. Merge the templates spec with the `kubecontrollersconfiguration` resource:
+
+ ```bash
+ kubectl patch kubecontrollersconfiguration default --patch-file hostEndpointTemplate.yaml --type merge
+ ```
+
+3. Verify that your `kubecontrollersconfiguration` resource is updated:
+
+ ```bash
+ kubectl get kubecontrollersconfiguration default -o yaml
+ ```
+
+ The output should look similar to this:
+
+ ```
+ apiVersion: projectcalico.org/v3
+ kind: KubeControllersConfiguration
+ metadata:
+ name: default
+ spec:
+ controllers:
+ node:
+ hostEndpoint:
+ autoCreate: Enabled
+ createDefaultHostEndpoint: Enabled
+ templates:
+ - generateName: custom-host-endpoint
+ interfaceCIDRs:
+ - 192.168.0.0/16
+ labels:
+ custom-label: template-host-endpoint
+ annotations:
+ custom-annotation: template-host-endpoint
+ ```
+
+4. If successful, host endpoints are created for nodes matching your node selector:
+
+ ```bash
+ kubectl get heps -o=custom-columns='NAME:.metadata.name,NODE:.spec.node,INTERFACES:.spec.interfaceName,IPS:.spec.expectedIPs,PROFILES:.spec.profiles'
+ ```
+
+ The output may look similar to this:
+
+ ```
+ NAME NODE INTERFACE IPS PROFILES
+ 192.168.83.64.compute.internal-custom-host-endpoint-auto-hep 192.168.83.64.compute.internal 192.168.83.64 projectcalico-default-allow
+ 192.168.0.128.compute.internal-custom-host-endpoint-auto-hep 192.168.0.128.compute.internal 192.168.0.128 projectcalico-default-allow
+ 192.168.157.128.compute.internal-custom-host-endpoint-auto-hep 192.168.157.128.compute.internal 192.168.157.128 projectcalico-default-allow
+ ```
+
+### Apply network policy to automatic host endpoints
+
+To apply policy that targets all Kubernetes nodes, first add a label to the nodes.
+The label will be synced to their automatic host endpoints.
+
+For example, to add the label **kubernetes-host** to all nodes and their host endpoints:
+
+```bash
+kubectl label nodes --all kubernetes-host=
+```
+
+And an example policy snippet:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: all-nodes-policy
+spec:
+ selector: has(kubernetes-host)
+ #
+```
+
+To select a specific set of host endpoints (and their corresponding Kubernetes nodes), use a policy selector that selects a label unique to that set of host endpoints.
+For example, if we want to add the label **environment=dev** to nodes named node1 and node2:
+
+```bash
+kubectl label node node1 environment=dev
+kubectl label node node2 environment=dev
+```
+
+With the labels in place and automatic host endpoints enabled, host endpoints for node1 and node2 will be updated with the **environment=dev** label.
+We can write policy to select that set of nodes with a combination of selectors:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: some-nodes-policy
+spec:
+ selector: has(kubernetes-host) && environment == 'dev'
+ #
+```
+
+## Tutorial
+
+This tutorial will lock down Kubernetes node ingress to only allow SSH and required ports for Kubernetes to function.
+We will apply two policies: one for the control plane nodes. and one for the worker nodes.
+
+:::note
+
+Note: This tutorial was tested on a cluster created with kubeadm v1.18.2 on AWS, using a "stacked etcd" [topology](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/). Stacked etcd topology means the etcd pods are running on the masters. kubeadm uses stacked etcd by default.
+If your Kubernetes cluster is on a different platform, is running a variant of Kubernetes, or is running a topology with an external etcd cluster,
+please review the required ports for control plane and worker nodes in your cluster and adjust the policies in this tutorial as needed.
+
+:::
+
+First, let's restrict ingress traffic to the control plane nodes. The ingress policy below contains three rules.
+The first rule allows access to the API server port from anywhere. The second rule allows all traffic to localhost, which
+allows Kubernetes to access control plane processes. These control plane processes includes the etcd server client API, the scheduler, and the controller-manager.
+This rule also allows localhost access to the kubelet API and calico/node health checks.
+And the final rule allows the etcd pods to peer with each other and allows the masters to access each others kubelet API.
+
+If you have not modified the failsafe ports, you should still have SSH access to the nodes after applying this policy.
+Now apply the ingress policy for the Kubernetes masters:
+
+```
+kubectl apply -f - << EOF
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: ingress-k8s-masters
+spec:
+ selector: has(node-role.kubernetes.io/master)
+ # This rule allows ingress to the Kubernetes API server.
+ ingress:
+ - action: Allow
+ protocol: TCP
+ destination:
+ ports:
+ # kube API server
+ - 6443
+ # This rule allows all traffic to localhost.
+ - action: Allow
+ destination:
+ nets:
+ - 127.0.0.0/8
+ # This rule is required in multi-master clusters where etcd pods are colocated with the masters.
+ # Allow the etcd pods on the masters to communicate with each other. 2380 is the etcd peer port.
+ # This rule also allows the masters to access the kubelet API on other masters (including itself).
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: has(node-role.kubernetes.io/master)
+ destination:
+ ports:
+ - 2380
+ - 10250
+EOF
+```
+
+Note that the above policy selects the standard **node-role.kubernetes.io/master** label that kubeadm sets on control plane nodes.
+
+Next, we need to apply policy to restrict ingress to the Kubernetes workers.
+Before adding the policy we will add a label to all of our worker nodes, which then gets added to its automatic host endpoint.
+For this tutorial we will use **kubernetes-worker**. An example command to add the label to worker nodes:
+
+```bash
+kubectl get node -l '!node-role.kubernetes.io/master' -o custom-columns=NAME:.metadata.name | tail -n +2 | xargs -I{} kubectl label node {} kubernetes-worker=
+```
+
+The workers' ingress policy consists of two rules. The first rule allows all traffic to localhost. As with the masters,
+the worker nodes need to access their localhost kubelet API and calico/node healthcheck.
+The second rule allows the masters to access the workers kubelet API. Now apply the policy:
+
+```
+kubectl apply -f - << EOF
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: ingress-k8s-workers
+spec:
+ selector: has(kubernetes-worker)
+ # Allow all traffic to localhost.
+ ingress:
+ - action: Allow
+ destination:
+ nets:
+ - 127.0.0.0/8
+ # Allow only the masters access to the nodes kubelet API.
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: has(node-role.kubernetes.io/master)
+ destination:
+ ports:
+ - 10250
+EOF
+```
+
+## Additional resources
+
+- [Apply policy to Kubernetes node ports](../beginners/services/kubernetes-node-ports.mdx)
+- [Global network policy](../../reference/resources/globalnetworkpolicy.mdx)
+- [Host endpoints](../../reference/resources/hostendpoint.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/index.mdx
new file mode 100644
index 0000000000..624ec3680f
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/index.mdx
@@ -0,0 +1,55 @@
+---
+description: Secure Kubernetes workloads and hosts in connected clusters with Calico Cloud network policy — managed enforcement, tiers, recommendations, and observability.
+---
+
+import { DocCardLink, DocCardLinkLayout } from '/src/___new___/components';
+
+# Network policy
+
+Writing network policies is how you restrict traffic to pods in your Kubernetes cluster.
+$[prodname] extends the standard `NetworkPolicy` object to provide advanced network policy features, such as policies that apply to all namespaces.
+
+## Getting started
+
+
+
+
+
+
+
+
+
+
+## Policy rules
+
+
+
+
+
+
+
+
+
+
+## Policy tiers
+
+
+
+
+
+
+
+
+## Policy for services
+
+
+
+
+
+
+## Policy for extreme traffic
+
+
+
+
+
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/networksets.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/networksets.mdx
new file mode 100644
index 0000000000..d6378a9dbd
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/networksets.mdx
@@ -0,0 +1,267 @@
+---
+description: Use Calico Cloud network sets to package frequently reused IP ranges or domains into named selectors that policies can reference across connected clusters.
+---
+
+# Get started with network sets
+
+## Visualize traffic to/from your cluster
+
+Modern applications often integrate with third-party APIs and SaaS services that live outside Kubernetes clusters. To securely enable access to those integrations, you must be able to limit IP ranges for egress and ingress traffic to workloads. Limiting IP lists or ranges is also used to deny-list bad actors or embargoed countries. To limit IP ranges, you need to use the $[prodname] resource called **network sets**.
+
+## What are network sets?
+
+**Network sets** are a grouping mechanism that allows you to create an arbitrary set of IP subnetworks/CIDRs or domains that can be matched by standard label selectors in Kubernetes or $[prodname] network policy. Like IP pools for pods, they allow you to reuse/scale sets of IP addresses in policies.
+
+A **network set** is a namespaced resource that you can use with Kubernetes or $[prodname] network policies; a **global network set** is a cluster-wide resource that you can use with $[prodname] network policies.
+
+Like network policy, you manage user access to network sets using standard Kubernetes RBAC.
+
+## Why are network sets powerful?
+
+If you are familiar with Service Graph in the web console, you know the value of seeing pod-to-pod traffic within your cluster. But what about traffic external to your cluster?
+
+$[prodname] automatically detects IPs for pods and nodes that fall into the standard IETF “public network” and “private network” designations, and displays those as icons in Service Graph. So you get some visibility into external traffic without using any network sets.
+
+
+
+However, when you create network sets, you can get more granular visibility into what's leaving the cluster to public networks. Because you control the grouping, the naming, and labeling, you create visibility that is customized to your organization. This is why they are so powerful.
+
+Here are just a few examples of how network sets can be used:
+
+- **Egress access control**
+
+ Network sets are a key resource for defining egress access controls; for example, securing ingress to microservices/apps or egress from workloads outside the cluster.
+
+- **Troubleshooting**
+
+ Network sets appear as additional metadata in flow logs, Flow Visualizer, and Service Graph.
+
+- **Efficiency and scaling**
+
+ Network sets are critical when scaling your deployment. You may have only a few CIDRs when you start. But as you scale out, it is easier to update a handful of network sets than update each network policy individually. Also, in a Kubernetes deployment, putting lots of anything (CIDRs, ports, policy rules) directly into policies causes inefficiencies in traffic processing (iptables/eBPF).
+
+- **Microsegmentation and shift left**
+
+ Network sets provide the same microsegmentation controls as network policy. For example, you can allow specific users to create policies (that reference network sets), but allow only certain users to manage network sets.
+
+- **Threat defense**
+
+ Network sets are key to being able to manage threats by blocking bad IPs with policy in a timely way. Imagine having to update individual policies when you find a bad IP you need to quickly block. You can even give access to a controller that automatically updates CIDRs in a network set when a bad IP is found.
+
+## Create a network set and use it in policy
+
+In this section, we’ll walk through how to create a namespaced network set in the web console. You can follow along using your cluster or tigera-labs cluster.
+
+In this example, you will create a network set named, `google`. This network set contains a list of trusted google endpoints for a microservice called, `hipstershop`. As a service owner, you want to be able to see traffic leaving the microservices in Service Graph. Instead of matching endpoints on IP addresses, we will use domain names.
+
+1. From the left navbar, click **Network Sets**.
+1. Click **Add Network Set**, and enter these values.
+ - For Name: `google`
+ - For Scope: Select **Namespace** and select, `hipstershop`
+1. Under Labels, click **Add label**.
+ - In the Select key field, enter `destinations` and click the green bar to add this new entry.
+ - In the Value field, enter `google`, click the green bar to add the entry, and save.
+1. For Domains, click **+Add Domain** and these URLs: `clouddebugger.googleapis.com`, `cloudtrace.googleapis.com`, `metadata.google.internal`, `monitoring.googleapis.com`.
+1. Click **Create Network Set**.
+
+You’ve created your first network set.
+
+
+
+The YAML looks like this:
+
+```yaml
+kind: NetworkSet
+apiVersion: projectcalico.org/v3
+metadata:
+ name: google
+ labels:
+ destinations: google
+ namespace: hipstershop
+spec:
+ nets: []
+ allowedEgressDomains:
+ - clouddebugger.googleapis.com
+ - cloudtrace.googleapis.com
+ - metadata.google.internal
+ - monitoring.googleapis.com
+```
+
+Next, we write a DNS policy for hipstershop that allows egress traffic to the trusted google sites. The following network policy allows egress access for all destination selectors labeled, `google`. Note that putting domains in a network set referencing it in policy is the best practice. Also, note that using `selector: all()` should only be used if all pods in the namespace can access all of the domains in the network set; if not, you should create separate policies accordingly.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: application.allow-egress-domain
+ namespace: hipstershop
+spec:
+ tier: application
+ order: 0
+ selector: all()
+ serviceAccountSelector: ''
+ egress:
+ - action: Allow
+ source: {}
+ destination:
+ selector: destinations == "google"
+ types:
+ - Egress
+```
+
+## Network sets in Service Graph
+
+Continuing with our `hipstershop` example, if you go to Service Graph, you see hipstershop (highlighted in yellow).
+
+
+
+If we double-click `hipstershop` to drill down, we now see the `google` network set icon (highlighted in yellow). We now have visibility to traffic external from google sites to hipstershop. (If you are using the tigera-labs cluster, note that the network set will not be displayed as shown below.)
+
+
+
+Service Graph provides a view into how services are interconnected in a consumable view, along with easy access to flow logs. You can also see traffic associated with network sets in volumetric display with Flow Visualizer.
+
+## Tutorial
+
+In the following example, we create a global network set resource for a trusted load-balancer that can be used with microservices and applications. The label, `trusted-ep: load-balancer` is how this global network set can be referenced in policy.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkSet
+metadata:
+ name: load-balancer
+ labels:
+ trusted-ep: "load-balancer"
+spec:
+ nets:
+ # Modify the ip addresses to refer to the ip addresses of load-balancers in your environment
+ - 10.0.0.1/32
+ - 10.0.0.2/32
+```
+
+The following network policy uses the `selector: trusted-ep == "load balancer"` to reference the above GlobalNetworkSet. All applications in the `app2-ns` namespace, that match `app2` and `svc1` are allowed ingress traffic from the trusted load balance on port 1001.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: application.app2-svc1
+ namespace: app2-ns
+spec:
+ tier: application
+ order: 500
+ selector: (app == "app2"&&svc == "svc1")
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: trusted-ep == "load-balancer"
+ destination:
+ ports:
+ - '10001'
+ types:
+ - Ingress
+```
+
+### Advanced policy rules with network sets
+
+When you combine $[prodname] policy rules with network sets, you have powerful ways to fine-tune. The following example combines network sets with specific rules in a global network policy to deny access more quickly.
+We start by creating a $[prodname] GlobalNetworkSet that specifies a list of CIDR ranges we want to deny: 192.0.2.55/32 and 203.0.113.0/24.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkSet
+metadata:
+ name: ip-protect
+ labels:
+ ip-deny-list: 'true'
+spec:
+ nets:
+ - 192.0.2.55/32
+ - 203.0.113.0/24
+```
+
+Next, we create two $[prodname] GlobalNetworkPolicy resources. The first is a high "order" policy that allows traffic as a default for things that don’t match our second policy, which is low "order" and uses the GlobalNetworkSet label as a selector to deny ingress traffic (IP-deny-list in the previous step). In the label selector, we also include the term, `!has(projectcalico.org/namespace)`, which prevents this policy from matching pods or NetworkSets that also have this label. To more quickly enforce the denial of forwarded traffic to the host at the packet level, use the `doNotTrack` and `applyOnForward` options.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: forward-default-allow
+spec:
+ selector: apply-ip-protect == 'true'
+ order: 1000
+ doNotTrack: true
+ applyOnForward: true
+ types:
+ - Ingress
+ ingress:
+ - action: Allow
+---
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: ip-protect
+spec:
+ selector: apply-ip-protect == 'true'
+ order: 0
+ doNotTrack: true
+ applyOnForward: true
+ types:
+ - Ingress
+ ingress:
+ - action: Deny
+ source:
+ selector: ip-deny-list == 'true' && !has(projectcalico.org/namespace)
+```
+
+## Best practices for using network sets
+
+- Create network sets as soon as possible after getting started
+
+ This allows you to quickly realize the benefits of seeing custom metadata in flow logs and visualizing traffic in Service Graph and Flow Visualizer.
+
+- Create a network set label and name schema
+
+ It is helpful to think: what names would be meaningful and easy to understand when you look in Service Graph or Flow Visualizer? What labels will be easy to understand when used in network policies – especially if you are separating users who manage network sets from those who consume them in network policies.
+
+- Do not put large sets of CIDRs and domains directly in policy
+
+ Network sets allow you to specify CIDRs and/or domains. Although you can add CIDRs and domains directly in policy, it doesn't scale.
+
+- Do not put thousands of rules into a policy, each with a different CIDR
+
+ If your set of /32s can be easily aggregated into a few broader CIDRs without compromising security, it’s a good thing to do; whether you’re putting the CIDRs in the rule or using a network set.
+
+- If you want to match thousands of endpoints, write one or two rules and use selectors to match the endpoints.
+
+ Having one rule per port, per host is inefficient because each rule ends up being rendered as an iptables/eBPF rule instead of making good use of IP sets.
+
+- Avoid overlapping IP addresses/subnets in networkset/globalnetworkset definitions
+
+## Efficient use of network sets
+
+If you have a large number of things to match, using a network set is more efficient both in the control plane (for example, Felix CPU), and for the packet path (latency/per packet CPU). If you use network sets and you add/remove an IP from the network set, this doesn't require changing iptables rules at all. It only requires updating the ipset, which is efficient. If you also change the policy rules, then iptables must be updated too. Using network sets is efficient for all of the following use cases:
+
+- The system applying the iptables rules to incoming connections (to decide whether to allow or deny the traffic)
+- iptables rules updates whenever one of the policies and/or network sets change
+- The Kubernetes APIserver handling changes to the policy and/or networkset CRDs
+
+Follow these guidelines for efficient use of network sets.
+
+| Policy | Network set | Results |
+| ------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
+| source: selector: foo="bar" | With handful of broad CIDRs | **Efficient** **-** 1 iptables/eBPF rule - 1 IP set with handful of CIDRs |
+| source: nets: [ ... handful ...] | Not used | **Efficient** - Handful of iptables/eBPF rules - 0 IP sets |
+| source: selector: foo="bar" | One network set with 2000 x /32s | **`*`Most efficient** - 1 iptables/eBPF rule - 1 IP sets with 2000 entries |
+| | Two network sets with 1000 each x /32s | **Efficient** - 2 iptables/eBPF rules - 2 IP set with 1000 entries |
+| source: nets: [... 2000 /32s ...] - source: nets: [1 x /32] - source: nets: [1 x /32] - ... x 2000 | Not used | **Inefficient** Results in programming 2k iptables/eBPF rules - 2000+ iptables/eBPF rules - 0 IP sets |
+
+`*` Updating **ipsets** is fast and efficient. Adding/removing a single entry is an O(1) operation no matter the number of IPs in the set. Updating **iptables** is generally slow and gets slower the more rules you have in total (including rules created by kube-proxy, for example). Less than 10K rules are generally fine, but noticeable latency occurs when updating rules above that number (increasing as the number of rules grows). (The newer nftables may scale more efficiently but those results are not included here.)
+
+Similarly, hitting many iptables (or eBPF) rules adds latency to the first packet in a flow. For iptables, it measures around 250ns per rule. Although a single rule is negligible, hitting 10K rules add >1ms to the first packet in the flow. Packets only hit the rules for the particular interface that they arrive on; if you have 10K rules on one interface and 10 rules on another, the packet processed by the first interface will have more latency.
+
+## Additional resources
+
+- [Network set](../reference/resources/networkset.mdx)
+- [Global network set](../reference/resources/globalnetworkset.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-best-practices.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-best-practices.mdx
new file mode 100644
index 0000000000..87ebe87b5c
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-best-practices.mdx
@@ -0,0 +1,355 @@
+---
+description: Best practices for Calico Cloud policy across connected clusters — security posture, scalability with tiers, and performance tuning under load.
+---
+
+# Policy best practices
+
+## Big picture
+
+Policy best practices for run-time security starts with $[prodname]’s robust network security policy, but other $[prodname] resources play equally important roles in security, scalability, and performance.
+
+Learn $[prodname] policy best practices and resources that support a zero trust network model:
+
+- [Prepare for policy authoring](#prepare-for-policy-authoring)
+- [Policy best practices for day-one zero trust](#policy-best-practices-for-day-one-zero-trust)
+- [Policy design for efficiency and performance](#policy-design-for-efficiency-and-performance)
+- [Policy life cycle tools](#policy-life-cycle-tools)
+
+## Prepare for policy authoring
+
+### Determine who can write policy
+
+Any team familiar with deploying microservices in Kubernetes can easily master writing network policies. The challenge in many organizations is deciding who will be given permission to write policy across teams. Although there are different approaches, $[prodname] policy tools have the flexibility and guardrails to accommodate different approaches.
+
+Let’s review two common approaches.
+
+- **Microservices teams write policy**
+
+ In this model, network policy is treated as code, built into and tested during the development process, just like any other critical part of a microservice’s code. The team responsible for developing a microservice has a good understanding of other microservices they consume and depend on, and which microservices consume their microservice. With a defined, standardized approach to policy and label schemas, there is no reason that the teams cannot implement network policies for their microservice as part of the development of the microservice. With visibility in Service Graph, teams can even do basic troubleshooting.
+
+- **Dev/Ops writes policy, microservice team focuses on internals**
+ An equally valid approach is to have development teams focus purely on the internals of the microservices they are responsible for, and leave responsibility for operating the microservices with DevOps teams. A Dev/ops team needs the same understanding as the microservices team above. However, network security may come much later in the organization’s processes, or even as an afterthought on a system already in production. This can be more challenging because getting network policies wrong can have significant production impacts. But using $[prodname] tools, this approach is still achievable.
+
+When you get clarity on who can write policies, you can move to creating tiers. $[prodname] tiers, along with standard Kubernetes RBAC, provide the infrastructure to meet security concerns across teams.
+
+### Understand the depth of $[prodname] network policy
+
+Because $[prodname] policy goes well beyond the features in Kubernetes policy, we recommend that you have a basic understanding of [network policy and global network policy](beginners/calico-network-policy.mdx) and how they provide workload access controls. And even though you may not implement the following policies, it is helpful to know the depth of defense that is available in $[prodname].
+
+- [Policy for services](beginners/services/index.mdx)
+- [Policy integration for firewalls](policy-firewalls/index.mdx)
+
+### Create policy tiers
+
+**Tiers** are a hierarchical construct used to group policies and enforce higher precedence policies that cannot be circumvented by other teams. As part of your microsegmentation strategy, tiers let you apply identity-based protection to workloads and hosts.
+
+Before creating policies, we recommend that you create your tier structure. This often requires internal debates and discussions. As noted previously, $[prodname] policy workflow has the guardrails you need to allow diverse teams to participate in policy writing.
+
+To understand how tiered policy works and best practices, see [Get started with tiered policies](policy-tiers/tiered-policy.mdx).
+
+### Create label standards
+
+Creating a label standard is often an overlooked step. But if you skip this step, it will cost you in troubleshooting down the road; especially given visibility/troubleshooting is already a challenge in a Kubernetes deployment.
+
+**Why are label standards important?**
+
+Network policies in Kubernetes depend on **labels and selectors** (not IP addresses and IP ranges) to determine which workloads can talk to each other. As pods dynamically scale up and down, network policy is enforced based on the labels and selectors that you define. So workloads and host endpoints need unique, identifiable labels. If you create duplicate label names, or labels are not intuitive, troubleshooting network policy issues and authoring network policies becomes more difficult.
+
+**Recommendations**:
+
+- Follow the [Kubernetes guidelines for labels](https://kubernetes.io/docs/concepts/overview/working-with-objects/common-labels/). If the Kubernetes guidelines do not cover your use cases, we recommend this blog from Tigera Support: [Label standard and best practices for Kubernetes security](https://www.helpnetsecurity.com/2021/05/26/kubernetes-security/).
+- Develop a comprehensive set of labels that meets the deployment, reporting, and security requirements of different stakeholders in your organization.
+- Standardize the way you label your pods and write your network policies using a consistent schema or design pattern.
+- Labels should be defined to achieve a specific and explicit purpose
+- Use an intuitive language in your label definition that enables a quick and simple identification of labeled Kubernetes objects.
+- Use label key prefixes and suffixes to identify attributes required for asset classification.
+- Ensure the right labels are applied to Kubernetes objects by implementing label governance checks in your CI/CD pipeline or at runtime.
+
+### Create network sets
+
+Network sets and global network sets are grouping mechanisms for arbitrary sets of IPs/subnets/CIDRs or domains. They are key resources for efficient policy design. The key use cases for network sets are:
+
+- **Use/reuse in policy to support scaling**
+
+ You reference network sets in policies using selectors (rather than updating individual policies with CIDRs or domains).
+
+- **Visibility to traffic to/from a cluster**
+
+ For apps that integrate with third-party APIs and SaaS services, you get enhanced visibility to this traffic in Service Graph.
+
+- **Global deny lists**
+
+ Create a “deny-list” of CIDRs for bad actors or embargoed countries in policy.
+
+**Recommendation**: Create network sets **and labels** before writing policy.
+
+For network set tutorial and best practices, see [Get started with network sets](networksets.mdx).
+
+## Policy best practices for day-one zero trust
+
+### Create a global default deny policy
+
+A global default deny network policy provides an enhanced security posture – so pods without policy (or incorrect policy) are not allowed traffic until appropriate network policy is defined. We recommend creating a global default deny, regardless of whether you use Calico Enterprise and/or Kubernetes network policy.
+
+But, be sure to understand the [best practices for creating a default deny policy](default-deny.mdx) to avoid breaking your cluster.
+
+Here are sample [default deny policies](beginners/kubernetes-default-deny.mdx).
+
+### Define both ingress and egress network policy rules for every pod in the cluster
+
+Although defining network policy for traffic external to clusters (north-south) is certainly important, it is equally important to defend against attacks for east-west traffic. Simply put, **every connection from/to every pod in every cluster should be protected**. Although having both doesn’t guarantee protection against other attacks and vulnerabilities, one innocuous workload can lead to exposure of your most critical workloads.
+
+For examples, see [basic ingress and egress policies](beginners/calico-network-policy.mdx).
+
+## Policy design for efficiency and performance
+
+Teams can write policies that work, but ultimately you want policies that also scale, and do not negatively impact performance.
+
+If you follow a few simple guidelines, you’ll be well on your way to writing efficient policy.
+
+### Use global network policy only when all rules apply globally
+
+- **Do**
+
+ Use global network policy for cluster-wide scope when all rules apply to multiple namespaces or host endpoints. For example, use a global network policy to create a deny-list of CIDRs for embargoed countries, or for global default deny everywhere, even for new namespaces.
+
+ Why? Although at the level of packet processing there is no difference between network policy and global network, for CPU usage, one global network policy is faster than a large number of network policies.
+
+- **Avoid**
+
+ Using a global network policy as a way to combine diverse, namespaced endpoints with different connectivity requirements. Although creating such a policy can work, appears efficient and is easier to view than several separate network policies, it is inefficient and should be avoided.
+
+ Why? Putting a lot of anything in policy (rules, CIDRs, ports) that are manipulated by selectors is inefficient. iptables/eBPF rules depend on minimizing executions and updates. When a selector is encountered in a policy rule, it is converted into one iptables rule that matches on an IP set. Then, different code keeps the IP sets up to date; this is more efficient than updating iptables rules. Also, because iptables rules execute sequentially in order, having many rules results in longer network latencies for the first packet in a flow (approximately 0.25-0.5us per rule). Finally, having more rules slows down programming of the data plane, making policy updates take longer.
+
+**Example: Inefficient global network policy**
+
+The following policy is a global network policy for a microservice that limits all egress communication external to the cluster in the security tier. Does this policy work? Yes. And logically, it seems to cleanly implement application controls.
+
+```yaml noValidation
+1 apiVersion: projectcalico.org/v3
+2 kind: GlobalNetworkPolicy
+3 metadata:
+4 name: security.allow-egress-from-pods
+5 spec:
+6 tier: security
+7 order: 1
+8 selector: all()
+9 egress:
+10 - action: Deny
+11 source:
+12 namespaceSelector: projectcalico.org/namespace starts with "tigera"
+13 destination:
+14 selector: threatfeed == "feodo"
+15 - action: Allow
+16 protocol: TCP
+17 source:
+18 namespaceSelector: kubernetes.io/metadata.name == "sso"
+19 ports:
+20 - '443'
+21 - '80'
+22 destination:
+23 domains:
+24 - '*.googleapis.com'
+25 - action: Allow
+26 protocol: TCP
+27 source:
+28 selector: psql == "external"
+29 destination:
+30 ports:
+31 - '5432'
+32 domains:
+33 - '*.postgres.database.azure.com'
+34 - action: Allow
+35 protocol: TCP
+36 source: {}
+37 destination:
+38 ports:
+39 - '443'
+40 - '80'
+41 domains:
+42 - '*.logic.azure.com'
+43 - action: Allow
+44 protocol: TCP
+45 source: {}
+46 destination:
+47 ports:
+48 - '443'
+49 - '80'
+50 domains:
+51 - '*.azurewebsites.windows.net'
+52 - action: Allow
+53 protocol: TCP
+54 source:
+55 selector: 'app in { "call-archives-api" }||app in { "finwise" }'
+56 destination:
+57 domains:
+58 - '*.documents.azure.com'
+59 - action: Allow
+60 protocol: TCP
+61 source:
+62 namespaceSelector: kubernetes.io/metadata.name == "warehouse"
+63 destination:
+64 ports:
+65 - '1433'
+66 domains:
+67 - '*.database.windows.net'
+68 - action: Allow
+69 protocol: TCP
+70 source: {}
+71 destination:
+72 nets:
+73 - 65.132.216.26/32
+74. - 10.10.10.1/32
+75 ports:
+76 - '80'
+77 - '443'
+78 - action: Allow
+79 protocol: TCP
+80 source:
+81 selector: app == "api-caller"
+82 destination:
+83 ports:
+84 - '80'
+85 - '443'
+86 domains:
+87 - api.example.com
+88 - action: Allow
+89 source:
+90 selector: component == "tunnel"
+91 - action: Allow
+92 destination:
+93 selector: all()
+94 namespaceSelector: all()
+95 - action: Deny
+96 types:
+97 - Egress
+```
+
+**Why this policy is inefficient**
+
+First, the policy does not follow guidance on use for global network policy: that all rules apply to the endpoints. So the main issue is inefficiency, although the policy works.
+
+The main selector `all()` (line 8) means the policy will be rendered on every endpoint (workload and host endpoints). The selectors in each rule (for example, lines 12 and 14) control traffic that are matched by that rule. So, even if the host doesn’t have any workloads that match `"selector: app == "api-caller"`, you’ll still get the iptables/eBPF rule rendered on every host to implement that rule. If this sample policy had 100 pods, that’s a 10 - 100x increase in the number of rules (depending on how many local endpoints match each rule). In short, it adds:
+
+- Memory and CPU to keep track of all the extra rules
+- Complexity to handle changes to endpoint labels, and to re-render all the policies too.
+
+### Avoid policies that may select unwanted endpoints
+
+The following policy is for an application in a single namespace, `app1-ns` namespace. There are two microservices that are all labeled appropriately:
+
+- microservice 1 has `app: app1`, `svc: svc1`
+- microservice 2 has `app: app1`, `svc: svc2`
+
+The following policy works correctly and does not incur a huge performance hit. But it could select additional endpoints that were not intended.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: application.app1
+ namespace: app1-ns
+spec:
+ tier: application
+ order: 10
+ selector: app == "app1"
+ types:
+ - Ingress
+ ingress:
+ - action: Allow
+ source:
+ selector: trusted-ip == "load-balancer"
+ destination:
+ selector: svc == "svc1"
+ ports:
+ - 10001
+ protocol: TCP
+ - action: Allow
+ source:
+ selector: svc == "svc1"
+ destination:
+ selector: svc == "svc2"
+ ports:
+ - 10002
+ protocol: TCP
+```
+
+The policy incorrectly assumes that the main policy selector (`app == "app1"`) will be combined (ANDed) with the endpoint selector, and only for certain policy types. In this case,
+
+- **Ingress** - combines policy selector and _destination endpoint selector_
+ or
+- **Egress** - combines policy selector and _source endpoint selector_
+
+But if the assumptions behind the labels are not understood by other policy authors and are not correctly assigned, the endpoint selector may select _additional endpoints that were not intended_. For ingress policy, this can open up the endpoint to more IP addresses than necessary. This unintended consequence would be exacerbated if the author used a global network policy.
+
+### Put multiple relevant policy rules together in the same policy
+
+As discussed previously, it is better to create separate policies for different endpoint connectivity rules, than a single global network policy. However, you may interpret this to mean that the best practice is to make unique policies that do not aggregate any rules. But that is not the case. Why? When $[prodname] calculates and enforces policy, it updates the iptables/eBPF and reads policy changes and pod/workload endpoints from the datastore. The more policies in memory, the more work it takes determine which policies match a particular endpoint. If you group more rules into one policy, there are fewer policies to match against.
+
+### Understand effective use of label selectors
+
+Label selectors abstract network policy from the network. Misuse of selectors can slow things down. As discussed previously, the more selectors you create, the harder $[prodname] works to find matches.
+
+The following policy shows an inefficient use of selectors. Using `selector: all()` renders the policy on all nodes for all workloads. If there are 10,000 workloads, but only 10 match label==foo, that is very inefficient at the data plane level.
+
+```yaml
+selector: all()
+ingress:
+ - source:
+ selector: label == 'bar'
+ destination:
+ selector: label == 'foo'
+```
+
+The best practice policy below allows the same traffic, but is more efficient and scalable. Why? Because the policy will be rendered only on nodes with workloads that match the selector `label==foo`.
+
+```yaml
+selector: label == 'foo'
+ingress:
+ source:
+ selector: label == 'bar'
+```
+
+Another common mistake is using `selector: all()` when you don’t need to. `all()` means _all workloads_ so that will be a large IP set. Whenever there's a source/destination selector in a rule, it is rendered as an IP set in the data plane.
+
+```yaml
+source:
+ selector: all()
+```
+
+### Put domains and CIDRs in network sets rather than policy
+
+Network sets allow you to specify CIDRs and/or domains. As noted in [Network set best practices](policy-best-practices.mdx), we do not recommend putting large CIDRs or domains directly in policy. Although nothing stops you from do this in policy, using network sets is more efficient and supports scaling.
+
+## Policy life cycle tools
+
+### Preview, stage, deploy
+
+A big obstacle to adopting Kubernetes is not having confidence that you can effectively prevent, detect, and mitigate across diverse teams. The following policy life cycle tools in the web console (**Policies** tab) can help.
+
+- **Policy recommendations**
+
+ Get a policy recommendation for unprotected workloads. Speeds up learning, while supporting zero trust.
+
+- **Policy impact preview**
+
+ Preview the impacts of policy changes before you apply them to avoid unintentionally exposing or blocking other network traffic.
+
+- **Policy staging and audit modes**
+
+ Stage network policy so you can monitor traffic impact of both Kubernetes and $[prodname] policy as if it were actually enforced, but without changing traffic flow. This minimizes misconfiguration and potential network disruption.
+
+For details, see [Policy life cycle tools](staged-network-policies.mdx).
+
+### Do not trust anything
+
+Zero trust means that you do not trust anyone or anything. $[prodname] handles authentication on a per request basis. Every action is either authorized or restricted, and the default is everything is restricted. To apply zero trust to policy and reduce your attack surface and risk, we recommend the following:
+
+- Ensure that all expected and allowed network flows are explicitly allowed; any connection not explicitly allowed is denied
+
+- Create a quarantine policy that denies all traffic that you can quickly apply to workloads when you detect suspicious activity or threats
+
+## Additional resources
+
+- [Troubleshoot policies](policy-troubleshooting.mdx)
+- [Security and policy best practices blog](https://www.tigera.io/blog/kubernetes-security-policy-10-critical-best-practices/)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/firewall-integration.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/firewall-integration.mdx
new file mode 100644
index 0000000000..93ef4f9a94
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/firewall-integration.mdx
@@ -0,0 +1,251 @@
+---
+description: Use a FortiGate firewall to control egress traffic from Kubernetes workloads in a Calico Cloud connected cluster.
+---
+
+# Extend Kubernetes to Fortinet firewall devices
+
+:::warning[deprecation and removal notice]
+
+The Fortinet integration is deprecated and will be removed in a future release.
+If you want to use $[prodname] with Fortinet or any other firewall, we recommend instead using an [egress gateway](../../../networking/egress/egress-gateway-on-prem.mdx).
+
+:::
+
+## Big picture
+
+Use $[prodname] network policy to control traffic from Kubernetes clusters in your FortiGate firewalls.
+
+## Value
+
+As platform and security engineers, you want your apps to securely communicate with the external world. But you also want to secure the network traffic from the Kubernetes clusters using your FortiGate firewalls. Using the Fortinet/$[prodname] integration, security teams can retain firewall responsibility, secure traffic using $[prodname] network policy, which frees up time for ITOps.
+
+## Concepts
+
+## Integration at a glance
+
+This $[prodname]/Fortinet integration workflow lets you control egress traffic leaving the Kubernetes cluster. You create perimeter firewall policies in FortiManager and FortiGate that reference Kubernetes workloads. $[prodname] acts as a conduit, using the `tigera-firewall-controller` and global network policies to pass Kubernetes workload information to FortiManager and FortiGate devices where policies are applied and enforced.
+
+The basic workflow is:
+
+1. Determine the Kubernetes pods that are allowed access outside the perimeter firewall.
+1. Create $[prodname] global network policies with selectors that match those pods. Each global network policy maps to an address group in the FortiGate firewall.
+1. Deploy the `tigera firewall controller` in the Kubernetes cluster.
+1. Create a ConfigMap with Fortinet firewall information.
+ The `tigera firewall controller` reads the ConfigMap, gets the FortiGate firewall IP address, API token, and source IP address selection with `node` or `pod`. In your Kubernetes cluster, the controller populates pod IPs or Kubernetes node IPs of selector matching pods in FortiGate address group objects.
+
+## Before you begin
+
+**Supported versions**
+
+- FortiGate v6.2
+- FortiManager v6.4
+
+**Required**
+
+{/*//TODO-CC-XREFS - Pull secret that you used during [$[prodname] installation](/getting-started/install-on-clusters/index)*/}
+- IPv4 CIDR’s or IP addresses of all Kubernetes nodes; this is required for FortiManager to treat Kubernetes nodes as trusted hosts.
+
+**Recommended**
+
+- Experience creating and administering FortiGate/FortiManager firewall policies
+- Experience using [$[prodname] tiers](../../../reference/resources/tier.mdx) and [Global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
+
+## How to
+
+- [Create tier and global network policy](#create-tier-and-global-network-policy)
+- [Configure FortiGate firewall to communicate with firewall controller](#configure-fortigate-firewall-to-communicate-with-firewall-controller)
+- [Configure FortiManager to communicate with firewall controller](#configure-fortimanager-to-communicate-with-firewall-controller)
+- [Create a config map for address selection in firewall controller](#create-a-config-map-for-address-selection-in-firewall-controller)
+- [Create a config map with FortiGate and FortiManager information](#create-a-config-map-with-fortigate-and-fortimanager-information)
+- [Install FortiGate ApiKey and FortiManager password as secrets](#install-fortigate-apikey-and-fortimanager-password-as-secrets)
+- [Deploy firewall controller in the Kubernetes cluster](#deploy-firewall-controller-in-the-kubernetes-cluster)
+
+### Create tier and global network policy
+
+1. Create a tier for organizing global network policies.
+
+ Create a new [Tier](../../policy-tiers/tiered-policy.mdx) to organize all FortiGate firewall global network policies in a single location.
+
+1. Note the tier name to use in a later step for the FortiGate firewall information config map.
+
+1. Create a GlobalNetworkPolicy for address group mappings.
+
+ For example, a GlobalNetworkPolicy can select a set of pods that require egress access to external workloads. In the following GlobalNetworkPolicy, the firewall controller creates an address group named, `default.production-microservice1` in the FortiGate firewall. The members of `default.production-microservice1` address group include IP addresses of nodes. Each node can host one or more pods whose label selector match with `env == 'prod' && role == 'microservice1'`. Each GlobalNetworkPolicy maps to an address group in FortiGate firewall.
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: GlobalNetworkPolicy
+ metadata:
+ name: default.production-microservice1
+ spec:
+ selector: "env == 'prod' && role == 'microservice1'"
+ types:
+ - Egress
+ egress:
+ - action: Allow
+ ```
+
+### Configure FortiGate firewall to communicate with firewall controller
+
+1. Determine and note the CIDR's or IP addresses of all Kubernetes nodes that can run the `tigera-firewall-controller`.
+ Required to explicitly allow the `tigera-firewall-controller` to access the FortiGate API.
+1. Create an Admin profile with read-write access to Address and Address Group Objects.
+ For example: `tigera_api_user_profile`
+1. Create a REST API Administrator, associate this user with the `tigera_api_user_profile` profile, and add the CIDR or IP address of your Kubernetes cluster nodes as trusted hosts.
+ For example: `calico_enterprise_api_user`
+1. Note the API key.
+
+### Configure FortiManager to communicate with firewall controller
+
+1. Determine and note the CIDR's or IP addresses of all Kubernetes nodes that can run the `tigera-firewall-controller`.
+ Required to explicitly allow the tigera-firewall-controller to access the FortiManager API.
+1. From system settings, create an Admin profile with Read-Write access for `Policy & Objects`.
+ For example: `tigera_api_user_profile`
+1. Create a JSON API administrator, associate this user with the `tigera_api_user_profile` profile, and add the CIDR or IP address of your Kubernetes cluster nodes as `Trusted Hosts`.
+1. Note the username and password.
+
+### Create a config map for address selection in firewall controller
+
+1. Create a namespace for tigera-firewall-controller.
+
+ ```bash
+ kubectl create namespace tigera-firewall-controller
+ ```
+
+1. Create a config map with FortiGate firewall information.
+
+ For example:
+
+ ```bash
+ kubectl -n tigera-firewall-controller create configmap tigera-firewall-controller \
+ --from-literal=tigera.firewall.policy.selector="projectcalico.org/tier == 'default'" \
+ --from-literal=tigera.firewall.addressSelection="node"
+ ```
+
+ **ConfigMap values**
+
+ | Field | Enter values... |
+ | -------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | tigera.firewall.policy.selector | The tier name with the global network policies with the FortiGate address group mappings. For example, this selects the global network policies in the `default` tier: `tigera.firewall.policy.selector: "projectcalico.org/tier == 'default'" |
+ | tigera.firewall.addressSelection | The addressSelection for outbound traffic leaving the cluster. For example, if outgoingNat is enabled in cluster and compute Node IP address is used "tigera.firewall.addressSelection == `node` or If pod IP address used then "tigera.firewall.addressSelection == `pod`" |
+
+### Create a config map with FortiGate and FortiManager information
+
+1. In the [FortiGate ConfigMap manifest]($[filesUrl_CE]/manifests/fortinet-device-configmap.yaml), add your FortiGate firewall information in the data section, `tigera.firewall.fortigate`.
+
+ Where:
+
+ | Field | Description |
+ | ------------------------ | --------------------------------------------------------------------------- |
+ | name | FortiGate device name |
+ | ip | FortiGate Management Ip address |
+ | apikey | Secret in tigera-firewall-controller namespace, to store FortiGate's APIKey |
+ | apikey.secretKeyRef.name | Name of the secret to store APIKey. |
+ | apikey.secretKeyRef.key | Key name in the secret, which stores APIKey |
+
+ For example:
+
+ ```yaml
+ - name: prod-eastcoast-1
+ ip: 1.2.3.1
+ apikey:
+ secretKeyRef:
+ name: fortigate-east1
+ key: apikey-fortigate-east1
+ - name: prod-eastcoast-2
+ ip: 1.2.3.2
+ apikey:
+ secretKeyRef:
+ name: fortigate-east2
+ key: apikey-fortigate-east2
+ ```
+
+1. In the [FortiManager ConfigMap manifest]($[filesUrl_CE]/manifests/fortinet-device-configmap.yaml), add your FortiManager information in the data section, `tigera.firewall.fortimgr`.
+
+ Where:
+
+ | Field | Description |
+ | -------------------------- | ------------------------------------------------------------------------------ |
+ | name | FortiManager device name |
+ | ip | FortiManager Management Ip address |
+ | adom | FortiManager ADOM name to manage kubernetes cluster. |
+ | username | JSON api access account name to Read/Write FortiManager address objects. |
+ | password | Secret in tigera-firewall-controller namespace, to store FortiManager password |
+ | password.secretKeyRef.name | Name of the secret to store password. |
+ | password.secretKeyRef.key | Key name in the secret, which stores password. |
+
+ For example:
+
+ ```yaml
+ - name: prod-east1
+ ip: 1.2.4.1
+ username: api_user
+ adom: root
+ password:
+ secretKeyRef:
+ name: fortimgr-east1
+ key: pwd-fortimgr-east1
+ ```
+
+:::note
+
+If you are not using FortiManager in the integration, include only the following field in the ConfigMap data section. `tigera.firewall.fortimgr: |`
+
+:::
+
+1. Apply the manifest.
+
+ ```
+ kubectl apply -f $[filesUrl_CE]/manifests/fortinet-device-configmap.yaml
+ ```
+
+### Install FortiGate ApiKey and FortiManager password as secrets
+
+1. Store each FortiGate API key as a secret in the `tigera-firewall-controller` namespace.
+ For example, the FortiGate device, `prod-east1`, store its ApiKey as a secret name as `fortigate-east1`, with key as `apikey-fortigate-east1`.
+
+ ```
+ kubectl create secret generic fortigate-east1 \
+ -n tigera-firewall-controller \
+ --from-literal=apikey-fortigate-east1=
+ ```
+
+1. Store each FortiManager password as secret in the `tigera-firewall-controller` namespace.
+ For example, for FortiMgr `prod-east1`, store its password as a secret name as `fortimgr-east1`, with key as `pwd-fortimgr-east1`.
+
+ ```
+ kubectl create secret generic fortimgr-east1 \
+ -n tigera-firewall-controller \
+ --from-literal=pwd-fortimgr-east1=
+ ```
+
+### Deploy firewall controller in the Kubernetes cluster
+
+1. Install your pull secret.
+
+ ```
+ kubectl create secret generic tigera-pull-secret \
+ --from-file=.dockerconfigjson= \
+ --type=kubernetes.io/dockerconfigjson -n tigera-firewall-controller
+ ```
+
+1. Apply the manifest.
+
+ ```
+ kubectl apply -f $[filesUrl_CE]/manifests/fortinet.yaml
+ ```
+
+## Verify the integration
+
+1. Log in to the FortiGate firewall user interface.
+1. Under **Policy & Objects**, click **Addresses**.
+1. Verify that your Kubernetes-related address objects and address group objects are created with the following comments "Managed by Tigera $[prodname]".
+
+For all FortiManagers that are configured to work with firewall-controller, log in to each FortiManager UI with the correct ADOM.
+
+1. Click **Policy & Objects**, **Object Configuration**, \*\*Addresses.
+1. Verify that your Kubernetes-related address objects and address group objects are created with the following comments "Managed by Tigera $[prodname]".
+
+## Additional resources
+
+- [Extend FortiManager firewall policies to Kubernetes](fortimgr-integration.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/fortimgr-integration.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/fortimgr-integration.mdx
new file mode 100644
index 0000000000..8a724895ca
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/fortimgr-integration.mdx
@@ -0,0 +1,164 @@
+---
+description: Extend FortiManager firewall policies into Kubernetes workloads in a Calico Cloud connected cluster.
+---
+
+# Extend FortiManager firewall policies to Kubernetes
+
+:::warning[deprecation and removal notice]
+
+The Fortinet integration is deprecated and will be removed in a future release.
+If you want to use $[prodname] with Fortinet or any other firewall, we recommend instead using an [egress gateway](../../../networking/egress/egress-gateway-on-prem.mdx).
+
+:::
+
+## Big picture
+
+Use FortiManager firewall policies to secure workloads in your Kubernetes cluster.
+
+## Value
+
+The $[prodname]/Fortinet integration lets you control Kubernetes clusters directly and apply policy
+using the FortiManager UI as the primary interface. This allows firewall administrators to leverage existing
+tools and workflows as they learn and adopt Kubernetes orchestration at their own pace.
+
+## Concepts
+
+### Integration at a glance
+
+This $[prodname]/Fortinet solution lets you directly control Kubernetes policies using FortiManager.
+
+The basic workflow is:
+
+1. Determine the Kubernetes pods that you want to securely communicate with each other.
+1. Label these pods using a key-value pair where key is the `tigera.io/address-group`, and value is the pod matching a label name.
+1. In the FortiManager, select the cluster’s ADOM, and create an address group using the key-value pair associated with the pods.
+1. Create firewall policies using the address groups for IPv4 Source address and IPv4 Destination Address, and select services and actions as you normally would to allow or deny the traffic. Under the covers, the $[prodname] integration controller periodically reads the FortiManager firewall policies for your Kubernetes cluster, converts them to $[prodname] global network policies, and applies them to clusters.
+1. Use the $[prodname] web console to verify the integration, and then FortiManager UI to make all updates to policy rules.
+
+:::note
+
+The default value for reading FortiManager firewall policies is three seconds. To change the value, modify environment variable FW_FORTIMGR_EW_POLL_INTERVAL in FortiManager integration manifest; units are in seconds.
+
+:::
+
+## Before you begin
+
+**Supported version**
+
+- FortiManager v6.4
+
+**Required**
+
+- IPv4 CIDR’s or IP addresses of all Kubernetes nodes; this is required for FortiManager to treat Kubernetes nodes as trusted hosts.
+
+{/*//TODO-CC-XREF
+- Pull secret that you used during [$[prodname] installation](/getting-started/install-on-clusters/index)
+- Login access to [the $[prodname] web console](/operations/cnx/access-the-manager/)
+*/}
+
+**Recommended**
+
+- Experience with [ tiered policy](../../policy-tiers/tiered-policy.mdx) and [ global network policy](../../../reference/resources/globalnetworkpolicy.mdx)
+- Experience creating and administering FortiGate/FortiManager firewall policies
+
+## How to
+
+- [Create a tier](#create-a-tier)
+- [Configure FortiManager to communicate with firewall controller](#configure-fortimanager-to-communicate-with-firewall-controller)
+- [Create a FortiManager config map](#create-a-fortimanager-config-map)
+- [Install FortiManager password as secrets](#install-fortimanager-password-as-secrets)
+- [Deploy the firewall controller in the Kubernetes cluster](#deploy-the-firewall-controller-in-the-kubernetes-cluster)
+- [Verify the integration](#verify-the-integration)
+
+### Create a tier
+
+Create a [$[prodname] tier](../../policy-tiers/tiered-policy.mdx) in the $[prodname] web console for each Kubernetes cluster you want to secure. We recommend that you create a new tier (rather than reusing an existing tier) for all global network policies created by the $[prodname] integration controller.
+
+## Configure FortiManager to communicate with firewall controller
+
+1. Determine and note the CIDR’s or IP addresses of all Kubernetes nodes that can run the `tigera-firewall-controller`.
+ This is required to explicitly allow the `tigera-firewall-controller` to access the FortiManager API.
+1. From system settings, create an Admin profile with Read-Write access for `Policy & Objects`.
+ For example: `tigera_api_user_profile`
+1. Create a JSON API administrator and associate this user with the `tigera_api_user_profile` profile and add CIDR or IP address of your Kubernetes cluster nodes as `trusted hosts`.
+1. Note the username and password.
+
+## Create a FortiManager config map
+
+1. Create a namespace for the tigera-firewall-controller.
+
+ ```bash
+ kubectl create namespace tigera-firewall-controller
+ ```
+
+1. In this [FortiManager ConfigMap manifest]($[filesUrl_CE]/manifests/fortimanager-device-configmap.yaml), add your FortiManager device information in the data section: `tigera.firewall.fortimanager-policies`. For example:
+
+ ```yaml noValidation
+ tigera.firewall.fortimanager-policies: |
+ - name: prod-east1
+ ip: 3.2.1.4
+ username: api_user
+ adom: root
+ tier:
+ packagename: sacramento
+ password:
+ secretKeyRef:
+ name: fortimgr-east1
+ key: pwd-fortimgr-east1
+ ```
+
+ Where:
+
+ | Field | Description |
+ | -------------------------- | ---------------------------------------------------------------------------------------------------------------- |
+ | name | FortiManager device name. |
+ | ip | FortiManager Management IP address. |
+ | adom | FortiManager ADOM name that manages Kubernetes cluster. |
+ | packagename | FortiManager Firewall package. All firewall rules targeted for Kubernetes cluster are packed under this package. |
+ | username | JSON api access account name to Read/Write FortiManager address objects. |
+ | password | Secret in tigera-firewall-controller namespace, to store FortiManager password |
+ | tier | Tier name you created in the $[prodname] web console |
+ | password.secretKeyRef.name | Name of the secret to store password. |
+ | password.secretKeyRef.key | Key name in the secret, which stores password. |
+
+1. Apply the manifest.
+
+ ```bash
+ kubectl apply -f $[filesUrl_CE]/manifests/fortimanager-device-configmap.yaml
+ ```
+
+## Install FortiManager password as secrets
+
+Store each FortiManager password as a secret in the `tigera-firewall-controller` namespace.
+
+For example, in the ConfigMap for FortiMgr `prod-east1`, store its password as a secret name as `fortimgr-east1`, with key as `pwd-fortimgr-east1`.
+
+```bash
+kubectl create secret generic fortimgr-east1 \
+-n tigera-firewall-controller \
+--from-literal=pwd-fortimgr-east1=
+```
+
+### Deploy the firewall controller in the Kubernetes cluster
+
+1. Install your pull secret.
+
+ ```bash
+ kubectl create secret generic tigera-pull-secret \
+ --from-file=.dockerconfigjson= \
+ --type=kubernetes.io/dockerconfigjson -n tigera-firewall-controller
+ ```
+
+1. Apply the manifest.
+
+ ```bash
+ kubectl apply -f $[filesUrl_CE]/manifests/fortimanager.yaml
+ ```
+
+## Verify the integration
+
+1. Log in to FortiManager with the correct ADOM.
+2. Select **Policy & Objects**, **Object Configuration**, and create new **Address Groups**.
+3. Click **Policy packages** and select the Package assigned to your Kubernetes cluster.
+4. Create a test firewall policy with the following fields: Name, IPv4 Source Address, IPv4 Destination Address, Service and Action.
+5. Log in to the $[prodname] web console, and under the tier that you specified in the ConfigMap, verify that the GlobalNetworkPolicies are created.
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/index.mdx
new file mode 100644
index 0000000000..4f0a0da5e8
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/index.mdx
@@ -0,0 +1,18 @@
+---
+description: Calico Cloud integrations with Fortinet firewalls — FortiGate for traffic enforcement and FortiManager for policy management.
+hide_table_of_contents: true
+---
+
+# Fortinet firewall integrations
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+:::warning[deprecation and removal notice]
+
+The Fortinet integration is deprecated and will be removed in a future release.
+If you want to use $[prodname] with Fortinet or any other firewall, we recommend instead using an [egress gateway](../../../networking/egress/egress-gateway-on-prem.mdx).
+
+:::
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/overview.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/overview.mdx
new file mode 100644
index 0000000000..60af00df8a
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/fortinet-integration/overview.mdx
@@ -0,0 +1,38 @@
+---
+description: Integrate Kubernetes clusters with existing Fortinet firewall workflows using Calico Cloud — architecture, components, and what each side enforces.
+---
+
+# Determine the best Calico Cloud/Fortinet solution
+
+## Big picture
+
+Determine the best $[prodname]/Fortinet solution to integrate Kubernetes clusters with your existing Fortinet firewall workflows.
+
+## Value
+
+Many security teams must work within the confines of their existing IT security architecture, even though perimeter firewalls do not meet the needs of Kubernetes clusters. The $[prodname]/Fortinet integration allows firewall administrators to leverage existing Fortinet security tools and workflows, continue meeting compliance requirements, while adopting Kubernetes orchestration using $[prodname] at their own pace.
+
+### Concepts
+
+The $[prodname]/Fortinet integration provides the following solutions. You can you use them separately, or together without contention.
+
+### Solution 1: Extend Kubernetes to Fortinet firewall devices
+
+**Use case**: Control egress traffic for Kubernetes clusters.
+
+**Problem**: Perimeter firewalls do not have the necessary information to act on traffic that leaves the cluster for Kubernetes workloads.
+
+**Solution**: The $[prodname]/Fortinet integration leverages the power of $[prodname] policy selectors to provide Kubernetes workload information to FortiManager and FortiGate devices. You create perimeter firewall policies in FortiManager and FortiGate that reference Kubernetes workloads. Policies are applied and enforced by FortiGate devices. And Firewall administrators can write cluster egress policies that reference Kubernetes workloads directly in Fortinet devices.
+
+### Solution 2: Extend FortiManager firewall policies to Kubernetes
+
+**Use case**: Control Kubernetes clusters directly and apply policy.
+
+**Problem**: To avoid disruption, teams need to leverage existing FortiManager as the primary user interface.
+
+**Solution**: Use FortiManager to create firewall policies that are applied as $[prodname] network policies on Kubernetes workloads. Use the power of a $[prodname] “higher-order tier” so Kubernetes policy is evaluated early in the policy processing order, but update policy using FortiManager UI. Use the $[prodname] web console as a secondary interface to verify the integration and troubleshoot using logs.
+
+## Next steps
+
+- [Extend Kubernetes to Fortinet firewall devices](firewall-integration.mdx)
+- [Extend FortiManager firewall policies to Kubernetes](fortimgr-integration.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/index.mdx
new file mode 100644
index 0000000000..1dd4313c62
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-firewalls/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Integrate Calico Cloud policy with existing perimeter firewalls — extend rule scope from Kubernetes workloads out to the network edge.
+hide_table_of_contents: true
+---
+
+# Policy for firewalls
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/calico-system.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/calico-system.mdx
new file mode 100644
index 0000000000..330de170af
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/calico-system.mdx
@@ -0,0 +1,75 @@
+---
+description: Customize the behavior of the calico-system tier that Calico Cloud installs by default to keep its own components reachable.
+---
+
+# Change calico-system tier behavior
+
+:::warning
+The `calico-system` tier contains policies that secure $[prodname] components and is critical to cluster integrity. It is controlled by the Tigera Operator, and policies in the tier should not be edited, and the tier should not be moved. Although you can change the behavior of calico-system using adjacent tiers, you can inadvertently break critical cluster traffic. We highly recommend that you work with Support to implement changes around `calico-system` to prevent service disruption.
+
+:::
+
+## Big picture
+
+Change traffic behavior of the tier that secures $[prodname] components.
+
+## Value
+
+Although the tier that secures $[prodname] components cannot be changed, you can create policies in adjacent tiers to change its behavior.
+
+## Concepts
+
+$[prodname] automatically creates the `calico-system` tier during installation with network policies that select traffic to and from Tigera components. These policies ensure that traffic required for $[prodname] operation is allowed, and that any unnecessary traffic involving Tigera components is denied. This tier prevents disruption of $[prodname] functionality in case of network policy misconfiguration impacting Tigera components, and denies unexpected traffic in case of defect or compromise.
+
+### Ownership and management of calico-system
+
+Tigera defines the `calico-system` tier and manages the policies within it. The Tigera Operator installs and monitors these policies, ensuring they always match the state defined by Tigera. Management by the Operator also ensures integrity for upgrades.
+
+:::note
+
+The `calico-system` tier and its policies should not be edited, and the tier should not be moved. However, if you inadvertently make changes they are automatically reverted by the Operator to ensure your cluster is always protected.
+
+:::
+
+## Tutorial
+
+### Change behavior of calico-system
+
+If you want to change the way traffic is enforced by the `calico-system` tier, you must create policy in an adjacent tier to meet your needs. For example, if a policy in the `calico-system` tier allows or denies traffic, and you want to change how that traffic is enforced, you can create a policy in a tier before `calico-system` that selects the same traffic to make your desired changes. Similarly, if a policy in the `calico-system` tier passes or does not select traffic that you want to enforce, you can create a policy in a tier after `calico-system` to select this traffic to meet the desired behavior.
+
+### Example: use preceding tier to tighten security
+
+Let's say a `calico-system` policy allows ingress traffic from a $[prodname] component that you do not use, and you want to tighten enforcement to not allow this traffic.
+
+Within a tier that comes before `calico-system`, you can create a policy that selects the same endpoint and contains ingress rules that deny traffic from that component and pass to `calico-system` for traffic from other components.
+
+```yaml
+ # calico-system.es-gateway-access allows ingress from deep packet inspection, a feature not utilized for the purpose of this example.
+ # This policy tightens the scope of allowed ingress to es-gateway without modifying the calico-system policy directly.
+
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: preceding-tier.es-gateway-access
+ namespace: tigera-elasticsearch
+spec:
+ # Place in a tier prior to calico-system.
+ tier: preceding-tier
+
+ # Select the same endpoint as the original policy.
+ selector: k8s-app == 'tigera-secure-es-gateway'
+ ingress:
+ # Select the same component ingress.
+ - source:
+ selector: k8s-app == 'tigera-dpi'
+ namespaceSelector: name == 'tigera-dpi'
+ # Enact different behavior (originally: Allow)
+ action: Deny
+
+ # Defer to calico-system for other ingress/egress decisions for this endpoint.
+ - action: Pass
+```
+
+This example shows how you can change the impact of the `calico-system` tier on traffic without modifying the tier itself. This makes your changes more maintainable, and allows the calico-system tier to continue to receive updates as $[prodname] evolves without you needing to reconcile your changes each release.
+
+For help to manage or change the behavior of the `calico-system` tier, contact Tigera Support.
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/index.mdx
new file mode 100644
index 0000000000..205530017e
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Use Calico Cloud policy tiers to let platform, security, and app teams author and order policy independently across connected clusters.
+hide_table_of_contents: true
+---
+
+# Policy tiers
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/policy-tutorial-ui.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/policy-tutorial-ui.mdx
new file mode 100644
index 0000000000..ff35297765
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/policy-tutorial-ui.mdx
@@ -0,0 +1,246 @@
+---
+description: Tutorial for the Calico Cloud policy management UI — author, order, and stage policies inside tiers from the web console.
+---
+
+import Screenshot from '/src/___new___/components/Screenshot';
+
+# Network policy tutorial
+
+## What you will learn:
+
+- How to create a policy in the web console
+- How labels and selectors work
+- Basics of policy ordering and tiers
+
+## Scenario
+
+Let's start with a sample Kubernetes cluster.
+
+
+
+| Item | Description |
+| ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| Kubernetes cluster | A Kubernetes cluster with four namespaces and three nodes that run the pods in the cluster. |
+| Namespace | Four namespaces named blue, red, green, and purple represent different applications running in the cluster. |
+| Pod | Pods with meaningful labels for our applications: - FE (frontend pods) - BE (backend pods) |
+| NetworkSet | An arbitrary set of IP subnetworks/CIDRs or domains that can be matched by standard label selectors in Kubernetes or $[prodname] network policy. Network sets are a $[prodname] namespaced resource. |
+| GlobalNetwork Set | An arbitrary set of IP subnetworks/CIDRs or domains that can be matched by standard label selectors in Kubernetes or $[prodname] network policy. Global network sets are a $[prodname] global resource. |
+| ServiceAccount | Provides an identity for processes that run in a pod. Service accounts are a Kubernetes namespaced resource. |
+| HostEndpoint (HEP) | Physical or virtual interfaces attached to a host that runs $[prodname]. HEPs enforce $[prodname] policy on the traffic that enters or leaves the host’s default network namespace through the interfaces. HEPs are a $[prodname] global resource. |
+| External component | A machine (physical or virtual) that runs outside of the Kubernetes cluster. |
+
+## Create a network policy
+
+To follow along in the web console, click **Policies**.
+
+There are three main parts to every $[prodname] policy:
+
+- **Scope** - namespace or global
+- **Applies to** - objects within the above scope to which policy rules will be applied using labels and selectors
+- **Rules** - whether this policy affects ingress, egress, or both
+ - Ingress - policy rules to apply to connections inbound to the selected objects
+ - Egress - policy rules to apply to connections outbound from the selected objects
+
+
+
+Let's look at each part.
+
+## Scope
+
+Scope defines the reach of your policy. Use this dropdown to determine whether your policy applies globally or to a specific namespace. Think of scope as the "top-level scope" that can be further specified using the "Applies to" selection that follows.
+
+- **Global**
+
+ If you select global, but do not add entries in the **Applies to** field to further limit scope, _every pod and host endpoint (HEP) in our cluster would be in scope_. The following example uses the global option to limit the scope to all pods and HEPs (noted by check marks).
+
+ 
+
+- **Namespace**
+
+ If you select namespace, but do not add entries in the **Applies to** field to further limit scope, _every pod in this policy's namespace would be in scope_. The following example uses the namespace option to limit the scope to pods in the RED namespace.
+
+ 
+
+### Applies to
+
+As discussed above, selecting **Applies to** lets you further limit pods in a policy. You can think of it as the "top-level endpoint selector". You define labels on your endpoints, namespaces, and service accounts, then use label selectors to limit connections by matching the following object types:
+
+- **Endpoints**
+
+ Specify one or more label selectors to match specific endpoints, or select all endpoints
+
+- **Namespaces** (available only when the Scope is global)
+
+ Specify one or more label selectors to match specific namespaces, or select all namespaces
+
+- **Service Accounts**
+
+ Specify or more label selectors to match specific service accounts, or select all service accounts
+
+For example, if we select the BLUE namespace and apply it to only pods with the label, `app/tier == FE`,
+
+
+
+the resulting scope in our diagram would be only the pods labeled, `FE`:
+
+
+
+### Rules
+
+In the Rules section, you specify whether the policy impacts ingress, egress, or both.
+
+Note that ingress and egress are defined from the point of view of the _scoped endpoints_ (pods or host endpoints). In the previous diagram, the scoped endpoints are the three pods labeled, `app/tier:FE`.
+
+- Ingress rules filter traffic _coming to_ the scoped endpoints
+- Egress rules filter traffic _leaving_ the scoped endpoints
+
+Click **+ Add ingress rule** to access the **Rules** panel.
+
+### Endpoint selector
+
+The endpoint selector lets you select the endpoint traffic that is matched within the scope you've defined in the policy.
+
+In our example, the policy is scoped to endpoints that have the `app/tier == FE` label in the BLUE namespace. In the context of an egress rule, when we add the `app/tier == BE` endpoint selector, all TCP traffic from endpoints that have the`app/tier == BE` label will be allowed to the `app/tier == FE` endpoints.
+
+
+
+Note that endpoints that have the `app/tier == BE` label in other namespaces are not matched because the policy is namespace scoped.
+
+### Namespace selector
+
+This is where things can get interesting. In the previous example, we did not select anything in the namespace selector. Let's change the namespace selector to have both the BLUE and GREEN namespaces.
+
+
+
+Although the overall policy is scoped to the BLUE namespace, we can match endpoints in other namespaces on a per-rule basis. Note that the top-level scope that you select remains unchanged, meaning that the policy is still applied only to endpoints in the BLUE namespace.
+
+
+
+### Network selector
+
+Using the Nets selector, we can add CIDR addresses to be matched by the policy rule.
+
+
+
+### Service account selector
+
+Network policies can be also applied to the endpoint’s service account.
+
+Using the service account selector, we can apply rules to traffic from any endpoint whose service account matches the name or label selector.
+
+
+
+### Use Match All for wider matches in policy rules
+
+The **Match All** policy rule (`all()` in YAML) matches traffic for:
+
+- All endpoints in a namespace (if the policy scope is namespace)
+- All endpoints (if the policy scope is global)
+
+Let's look at an example of using **Match All** traffic in a namespaced policy:
+
+- Scope is namespaced (BLUE)
+- Applies to `app/tier == FE`
+
+Suppose we want to match traffic to the pod labeled `BE`, and the $[prodname] `networkset-1`.
+
+
+
+To do this, we can use the policy rule endpoint selector, **Match All**.
+
+
+
+Not only is the pod labeled `BE` included, but also the $[prodname] `networkset-1`.
+
+
+
+Note that we could have created individual selectors to match pods labeled, `BE` and for the `network-set-1`.
+
+**Match All traffic with namespace selectors**
+
+In the following example, if we select **Match All** endpoints, but in the **Namespace selector**, we select both the BLUE and GREEN namespaces, the results for matching are: all pods and network sets in the BLUE and GREEN namespaces.
+
+
+
+**Global selector**
+
+Let's see what happens when we select the **Global** selector.
+
+
+
+In our example, the Global selector selects HEPs and global network sets are selected. You might think that Global (`global()` in YAML) would select all endpoints, but it doesn't. Global means "do not select any namespaced resources" (which includes namespaced network set resources). Another way to express it is, do not select any workload endpoints.
+
+
+
+**Endpoint selector, unspecified**
+
+Next, let's see what happens when the policy rule does not specify any selection criteria. In this example, the rule selects all workloads, network sets, endpoints, and host endpoints within scope of the policy, including external components (the VM database).
+
+
+
+Now that you know the basic elements of a network policy, let's move on to policy ordering and tiers.
+
+## Policy ordering
+
+$[prodname] policies can have order values that control the order of precedence. For both network policies and global network policies, $[prodname] applies the policy with the lowest value first.
+
+
+
+### Mixing Kubernetes and $[prodname] policies
+
+Kubernetes and $[prodname] policies work side by side without a problem. However, Kubernetes network policies cannot assign an order value, so $[prodname] will set an implicit order value of 1000 to any Kubernetes network policies.
+
+:::note
+Policies are immediately applied to any new connections. However, for existing connections that are already open, the policy changes will only take effect after the connection has been reestablished. This means that any ongoing sessions may not immediately reflect policy changes until they are initiated again.
+:::
+
+### $[prodname] policies with no order value
+
+$[prodname] policies with order values take precedence. Policies without order values take lesser precedence and are processed alphabetically.
+
+## Tiers
+
+Tiers are a hierarchical construct used to group policies and enforce higher precedence policies that cannot be circumvented by other teams. Access to tiers is controlled using user role permissions. For example, a security team can implement high-level policy (for example, blocking access to/from IP ranges in particular countries), while developers in a later tier can control specific rules for the microservices of an app running in the cluster.
+
+### Policy processing overview
+
+When a new connection is processed by $[prodname], each tier that contains a policy that selects the endpoint processes the connection. Tiers are sorted by their order - the smallest number first. Policies in each tier are then processed in order from lowest to highest. For example, a policy of 800 is ordered before a policy of order 1000.
+
+- If a network policy or global network policy in the tier allows or denies the connection, then evaluation is done: the connection is handled accordingly.
+
+- If a network policy or global network policy in the tier passes the connection, the next tier containing a policy that selects the endpoint processes the connection
+
+After a Pass action, if no subsequent tier contains any policies that apply to the pod, the connection is allowed.
+
+If the tier contains policies that apply to the endpoint, but the policies take no action on the connection, the connection is dropped by an implicit deny.
+
+If no tiers contain policies that apply to the endpoint, the connection is allowed by an implicit allow.
+
+### Policies with no order value
+
+You can create policies without an order value. When a policy with no order value is placed in a tier with other policies that do have an order value, the policies are processed as follows:
+
+- Policies are evaluated from smallest to largest order value within the tier
+- Policies with no order value are processed last in the tier, but before the implicit deny
+- When multiple policies without an order value are present in a tier, they are processed in alphabetical order. However, we do not recommended relying on alphabetical ordering because it hard to operationalize.
+
+### How policy action rules affect traffic processing
+
+It is also important to understand that $[prodname] policy action rules affect how traffic and connections are processed. Let's go back to the first drop-down on the rules panel.
+
+Action defines what should happen when a connection matches this rule.
+
+
+
+- **Allow or Deny** - traffic is allowed or denied and the connection is handled accordingly. No further rules are processed.
+- **Pass** - skips to the next tier that contains a policy that applies to the endpoint, and processes the connection. If the tier applies to the endpoint but no action is taken on the connection, the connection is dropped.
+- **Log** - creates a log, and evaluation continues processing to the next rule
+
+## Additional resources
+
+The following topics go into further detail about concepts described in this tutorial:
+
+- [Get started with network policy](../beginners/calico-network-policy.mdx)
+- [Service account selectors](../beginners/policy-rules/service-accounts.mdx)
+- [Get started with tiered network policy](tiered-policy.mdx)
+- [Get started with network sets](../networksets.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/rbac-tiered-policies.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/rbac-tiered-policies.mdx
new file mode 100644
index 0000000000..154acf01d9
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/rbac-tiered-policies.mdx
@@ -0,0 +1,518 @@
+---
+description: Configure Kubernetes RBAC to control which users can edit Calico Cloud policies in each tier across connected clusters.
+---
+
+# Configure RBAC for tiered policies
+
+## Big picture
+
+Configure fine-grained user access controls for tiered policies.
+
+## Value
+
+Self-service is an important part of CI/CD processes for containerization and microservices. $[prodname] provides fine-grained access control (RBAC) for:
+
+- $[prodname] policy and tiers
+- Kubernetes network policy
+
+## Concepts
+
+### Standard Kubernetes RBAC
+
+$[prodname] implements the standard **Kubernetes RBAC Authorization APIs** with `Role` and `ClusterRole` types. The $[prodname] API server integrates with Kubernetes RBAC Authorization APIs as an extension API server.
+
+### RBAC for policies and tiers
+
+In $[prodname], global network policy and network policy resources are associated with a specific tier. Admins can configure access control for these $[prodname] policies using standard Kubernetes `Role` and `ClusterRole` resource types. This makes it easy to manage RBAC for both Kubernetes network policies and $[prodname] tiered network policies. RBAC permissions include managing resources using the $[prodname] web console, and `kubectl`.
+
+### Fine-grained RBAC for policies and tiers
+
+RBAC permissions can be split by resources ($[prodname] and Kubernetes), and by actions (CRUD). Tiers should be created by administrators. Full CRUD operations on tiers is synonymous with full management of network policy. Full management to network policy and global network policy also requires `GET` permissions to 1) any tier a user can view/manage, and 2) the required access to the tiered policy resources.
+
+Here are a few examples of how you can fine-tune RBAC for tiers and policies.
+
+| **User** | **Permissions** |
+| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| Admin | The default **tigera-network-admin** role lets you create, update, delete, get, watch, and list all $[prodname] resources (full control). Examples of limiting Admin access:
List tiers only
List only specific tiers
|
+| Non-Admin | The default **tigera-ui-user** role allows users to only list $[prodname] policy and tier resources. Examples of limiting user access:
Read-only access to all policy resources across all tiers, but only write access for NetworkPolicies with a specific tier and namespace.
Perform any operations on NetworkPolicies and GlobalNetworkPolicies.
List tiers only.
List or modify any policies in any tier. Fully manage only Kubernetes network policies in the **default** tier, in the **default** namespace, with read-only access for all other tiers.
|
+
+### RBAC definitions for $[prodname] network policy
+
+To specify per-tier RBAC for the $[prodname] network policy and $[prodname] global network policy, use pseudo resource kinds and names in the `Role` and `ClusterRole` definitions. For example,
+
+```yaml
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: tier-default-reader
+rules:
+ - apiGroups: ['projectcalico.org']
+ resources: ['tiers']
+ resourceNames: ['default']
+ verbs: ['get']
+ - apiGroups: ['projectcalico.org']
+ resources: ['tier.networkpolicies', 'networkpolicies]
+ resourceNames: ['default.*']
+ verbs: ['get', 'list']
+```
+
+Where:
+
+- **resources**: both `tier.globalnetworkpolicies` and `globalnetworkpolicies` for global network policies, and both `tier.networkpolicies` and `networkpolicies` for network policies.
+- **resourceNames**:
+ - Blank - any policy of the specified kind across all tiers.
+ - `.*` - any policy of the specified kind within the named tier.
+ - `` - the specific policy of the specified kind. Because the policy name is prefixed with the tier name, this also specifies the tier.
+
+## Before you begin...
+
+**Required**
+
+A **cluster-admin** role with full permissions to create and modify resources.
+
+**Recommended**
+
+A rough idea of your tiered policy workflow, and who should access what. See [Configure tiered policies](tiered-policy.mdx).
+
+## How to
+
+- [Create Admin users, full permissions](#create-admin-users-full-permissions)
+- [Create minimum permissions for all non-Admin users](#create-minimum-permissions-for-all-non-admin-users)
+
+:::note
+
+` kubectl auth can-i` cannot be used to check RBAC for tiered policy.
+
+:::
+
+### Create Admin users, full permissions
+
+Create an Admin user with full access to the $[prodname] web console (as well as everything else in the cluster) using the following command. See the Kubernetes documentation to identify users based on your chosen [authentication method](https://kubernetes.io/docs/reference/access-authn-authz/authentication/), and how to use the [RBAC resources](https://kubernetes.io/docs/reference/access-authn-authz/rbac/).
+
+```
+kubectl create clusterrolebinding permissive-binding \
+ --clusterrole=cluster-admin \
+ --user=
+```
+
+### Create minimum permissions for all non-Admin users
+
+All users using the $[prodname] web console should be able to create authorizationreviews and authorizationrequests as well as access
+license information through the services/proxy https:calico-api:8080.
+
+1. Download the [min-ui-user-rbac.yaml manifest]($[tutorialFilesURL]/min-ui-user-rbac.yaml).
+ The roles and bindings in this file provide a minimum starting point for setting up RBAC for your users according to your specific security requirements.
+ This manifest provides basic RBAC to view some statistical data in the UI but does not provide permissions to
+ view or modify any network policy related configuration.
+
+1. Run the following command to replace `` with the name or email of the user you are providing permissions to:
+
+ ```bash
+ sed -i -e 's///g' min-ui-user-rbac.yaml
+ ```
+
+1. Use the following command to install the bindings:
+
+ ```bash
+ kubectl apply -f min-ui-user-rbac.yaml
+ ```
+
+## Tutorial
+
+This tutorial shows how to use RBAC to control access to resources and CRUD actions for a non-Admin user, John, with the username **john**.
+
+The RBAC examples shown will include:
+
+- [User cannot read policies in any tier](#user-cannot-read-policies-in-any-tier)
+- [User can view all policies, and modify policies in the default namespace and tier](#user-can-view-all-policies-and-modify-policies-in-the-default-namespace-and-tier)
+- [User can read policies only in both the default tier and namespace](#user-can-read-policies-only-in-both-the-default-tier-and-namespace)
+- [User can read policies only in both a specific tier and in the default namespace](#user-can-read-policies-only-in-both-a-specific-tier-and-in-the-default-namespace)
+- [User can only view a specific tier](#user-can-only-view-a-specific-tier)
+- [User can read all policies across all tiers and namespaces](#user-can-read-all-policies-across-all-tiers-and-namespaces)
+- [User has full control over policies only in both a specific tier and in the default namespace](#user-has-full-control-over-policies-only-in-both-a-specific-tier-and-in-the-default-namespace)
+
+### User cannot read policies in any tier
+
+User 'john' is forbidden from reading policies in any tier (**default** tier, and **net-sec** tier).
+
+When John issues the following command:
+
+```bash
+kubectl get networkpolicies.p
+```
+
+It returns:
+
+```
+Error from server (Forbidden): networkpolicies.projectcalico.org is forbidden: User "john" cannot list networkpolicies.projectcalico.org in tier "default" and namespace "default" (user cannot get tier)
+```
+
+Similarly, when John issues this command:
+
+```bash
+kubectl get networkpolicies.p -l projectcalico.org/tier==net-sec
+```
+
+It returns:
+
+```
+Error from server (Forbidden): networkpolicies.projectcalico.org is forbidden: User "john" cannot list networkpolicies.projectcalico.org in tier "net-sec" and namespace "default" (user cannot get tier)
+```
+
+:::note
+
+The .p' extension (`networkpolicies.p`) is short
+for "networkpolicies.projectcalico.org" and used to
+differentiate it from the Kubernetes NetworkPolicy resource and
+the underlying CRDs (if using the Kubernetes Datastore Driver).
+
+:::
+
+:::note
+
+The label for selecting a tier is `projectcalico.org/tier`.
+When a label selector is not specified, the server defaults the selection to the
+`default` tier. Alternatively, a field selector (`spec.tier`) may be used to select
+a tier.
+
+```bash
+kubectl get networkpolicies.p --field-selector spec.tier=net-sec
+```
+
+:::
+
+### User can view all policies, and modify policies in the default namespace and tier
+
+1. Download the [`read-all-crud-default-rbac.yaml` manifest]($[tutorialFilesURL]/read-all-crud-default-rbac.yaml).
+
+1. Run the following command to replace `` with the `name or email` of
+ the user you are providing permissions to:
+
+ ```bash
+ sed -i -e 's///g' read-all-crud-default-rbac.yaml
+ ```
+
+1. Use the following command to install the bindings:
+
+ ```bash
+ kubectl apply -f read-all-crud-default-rbac.yaml
+ ```
+
+The roles and bindings in this file provide the permissions to read all policies across all tiers and to fully manage
+policies in the **default** tier and **default** namespace. This file includes the minimum required `ClusterRole` and `ClusterRoleBinding` definitions for all UI users (see `min-ui-user-rbac.yaml` above).
+
+### User can read policies only in both the default tier and namespace
+
+In this example, we give user 'john' permission to read policies only in both the **default** tier and namespace.
+
+```yaml
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: tigera-example-get-default-tier
+rules:
+ # To access Calico policy in a tier, the user requires "get" access to that tier.
+- apiGroups: ["projectcalico.org"]
+ resources: ["tiers"]
+ resourceNames: ["default"]
+ verbs: ["get"]
+
+---
+
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: tigera-example-read-policies-in-default-tier
+rules:
+ # This allows "get" and "list" of the Calico NetworkPolicy resources in the default tier.
+- apiGroups: ["projectcalico.org"]
+ resources: ["tier.networkpolicies"]
+ resourceNames: ["default.*"]
+ verbs: ["get", "list"]
+
+---
+
+# tigera-example-get-default-tier is applied globally
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: john-can-get-default-tier
+subjects:
+- kind: User
+ name: john
+ apiGroup: rbac.authorization.k8s.io
+roleRef:
+ kind: ClusterRole
+ name: tigera-example-get-default-tier
+ apiGroup: rbac.authorization.k8s.io
+
+---
+
+# tigera-example-read-policies-in-default-tier is applied per-namespace
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: john-can-read-policies-in-default-tier-and-namespace
+subjects:
+- kind: User
+ name: john
+ apiGroup: rbac.authorization.k8s.io
+roleRef:
+ kind: ClusterRole
+ name: tigera-example-read-policies-in-default-tier
+ apiGroup: rbac.authorization.k8s.io
+```
+
+With the above, user john is able to list all NetworkPolicy resources in the **default** tier:
+
+```bash
+kubectl get networkpolicies.p --all-namespaces
+```
+
+With some example policies on the cluster, returns:
+
+```
+NAMESPACE NAME CREATED AT
+blue default.calico-np-blue-ns-default-tier 2021-07-26T09:05:11Z
+default default.calico-np-default-ns-default-tier 2021-07-26T09:05:11Z
+green default.calico-np-green-ns-default-tier 2021-07-26T09:05:13Z
+red default.calico-np-red-ns-default-tier 2021-07-26T09:05:12Z
+yellow default.calico-np-yellow-ns-default-tier 2021-07-26T09:05:13Z
+```
+
+As intended, user john can only examine those in the **default** namespace:
+
+```bash
+kubectl get networkpolicies.p default.calico-np-green-ns-default-tier -o yaml -n=green
+```
+
+Correctly returns:
+
+```
+Error from server (Forbidden): networkpolicies.projectcalico.org "default.calico-np-green-ns-default-tier" is forbidden: User "john" cannot get networkpolicies.projectcalico.org in tier "default" and namespace "green"
+```
+
+John also still cannot access tier **net-sec**, as intended:
+
+```bash
+kubectl get networkpolicies.p -l projectcalico.org/tier==net-sec
+```
+
+This returns:
+
+```
+Error from server (Forbidden): networkpolicies.projectcalico.org is forbidden: User "john" cannot list networkpolicies.projectcalico.org in tier "net-sec" and namespace "default" (user cannot get tier)
+```
+
+### User can read policies only in both a specific tier and in the default namespace
+
+Let's assume that the kubernetes-admin gives user 'john' the permission to list the policies in tier **net-sec**, but only examine the detail of the policies that are also in the **default** namespace.
+To provide these permissions to user 'john', use the following `ClusterRoles`,`ClusterRoleBinding` and `RoleBinding`.
+
+```yaml
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: tigera-example-get-net-sec-tier
+rules:
+ # To access Calico policy in a tier, the user requires "get" access to that tier.
+- apiGroups: ["projectcalico.org"]
+ resources: ["tiers"]
+ resourceNames: ["net-sec"]
+ verbs: ["get"]
+
+---
+
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: tigera-example-read-policies-in-net-sec-tier
+rules:
+ # This allows "get" and "list" of the Calico NetworkPolicy resources in the net-sec tier.
+- apiGroups: ["projectcalico.org"]
+ resources: ["tier.networkpolicies"]
+ resourceNames: ["net-sec.*"]
+ verbs: ["get", "list"]
+
+---
+
+# tigera-example-get-net-sec-tier is applied globally
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: john-can-get-net-sec-tier
+subjects:
+- kind: User
+ name: john
+ apiGroup: rbac.authorization.k8s.io
+roleRef:
+ kind: ClusterRole
+ name: tigera-example-get-net-sec-tier
+ apiGroup: rbac.authorization.k8s.io
+
+---
+
+# tigera-example-read-policies-in-net-sec-tier is applied per-namespace
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: john-can-read-policies-in-net-sec-tier-and-namespace
+subjects:
+- kind: User
+ name: john
+ apiGroup: rbac.authorization.k8s.io
+roleRef:
+ kind: ClusterRole
+ name: tigera-example-read-policies-in-net-sec-tier
+ apiGroup: rbac.authorization.k8s.io
+```
+
+### User can only view a specific tier
+
+In this example, the following `ClusterRole` and `ClusterRoleBinding` can be used to provide 'get' access to the **net-sec**
+tier. This has the effect of making the **net-sec** tier visible in the $[prodname] web console (including listing the names of the policies it contains).
+
+However, to modify or view the details of policies within the **net-sec** tier, additional RBAC permissions would be required.
+
+```yaml
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: tigera-example-make-net-sec-tier-visible
+rules:
+ # To access Calico policy in a tier, the user requires "get" access to that tier.
+- apiGroups: ["projectcalico.org"]
+ resources: ["tiers"]
+ resourceNames: ["net-sec"]
+ verbs: ["get"]
+
+---
+
+# tigera-example-make-net-sec-tier-visible is applied globally
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: john-can-view-the-net-sec-tier
+subjects:
+- kind: User
+ name: john
+ apiGroup: rbac.authorization.k8s.io
+roleRef:
+ kind: ClusterRole
+ name: tigera-example-make-net-sec-tier-visible
+ apiGroup: rbac.authorization.k8s.io
+```
+
+### User can read all policies across all tiers and namespaces
+
+In this example, a single `ClusterRole` is used to provide read access to all policy resource types across all tiers. In this case, there is no need to use both `ClusterRoleBindings` and `RoleBindings` to map these abilities to the target user, because the intention is to for the policy to apply to all current and future namespaces on the cluster, so a `ClusterRoleBinding` provides the desired granularity.
+
+```yaml
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: tigera-example-all-tiers-and-namespaces-policy-reader
+rules:
+ # To access Calico policy in a tier, the user requires "get" access to that tier.
+ # Not specifying any specific "resourceNames" provides access to all tiers.
+- apiGroups: ["projectcalico.org"]
+ resources: ["tiers"]
+ verbs: ["get"]
+ # This allows read access to the Kubernetes NetworkPolicy resources (these are always in the default tier).
+- apiGroups: ["networking.k8s.io", "extensions"]
+ resources: ["networkpolicies"]
+ verbs: ["get","watch","list"]
+ # This allows read access to the Calico NetworkPolicy and GlobalNetworkPolicies.
+ # Not specifying any specific "resourceNames" provides access to them in all tiers.
+- apiGroups: ["projectcalico.org"]
+ resources: ["tier.networkpolicies","tier.globalnetworkpolicies"]
+ verbs: ["get","watch","list"]
+
+---
+
+# tigera-example-all-tiers-and-namespaces-policy-reader is applied globally, with a single ClusterRoleBinding,
+# since all the rules it contains apply to all current and future namespaces on the cluster.
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: read-all-tier
+subjects:
+- kind: User
+ name: john
+ apiGroup: rbac.authorization.k8s.io
+roleRef:
+ kind: ClusterRole
+ name: tigera-example-all-tiers-and-namespaces-policy-reader
+ apiGroup: rbac.authorization.k8s.io
+```
+
+### User has full control over policies only in both a specific tier and in the default namespace
+
+In this example, two `ClusterRole` objects are used to provide full access control of Calico NetworkPolicy
+resource types in the **net-sec** tier:
+
+- The `tiers` resource is bound to a user using a `ClusterRoleBinding`, because it is a global resource.
+ This results in the user having the ability to read the contents of the tier across all namespaces.
+- The `networkpolicies` resources are bound to a user using a `RoleBinding`, because the aim in this
+ case was to make them CRUD-able only in the default namespace.
+ You only need this one `ClusterRole` to be defined, but it can be applied to different namespaces
+ using additional `RoleBinding` objects. If the intention was to apply it to all current and future namespaces,
+ a `ClusterRoleBinding` could be used.
+
+```yaml
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: tigera-example-get-net-sec-tier
+rules:
+ # To access Calico policy in a tier, the user requires "get" access to that tier.
+- apiGroups: ["projectcalico.org"]
+ resources: ["tiers"]
+ resourceNames: ["net-sec"]
+ verbs: ["get"]
+
+---
+
+kind: ClusterRole
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: tigera-example-crud-policies-in-net-sec-tier
+rules:
+ # This allows full CRUD access to the Calico NetworkPolicy resources in the net-sec tier.
+- apiGroups: ["projectcalico.org"]
+ resources: ["tier.networkpolicies"]
+ resourceNames: ["net-sec.*"]
+ verbs: ["*"]
+
+---
+
+# tigera-example-get-net-sec-tier is applied globally
+kind: ClusterRoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: john-can-get-net-sec-tier
+subjects:
+- kind: User
+ name: john
+ apiGroup: rbac.authorization.k8s.io
+roleRef:
+ kind: ClusterRole
+ name: tigera-example-get-net-sec-tier
+ apiGroup: rbac.authorization.k8s.io
+
+---
+
+# tigera-example-crud-policies-in-net-sec-tier is applied per-namespace
+kind: RoleBinding
+apiVersion: rbac.authorization.k8s.io/v1
+metadata:
+ name: john-can-crud-policies-in-net-sec-tier-and-namespace
+subjects:
+- kind: User
+ name: john
+ apiGroup: rbac.authorization.k8s.io
+roleRef:
+ kind: ClusterRole
+ name: tigera-example-crud-policies-in-net-sec-tier
+ apiGroup: rbac.authorization.k8s.io
+```
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/tiered-policy.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/tiered-policy.mdx
new file mode 100644
index 0000000000..7a77b79c9a
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-tiers/tiered-policy.mdx
@@ -0,0 +1,242 @@
+---
+description: How tiered policy works in Calico Cloud — evaluation order, pass actions, and using tiers to enforce microsegmentation across connected clusters.
+---
+
+# Get started with policy tiers
+
+## Seamless network policy integration
+
+**Network policy** is the primary tool for securing a Kubernetes network. It lets you restrict network traffic in your cluster so only the traffic that you want to flow is allowed. $[prodname] provides more robust policy than Kubernetes, but you can use them together -- seamlessly. $[prodname] supports:
+
+- $[prodname] network policy, (namespaced)
+- $[prodname] global network policy (non-namespaced, global)
+- Kubernetes network policy
+
+## Tiers: what and why?
+
+**Tiers** are a hierarchical construct used to group policies and enforce higher precedence policies that cannot be circumvented by other teams. As you will learn in this tutorial, tiers have built-in features that support workload microsegmentation.
+
+All $[prodname] and Kubernetes network policies reside in tiers. You can start "thinking in tiers" by grouping your teams and types of policies within each group. For example, we recommend these three tiers (platform, security, and application).
+
+
+
+Next, you can determine the priority of policies in tiers (from top to bottom). In the following example, the platform and security tiers use $[prodname] global network policies that apply to all pods, while developer teams can safely manage pods within namespaces using Kubernetes network policy for their applications and microservices.
+
+
+
+## Create a tier and policy
+
+To create a tier and policy in the web console:
+
+1. In the left navbar, click **Policies**.
+1. On the **Policies Board**, click **Add Tier**.
+1. Name the tier, select **Order, Add after** `tigera-security`, and save.
+1. To create a policy in the tier, click **+ Add policy**.
+
+You can export all policies or a single policy to a YAML file.
+
+Here is a sample YAML that creates a security tier and uses `kubectl` to apply it.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: Tier
+metadata:
+ name: security
+spec:
+ order: 300
+```
+
+```bash
+kubectl apply -f security.yaml
+```
+
+## The default tier:
+
+The default tier is created during installation and has the order of 1,000,000. This value is fixed, and cannot be changed. The desire is to evaluate policies in the default tier as last.
+
+
+
+The default tier is where:
+
+- You manage all Kubernetes network policies
+- Network and global network policies are placed when you upgrade from Project Calico to $[prodname]
+- Recommended policies are placed when you use the **Recommend a policy** feature
+
+## The admin network policy tier:
+
+The `Tier` with name `adminnetworkpolicy` is where all [Kubernetes admin network policies](https://network-policy-api.sigs.k8s.io/reference/examples/) reside. It is automatically created
+during installation and has the order of 1,000 and a default action of `Pass`. This is fixed, and should not be changed.
+
+In addition to `AdminNetworkPolicy` resources, you can also add $[prodname] `NetworkPolicy`/`GlobalNetworkPolicy` resources
+to the admin network policy `Tier`. The `AdminNetworkPolicy` `priority` field maps to the `order` field in the $[prodname]
+`NetworkPolicy`/`GlobalNetworkPolicy` resources so that the two types of policy can be ordered together.
+
+## The baseline admin network policy tier:
+
+The `Tier` with name `baselineadminnetworkpolicy` is where the singleton [Kubernetes baseline admin network policy](https://network-policy-api.sigs.k8s.io/reference/examples/) resides. It is automatically created
+during installation and has the order of 10,000,000 and a default action of `Pass`. This is fixed, and should not be changed.
+
+In addition to the `BaselineAdminNetworkPolicy` resource, you can also add $[prodname] `NetworkPolicy`/`GlobalNetworkPolicy` resources
+to the baseline admin network policy `Tier`. The `BaselineAdminNetworkPolicy` is treated as if it had an `order` of 1,000, allowing $[prodname]
+`NetworkPolicy`/`GlobalNetworkPolicy` resources to be inserted with higher/lower precedence than the `BaselineAdminNetworkPolicy`.
+
+
+## System tiers
+
+System tiers are added during installation and are hidden by default.
+
+- **calico-system** tier contains policies to secure $[prodname] components and are controlled by the Tigera Operator. These policies should not be edited, and the tier should not be moved. Inadvertent changes are automatically reverted by the Operator to ensure your cluster is always protected.
+
+:::warning
+
+Although it is possible to change the behavior of the `calico-system` tier using adjacent tiers, it is not a trivial task. You can break critical cluster traffic and impact the operation of $[prodname]. To prevent loss of cluster services, see [Change calico-system tier behavior](calico-system.mdx), and contact Support for help.
+
+:::
+
+## Moving tiers
+
+You can move tiers by dragging and moving them in the graphical sequence, but all tiers must be visible first before you reorder tiers.
+
+To show all tiers, click **View** and select all of the tiers in the Show tiers list.
+
+
+
+Now you can reorder tiers by dragging and moving them.
+
+## Tier order
+
+Tiers are sorted by their orders (from left to right), starting from the lowest order (the highest priority) tiers.
+
+
+
+In the example above, tier priorities are as follows:
+
+- **security tier** - is higher priority than platform tier
+- **platform tier** - is higher priority than default tier
+- **default tier** - is the lowest priority
+
+The tier you put as the highest priority (after system tiers), depends on your environment. In compliance-driven environments, the security tier may be the highest priority (as shown above). There is no one-size-fits-all order.
+
+## Policy processing
+
+Policies are processed in sequential order from lowest order (highest priority) to highest order (lowest priority), which is from top to bottom in the following diagram.
+
+
+
+Two mechanisms drive how traffic is processed across tiered policies:
+
+- Labels and selectors
+- Policy action rules
+
+It is important to understand the roles they play.
+
+### Labels and selectors
+
+Instead of IP addresses and IP ranges, network policies in Kubernetes depend on labels and selectors to determine which workloads can talk to each other. Workload identity is the same for Kubernetes and $[prodname] network policies: as pods dynamically come and go, network policy is enforced based on the labels and selectors that you define.
+
+The following diagrams show the relationship between all of the elements that affect traffic flow:
+
+- **Tiers** group and order policies
+- **Policy action rules** define how to process traffic in and across tiers, and policy labels and selectors specify how groups of pods are allowed to communicate with each other and other network endpoints
+- The **CNI**, **$[prodname] components**, and underlying **data plane** (iptables/eBPF) all make use of labels and selectors as part of routing traffic.
+
+
+
+### Policy action rules
+
+$[prodname] network policy uses action rules to specify how to process traffic/packets:
+
+- **Allow or Deny** - traffic is allowed or denied and the packet is handled accordingly. No further rules are processed.
+- **Pass** - skips to the next tier that contains a policy that applies to the endpoint, and processes the packet. If the tier applies to the endpoint but no action is taken on the packet, the packet is dropped.
+- **Log** - creates a log, and evaluation continues processing to the next rule
+
+### Implicit default deny
+
+As shown in the following diagram, at the end of each tier is an implicit default deny. This is a safeguard that helps mitigate against unsecured policy.
+Because of this safeguard, you must either explicitly update tier's default action to **Pass** or apply a Pass action rule when you want traffic evaluation to continue.
+In the following example, the Pass action in a policy ensures that traffic evaluation continues, and overrides the implicit default deny.
+
+
+
+Let’s look at a Dev/Ops global network policy in a high precedence tier (Platform). The policy denies ingress and egress traffic to workloads that match selector, `env == "stage"`. To ensure that policies continue to evaluate traffic after this policy, the policy adds a Pass action for both ingress and egress.
+
+**Pass action rule example**
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: GlobalNetworkPolicy
+metadata:
+ name: devops.stage-env
+spec:
+ tier: devops
+ order: 255
+ selector: env == "stage"
+ ingress:
+ - action: Deny
+ source:
+ selector: env != "stage"
+ - action: Pass
+ egress:
+ - action: Deny
+ destination:
+ selector: env != "stage"
+ - action: Pass
+ types:
+ - Ingress
+ - Egress
+```
+
+The other option, is to update tier's default action to **Pass** to override the implicit default deny.
+
+**Pass default action tier example**
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: Tier
+metadata:
+ name: devops
+spec:
+ order: 300
+ defaultAction: Pass
+```
+
+### Policy endpoint matching across tiers
+
+Whoever is responsible for tier creation, also needs to understand how policy selects matching endpoints across tiers. For normal policy processing (without apply-on-forward, pre-DNAT, and do-not-track), if no policies within a tier apply to endpoints, the tier is skipped, and the tier's implicit deny behavior is not executed.
+
+In the following example, **policy D** in the Security tier includes a Pass action rule because we want traffic evaluation to continue to the next tier in sequence. In the Platform tier, there are no selectors in policies that match endpoints so the tier is skipped, including the end of tier deny. Evaluation continues to the Application tier. **Policy J** is the first policy with a matching endpoint.
+
+
+
+### Default endpoint behavior
+
+Also, tier managers need to understand the default behavior for endpoints based on whether the endpoint is known or unknown, and the endpoint type. As shown in the following table:
+
+- **Known endpoints** - $[prodname] resources that are managed by Felix
+- **Unknown endpoints** - interfaces/resources not recognizable as part of our data model
+
+| Endpoint type | Default behavior for known endpoints | Default behavior for unknown endpoints (outside of our data model) |
+| ---------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------ |
+| Workload, $[prodname] | Deny | Deny |
+| Workload, Kubernetes | Allow ingress from same Kubernetes namespace; allow all egress | Deny |
+| Host | Deny. With exception of auto host endpoints, which get `default-allow`. | Fall through and use iptables rules |
+
+## Best practices for tiered policy
+
+To control and authorize access to $[prodname] tiers, policies, and Kubernetes network policies, you use Kubernetes RBAC. Security teams can prevent unauthorized viewing or modification of higher precedence (lower order) tiers, while still allowing developers or service owners to manage the detailed policies related to their workloads.
+
+We recommend:
+
+- Limit tier creation permissions to Admin users only; creating and reordering tiers affects your policy processing workflow
+
+- Limit full CRUD operations on tiers and policy management to select Admin users
+
+- Review your policy processing whenever you add/reorder tiers
+
+ For example, you may need to update Pass action rules to policies before or after the new tier. Intervening tiers may require changes to policies before and after, depending on the endpoints.
+
+- Use the **policy preview** feature to see effects of policy in action before enforcing it, and use the **staged network policy** feature to test the entire tier workflow before pushing it to production
+
+## Additional resources
+
+- For details on using RBAC for fine-grained access to tiers and policies, see [Configure RBAC for tiered policies](rbac-tiered-policies.mdx).
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/policy-troubleshooting.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-troubleshooting.mdx
new file mode 100644
index 0000000000..4f1bcf0bbe
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/policy-troubleshooting.mdx
@@ -0,0 +1,42 @@
+---
+description: Troubleshooting guide for Calico Cloud policy implementation problems in connected clusters — denied traffic, missing rules, and tier-evaluation surprises.
+---
+
+# Troubleshoot policies
+
+### Problem
+
+I created my first egress policy with default deny behavior, but now I’ve blocked other traffic.
+
+### Solution
+
+In Kubernetes, when there are no egress policies that apply to an endpoint, all egress traffic is allowed. However, as soon as you add the first egress policy to an endpoint, $[prodname] switches to default deny and blocks everything else; this is part of our zero trust network policy model. For new users of $[prodname], this is unexpected behavior (but it’s required by both Kubernetes and $[prodname] policy specs.)
+
+For egress policy in particular, you may not be used to worrying about “system-level” egress traffic that is now suddenly blocked. For example, most workloads rely on DNS, but you may not have thought of this when writing your policy. So you end up with this problem loop: you allow HTTP traffic, but then your DNS traffic gets blocked, but then HTTP traffic stops working because it relies on DNS to function.
+
+A natural response to this issue is to add an egress rule to allow DNS(!). For example, you add an egress rule “allow UDP to port 53 to namespace kube-system”. In some systems (OpenShift), the DNS pod actually listens on port 5353, not port 53. However, the DNS Service DNATs the traffic from port 53 to port 5353, hiding that detail from the DNS client. $[prodname] then blocks the traffic because it sees the traffic after the DNAT. So $[prodname] sees port 5353, not the expected port 53.
+
+The solution is to define policy for workload services, not for ports used by workloads. For help, see [Policy for services](beginners/services/index.mdx).
+
+### Problem
+
+Traffic is blocked, even though I allow it in a policy.
+
+### Solution
+
+The problem of blocking traffic can reside in your tier, or a different tier.
+
+1. **Check policies in your tier**
+
+ Go to your policy and see if there is a higher precedent policy in the tier that is blocking processing.
+
+ - If that is not the problem, go to step 2.
+ - If that is the problem, and if it makes sense for the traffic, you can reorder the policies in the tier. If you cannot, you must change the policy that is dropping traffic to allow your traffic flow using a Pass action rule.
+
+2. **Check policies in other tiers**
+
+ Go to the next applicable higher precedent tier for your workload to see if a policy in that tier is blocking traffic. The policy at the end of the tier could be blocking traffic because the default behavior at the end of a tier is to drop traffic as part of zero trust. To unblock traffic, add a **Pass action rule** to the policy, or create a **Pass policy**.
+
+For help with visibility, use Service Graph to see how traffic is passed. Click on your flow, and view details in the right panel.
+
+For help with Pass action rules, see [Get started with tiered policy](policy-tiers/tiered-policy.mdx).
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/recommendations/index.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/recommendations/index.mdx
new file mode 100644
index 0000000000..32ee67a4a6
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/recommendations/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Use Calico Cloud policy recommendations to generate baseline network policy for unprotected namespaces from observed flow logs in connected clusters.
+hide_table_of_contents: true
+---
+
+# Policy recommendations
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/recommendations/learn-about-policy-recommendations.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/recommendations/learn-about-policy-recommendations.mdx
new file mode 100644
index 0000000000..0bbc217bda
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/recommendations/learn-about-policy-recommendations.mdx
@@ -0,0 +1,136 @@
+---
+description: Tutorial walkthrough of the Calico Cloud policy recommendations engine — what it generates, how to review it, and how to promote it to enforced.
+---
+
+# Policy recommendations tutorial
+
+## Big picture
+
+In this tutorial, we show you how recommendations are generated using flow logs in your cluster for traffic to/from namespaces, network sets, private network IPs and public domains.
+
+### Create resources for the tutorial
+
+Because the policy recommendation feature requires traffic between endpoints, this step provides these resources for this hands-on tutorial. If your cluster is already generating traffic for policy recommendations, you can skip this step and follow along using your own cluster.
+
+1. Configure felix for fast flow logs collection
+
+ ```bash
+ kubectl patch felixconfiguration.p default -p '{"spec":{"flowLogsFlushInterval":"10s"}}'
+ ```
+
+1. Download the [policy recommendation tutorial deployment]($[tutorialFilesURL]/policy-recommendation-deployments.yaml) YAML.
+
+1. Use the following command to create the necessary resources:
+
+ ```bash
+ kubectl apply -f policy-recommendation-deployments.yaml
+ ```
+
+### Enable policy recommendation
+
+1. In the web console left navbar, click the **Policies** icon.
+1. Select **Recommendations**.
+1. Click on **Enable Policy Recommendations**.
+
+Wait for the recommendations to be generated. Unless otherwise configured, recommendations will take at least 2m30s to be generated, which is default time for the [Processing Interval](../../reference/resources/policyrecommendations.mdx#spec) setting.
+
+Once ready, the recommendations will be listed in the main page, under the **Recommendations** tab.
+
+### Understand the policy recommendation
+
+You should find a recommendation named `curl-ns` (appended with a five character suffix, like `-vfzgh`) with policy selector:
+```
+Policy Label selector: [[projectcalico.org/namespace == 'curl-ns']]
+```
+meaning that this policy pertains to the traffic originating from or destined for the `curl-ns` namespace.
+
+The policy will display a list of ingress rules:
+```
+Allow:Protocol is TCP
+From: Namespaces [[projectcalico.org/name == 'service-ns']]
+To:Ports [Port is 80 ]
+```
+allows ingress traffic, for protocol TCP, on port 80, from the `service-ns` namespace.
+
+A list of egress rules:
+```
+Allow:Protocol is TCP
+To:Ports [Port is 8080 ] Domains [www.tigera.io]
+```
+allows egress traffic, for protocol TCP, on port 8080, to domain `www.tigera.io`.
+
+```
+Allow:Protocol is TCP
+To:Ports [Port is 80 ] Namespaces [[projectcalico.org/name == 'service-ns']]
+```
+allows egress traffic, for protocol TCP, on port 80, to the `service-ns` namespace.
+
+```
+Allow:Protocol is UDP
+To:Ports [Port is 53 ] Namespaces [[projectcalico.org/name == 'kube-system']]
+```
+allows egress traffic, for protocol UDP, on port 53, to the `kube-system` namespace.
+
+```
+Allow:Protocol is TCP
+To:Ports [Port is 80 ] Endpoints [[projectcalico.org/name == 'public-ips' and projectcalico.org/kind == 'NetworkSet']] Namespaces global()
+```
+allows egress traffic, for protocol TCP, on port 80, to IPs defined in the global network set named: `public-ips`.
+
+```
+Allow:Protocol is TCP
+To:Ports [Port is 8080 ] Nets [Is 10.0.0.0/8 OR Is 172.16.0.0/12 OR Is 192.168.0.0/16 ]
+```
+allows egress traffic, for protocol TCP, on port 8080, to private range IPs.
+
+```
+Allow:Protocol is TCP
+To:Ports [Port is 80 ]
+```
+allows egress traffic, for protocol TCP, on port 80, to public range IPs.
+
+### Investigate the flows that are used to generate the policy rules
+
+To view flow logs in Service Graph:
+
+1. In the web console left navbar, click **Service Graph**.
+1. Select **Default** under the VIEWS option.
+1. In the bottom pane you will see flow logs in the Flows tab.
+
+To generate rules, the recommendation engine queries for flow logs that are not addressed by any other policy in the cluster. Subsequently, it builds the missing policies necessary for allowing that traffic.
+
+### Understand the flow logs used in policy recommendations
+
+To get a better understanding of which flows contributed to generating the rules in your policy, select **Filter Flows**
+
+* To find the flows that were used to generate the egress to global network set rule, add:
+```
+source_namespace = "curl-ns" AND dest_name_aggr = "public-ips"
+```
+
+* To find the flows that generated the egress rule to namespace `kube-system`, define query:
+```
+source_namespace = "curl-ns" AND dest_namespace = "kube-system"
+```
+
+You'll notice that each of the flow logs contains a field named, `policies` with a entry like:
+```
+1|__PROFILE__|__PROFILE__.kns.curl-ns|allow|0
+```
+meaning that the particular flow was not addressed by any other policy within your cluster.
+
+You will also find input like:
+```
+0|namespace-isolation|curl-ns/namespace-isolation.staged:curl-ns-vfzgh|allow|3
+```
+indicating that the 3rd rule defined in policy **curl-ns-vfzgh**, will allow traffic defined by this flow, once the policy is enforced.
+
+### Examine policy traffic
+
+Examine the **Allowed Bytes** field in the **Recommendations** tab for the `curl-ns-recommendation` policy to get a sense of the total bytes allowed by the policy.
+
+Examine the **Allowed/sec** of each rule in the policy to get a sense of the quantity of traffic allowed per second by the rule in question.
+
+### When policy recommendations are not generated
+
+You may wonder why you are not getting policy recommendations, even though there is traffic between endpoints. This is because policy recommendations are generated only for flows that are not captured by any other policy in your cluster. To see if policy is already enforcing the traffic in question, search for the flow log in question, examine the `policies` field, and verify that no other enforced policy allows or denies traffic for that flow.
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/recommendations/policy-recommendations.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/recommendations/policy-recommendations.mdx
new file mode 100644
index 0000000000..aa907a5543
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/recommendations/policy-recommendations.mdx
@@ -0,0 +1,186 @@
+---
+description: Run continuous Calico Cloud policy recommendations so unprotected namespaces and workloads pick up baseline policy automatically.
+---
+
+# Enable policy recommendations
+
+## Big picture
+
+Use policy recommendations to automatically isolate namespaces with network policy.
+
+## Value
+
+One of the best practices for improving the security posture of your Kubernetes cluster is to implement namespace isolation with network policy. Namespace isolation helps to implement a zero-trust and least-privileged security model, where only required communication between namespaces is authorized and everything else is blocked. This helps mitigate the risk of lateral movement within a cluster in the event of an attack.
+
+$[prodname] makes it easy for platform operators to implement namespace isolation without experience in authoring network policy or detailed knowledge of how application workloads are communicating. $[prodname] analyzes the flow logs that are generated from workloads, and automatically recommends and stages policies for each namespace that can be used for isolation.
+
+## Before you begin
+
+**Unsupported**
+- Windows nodes
+
+**Required RBAC**
+
+To enable/disable and use policy recommendations, you must have the **tigera-network-admin** role or permissions to **update**, **patch**, **get**, **list**, **watch** `projectcalico.org` resources:
+* tiers
+* policyrecommendationscopes
+* stagednetworkpolicies
+* tier.stagednetworkpolicies
+* networkpolicies
+* tier.networkpolicies
+* globalnetworksets
+
+Specifically, you will need access to the `namespace-isolation` tier and to staged and network policies in the `namespace-isolation` tier.
+
+**Recommended**
+
+Basic knowledge of policies in the web console and tiers:
+- [Get started with tiered network policy](../../network-policy/policy-tiers/tiered-policy)
+- [Network policy tutorial](../../network-policy/policy-tiers/policy-tutorial-ui)
+
+**Limitations**
+
+Creating and managing policy recommendations is available only in the web console.
+
+## How to
+
+- Enable policy recommendations
+- [Activate and review policy recommendations](#activate-and-review-policy-recommendations)
+- [Review global settings for workloads](#review-global-settings-for-workloads)
+- [Update policy recommendations](#update-policy-recommendations)
+- [Private network recommendations](#private-network-recommendations)
+- [Troubleshoot policy recommendations](#troubleshoot-policy-recommendations)
+- [Disable the policy recommendations feature](#disable-policy-recommendations)
+
+### Enable policy recommendations **using the web console**
+
+1. In the left navbar in the web console, click **Policies**, **Recommendations**.
+1. On the opt-in page, click **Enable Policy Recommendations**.
+
+The **Policy Recommendations** board is automatically displayed.
+
+
+
+**Notes**:
+
+- A policy recommendation is generated for every namespace in your cluster (unless namespaces are filtered out by an Admin using the [selector](../../reference/resources/policyrecommendations.mdx#namespacespec) in the PolicyRecommendationScope resource).
+- Flow logs are continuously monitored for policy recommendations.
+- Recommended policies are continuously updated until you **Add to policy board** or **Dismiss policy** using the Actions menu.
+- Policy recommendations are created as **staged network policies** so you can safely observe the traffic before enforcing them.
+- Traffic originating from the recommended policy's namespace is used to generate egress rules, and traffic destined for the namespace is used to define ingress rules.
+- To stop policy recommendations from being processed and updated for a namespace, click the **Action** menu, **Dismiss policy**.
+
+### Enable policy recommendations **using kubectl**.
+
+To enable the policy recommendations feature, set the **RecStatus** parameter to `Enabled`, in the [Policy recommendations resource](../../reference/resources/policyrecommendations.mdx).
+
+```bash
+kubectl patch PolicyRecommendationScope default --type='json' -p='[{"op": "replace", "path": "/spec/namespaceSpec/recStatus", "value": "Enabled"}]'
+```
+
+### Activate and review policy recommendations
+
+Policy recommendations are not enabled until you activate them and move them to the **Active** board.
+
+From the Policy Recommendation board, select a policy recommendation (or bulk select) and select, **Add to policy board**. Click on the **Active tab**.
+
+You can now view the activated policies in the **Policies Board**. In the left navbar, click **Policies**.
+
+Policy recommendations are added to the **namespace-isolation** tier. Note the following:
+
+- Staged network policy recommendations work like any other staged network policy.
+- You cannot move recommended staged policies in the `namespace-isolation` tier.
+- The name of the `namespace-isolation` tier is fixed and cannot be changed
+
+You are now ready to observe traffic flows in Policies board to verify that the policy is authorizing traffic as expected. When a policy works as expected, you can safely enforce it. See [Stage, preview impacts, and enforce policy](network-policy/staged-network-policies.mdx) for help.
+
+### Review global settings for workloads
+
+The default global settings for capturing flows for policy recommendations are based on application workloads with *frequent communication with other namespaces in your cluster*.
+
+Global settings are found on the Policy Recommendations board, **Action** menu.
+
+
+
+- **Stabilization Period** is the learning time to capture flow logs so that a recommendation accurately reflects the cluster's traffic patterns.
+
+- **Processing Interval** is the frequency to process new flow logs and refine recommendations.
+
+:::tip
+For application workloads with less frequent communication, the stabilization period setting may not be long enough to get accurate traffic flows, so you’ll want to increase the time. We recommend that you review your workloads immediately after you enable policy recommendations and adjust the settings accordingly.
+:::
+
+Changes to all other policy recommendations parameters require Admin permissions and can be changed using the [Policy recommendations resource](../../reference/resources/policyrecommendations.mdx).
+
+### Update policy recommendations
+
+This section describes common changes you may want to make to policy recommendations.
+
+#### Relearn activated recommendations
+
+As new namespace and components are added to a cluster, your activated policy recommendation may need to be updated to reflect those changes. If a policy recommendation has not been enforced, you’ll need to update it to allow traffic.
+
+1. On the **Policies Recommendations** board, click the **Active tab**, which lists the active staged network policies.
+1. Select the Actions menu associated with the policy in question, and click **Dismiss policy**.
+1. Click the **Dismissed tab**, select the Actions menu, and **Reactivate** the policy.
+
+#### Rerun policy recommendations for an enforced policy
+
+To generate a new recommendation for an enforced policy, delete the network policy on the **Policy** board.
+
+#### Stop policy recommendation updates for a namespace
+
+1. On the Policy Recommendations board, click the **Recommendations** tab, which lists the recommendations.
+1. Select the recommendation, click the **Actions** menu, and click **Dismiss policy**.
+
+To reactivate a policy recommendation for a namespace, select the dismissed staged policy, and from the Actions menu, select **Reactivate**.
+
+### Private network recommendations
+
+If any flow to a private network in your cluster is found, a private rule is automatically created that contains RFC 1918 subnets, which will allow traffic to/from those endpoints. If you need to apply a more restrictive approach, create a [GlobalNetworkSet](../../reference/resources/globalnetworkset.mdx) and update it with the desired CIDR blocks. The recommendation engine will identify flows to your private IPs and generate the appropriate NetworkSet Rule.
+
+**Notes**:
+Exclude any CIDR ranges used by the cluster for nodes and pods.
+
+### Troubleshoot policy recommendations
+
+**Problem**: I’m not seeing policy recommendations on the Policy Recommendations board.
+
+**Solution/workaround**: Policy recommendations are based on historical flow logs that match a request, and are generated only for flows that have not been addressed by any other policy. As such, there are times when policy recommendations will not be generated:
+
+- Not enough traffic history
+
+ If you recently installed $[prodname], you may not have enough traffic history. Workloads must run for some time (around 5 days) to get “typical network traffic” for applications.
+
+- Traffic is covered by existing policy
+
+ Even if your cluster has been running for a long time with traffic, the flows may already be covered by existing policies.
+
+To verify why there may not be any recommendations, follow these steps:
+
+1. Go to **Service Graph**, **Default**.
+1. Filter flow logs for your namespace.
+1. Investigate the content within the `policies` field for the flow logs in question.
+1. Validate that no other enforced policy already addresses the flow.
+
+**Problem**: Why are egress-to-domain rules being generated for a Kubernetes service?
+
+**Solution/workaround**: The policy recommendation controller can only read the cluster domain of the cluster it runs in. If you have managed clusters with a non-default domain (`cluster.local`), the controller will treat egress traffic as though it is to a domain.
+
+### Disable policy recommendations
+
+To disable the policy recommendations feature, set the **RecStatus** parameter to `Disabled`, in the [Policy recommendations resource](../../reference/resources/policyrecommendations.mdx).
+
+```bash
+kubectl patch PolicyRecommendationScope default --type='json' -p='[{"op": "replace", "path": "/spec/namespaceSpec/recStatus", "value": "Disabled"}]'
+```
+
+:::note
+
+When disabled, non-active staged policies in the **Policies Recommendations** board are no longer updated. Existing activated and enforced staged network policies are not affected by disabling policy recommendations.
+
+:::
+
+## Additional resources
+
+- [Policy best practices](../../network-policy/policy-best-practices.mdx)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/network-policy/staged-network-policies.mdx b/calico-cloud_versioned_docs/version-24-1/network-policy/staged-network-policies.mdx
new file mode 100644
index 0000000000..0bd27af9b5
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/network-policy/staged-network-policies.mdx
@@ -0,0 +1,179 @@
+---
+description: Stage and preview Calico Cloud network policies from the web console to observe traffic impact across connected clusters before enforcing.
+---
+
+# Stage, preview impacts, and enforce policy
+
+## Big picture
+
+Stage and preview impacts on traffic before enforcing policy.
+
+## Value
+
+$[prodname] staged network policy resources lets you test the traffic impact of the policy as if it were enforced, but without changing traffic flow. You can also preview the impacts of a staged policy on existing traffic. By verifying that correct flows are allowed and denied before enforcement, you can minimize misconfiguration and potential network disruption.
+
+## Concepts
+
+### About staged policies
+
+The following staged policy resources have the same structure (i.e. the resource spec has the same fields) as their “enforced” counterpart.
+
+- Staged global network policy
+- Staged network policy
+- Staged Kubernetes network policy
+
+### Review permissions
+
+The default `tigera-network-admin` cluster role has the required permissions to manage the different enforced
+and staged network policies. Adjust permissions for your environment. As with $[prodname] network policy and global network policies, the RBAC for $[prodname] staged network policy and staged global network policy is tier-dependent.
+
+## How to
+
+- [Create a policy recommendation](#create-a-policy-recommendation)
+- [Stage a policy](#stage-a-policy)
+- [Preview policy impact](#preview-policy-impact)
+- [Enforce a staged policy](#enforce-a-staged-policy)
+- [Stage updates to an enforced policy](#stage-updates-to-an-enforced-policy)
+
+### Create a policy recommendation
+
+One of the first things developers need to do is secure unprotected workloads with network policy. (For example, by default, Kubernetes pods accept traffic from any source.) The **Recommend policy** feature allows developers with minimal experience writing policy to secure workloads.
+
+Because **Recommend policy** looks at historical flow log entries that match your request, you should run your workloads for a reasonable amount of time to get "typical network traffic" for your application.
+
+1. In the left navbar, click **Policies**.
+1. Click **Recommend a policy**.
+1. Enter time range, Namespace, Name, and click **Recommend**.
+1. If relevant flow logs are found within the time range for the workload endpoint, click **Preview** to assess the impact of the recommended policy, or **Stage**.
+
+
+
+### Stage a policy
+
+Stage a policy to test it in a near replica of a production environment.
+
+1. In the left navbar, click **Policies**.
+1. In a tier, click **Add Policy**.
+1. Create your policy and click **Stage** to save and stage it.
+
+
+### Preview policy impact
+
+Before enforcing a staged policy, it is a best practice to use the **Preview** feature to avoid unintentionally exposing or blocking other network traffic.
+
+1. From the **Policies Board**, select a staged policy and click **Edit policy**.
+1. Make some edits and click **Preview**.
+
+
+### Enforce a staged policy
+
+1. From **Policies Board**, click a staged policy.
+1. Click**Edit policy**, make changes and click **Enforce**. The staged policy is deleted and the enforced policy is created/updated (depending on whether it already exists).
+
+### Stage updates to an enforced policy
+
+1. From the **Policies Board**, open an enforced policy.
+1. In **View Policy**, click **Edit policy**.
+1. Make your changes, and click **Preview**. Depending on the results, you can click **Stage** or **Enforce**.
+
+You can also use custom resources to stage Kubernetes and $[prodname] policies, and apply them using `kubectl`. Here are sample YAML files.
+
+**Example: StagedGlobalNetworkPolicy**
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: StagedGlobalNetworkPolicy
+metadata:
+ name: default.allow-tcp-6379
+spec:
+ tier: default
+ selector: role == 'database'
+ types:
+ - Ingress
+ - Egress
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: role == 'frontend'
+ destination:
+ ports:
+ - 6379
+ egress:
+ - action: Allow
+```
+
+**Example: StagedNetworkPolicy**
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: StagedNetworkPolicy
+metadata:
+ name: default.allow-tcp-6379
+ namespace: default
+spec:
+ tier: default
+ selector: role == 'database'
+ types:
+ - Ingress
+ - Egress
+ ingress:
+ - action: Allow
+ protocol: TCP
+ source:
+ selector: role == 'frontend'
+ destination:
+ ports:
+ - 6379
+ egress:
+ - action: Allow
+```
+
+**Example: StagedKubernetesNetworkPolicy**
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: StagedKubernetesNetworkPolicy
+metadata:
+ name: test-network-policy
+ namespace: default
+spec:
+ podSelector:
+ matchLabels:
+ role: db
+ policyTypes:
+ - Ingress
+ - Egress
+ ingress:
+ - from:
+ - ipBlock:
+ cidr: 172.17.0.0/16
+ except:
+ - 172.17.1.0/24
+ - namespaceSelector:
+ matchLabels:
+ project: myproject
+ - podSelector:
+ matchLabels:
+ role: frontend
+ ports:
+ - protocol: TCP
+ port: 6379
+ egress:
+ - to:
+ - ipBlock:
+ cidr: 10.0.0.0/24
+ ports:
+ - protocol: TCP
+ port: 5978
+```
+
+## Additional resources
+
+- [Staged global network policy](../reference/resources/stagedglobalnetworkpolicy.mdx)
+- [Staged network policy](../reference/resources/stagednetworkpolicy.mdx)
+- [Staged Kubernetes network policy](../reference/resources/stagedkubernetesnetworkpolicy.mdx)
+- For details on how to configure RBAC for staged policy resources, see [Configuring RBAC for tiered policy](policy-tiers/rbac-tiered-policies.mdx)
+- For details on staged policy metrics, see
+ - [Flow logs](../observability/elastic/flow/datatypes.mdx)
+ - [Prometheus metrics](../operations/monitor/metrics/index.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/add-maglev-load-balancing.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/add-maglev-load-balancing.mdx
new file mode 100644
index 0000000000..01cd6ccaf3
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/add-maglev-load-balancing.mdx
@@ -0,0 +1,94 @@
+---
+description: Switch a Kubernetes service to Maglev consistent-hash load balancing on the Calico Cloud eBPF data plane for stable backend selection in connected clusters.
+---
+
+# Add Maglev load balancing to a service
+
+This guide shows you how to enable Maglev load balancing for external traffic to a service.
+
+Maglev load balancing opens up the possibility of using $[prodname] as a distributed, horizontally
+scalable load balancer for external connections, and allows for such connections to fail over from
+one load balancing node to another during a node outage.
+
+One case where you might enable Maglev for your service is when you wish to advertise the service IP out to your broader network as an ECMP route.
+$[prodname] nodes can be used as the nexthops for such a route. These nexthops allow external connections to that service to survive
+nexthop downtime and churn, say, in the case where a node must be taken down for maintenance.
+This is because traffic may failover onto another path when the normal path stops working.
+
+
+## Limitations
+
+Note Maglev load balancing cannot be used with the following:
+* Internal (pod-to-service) traffic.
+* NodePorts - as NodePort connections are always tied to a single node, and cannot failover to another.
+* Kubernetes External Traffic Policy. Maglev chooses from a lookup table of all valid backends when performing backend selection.
+
+
+## Prerequisites
+
+* Your cluster uses the eBPF data plane with [direct server return mode](../../operations/ebpf/enabling-ebpf.mdx#try-out-direct-server-return-mode).
+* All your nodes are running on Linux.
+* You have a service with a VIP/External-IP, possibly allocated by $[prodname] [LB IPAM](../ipam/service-loadbalancer.mdx), which you are advertising outside of your cluster.
+
+
+## Enable Maglev load balancing for a service
+
+To enable Maglev load balancing for a service, add the following annotation:
+
+```yaml
+lb.projectcalico.org/external-traffic-strategy: "maglev"
+```
+
+Or annotate a pre-existing service with:
+
+```bash
+kubectl -n annotate service 'lb.projectcalico.org/external-traffic-strategy=maglev'
+```
+
+Replace the following:
+* ``: The namespace of the service.
+* ``: The name of the service.
+
+
+## Verify that $[prodname] has configured Maglev load balancing for the service
+
+After annotating the service in-question, check any $[noderunning] container for an entry
+in the $[prodname] eBPF NAT table with the "maglev" flag.
+
+```bash title='Example NAT table dump'
+kubectl -n calico-system exec -- calico-node -bpf nat dump
+```
+
+Replace `` with the name of any calico-node pod.
+
+Check the command output for an entry with your service's IP, and the "maglev" flag mentioned in the same line:
+
+```
+10.101.205.28 port 80 proto 6 id 7 count 4 local 1 flags maglev
+ 7:0 192.168.95.210:9000
+ 7:1 192.168.163.6:9000
+ 7:2 192.168.221.69:9000
+ 7:3 192.168.28.136:9000
+```
+
+
+## Additional notes
+
+### BPF map sizing for large deployments
+
+In order to evenly distribute traffic, consistent-hash-based load balancing algorithms like Maglev must allocate large lookup-tables (LUTs),
+leading to a larger memory footprint than basic algorithms e.g. random-selection, round-robin. For this reason, the feature is enabled on a
+per-service basis, rather than globally applying to all services.
+
+In $[prodname], we program these LUTs to the eBPF data plane as maps which can grow up to a maximum size.
+If you plan to provision more than 100 services, or if you plan for any one service to have more than 100 endpoints, then the $[prodname]
+FelixConfiguration should be updated to reflect that:
+ - [BPFMaglevMaxEndpointsPerService](../../reference/resources/felixconfig.mdx#bpfMaglevMaxEndpointsPerService)
+ - [BPFMaglevMaxServices](../../reference/resources/felixconfig.mdx#bpfMaglevMaxServices)
+
+
+## Additional resources
+* [Prometheus Metrics for Maglev](../../reference/component-resources/node/felix/prometheus.mdx#load-balancer-metrics)
+* [FelixConfiguration](../../reference/resources/felixconfig.mdx)
+* [Enable the eBPF data plane](../../operations/ebpf/enabling-ebpf.mdx)
+* [Advertise Service IPs with BGP](advertise-service-ips.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/advertise-service-ips.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/advertise-service-ips.mdx
new file mode 100644
index 0000000000..221b8d79bb
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/advertise-service-ips.mdx
@@ -0,0 +1,270 @@
+---
+description: Advertise Kubernetes service cluster IPs and external IPs out of a Calico Cloud connected cluster over BGP so upstream routers can reach them directly.
+---
+
+# Advertise Kubernetes service IP addresses
+
+## Big picture
+
+Enable $[prodname] to advertise Kubernetes service IPs outside a cluster. $[prodname] supports advertising a service’s cluster IPs and external IPs.
+
+## Value
+
+Typically, Kubernetes service cluster IPs are accessible only within the cluster, so external access to the service requires a dedicated load balancer or ingress controller. In cases where a service’s cluster IP is not routable, the service can be accessed using its external IP.
+
+Just as $[prodname] supports advertising **pod IPs** over BGP, it also supports advertising Kubernetes **service IPs** outside a cluster over BGP. This avoids the need for a dedicated load balancer. This feature also supports equal cost multi-path (ECMP) load balancing across nodes in the cluster, as well as source IP address preservation for local services when you need more control.
+
+## Concepts
+
+### BGP makes it easy
+
+In Kubernetes, all requests for a service are redirected to an appropriate endpoint (pod) backing that service. Because $[prodname] uses BGP, external traffic can be routed directly to Kubernetes services by advertising Kubernetes service IPs into the BGP network.
+
+If your deployment is configured to peer with BGP routers outside the cluster, those routers (plus any other upstream places the routers propagate to) can send traffic to a Kubernetes service IP for routing to one of the available endpoints for that service.
+
+### Advertising service IPs: quick glance
+
+$[prodname] implements the Kubernetes **externalTrafficPolicy** using kube-proxy to direct incoming traffic to a correct pod. Advertisement is handled differently based on the service type that you configure for your service.
+
+| **Service mode** | **Cluster IP advertisement** | **Traffic is...** | Source IP address is... |
+| ----------------- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------- |
+| Cluster (default) | All nodes in the cluster statically advertise a route to the service CIDR. | Load balanced across nodes in the cluster using ECMP, then forwarded to appropriate pod in the service using SNAT. May incur second hop to another node, but good overall load balancing. | Obscured by SNAT |
+| Local | The nodes with a pod backing the service advertise a specific route (/32 or /128) to the service's IP. | Load balanced across nodes with endpoints for the service. Avoids second hop for LoadBalancer and NodePort type services, traffic may be unevenly load balanced. (Other traffic is load balanced across nodes in the cluster.) | Preserved |
+
+If your $[prodname] deployment is configured to peer with BGP routers outside the cluster, those routers - plus any further upstream places that those routers propagate to - will be able to send traffic to a Kubernetes service cluster IP, and that traffic is routed to one of the available endpoints for that service.
+
+### Tips for success
+
+- Generally, we recommend using “Local” for the following reasons:
+ - If any of your network policy uses rules to match by specific source IP addresses, using Local is the obvious choice because the source IP address is not altered, and the policy will still work.
+ - Return traffic is routed directly to the source IP because “Local” services do not require undoing the source NAT (unlike “Cluster” services).
+- Cluster IP advertisement works best with a ToR that supports ECMP. Otherwise, all traffic for a given route is directed to a single node.
+
+## Before you begin...
+
+**Required**
+
+- Calico CNI
+- [Configure BGP peering](bgp.mdx) between $[prodname] and your network infrastructure
+- For ECMP load balancing to services, the upstream routers must be configured to use BGP multipath.
+- You need at least one external node outside the cluster that acts as a router, route reflector, or ToR that is peered with calico nodes inside the cluster.
+- Services must be configured with the correct service mode (“Cluster” or “Local”) for your implementation. For `externalTrafficPolicy: Local`, the service must be type `LoadBalancer` or `NodePort`.
+
+**Limitations**
+
+- Supported in EKS and AWS, but only if you are using Calico CNI
+- OpenShift, versions 4.5 and 4.6
+ There is a [bug](https://github.com/kubernetes/kubernetes/issues/91374) where the source IP is not preserved by NodePort services or traffic via a Service ExternalIP with externalTrafficPolicy:Local.
+
+ OpenShift users on v4.5 or v4.6 can use this [workaround to avoid SNAT with ExternalIP](https://docs.openshift.com/container-platform/4.7/nodes/clusters/nodes-cluster-enabling-features.html):
+
+ ```
+ oc edit featuregates.config.openshift.io cluster
+ spec:
+ customNoUpgrade:
+ enabled:
+ - ExternalPolicyForExternalIP
+ ```
+
+ Kubernetes users on version v1.18 or v1.19 can enable source IP preservation for NodePort services using the ExternalPolicyForExternalIP feature gate.
+
+ Source IP preservation for NodePort and services and ExternalIPs is enabled by default in OpenShift v4.7+, and Kubernetes v1.20+.
+
+## How to
+
+- [Advertise service cluster IP addresses](#advertise-service-cluster-ip-addresses)
+- [Advertise service external IP addresses](#advertise-service-external-ip-addresses)
+- [Advertise service load balancer IP addresses](#advertise-service-load-balancer-ip-addresses)
+- [Exclude certain nodes from advertisement](#exclude-certain-nodes-from-advertisement)
+
+### Advertise service cluster IP addresses
+
+1. Determine the service cluster IP range. (Or ranges, if your cluster is [dual stack](../ipam/ipv6.mdx).)
+
+ The range(s) for your cluster can be inferred from the `--service-cluster-ip-range` option passed to the Kubernetes API server. For help, see the [Kubernetes API server reference guide](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/).
+
+1. Check to see if you have a default BGPConfiguration.
+
+ ```bash
+ kubectl get bgpconfiguration.projectcalico.org default
+ ```
+
+1. Based on above results, update or create a BGPConfiguration.
+
+ **Update default BGPConfiguration**.
+
+ Patch the BGPConfiguration using the following command, using your own service cluster IP CIDR in place of "10.0.0.0/24":
+
+ ```bash
+ kubectl patch bgpconfiguration.projectcalico.org default -p '{"spec":{"serviceClusterIPs": [{"cidr": "10.0.0.0/24"}]}}'
+ ```
+
+ **Create default BGPConfiguration**.
+
+ Use the following sample command to create a default BGPConfiguration. Add your CIDR blocks, covering the cluster IPs to be advertised, in the `serviceClusterIPs` field, for example:
+
+ ```bash
+ kubectl create -f - <
+ asNumber:
+ filters:
+ - export-to-tor
+```
+
+### Configure BGP peering with workloads
+
+In the parent cluster, create a `BGPPeer` resource to peer with the workloads.
+
+- The `localWorkloadSelector` field is used to select which workloads to peer with.
+ In this example, we select workloads with the label `color=red`.
+
+- Include the `BGPFilter` resources defined above in the `BGPPeer` resource to control
+ which routes are imported and exported.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: BGPPeer
+metadata:
+ name: peer-to-workloads
+spec:
+ localWorkloadSelector: color == 'red'
+ asNumber:
+ filters:
+ - no-export
+ - accept-nested-ip-pools
+```
+
+Both per-node and global `BGPPeer` resources are supported. To limit the peering to certain nodes, use the `nodeSelector` field.
+
+:::note
+
+`localWorkloadSelector` is scoped to all workloads and it does not currently have a corresponding
+"namespace selector". To match on namespace labels, you can prefix the label name with `pcns.`.
+
+:::
+
+In the child cluster,
+
+- Ensure that the node-to-node mesh is disabled in the `BGPConfiguration` resource and
+ that the workload cluster's AS number is set:
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: BGPConfiguration
+ metadata:
+ name: default
+ spec:
+ nodeToNodeMeshEnabled: false
+ asNumber:
+ ```
+
+- Create a `BGPPeer` resource (per desired IP version) that peers with the
+ parent clusters' virtual IP:
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: BGPPeer
+ metadata:
+ name: peer-to-parent-cluster
+ spec:
+ peerIP: 169.254.0.179
+ asNumber:
+ ---
+ apiVersion: projectcalico.org/v3
+ kind: BGPPeer
+ metadata:
+ name: peer-to-parent-cluster-v6
+ spec:
+ peerIP: "fdc9:9723:09bc::1"
+ asNumber:
+ ```
+
+### Configure more than one nested cluster
+
+You can configure more than one nested cluster by:
+
+- Choosing a unique non-overlapping IP pool for each nested cluster.
+- In the parent cluster: creating a new import `BGPFilter` resource for each cluster to import its routes.
+- In the parent cluster: creating a new, uniquely-named `BGPPeer` resource for each cluster to peer with the
+ parent cluster. You can re-use the shared "no-export" `BGPFilter` resource with every nested cluster peering.
+- In the parent cluster: updating the `export-to-tor` `BGPFilter` resource to include the new cluster's CIDRs.
+- In the nested cluster: adding a copy of the `peer-to-parent-cluster` `BGPPeer`(s). These should
+ be the same in all nested clusters since a parent cluster always uses the same virtual IP for all
+ nested clusters.
+
+:::note
+
+If you plan to use many nested clusters consider allocating their IP pools from a single larger
+CIDR. Then the `export-to-tor` filter can be simplified to match on the larger CIDR only.
+
+If you trust the nested clusters, similarly, you could also re-use a single `accept-nested-ip-pools` filter
+for all child clusters.
+
+:::
+
+## Additional resources
+
+- [BGP guide](./bgp.mdx)
+- [BGP L3 interconnect guide](../../reference/architecture/design/l3-interconnect-fabric.mdx)
+- [Node resource](../../reference/resources/node.mdx)
+- [BGP configuration resource](../../reference/resources/bgpconfig.mdx)
+- [BGP peer resource](../../reference/resources/bgppeer.mdx)
+- [BGP filter resource](../../reference/resources/bgpfilter.mdx)
+
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/bgp.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/bgp.mdx
new file mode 100644
index 0000000000..f419958a08
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/bgp.mdx
@@ -0,0 +1,364 @@
+---
+description: Set up BGP peering for Calico Cloud connected clusters — full mesh, per-node peers, top-of-rack switches, and route reflectors — with BGPPeer and BGPConfiguration resources.
+---
+
+# Configure BGP peering
+
+## Big picture
+
+Configure BGP (Border Gateway Protocol) between Calico nodes or peering with network infrastructure to distribute routing information.
+
+## Value
+
+$[prodname] nodes can exchange routing information over BGP to enable reachability for $[prodname] networked workloads (Kubernetes pods or OpenStack VMs). In an on-premises deployment this allows you to make your workloads first-class citizens across the rest of your network. In public cloud deployments, it provides an efficient way of distributing routing information within your cluster, and is often used in conjunction with IPIP overlay or cross-subnet modes.
+
+## Concepts
+
+### BGP
+
+**BGP** is a standard protocol for exchanging routing information between routers in a network. Each router running BGP has one or more **BGP peers** - other routers which they are communicating with over BGP. You can think of $[prodname] networking as providing a virtual router on each of your nodes. You can configure $[prodname] nodes to peer with each other, with route reflectors, or with top-of-rack (ToR) routers.
+
+### Common BGP topologies
+
+There are many ways to configure a BGP network depending on your environment. Here are some common ways it is done with $[prodname].
+
+### Full-mesh
+
+When BGP is enabled, $[prodname]’s default behavior is to create a **full-mesh** of internal BGP (iBGP) connections where each node peers with each other. This allows $[prodname] to operate over any L2 network, whether public cloud or private cloud, or, if IPIP is [configured](vxlan-ipip.mdx), to operate as an overlay over any network that does not block IPIP traffic. $[prodname] does not use BGP for VXLAN overlays.
+
+:::note
+
+Most public clouds support IPIP. The notable exception is Azure, which blocks IPIP traffic. So if you want to run Calico as an overlay network in Azure, you must [configure $[prodname] to use VXLAN](vxlan-ipip.mdx).
+
+:::
+
+Full-mesh works great for small and medium-size deployments of say 100 nodes or less, but at significantly larger scales full-mesh becomes less efficient, and we recommend using route reflectors.
+
+### Route reflectors
+
+To build large clusters of internal BGP (iBGP), **BGP route reflectors** can be used to reduce the number of BGP peerings used on each node. In this model, some nodes act as route reflectors and are configured to establish a full mesh amongst themselves. Other nodes are then configured to peer with a subset of those route reflectors (typically 2 for redundancy), reducing the total number BGP peering connections compared to full-mesh.
+
+### Top of Rack (ToR)
+
+In **on-premises deployments**, you can configure $[prodname] to peer directly with your physical network infrastructure. Typically, this involves disabling $[prodname]’s default full-mesh behavior, and instead peer $[prodname] with your L3 ToR routers. There are many ways to build an on-premises BGP network. How you configure your BGP is up to you - $[prodname] works well with both iBGP and eBGP configurations, and you can effectively treat $[prodname] like any other router in your network design.
+
+Depending on your topology, you may also consider using BGP route reflectors within each rack. However, this is typically needed only if the number of nodes in each L2 domain is large (> 100).
+
+For a deeper look at common on-premises deployment models, see [Calico over IP Fabrics](../../reference/architecture/design/l2-interconnect-fabric.mdx).
+
+## Before you begin...
+
+**Required**
+
+- Calico CNI
+
+{/*//TODO-CC-XREF- [calicoctl] (/operations/clis/calicoctl/install) must be installed and configured*/}
+
+## How to
+
+:::note
+
+Significantly changing $[prodname]'s BGP topology, such as changing from full-mesh to peering with ToRs, may result in temporary loss of pod network connectivity during the reconfiguration process. It is recommended to only make such changes during a maintenance window.
+
+:::
+
+- [Configure a global BGP peer](#configure-a-global-bgp-peer)
+- [Configure a per-node BGP peer](#configure-a-per-node-bgp-peer)
+- [Configure a node to act as a route reflector](#configure-a-node-to-act-as-a-route-reflector)
+- [Disable the default BGP node-to-node mesh](#disable-the-default-bgp-node-to-node-mesh)
+- [Change from node-to-node mesh to route reflectors without any traffic disruption](#change-from-node-to-node-mesh-to-route-reflectors-without-any-traffic-disruption)
+- [View BGP peering status for a node](#view-bgp-peering-status-for-a-node)
+- [View BGP info on all peers for a node](#view-bgp-info-on-all-peers-for-a-node)
+- [Change the default global AS number](#change-the-default-global-as-number)
+- [Change AS number for a particular node](#change-as-number-for-a-particular-node)
+- [Set a local AS number for a specific BGP peer](#set-a-local-as-number-for-a-specific-bgp-peer)
+- [Configure a BGP filter](#configure-a-bgp-filter)
+- [Configure a BGP peer with a BGP filter](#configure-a-bgp-peer-with-a-bgp-filter)
+
+### Configure a global BGP peer
+
+Global BGP peers apply to all nodes in your cluster. This is useful if your network topology includes BGP speakers that will be peered with every $[prodname] node in your deployment.
+
+The following example creates a global BGP peer that configures every $[prodname] node to peer with **192.20.30.40** in AS **64567**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: BGPPeer
+metadata:
+ name: my-global-peer
+spec:
+ peerIP: 192.20.30.40
+ asNumber: 64567
+```
+
+### Configure a per-node BGP peer
+
+Per-node BGP peers apply to one or more nodes in the cluster. You can choose which nodes by specifying the node’s name exactly, or using a label selector.
+
+The following example creates a BGPPeer that configures every $[prodname] node with the label, **rack: rack-1** to peer with **192.20.30.40** in AS **64567**.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: BGPPeer
+metadata:
+ name: rack1-tor
+spec:
+ peerIP: 192.20.30.40
+ asNumber: 64567
+ nodeSelector: rack == 'rack-1'
+```
+
+### Configure a node to act as a route reflector
+
+$[prodname] nodes can be configured to act as route reflectors. To do this, each node that you want to act as a route reflector must have a cluster ID - typically an unused IPv4 address.
+
+To configure a node to be a route reflector with cluster ID 244.0.0.1, run the following command.
+
+```bash
+kubectl annotate node my-node projectcalico.org/RouteReflectorClusterID=244.0.0.1
+```
+
+Typically, you will want to label this node to indicate that it is a route reflector, allowing it to be easily selected by a BGPPeer resource. You can do this with kubectl. For example:
+
+```bash
+kubectl label node my-node route-reflector=true
+```
+
+Now it is easy to configure route reflector nodes to peer with each other and other non-route-reflector nodes using label selectors. For example:
+
+```yaml
+kind: BGPPeer
+apiVersion: projectcalico.org/v3
+metadata:
+ name: peer-with-route-reflectors
+spec:
+ nodeSelector: all()
+ peerSelector: route-reflector == 'true'
+```
+
+:::note
+
+Adding `routeReflectorClusterID` to a node spec will remove it from the node-to-node mesh immediately, tearing down the
+existing BGP sessions. Adding the BGP peering will bring up new BGP sessions. This will cause a short (about 2 seconds)
+disruption to data plane traffic of workloads running in the nodes where this happens. To avoid this, make sure no
+workloads are running on the nodes, by provisioning new nodes or by running `kubectl drain` on the node (which may
+itself cause a disruption as workloads are drained).
+
+:::
+
+### Disable the default BGP node-to-node mesh
+
+The default **node-to-node BGP mesh** may be turned off to enable other BGP topologies. To do this, modify the default **BGP configuration** resource.
+
+Run the following command to disable the BGP full-mesh:
+
+```bash
+calicoctl patch bgpconfiguration default -p '{"spec": {"nodeToNodeMeshEnabled": false}}'
+```
+
+:::note
+
+If the default BGP configuration resource does not exist, you need to create it first. See [BGP configuration](../../reference/resources/bgpconfig.mdx) for more information.
+
+:::
+
+:::note
+
+Disabling the node-to-node mesh will break pod networking until/unless you configure replacement BGP peerings using BGPPeer resources.
+You may configure the BGPPeer resources before disabling the node-to-node mesh to avoid pod networking breakage.
+
+:::
+
+### Change from node-to-node mesh to route reflectors without any traffic disruption
+
+Switching from node-to-node BGP mesh to BGP route reflectors involves tearing down BGP sessions and bringing up new ones. This causes a short
+data plane network disruption (of about 2 seconds) for workloads running on the nodes in the cluster. To avoid this, you may provision
+route reflector nodes and bring their BGP sessions up before tearing down the node-to-node mesh sessions.
+
+Follow these steps to do so:
+
+1. [Provision new nodes to be route reflectors.](#configure-a-node-to-act-as-a-route-reflector) The nodes [should not be schedulable](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/)
+ and they should have `routeReflectorClusterID` in their spec. These won't be part of the existing
+ node-to-node BGP mesh, and will be the route reflectors when the mesh is disabled. These nodes should also have a label like
+ `route-reflector` to select them for the BGP peerings. [Alternatively](https://kubernetes.io/docs/tasks/administer-cluster/safely-drain-node/),
+ you can drain workloads from existing nodes in your cluster by running `kubectl drain ` to configure them to be route reflectors,
+ but this will cause a disruption on the workloads on those nodes as they are drained.
+
+2. Also set up a [BGPPeer](#configure-a-node-to-act-as-a-route-reflector) spec to configure route reflector nodes to peer with each other and other non-route-reflector nodes
+ using label selectors.
+
+3. Wait for these peerings to be established. This can be [verified](#view-bgp-peering-status-for-a-node) by running `sudo calicoctl node status` on the nodes. Alternatively, you can create a [`CalicoNodeStatus` resource](../../reference/resources/caliconodestatus.mdx) to get BGP session status for the node.
+
+4. [Disable the BGP node-to-node mesh for the cluster.](#disable-the-default-bgp-node-to-node-mesh)
+
+5. If you did drain workloads from the nodes or created them as unschedulable, mark the nodes as schedulable again (e.g. by running `kubectl uncordon `).
+
+### View BGP peering status for a node
+
+Create a [CalicoNodeStatus resource](../../reference/resources/caliconodestatus.mdx) to monitor BGP session status for the node.
+
+Alternatively, you can run the `calicoctl node status` command on a given node to learn more about its BGP status.
+
+:::note
+
+This command communicates with the local $[prodname] agent, so you must execute it on the node whose status you are attempting to view.
+
+:::
+
+### View BGP info on all peers for a node
+
+You can use `calicoctl` to view the BGP information for all peers of a particular node, including connection status, routing statistics, and BGP state. This is useful for confirming that your configuration is behaving as desired, and for more detailed troubleshooting.
+
+Run the following command from anywhere you have access to `kubectl`:
+
+```bash
+calicoctl bgp peers
+```
+
+Where `` is the resource name for one of the Calico node pods within your cluster.
+
+### Change the default global AS number
+
+By default, all Calico nodes use the 64512 autonomous system, unless a per-node AS has been specified for the node. You can change the global default for all nodes by modifying the default **BGPConfiguration** resource. The following example command sets the global default AS number to **64513**.
+
+```bash
+kubectl patch bgpconfiguration default -p '{"spec": {"asNumber": "64513"}}'
+```
+
+:::note
+
+If the default BGP configuration resource does not exist, you need to create it first. See [BGP configuration](../../reference/resources/bgpconfig.mdx) for more information.
+
+:::
+
+### Change AS number for a particular node
+
+You can configure an AS for a particular node by modifying the node object using `calicoctl`. For example, the following command changes the node named **node-1** to belong to **AS 64514**.
+
+```bash
+calicoctl patch node node-1 -p '{"spec": {"bgp": {"asNumber": "64514"}}}'
+```
+
+### Set a local AS number for a specific BGP peer
+
+You can configure a distinct local AS number for an individual BGP peer by modifying the `BGPPeer` resource using `calicoctl` or `kubectl`. This overrides the node-wide or global AS number defined in the `BGPConfiguration`, allowing different local ASNs to be used on a per-peer basis. If `localASNumber` is not set, Calico will fall back to the node-wide or global AS number.
+
+```bash
+kubectl patch bgppeer -p '{"spec": {"localASNumber": 64577}}'
+```
+
+### Configure a BGP filter
+
+BGP filters control which routes are imported and exported between BGP peers.
+
+The BGP filter rules (importVX, exportVX) are applied sequentially, taking the
+`action` of the first matching rule. When no rules are matched, the default
+`action` is `Accept`.
+
+In order for a BGPFilter to be used in a BGP peering, its `name`
+must be added to `filters` of the corresponding BGPPeer resource.
+
+The following example creates a BGPFilter
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: BGPFilter
+metadata:
+ name: my-filter
+spec:
+ exportV4:
+ - action: Accept
+ matchOperator: In
+ cidr: 77.0.0.0/16
+ - action: Reject
+ source: RemotePeers
+ - action: Reject
+ interface: '*.calico'
+ importV4:
+ - action: Reject
+ matchOperator: NotIn
+ cidr: 44.0.0.0/16
+ exportV6:
+ - action: Reject
+ source: RemotePeers
+ - action: Reject
+ interface: '*.calico'
+ importV6:
+ - action: Accept
+ matchOperator: Equal
+ cidr: 5000::0/64
+ - action: Reject
+```
+
+### Configure a BGP peer with a BGP filter
+
+BGP peers can use BGP filters to control which routes are imported or exported between them.
+
+The following example creates a BGPFilter and associates it with a BGPPeer
+:::note
+
+BGPFilters are applied in the order listed on a BGPPeer
+
+:::
+
+```yaml
+kind: BGPFilter
+apiVersion: projectcalico.org/v3
+metadata:
+ name: first-bgp-filter
+spec:
+ exportV4:
+ - action: Accept
+ matchOperator: In
+ cidr: 77.0.0.0/16
+ source: RemotePeers
+ importV4:
+ - action: Reject
+ matchOperator: NotIn
+ cidr: 44.0.0.0/16
+ exportV6:
+ - action: Reject
+ interface: '*.calico'
+ importV6:
+ - action: Accept
+ matchOperator: Equal
+ cidr: 5000::0/64
+---
+kind: BGPFilter
+apiVersion: projectcalico.org/v3
+metadata:
+ name: second-bgp-filter
+spec:
+ exportV4:
+ - action: Accept
+ matchOperator: In
+ cidr: 77.0.0.0/16
+ interface: '*.calico'
+ importV4:
+ - action: Reject
+ matchOperator: NotIn
+ cidr: 44.0.0.0/16
+ exportV6:
+ - action: Reject
+ source: RemotePeers
+ importV6:
+ - action: Reject
+---
+kind: BGPPeer
+apiVersion: projectcalico.org/v3
+metadata:
+ name: peer-with-filter
+spec:
+ peerSelector: has(filter-bgp)
+ filters:
+ - first-bgp-filter
+ - second-bgp-filter
+```
+
+## Additional resources
+
+- [Node resource](../../reference/resources/node.mdx)
+- [Configure BGP peering with nested clusters running on Kubevirt VMs](./bgp-to-workload.mdx)
+- [BGP configuration resource](../../reference/resources/bgpconfig.mdx)
+- [BGP peer resource](../../reference/resources/bgppeer.mdx)
+- [BGP filter resource](../../reference/resources/bgpfilter.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/custom-bgp-config.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/custom-bgp-config.mdx
new file mode 100644
index 0000000000..3f37c0275a
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/custom-bgp-config.mdx
@@ -0,0 +1,49 @@
+---
+description: Override the default BIRD BGP templates in a Calico Cloud connected cluster to access advanced BIRD features for proof-of-concept and special-case routing.
+---
+
+# Custom BGP Configuration
+
+## Big picture
+
+Use customized BIRD configuration files to enable specialized use-cases.
+
+## Concepts
+
+In $[prodname], BGP is handled by [BIRD](https://github.com/projectcalico/bird).
+The BIRD configurations are templated out through [confd](https://github.com/projectcalico/confd).
+You can modify the BIRD configuration to use BIRD features which are not typically exposed using the
+default configuration provided with $[prodname].
+
+Customization of BGP templates should be done only with the help of your Tigera Support representative.
+
+## Before you begin
+
+**Required**
+
+- Calico CNI
+
+## How to
+
+- [Update BGP configuration](#update-bgp-configuration)
+- [Apply BGP customizations](#apply-bgp-customizations) based on how you've deployed $[prodname]:
+
+### Update BGP configuration
+
+Using the directions provided with the templates, set the correct values
+for the BGP configuration using these resources:
+
+- [BGP Configuration](../../reference/resources/bgpconfig.mdx)
+- [BGP Peer](../../reference/resources/bgppeer.mdx)
+{/* //TODO-CC-XREFS - [calicoctl](/reference/clis/calicoctl/index)*/}
+
+### Apply BGP Customizations
+
+1. Create your confd templates.
+1. Create a ConfigMap from the templates.
+
+```
+kubectl create configmap bird-templates -n tigera-operator --from-file=
+```
+
+The created config map will be used to populate the $[prodname] BIRD configuration file templates. If a template with the same name already exists within the node container, it will be overwritten with the contents from the config map.
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/dual-tor.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/dual-tor.mdx
new file mode 100644
index 0000000000..b974e55a53
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/dual-tor.mdx
@@ -0,0 +1,642 @@
+---
+description: Deploy a dual ToR cluster connected to Calico Cloud so two independent connectivity planes provide redundancy between racks for on-premises clusters.
+---
+
+# Deploy a dual ToR cluster
+
+## Big picture
+
+Deploy a dual plane cluster to provide redundant connectivity between your workloads for on-premises deployments.
+
+:::note
+
+Dual ToR is not supported if you are using BGP with encapsulation (VXLAN or IP-in-IP).
+
+:::
+
+## Value
+
+A dual plane cluster provides two independent planes of connectivity between all cluster
+nodes. If a link or software component breaks somewhere in one of those planes, cluster
+nodes can still communicate over the other plane, and the cluster as a whole continues to
+operate normally.
+
+## Concepts
+
+### Dual plane connectivity, aka "dual ToR"
+
+Large on-prem Kubernetes clusters, split across multiple server racks, can use two or more
+independent planes of connectivity between all the racks. The advantages are:
+
+- The cluster can still function, even if there is a single break in connectivity
+ somewhere.
+
+- The cluster can load balance across the bandwidth of _both_ planes, when both planes
+ are available.
+
+The redundant approach can be applied within each rack as well, such that each node has
+two or more independent connections to those connectivity planes. Typically, each rack
+has two top-of-rack routers ("ToRs") and each node has two fabric-facing interfaces, each
+of which connects over a separate link or Ethernet to one of the ToRs for the rack.
+
+Here's an example of how a dual plane setup might look, with just two racks and two nodes
+in each rack. For simplicity, we've shown the connections _between_ racks as single
+links; in reality that would be more complex, but still following the overall dual plane
+paradigm.
+
+
+
+Because of the two ToRs per rack, the whole setup is often referred to as "dual ToR".
+
+### Network design for a dual ToR cluster
+
+For a dual ToR cluster to operate seamlessly when there is a break on one of the planes,
+several things are needed.
+
+- Each node should have a stable IP address that is independent of its per-interface
+ addresses and remains valid if the connectivity through _one_ of those interfaces goes
+ down.
+
+- Each node must somehow know or learn the stable IP address of every other node.
+
+- Wherever a connection (other than BGP) is to or from a _node_ (as opposed to a
+ non-host-networked pod), that connection should use the node's stable address as its
+ destination or source IP (respectively), so that the connection can continue working if
+ one of the planes has an outage.
+
+- Importantly, this includes connections that Kubernetes uses as part of its own control
+ plane, such as between the Kubernetes API server and kubelet on each node. Ideally,
+ therefore, the stable IP address setup on each node should happen *before* Kubernetes
+ starts running.
+
+- BGP is an exception to the previous points - in fact, the _only_ exception - because we
+ want each node's BGP peerings to be interface-specific and to reflect what is actually
+ reachable, moment by moment, over that interface. The Linux routing table then
+ automatically adjusts so that the route to each remote destination is either ECMP -
+ when both planes are up - or non-ECMP when it can only be reached over one of the
+ planes.
+
+- BGP peerings should be configured to detect any outages, and to propagate their
+ consequences, as quickly as possible, so that the routing can quickly respond on each
+ node. Note that this is quite different from the reasoning for a single connectivity
+ plane, where it's better to delay any network churn, on the assumption that an outage
+ will be quickly fixed.
+
+Finally, to spread load evenly and maximise use of both planes, when both available, the
+routers and Linux kernel need to be configured for efficient ECMP.
+
+### Calico's early networking architecture
+
+$[prodname]'s $[nodecontainer] image can be run in an "early networking" mode,
+on each node, to perform all of the above points that are needed before Kubernetes starts
+running. That means that it:
+
+- Provisions the stable IP address, and assigns it to the loopback interface.
+
+- Ensures the stable address will be used as the source
+ IP for any outgoing connections, by adjusting the scope of interface addresses.
+
+- Starts running BGP, peering with the node's ToRs, to advertise the node's
+ stable address to other nodes.
+
+- Configures efficient ECMP in the Linux kernel (with `fib_multipath_hash_policy=1` and
+ `fib_multipath_use_neigh=1`).
+
+More detail is given below on how to run this early networking image. A key point is that
+it must run as soon as possible after each node boot, and before Kubernetes starts on the
+node, so it is typically run as a Docker or podman container.
+
+After its start-of-day provisioning, the early networking container keeps running so that
+it can tag-team the BGP role with Calico's regular BGP service running inside the
+$[nodecontainer] _pod_:
+
+- Initially the $[nodecontainer] pod does not yet exist, so the early networking
+ BGP runs to advertise out the node's stable address.
+
+- After Kubernetes has started on the node, and Calico has been installed in Kubernetes,
+ the $[nodecontainer] pod runs and starts its own BGP service. The early
+ networking container spots that the regular BGP service is now running and so shuts
+ down its own BGP. Now the regular BGP service handles the advertisement of the stable
+ address, as well as pod IPs and so on.
+
+- Later, the $[nodecontainer] pod might be shut down, e.g. for restart or upgrade.
+ If the downtime continues for longer than the graceful restart period, the early
+ networking container spots this and restarts its own BGP, to ensure that the node's
+ stable IP address continues to be advertised to other nodes. The cycle can now repeat
+ from the "Initially" state above.
+
+ :::note
+
+ The default graceful restart period is 120s for traditional BGP GR and
+ 3600s for LLGR.
+
+ :::
+
+### BGP configuration for rapid outage detection
+
+A dual ToR cluster needs Calico BGPPeer resources to specify how each node should peer
+with its ToRs. The remaining parts of the dual ToR network design are implemented as
+properties of those BGP peerings, and as corresponding properties on the BGP configuration
+between and within the ToRs and core infrastructure.
+
+Specifically, on Calico's BGPPeer resource,
+
+- the `failureDetectionMode` field is used to enable BFD
+
+- the `restartMode` field can be used to enable long-lived graceful restart (LLGR).
+
+See below for more on the benefits of these settings. When they are used, consistent
+settings are needed on the ToRs and core infrastructure.
+
+### ECMP routing
+
+An "Equal Cost Multiple Path" (ECMP) route is one that has multiple possible ways to reach
+a given destination or prefix, all of which are considered to be equally good. A dual ToR
+setup naturally generates ECMP routes, with the different paths going over the different
+connectivity planes.
+
+When using an ECMP route, Linux decides how to balance traffic across the available paths,
+including whether this is informed by TCP and UDP port numbers as well as source and
+destination IP addresses, whether the decision is made per-packet, per-connection, or in
+some other way, and so on; and the details here have varied with Linux kernel version.
+For a clear account of the exact options and behaviors for different kernel versions,
+please see [this blog](https://web.archive.org/web/20210204031636/https://cumulusnetworks.com/blog/celebrating-ecmp-part-two/).
+
+### BFD
+
+Bidirectional Forwarding Detection (BFD) is [a protocol](https://tools.ietf.org/html/rfc5880)
+ that detects very quickly when forwarding
+along a particular path stops working - whether that's because a link has broken
+somewhere, or some software component along the path.
+
+In a dual ToR setup, rapid failure detection is important so that traffic flows within the
+cluster can quickly adjust to using the other available connectivity plane.
+
+### Long lived graceful restart
+
+Long Lived Graceful Restart (LLGR) is [an extension for BGP](https://tools.ietf.org/html/draft-uttaro-idr-bgp-persistence-05)
+ that handles link
+failure by lowering the preference of routes over that link. This is a compromise between
+the base BGP behaviour - which is immediately to remove those routes - and traditional BGP
+Graceful Restart behaviour - which is not to change those routes at all, until some
+configured time has passed.
+
+For a dual ToR setup, LLGR is helpful, as explained in more detail by [this blog](https://vincent.bernat.ch/en/blog/2018-bgp-llgr)
+, because:
+
+- If a link fails somewhere, the immediate preference lowering allows traffic to adjust
+ immediately to use the other connectivity plane.
+
+- If a node is restarted, we still get the traditional Graceful Restart behaviour whereby
+ routes to that node persist in the rest of the network.
+
+
+## Before you begin
+
+**Unsupported**
+
+- AKS
+- EKS
+- GKE
+
+**Required**
+
+- Calico CNI
+
+## How to
+
+- [Prepare YAML resources describing the layout of your cluster](#prepare-yaml-resources-describing-the-layout-of-your-cluster)
+- [Arrange for dual-homed nodes to run $[nodecontainer] on each boot](#arrange-for-dual-homed-nodes-to-run-cnx-node-on-each-boot)
+- [Configure your ToR routers and infrastructure](#configure-your-tor-routers-and-infrastructure)
+- [Install Kubernetes and $[prodname]](#install-kubernetes-and-calico-cloud)
+- [Verify the deployment](#verify-the-deployment)
+
+### Prepare YAML resources describing the layout of your cluster
+
+1. Prepare BGPPeer resources to specify how each node in your cluster should peer with
+ the ToR routers in its rack. For example, if your rack 'A' has ToRs with IPs
+ 172.31.11.100 and 172.31.12.100 and the rack AS number is 65001:
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: BGPPeer
+ metadata:
+ name: ra1
+ spec:
+ nodeSelector: "rack == 'ra' || rack == 'ra_single'"
+ peerIP: 172.31.11.100
+ asNumber: 65001
+ sourceAddress: None
+ ---
+ apiVersion: projectcalico.org/v3
+ kind: BGPPeer
+ metadata:
+ name: ra2
+ spec:
+ nodeSelector: "rack == 'ra'"
+ peerIP: 172.31.12.100
+ asNumber: 65001
+ sourceAddress: None
+ ```
+
+ :::note
+
+ The effect of the `nodeSelector` fields here is that any node with label
+ `rack: ra` will peer with both these ToRs, while any node with label `rack: ra_single` will peer with only the first ToR. For optimal dual ToR function and
+ resilience, nodes in rack 'A' should be labelled `rack: ra`, but `rack: ra_single`
+ can be used instead on any nodes which cannot be dual-homed.
+
+ :::
+
+ Repeat for as many racks as there are in your cluster. Each rack needs a new pair of
+ BGPPeer resources with its own ToR addresses and AS number, and `nodeSelector` fields
+ matching the nodes that should peer with its ToR routers.
+
+ Depending on what your ToR supports, consider also setting these fields in each
+ BGPPeer:
+
+ - `failureDetectionMode: BFDIfDirectlyConnected` to enable BFD, when possible, for
+ fast failure detection.
+
+ :::note
+
+ $[prodname] only supports BFD on directly connected peerings, but
+ in practice nodes are normally directly connected to their ToRs.
+
+ :::
+
+ - `restartMode: LongLivedGracefulRestart` to enable LLGR handling when the node needs
+ to be restarted, if your ToR routers support LLGR. If not, we recommend instead
+ `maxRestartTime: 10s`.
+
+ - `birdGatewayMode: DirectIfDirectlyConnected` to enable the "direct" next hop
+ algorithm, if that is helpful for optimal interworking with your ToR routers.
+
+ :::note
+
+ For directly connected BGP peerings, BIRD provides two gateway
+ computation modes, "direct" and "recursive".
+
+ "recursive" is the default, but "direct" can give better results when the ToR
+ also acts as the route reflector (RR) for the rack.
+ Specifically, a combined ToR/RR should ideally keep the BGP next hop intact (aka
+ "next hop keep") when reflecting routes from other nodes in the same rack, but
+ add itself as the BGP next hop (aka "next hop self") when forwarding routes from
+ outside the rack. If your ToRs can be configured to do that, fine.
+ If they cannot, an effective workaround is to configure the ToRs to do "next hop
+ keep" for all routes, with "gateway direct" on the $[prodname] nodes. In
+ effect the “gateway direct” applies a “next hop self” when needed, but otherwise
+ not.
+
+ :::
+
+1. Prepare this BGPConfiguration resource to [disable the full node-to-node mesh](bgp.mdx#disable-the-default-bgp-node-to-node-mesh):
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: BGPConfiguration
+ metadata:
+ name: default
+ spec:
+ nodeToNodeMeshEnabled: false
+ ```
+
+1. Prepare disabled IPPool resources for the CIDRs from which you will allocate stable
+ addresses for dual-homed nodes. For example, if the nodes in rack 'A' will have
+ stable addresses from 172.31.10.0/24:
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: IPPool
+ metadata:
+ name: ra-stable
+ spec:
+ cidr: 172.31.10.0/24
+ disabled: true
+ nodeSelector: all()
+ ```
+
+ If the next rack uses a different CIDR, define a similar IPPool for that rack, and so
+ on.
+
+ :::note
+
+ These IPPool definitions tell $[prodname]'s BGP component to export
+ routes within the given CIDRs, which is essential for the core BGP infrastructure to
+ learn how to route to each stable address. `disabled: true` tells $[prodname]
+ _not_ to use these CIDRs for pod IPs.
+
+ :::
+
+1. Prepare an enabled IPPool resource for your default CIDR for pod IPs. For example:
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: IPPool
+ metadata:
+ name: default-ipv4
+ spec:
+ cidr: 10.244.0.0/16
+ nodeSelector: all()
+ ```
+
+ :::note
+
+ The CIDR must match what you specify elsewhere in the Kubernetes
+ installation. For example, `networking.clusterNetwork.cidr` in OpenShift's install
+ config, or `--pod-network-cidr` with kubeadm. You should not specify `ipipMode` or
+ `vxlanMode`, as these are incompatible with dual ToR operation. `natOutgoing` can
+ be omitted, as here, if your core infrastructure will perform an SNAT for traffic
+ from pods to the Internet.
+
+ :::
+
+1. Prepare an EarlyNetworkConfiguration resource to specify the additional information
+ that is needed for each node in a multi-rack dual ToR cluster:
+
+ - The stable address for the node.
+ - Its BGP AS number.
+ - The IPs that the node should peer with, when $[nodecontainer] runs
+ as a container for early networking setup after each node boot.
+ - Any labels that the node should have, so as to match the right BGPPeer definitions
+ for its rack, when $[nodecontainer] runs as a Kubernetes pod.
+
+
+ With OpenShift, also add a toplevel `platform: openshift` setting.
+
+ :::note
+
+ `platform: openshift` triggers additional per-node setup that is needed
+ during OpenShift's bootstrapping phase.
+
+ :::
+
+ For example, with IP addresses and AS numbers similar as for other resources above:
+
+ ```yaml noValidation
+ apiVersion: projectcalico.org/v3
+ kind: EarlyNetworkConfiguration
+ spec:
+ platform: openshift
+ nodes:
+ # worker1
+ - interfaceAddresses:
+ - 172.31.11.3
+ - 172.31.12.3
+ stableAddress:
+ address: 172.31.10.3
+ asNumber: 65001
+ peerings:
+ - peerIP: 172.31.11.100
+ - peerIP: 172.31.12.100
+ labels:
+ rack: ra
+ # worker2
+ - interfaceAddresses:
+ - 172.31.21.4
+ - 172.31.22.4
+ stableAddress:
+ address: 172.31.20.4
+ asNumber: 65002
+ peerings:
+ - peerIP: 172.31.21.100
+ - peerIP: 172.31.22.100
+ labels:
+ rack: rb
+ ...
+ ```
+
+1. Prepare a ConfigMap resource named "bgp-layout", in namespace "tigera-operator", that
+ wraps the EarlyNetworkConfiguration like this:
+
+ ```yaml noValidation
+ apiVersion: v1
+ kind: ConfigMap
+ metadata:
+ name: bgp-layout
+ namespace: tigera-operator
+ data:
+ earlyNetworkConfiguration: |
+ apiVersion: projectcalico.org/v3
+ kind: EarlyNetworkConfiguration
+ spec:
+ nodes:
+ # worker1
+ - interfaceAddresses:
+ ...
+ ```
+
+:::note
+
+EarlyNetworkConfiguration supplies labels and AS numbers to apply to each
+Calico node, as well as peering and other network configuration to use during node
+startup prior to receiving BGPPeer and BGPConfiguration resources from the datastore.
+EarlyNetworkConfiguration will be superseded by any BGPPeer or BGPConfiguration
+resources after successful startup.
+
+:::
+
+### Arrange for dual-homed nodes to run $[nodecontainer] on each boot
+
+$[prodname]'s $[nodecontainer] image normally runs as a Kubernetes pod, but
+for dual ToR setup it must also run as a container after each boot of a dual-homed node.
+For example:
+
+```
+podman run --privileged --net=host \
+ -v /calico-early:/calico-early -e CALICO_EARLY_NETWORKING=/calico-early/cfg.yaml \
+ $[registry]$[imageNames.node]:latest
+```
+
+The environment variable `CALICO_EARLY_NETWORKING` must point to the
+EarlyNetworkConfiguration prepared above, so that EarlyNetworkConfiguration YAML must be
+copied into a file on the node (here, `/calico-early/cfg.yaml`) and mapped into the
+$[nodecontainer] container.
+
+We recommend defining systemd services to ensure that early networking runs on each boot,
+and before kubelet starts on the node. Following is an example that may need tweaking for
+your particular platform, but that illustrates the important points.
+
+Firstly, a "calico-early" service that runs the Calico early networking on each boot:
+
+```
+[Unit]
+Wants=network-online.target
+After=network-online.target
+After=nodeip-configuration.service
+[Service]
+ExecStartPre=/bin/sh -c "rm -f /etc/systemd/system/kubelet.service.d/20-nodenet.conf /etc/systemd/system/crio.service.d/20-nodenet.conf; systemctl daemon-reload"
+ExecStartPre=-/bin/podman rm -f calico-early
+ExecStartPre=/bin/mkdir -p /etc/calico-early
+ExecStartPre=/bin/sh -c "test -f /etc/calico-early/details.yaml || /bin/curl -o /etc/calico-early/details.yaml http://172.31.1.1:8080/calico-early/details.yaml"
+ExecStart=/bin/podman run --rm --privileged --net=host --name=calico-early -v /etc/calico-early:/etc/calico-early -e CALICO_EARLY_NETWORKING=/etc/calico-early/details.yaml $[registry]$[imageNames.node]:latest
+[Install]
+WantedBy=multi-user.target
+```
+
+:::note
+
+- You must also install your Tigera-issued pull secret at `/root/.docker/config.json`,
+ on each node, to enable pulling from $[registry].
+- Some OpenShift versions have a `nodeip-configuration` service that configures
+ kubelet's `--node-ip` option **wrongly** for a dual ToR setup. The
+ `After=nodeip-configuration.service` setting and the deletion of `20-nodenet.conf`
+ undo that service's work so that kubelet can choose its own IP correctly (using a
+ reverse DNS lookup).
+- The `/bin/curl ...` line shows how you can download the EarlyNetworkConfiguration
+ YAML from a central hosting point within your cluster.
+
+:::
+
+Secondly, a "calico-early-wait" service that delays kubelet until after the Calico early
+networking setup is in place:
+
+```
+[Unit]
+After=calico-early.service
+Before=kubelet.service
+[Service]
+Type=oneshot
+ExecStart=/bin/sh -c "while sleep 5; do grep -q 00000000:1FF3 /proc/net/tcp && break; done; sleep 15"
+[Install]
+WantedBy=multi-user.target
+```
+
+:::note
+
+- The `ExecStart` line here arranges that kubelet will not start running until the
+ calico-early service has started listening on port 8179 (hex `1FF3`). 8179 is the
+ port that the calico-early service uses for pre-Kubernetes BGP.
+- We have sometimes observed issues if kubelet starts immediately after Calico's early
+ networking setup, because of NetworkManager toggling the hostname. The final `sleep 15` allows for such changes to settle down before kubelet starts.
+
+:::
+
+On OpenShift you should wrap the above service definitions in `MachineConfig` resources
+for the control and worker nodes.
+
+On other platforms either define and enable the above services directly, or use
+whatever API the platform provides to define and enable services on new nodes.
+
+### Configure your ToR routers and infrastructure
+
+You should configure your ToR routers to accept all the BGP peerings from
+$[prodname] nodes, to reflect routes between the nodes in that rack, and to
+propagate routes between the ToR routers in different racks. In addition we recommend
+consideration of the following points.
+
+BFD should be enabled if possible on all BGP sessions - both to the $[prodname]
+nodes, and between racks in your core infrastructure - so that a break in connectivity
+anywhere can be rapidly detected. The handling should be to initiate LLGR procedures if
+possible, or else terminate the BGP session non-gracefully.
+
+LLGR should be enabled if possible on all BGP sessions - again, both to the
+$[prodname] nodes, and between racks in your core infrastructure. Traditional BGP
+graceful restart should not be used, because this will delay the cluster's response to a
+break in one of the connectivity planes.
+
+### Install Kubernetes and $[prodname]
+
+Details here vary, depending on **when** your Kubernetes installer gives an opportunity
+for you to define custom resources, but fundamentally what is needed here is to perform
+the installation as usual, except that all of the Calico resources prepared above, except
+the EarlyNetworkConfiguration, must be added into the datastore **before** the
+$[nodecontainer] pods start running on any node. We can illustrate this by looking
+at two examples: with OpenShift, and when adding Calico to an existing Kubernetes cluster.
+
+**OpenShift**
+
+With OpenShift, follow our documentation as
+far as the option to provide additional configuration.
+{/*TODO-XREFS-CC */}
+Then use `kubectl create configmap ...`, as that documentation says, to combine the
+prepared BGPPeer, BGPConfiguration and IPPool resources into a `calico-resources`
+ConfigMap. Place the generated file in the manifests directory for the OpenShift install.
+
+Also place the "bgp-layout" ConfigMap file in the manifests directory.
+
+Now continue with the OpenShift install process, and it will take care of adding those
+resources into the datastore as early as possible.
+
+**Adding to an existing Kubernetes cluster**
+
+Follow our documentation
+{/*TODO-XREFS-CC */}
+as
+far as the option for installing any custom Calico resources. Then use `calicoctl`, as
+that documentation says, to install the prepared BGPPeer, BGPConfiguration and IPPool
+resources.
+
+Also use `kubectl` to install the "bgp-layout" ConfigMap.
+
+Now continue with the $[prodname] install process, and you should observe each node
+establishing BGP sessions with its ToRs.
+
+### Verify the deployment
+
+If you examine traffic and connections within the cluster - for example, using `ss` or
+`tcpdump` - you should see that all connections use loopback IP addresses or pod CIDR IPs
+as their source and destination. For example:
+
+- The kubelet on each node connecting to the API server.
+
+- The API server's connection to its backing etcd database, and peer connections between
+ the etcd cluster members.
+
+- Pod connections that involve an SNAT or MASQUERADE in the data path, as can be the case
+ when connecting to a Service through a cluster IP or NodePort. At the point of the
+ SNAT or MASQUERADE, a loopback IP address should be used.
+
+- Direct connections between pod IPs on different nodes.
+
+The only connections using interface-specific addresses should be BGP.
+
+:::note
+
+If you plan to use [Egress Gateways](../egress/egress-gateway-on-prem.mdx) in your cluster, you must also adjust the $[nodecontainer] IP
+auto-detection method to pick up the stable IP, for example using the `interface: lo` setting
+(The default first-found setting skips over the lo interface). This can be configured via the
+$[prodname] [Installation resource](../../reference/installation/api.mdx#nodeaddressautodetection).
+
+:::
+
+If you look at the Linux routing table on any cluster node, you should see ECMP routes
+like this to the loopback address of every other node in other racks:
+
+```
+172.31.20.4/32
+ nexthop via 172.31.11.250 dev eth0
+ nexthop via 172.31.12.250 dev eth1
+```
+
+and like this to the loopback address of every other node in the same rack:
+
+```
+172.31.10.4/32
+ nexthop dev eth0
+ nexthop dev eth1
+```
+
+If you launch some pods in the cluster, you should see ECMP routes for the /26 IP blocks
+for the nodes where those pods were scheduled, like this:
+
+```
+10.244.192.128/26
+ nexthop via 172.31.11.250 dev eth0
+ nexthop via 172.31.12.250 dev eth1
+```
+
+If you do something to break the connectivity between racks of one of the planes, you
+should see, within only a few seconds, that the affected routes change to have a single
+path only, via the plane that is still unbroken; for example:
+
+```
+172.31.20.4/32 via 172.31.12.250 dev eth1`
+10.244.192.128/26 via 172.31.12.250 dev eth1
+```
+
+When the connectivity break is repaired, those routes should change to become ECMP again.
+
+## Additional resources
+
+ - [L3 fabric designs](../../reference/architecture/design/l3-interconnect-fabric.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/index.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/index.mdx
new file mode 100644
index 0000000000..c33e2bd4b8
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Networking configuration tasks for Calico Cloud connected clusters — BGP, overlay encapsulation, MTU, multiple pod networks, dual ToR, IPVS, NAT, and QoS controls.
+hide_table_of_contents: true
+---
+
+# Configure Calico Cloud networking
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/local-subnet-l2-reachability.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/local-subnet-l2-reachability.mdx
new file mode 100644
index 0000000000..083df0ac72
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/local-subnet-l2-reachability.mdx
@@ -0,0 +1,178 @@
+---
+description: Make pods and LoadBalancer service VIPs that share the host subnet reachable from the local L2 network without BGP, using Calico Cloud's userspace ARP/NDP responder.
+---
+
+# L2 reachability for pods and services without BGP
+
+## Big picture
+
+Make pods and LoadBalancer service IPs reachable from the local layer 2 (L2) network without configuring BGP, by having $[prodname] answer ARP and NDP requests for those IPs directly.
+
+## Value
+
+When a pod or LoadBalancer VIP is assigned an IP from the same subnet as a node's physical interface, external hosts on that L2 segment try to reach it with ARP (IPv4) or Neighbor Solicitation (IPv6). By default nobody answers: the pod IP lives in a network namespace behind a veth, and a LoadBalancer VIP does not exist on any interface.
+
+Traditionally the only way to make these IPs reachable is to [advertise them over BGP](advertise-service-ips.mdx), which requires peering with your network infrastructure. In flat L2 environments — on-prem environment, edge deployments, `kind` clusters, or networks where you cannot configure the upstream router — BGP may not be an option.
+
+With `localSubnetL2Reachability` enabled, $[prodname] runs a userspace ARP/NDP responder on the relevant host interfaces and answers for local pod IPs and selected LoadBalancer VIPs that fall within the host subnet. No BGP, no overlay encapsulation, and no changes to your network infrastructure.
+
+## Concepts
+
+### Userspace ARP/NDP responder
+
+$[prodname] opens a raw socket on each host physical interface that has at least one pod IP or LoadBalancer VIP within its subnet, and replies to ARP/NDP requests for those IPs. The reply carries the node's MAC address, so the external host sends the workload's traffic to that node. From there $[prodname]'s normal data plane forwards it the rest of the way — directly to a local pod for a pod IP, or load-balanced to a service backend for a LoadBalancer VIP. The responder only answers ARP/NDP; it does not change how traffic is forwarded once it reaches the node.
+
+### One node answers per LoadBalancer VIP
+
+For a LoadBalancer VIP, exactly one node answers ARP. $[prodname] elects that node consistently across the cluster using a consistent-hash ring, so every node independently agrees on the owner without coordination. If the owning node's `Node` object is deleted, the VIP is reassigned to another node, which proactively updates external caches with a gratuitous ARP / unsolicited Neighbor Advertisement.
+
+### Only no-encapsulation IP pools are eligible
+
+$[prodname] answers only for IPs that belong to an IP pool with no encapsulation (`ipipMode` and `vxlanMode` both `Never`). Encapsulated pools are treated as private pod networks and are never advertised on the host L2 segment.
+
+## Before you begin...
+
+**Limitations**
+
+- **One node per LoadBalancer VIP.** There is no active-active high availability. If the owning node goes down, the VIP is unreachable until its `Node` object is removed and a new owner is elected.
+- **Cloud provider ARP filtering.** Some cloud networks (for example, AWS VPC) filter ARP at the hypervisor. The responder will not work unless the VIP/pod IPs are assigned to the node's cloud interface. This is an infrastructure constraint outside $[prodname]'s control.
+- **Heterogeneous subnets.** Node selection for LoadBalancer VIPs hashes over all nodes without checking whether a node has an interface on the VIP's subnet. This is only a concern when nodes do not share the same subnets.
+- **Multiple host interfaces on the same L2 segment.** $[prodname] answers on *every* host interface whose subnet contains a proxied IP. If a node has two or more interfaces on the **same** L2 segment (the same broadcast domain) and a proxied IP falls in that shared subnet, each of those interfaces replies to ARP/NDP for the IP with its own MAC address, so external hosts see the IP resolve to several MACs and their neighbor caches flip between them.
+- **Only `externalTrafficPolicy: Cluster` is supported for LoadBalancer services.** $[prodname] elects the node that answers for a VIP with a consistent hash over all nodes, independent of where the service's backends run. Under `externalTrafficPolicy: Local` the elected node may have no local backend, so traffic that reaches it is dropped. Leave `externalTrafficPolicy` at its default of `Cluster`.
+- **kube-proxy in IPVS mode requires `strictARP`.** In IPVS mode, kube-proxy binds every LoadBalancer VIP to the `kube-ipvs0` dummy interface on *all* nodes. Because the Linux kernel answers ARP for any IP configured on the host by default, every node replies for the VIP — not just the one $[prodname] elected — so external hosts receive conflicting replies from several MAC addresses. Either run kube-proxy in `iptables` or `nftables` mode, or keep IPVS mode and set `strictARP: true` in kube-proxy's configuration (the `ipvs.strictARP` field of the `KubeProxyConfiguration`, which is stored as YAML inside the `kube-proxy` `ConfigMap`) so the kernel stops answering ARP for the dummy-interface VIPs and leaves it to $[prodname]'s responder.
+
+:::note
+
+The ARP/NDP responder runs inside Felix (`calico-node`). While a node's Felix is restarting it briefly does not answer ARP or NDP. Established connections keep working because the upstream router and switches still have the node's MAC cached for those IPs, but **a new connection to an IP that is not already cached upstream may fail until Felix finishes starting** and rebuilds its responder state (typically under a minute).
+
+To reduce the impact, increase the ARP/neighbor cache timeout (aging time) on your upstream router and switches so cached entries survive a Felix restart.
+
+:::
+
+## How to
+
+- [Enable local subnet L2 reachability](#enable-local-subnet-l2-reachability)
+- [Create a dedicated IP pool in the host subnet](#create-a-dedicated-ip-pool-in-the-host-subnet)
+- [Steer pods or services into the pool](#steer-pods-or-services-into-the-pool)
+- [Verify reachability](#verify-reachability)
+
+### Enable local subnet L2 reachability
+
+Set `localSubnetL2Reachability` to `PodsAndLoadBalancers` on the default `FelixConfiguration`:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' \
+ -p '{"spec": {"localSubnetL2Reachability": "PodsAndLoadBalancers"}}'
+```
+
+The feature is `Disabled` by default. This setting is read when the data plane starts, so changing it makes Felix (`calico-node`) **restart automatically** to pick up the new value — no manual restart is required. The feature takes effect once Felix finishes restarting. For the full field reference, see [Felix configuration resource](../../reference/resources/felixconfig.mdx).
+
+:::note
+
+Enabling the feature alone does nothing. $[prodname] only answers for IPs in a no-encapsulation IP pool that overlaps a host subnet, so you must also create that pool.
+
+:::
+
+**Optional: tune periodic re-announcement.** While the feature is enabled, Felix periodically re-announces every IP it proxies with a gratuitous ARP / unsolicited Neighbor Advertisement, keeping upstream neighbor caches and switch forwarding tables warm even when the set of proxied IPs has not changed. `localSubnetL2ReachabilityRefreshInterval` controls how often this happens (default `120s`). Lower it if your upstream devices age out ARP/NDP entries quickly, or set it to `0` to disable periodic re-announcement and keep only the one-shot announcement sent when an IP is first proxied:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' \
+ -p '{"spec": {"localSubnetL2ReachabilityRefreshInterval": "30s"}}'
+```
+
+### Create a dedicated IP pool in the host subnet
+
+Create an IP pool whose CIDR lies inside your host interface's subnet, with no encapsulation.
+
+:::caution
+
+Reserve a sub-range of the host subnet for this pool that does **not** overlap DHCP scopes, static host assignments, or infrastructure addresses (routers, switches, management interfaces). For example, for a host subnet of `10.0.0.0/23`, use `10.0.0.2–10.0.0.255` for hosts and a separate `10.0.1.0/24` for the pool.
+
+:::
+
+**For pods:**
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: host-subnet-pod-pool
+spec:
+ cidr: 10.0.1.0/24
+ ipipMode: Never
+ vxlanMode: Never
+ natOutgoing: false
+ disabled: false
+ assignmentMode: Manual
+```
+
+`assignmentMode: Manual` keeps the pool opt-in: $[prodname] never assigns from it automatically, so only the workloads you explicitly steer into it get host-subnet IPs. Without this, $[prodname] could allocate IPs from the pool to arbitrary pods.
+
+**For LoadBalancer services**, add `allowedUses: [LoadBalancer]`:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: host-subnet-lb-pool
+spec:
+ cidr: 10.0.2.0/24
+ ipipMode: Never
+ vxlanMode: Never
+ natOutgoing: false
+ disabled: false
+ assignmentMode: Manual
+ allowedUses:
+ - LoadBalancer
+```
+
+With `assignmentMode: Manual`, ordinary LoadBalancer services keep drawing VIPs from your existing automatic pools — you do not need to change the LoadBalancer kube-controller's `assignIPs` mode. Only services you annotate take a VIP from this host-subnet pool.
+
+Your cluster's default workload pool is unchanged, and workloads allocated from it behave exactly as before. For more on LoadBalancer IP pools, see [Configure LoadBalancer IP address management](../ipam/service-loadbalancer.mdx).
+
+### Steer pods or services into the pool
+
+Pods and services do not use the new pool automatically — direct the specific workloads you want reachable on the host L2 segment into it.
+
+**Pods:** annotate the pod or its namespace with the pool name:
+
+```yaml
+cni.projectcalico.org/ipv4pools: '["host-subnet-pod-pool"]'
+```
+
+**LoadBalancer services:** annotate the `Service` with the pool name:
+
+```yaml
+projectcalico.org/ipv4pools: '["host-subnet-lb-pool"]'
+```
+
+For IPv6, use `projectcalico.org/ipv6pools`. Services without this annotation continue to get VIPs from your automatic LoadBalancer pools as before. See [Configure LoadBalancer IP address management](../ipam/service-loadbalancer.mdx) for more options.
+
+### Verify reachability
+
+On the node, confirm ARP requests arrive and replies leave with the node's MAC:
+
+```bash
+tcpdump -i arp
+```
+
+For IPv6 NDP solicitations and advertisements:
+
+```bash
+tcpdump -i 'icmp6 and (icmp6.type == 135 or icmp6.type == 136)'
+```
+
+From an external host on the same L2 segment, confirm end-to-end resolution:
+
+```bash
+arping -I
+```
+
+If there is no reply, check that the IP falls within both a host interface subnet and a no-encapsulation IP pool, that the feature is enabled, and that your network does not filter ARP (see Limitations).
+
+## Additional resources
+
+- [Advertise Kubernetes service IP addresses (over BGP)](advertise-service-ips.mdx)
+- [Configure LoadBalancer IP address management](../ipam/service-loadbalancer.mdx)
+- [Felix configuration resource](../../reference/resources/felixconfig.mdx)
+- [IP pool resource](../../reference/resources/ippool.mdx)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/mark-lb-node-for-maintenance.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/mark-lb-node-for-maintenance.mdx
new file mode 100644
index 0000000000..f8a2256055
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/mark-lb-node-for-maintenance.mdx
@@ -0,0 +1,61 @@
+---
+description: Mark a node in a Calico Cloud connected cluster for load balancer maintenance with an annotation so the eBPF data plane stops sending new service traffic to its pods.
+---
+
+# Mark a load balancer node for maintenance
+
+This guide shows you how to mark a node as being under maintenance.
+
+When a node is marked for maintenance, $[prodname] will avoid load balancing new service traffic
+to pods on that node until the annotation is removed. Existing connections will continue to work
+until they are finished.
+
+
+## Limitations
+
+The following limitations apply to load balancer maintenance features:
+
+ - Load balancer node maintenance features are only supported by the eBPF data plane.
+
+ - Upstream routers might still send traffic to marked nodes, if routing is not configured to exclude
+ the marked nodes. In this case, the node under maintenance will load balance traffic to a backend
+ on another node. [Maglev Load Balancing](add-maglev-load-balancing.mdx) can be used to mitigate the negative effects of upstream routing
+ adjustments.
+
+
+## Prerequisites
+
+* Your cluster uses the [eBPF data plane](../../operations/ebpf/enabling-ebpf.mdx).
+
+
+## Exclude backends on a node from load balancer backend selection
+
+To exclude a node's backends from load balancer backend selection, annotate the Kubernetes node
+resource with the following annotation:
+
+```yaml
+lb.projectcalico.org/maintenance: "exclude-local-backends"
+```
+
+or from the terminal:
+
+```sh
+kubectl annotate node 'lb.projectcalico.org/maintenance=exclude-local-backends'
+```
+
+To add the backends back into the selection pool, either remove the annotation, or set the value to "none".
+
+
+## Additional notes
+
+### Failsafes
+
+It is not possible to remove all backends of a service from backend selection via the maintenance annotation.
+In the event that the maintenance annotation would lead to an empty set of backends for a given service, no
+backends will be excluded at all for that service.
+
+
+## Additional resources
+* [Enable the eBPF data plane](../../operations/ebpf/enabling-ebpf.mdx)
+* [Maglev Load Balancing](add-maglev-load-balancing.mdx)
+* [Prometheus Metrics](../../reference/component-resources/node/felix/prometheus.mdx#load-balancer-metrics)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/mtu.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/mtu.mdx
new file mode 100644
index 0000000000..7d5303e3da
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/mtu.mdx
@@ -0,0 +1,119 @@
+---
+description: Tune the Calico Cloud MTU on the Installation resource so pod traffic matches the underlay, accounting for VXLAN, IP-in-IP, and WireGuard overhead.
+---
+
+# Configure MTU to maximize network performance
+
+## Big picture
+
+Configure the maximum transmission unit (MTU) for your $[prodname] environment.
+
+## Value
+
+Optimize network performance for workloads by configuring the MTU in $[prodname] to best suit your underlying network.
+
+Increasing the MTU can improve performance, and decreasing the MTU can resolve packet loss and fragmentation problems when it is too high.
+
+## Concepts
+
+### MTU and $[prodname] defaults
+
+The maximum transmission unit (MTU) setting determines the largest packet size that can be transmitted through your network. MTU is configured on the veth attached to each workload, and tunnel devices (if you enable IP in IP, VXLAN, or WireGuard).
+
+In general, maximum performance is achieved by using the highest MTU value that does not cause fragmentation or dropped packets on the path. Maximum bandwidth increases and CPU consumption may drop for a given traffic rate. The improvement is often more significant when pod to pod traffic is being encapsulated (IP in IP, VXLAN, or WireGuard), and splitting and combining such traffic cannot be offloaded to your NICs.
+
+By default, $[prodname] will auto-detect the correct MTU for your cluster based on node configuration and enabled networking modes. This guide explains how you can override auto-detection
+of MTU by providing an explicit value if needed.
+
+To ensure auto-detection of MTU works correctly, make sure that the correct encapsulation modes are set in your [felix configuration](../../reference/resources/felixconfig.mdx). Disable any unused encapsulations (`vxlanEnabled`, `ipipEnabled`, `wireguardEnabled` and `wireguardEnabledV6`) in your felix configuration to ensure that auto-detection can pick the optimal MTU for your cluster.
+
+## Before you begin...
+
+**Required**
+
+- Calico CNI
+
+For help on using IP in IP and/or VXLAN overlays, see [Configure overlay networking](vxlan-ipip.mdx).
+
+For help on using WireGuard encryption, see [Configure WireGuard encryption](../../compliance/encrypt-cluster-pod-traffic.mdx).
+
+## How to
+
+- [Determine MTU size](#determine-mtu-size)
+- [Configure MTU](#configure-mtu)
+- [View current tunnel MTU values](#view-current-tunnel-mtu-values)
+
+### Determine MTU size
+
+The following table lists common MTU sizes for $[prodname] environments. Because MTU is a global property of the network path between endpoints, you should set the MTU to the minimum MTU of any path that packets may take.
+
+**Common MTU sizes**
+
+| Network MTU | $[prodname] MTU | $[prodname] MTU with IP-in-IP (IPv4) | $[prodname] MTU with VXLAN (IPv4) | $[prodname] MTU with VXLAN (IPv6) | $[prodname] MTU with WireGuard (IPv4) | $[prodname] MTU with WireGuard (IPv6) |
+| ---------------------- | --------------------- | ------------------------------------------ | --------------------------------------- | ------------------------------------------- | ---- | ---- |
+| 1500 | 1500 | 1480 | 1450 | 1430 | 1440 | 1420 |
+| 9000 | 9000 | 8980 | 8950 | 8930 | 8940 | 8920 |
+| 1500 (AKS) | 1500 | 1480 | 1450 | 1430 | 1340 | 1320 |
+| 1460 (GCE) | 1460 | 1440 | 1410 | 1390 | 1400 | 1380 |
+| 9001 (AWS Jumbo) | 9001 | 8981 | 8951 | 8931 | 8941 | 8921 |
+| 1450 (OpenStack VXLAN) | 1450 | 1430 | 1400 | 1380 | 1390 | 1370 |
+
+**Recommended MTU for overlay networking**
+
+The extra overlay header used in IP in IP, VXLAN and WireGuard protocols, reduces the minimum MTU by the size of the header. (IP in IP uses a 20-byte header, IPv4 VXLAN uses a 50-byte header, IPv6 VXLAN uses a 70-byte header, IPv4 WireGuard uses a 60-byte header and IPv6 WireGuard uses an 80-byte header).
+
+When using AKS, the underlying network has an [MTU of 1400](https://docs.microsoft.com/en-us/azure/virtual-network/virtual-network-tcpip-performance-tuning#azure-and-vm-mtu), even though the network interface will have an MTU of 1500.
+WireGuard sets the Don't Fragment (DF) bit on its packets, and so the MTU for WireGuard on AKS needs to be set to 60 bytes below (or 80 bytes for IPv6) the 1400 MTU of the underlying network to avoid dropped packets.
+
+If you have a mix of WireGuard and either IP in IP or VXLAN in your cluster, you should configure the MTU to be the smallest of the values of each encap type. The reason for this is that only WireGuard encapsulation will be used between any nodes where both have WireGuard enabled, and IP in IP or VXLAN will then be used between any nodes where both do not have WireGuard enabled. This could be the case if, for example, you are in the process of installing WireGuard on your nodes.
+
+Therefore, we recommend the following:
+
+- If you use IPv4 WireGuard encryption anywhere in your pod network, configure MTU size as “physical network MTU size minus 60”.
+- If you use IPv6 WireGuard encryption anywhere in your pod network, configure MTU size as “physical network MTU size minus 80”.
+- If you don't use WireGuard, but use IPv4 VXLAN anywhere in your pod network, configure MTU size as “physical network MTU size minus 50”.
+- If you don't use WireGuard, but use IPv6 VXLAN anywhere in your pod network, configure MTU size as “physical network MTU size minus 70”.
+- If you don't use WireGuard, but use only IP in IP, configure MTU size as “physical network MTU size minus 20”
+- Set the workload endpoint MTU and the tunnel MTUs to the same value (so all paths have the same MTU)
+
+**eBPF mode**
+
+Implementation of NodePorts uses VXLAN tunnel to hand off packets from one node to another, therefore VXLAN MTU setting
+is used to set the MTUs of workloads (veths) and should be “physical network MTU size minus 50” (see above).
+
+**MTU for flannel networking**
+
+When using flannel for networking, the MTU for network interfaces should match the MTU of the flannel interface.
+
+- If using flannel with VXLAN, use the “$[prodname] MTU with VXLAN” column in the table above for common sizes.
+
+### Configure MTU
+
+:::note
+
+The updated MTU used by $[prodname] only applies to new workloads.
+
+:::
+
+For Operator installations, edit the $[prodname] operator `Installation` resource to set the `mtu`
+field in the `calicoNetwork` section of the `spec`. For example:
+
+```bash
+kubectl patch installation.operator.tigera.io default --type merge -p '{"spec":{"calicoNetwork":{"mtu":1440}}}'
+```
+
+Similarly, for OpenShift:
+
+```bash
+oc patch installation.operator.tigera.io default --type merge -p '{"spec":{"calicoNetwork":{"mtu":1440}}}'
+```
+
+### View current tunnel MTU values
+
+To view the current tunnel size, use the following command:
+
+`ip link show`
+
+The IP in IP tunnel appears as tunlx (for example, tunl0), along with the MTU size. For example:
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/multiple-networks.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/multiple-networks.mdx
new file mode 100644
index 0000000000..94b28a08bd
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/multiple-networks.mdx
@@ -0,0 +1,249 @@
+---
+description: Add extra Calico Cloud networks to each pod in a connected cluster with the Multus-CNI plugin, then control access with tiered network policy on every interface.
+---
+
+# Configure multiple Calico Cloud networks on a pod
+
+## Big picture
+
+Configure a Kubernetes cluster with multiple $[prodname] networks on each pod, and enforce security using $[prodname] tiered network policy.
+
+## Value
+
+By default, you can configure only one CNI (network and pod interface) in a cluster. But many deployments require multiple networks (for example, one that is faster or more secure) for sending different types of data. $[prodname] supports configuring additional $[prodname] networks and interfaces in your pods using the Multus-CNI plugin. You can then use $[prodname] tiered policy and other features to enforce security on all of your workload traffic.
+
+## Concepts
+
+### About the Multus-CNI plugin
+
+$[prodname] uses the [Multus-CNI plugin](https://github.com/intel/multus-cni/) to create multiple $[prodname] networks and multiple pod interfaces to access these networks. This extends the default network and pod interface that comes with the Calico CNI.
+
+You install Multus on a cluster, then simply enable Multus in the $[prodname] Installation resource. Using the Multus **NetworkAttachmentDefinition**, you define the new networks and reference them as an annotation in the pod resource.
+
+### Labels, workload endpoints, and policy
+
+When you set the `MultiInterfaceMode` field to `Multus` in the Installation resource, the following network and network interface labels are automatically added to new workload endpoints.
+
+- `projectcalico.org/network`
+- `projectcalico.org/network-namespace`
+- `projectcalico.org/network-interface`
+
+You can then create $[prodname] policies using these label selectors to target specific networks or network interfaces.
+
+### Limitations
+
+**Maximum additional networks per pod**
+
+You can define a maximum of nine additional $[prodname] networks on a pod. If you add a network that exceeds the limit for the pod, networking is not configured and the pod fails to start with an associated error.
+
+**$[prodname] features**
+
+Although the following $[prodname] features are supported for your default $[prodname] network, they are not supported at this time for additional networks/network interfaces using Multus:
+
+- Floating IPs
+- Specific IPs
+- Specifying IP pools on a per-namespace or per-pod basis
+- Egress gateways
+
+## Before you begin...
+
+**Required**
+
+- Calico CNI
+
+ :::note
+
+ Verify that you are using the $[prodname] CNI. The CNI plugin used by Kubernetes for AKS, EKS, and GKE may be different, which means this feature will not work.
+
+ :::
+
+- [Install Multus 3.0+ on your Kubernetes cluster](https://github.com/intel/multus-cni/)
+ :::note
+
+ Multus is installed on OpenShift 4.0+ clusters.
+
+ :::
+
+{/*//TODO-CC-XREFS- [Install and configure calicoctl](/operations/clis/calicoctl/index) or configure access to [the Calico Enterprise web console](/operations/cnx//access-the-manager/)*/}
+
+## How to
+
+1. [Configure cluster for multiple networks](#configure-cluster-for-multiple-networks)
+1. [Create a new network](#create-a-new-network)
+1. [Create a pod interface for the new network](#create-a-pod-interface-for-the-new-network)
+1. [Configure the IP pool for the network](#configure-the-ip-pool-for-the-network)
+1. [Enforce policy on the new network and pod interface](#enforce-policy-on-the-new-network-and-pod-interface)
+1. [View workload endpoints](#view-workload-endpoints)
+
+### Configure cluster for multiple networks
+
+In the [Installation custom resource](../../reference/installation/api.mdx#caliconetworkspec), set the `MultiInterfaceMode` to **Multus**.
+
+### Create a new network
+
+Create a new network using the Multus **NetworkAttachmentDefinition**, and set the following required field to `"type":"calico"`.
+
+```yaml
+apiVersion: 'k8s.cni.cncf.io/v1'
+kind: NetworkAttachmentDefinition
+metadata:
+ name: additional-calico-network
+spec:
+ config: '{
+ "cniVersion": "0.3.1",
+ "type": "calico",
+ "log_level": "info",
+ "datastore_type": "kubernetes",
+ "mtu": 1410,
+ "nodename_file_optional": false,
+ "ipam": {
+ "type": "calico-ipam",
+ "assign_ipv4" : "true",
+ "assign_ipv6" : "false"
+ },
+ "policy": {
+ "type": "k8s"
+ },
+ "kubernetes": {
+ "kubeconfig": "/etc/cni/net.d/calico-kubeconfig"
+ }
+ }'
+```
+
+### Create a pod interface for the new network
+
+Create a pod interface that specifies the new network using an annotation.
+
+In the following example, we create a pod with an additional pod interface named, `cali1`. The pod interface is attached to the network named, `additional-calico-network`, using the `k8s.v1.cni.cncf.io/networks` annotation.
+Note that all networks in `k8s.v1.cni.cncf.io/networks` are assumed to be $[prodname] networks.
+
+```yaml
+apiVersion: v1
+kind: Pod
+metadata:
+ name: multus-test-pod-1
+ namespace: default
+ annotations:
+ k8s.v1.cni.cncf.io/networks: additional-calico-network@cali1
+spec:
+ nodeSelector:
+ kubernetes.io/os: linux
+ containers:
+ - name: multus-test
+ command: ['/bin/sh', '-c', 'trap : TERM INT; sleep infinity & wait']
+ image: alpine
+```
+
+### Configure the IP pool for the network
+
+Although not required, you may want to assign IPs from specific pools to specific network interfaces. If you are using the [$[prodname] IPAM plugin](../../reference/component-resources/configuration.mdx#specifying-ip-pools-on-a-per-namespace-or-per-pod-basis), specify the IP pools in the **NetworkAttachmentDefinition** custom resource. For example:
+
+```
+ "ipam": {
+ "type": "calico-ipam",
+ "assign_ipv4" : "true",
+ "assign_ipv6" : "false"
+ "ipv4_pools": ["10.0.0.0/24", "20.0.0.0/16", "default-ipv4-ippool"],
+},
+```
+
+### Enforce policy on the new network and pod interface
+
+When MultiInterfaceMode is set to Multus, WorkloadEndpoints are created with these labels:
+
+- `projectcalico.org/network`
+- `projectcalico.org/network-namespace`
+- `projectcalico.org/network-interface`
+
+You can use these labels to enforce policies on specific interfaces and networks using policy label selectors.
+
+:::note
+
+Prior to $[prodname] 3.0, if you were using Kubernetes datastore (kdd mode), the workload endpoint field and name suffix were always **eth0**. In 3.0, the value for workload labels may not be what you expect. Before creating policies targeting WorkloadEndpoints using the new labels, you should verify label values using the commands in [View workload endpoints](#view-workload-endpoints).
+
+:::
+
+In this policy example, we use the selector field to target all WorkloadEndpoints with the network interface of, `cali1`.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: internal-access.allow-tcp-6379
+ namespace: production
+spec:
+ tier: internal-access
+ selector: projectcalico.org/network-interface == cali1
+ types:
+ - Ingress
+ - Egress
+ ingress:
+ - action: Allow
+ metadata:
+ annotations:
+ from: frontend
+ to: database
+ protocol: TCP
+ source:
+ selector: role == 'frontend'
+ destination:
+ ports:
+ - 6379
+ egress:
+ - action: Allow
+```
+
+### View workload endpoints
+
+**In the $[prodname] web console**, go to the **WorkloadEndpoint** page to see all of the WorkloadEndpoints, including the network labels are for targeting WorkloadEndpoints with policy.
+
+**Using the CLI...**
+
+To view all WorkloadEndpoints for pods (default and new), use the following command.
+
+```
+MULTI_INTERFACE_MODE=multus calicoctl get workloadendpoints -o wide
+```
+
+```
+NAME WORKLOAD NODE NETWORKS INTERFACE PROFILES NATS
+test--bo--72vg--kadm--infra--0-k8s-multus--test--pod--1-eth0 multus-test-pod-1 bryan-bo-72vg-kadm-infra-0 192.168.53.129/32 calif887e436e8b kns.default,ksa.default.default
+test--bo--72vg--kadm--infra--0-k8s-multus--test--pod--1-net1 multus-test-pod-1 bryan-bo-72vg-kadm-infra-0 192.168.53.140/32 calim17CD6INXIX kns.default,ksa.default.default
+test--bo--72vg--kadm--infra--0-k8s-multus--test--pod--1-testiface multus-test-pod-1 bryan-bo-72vg-kadm-infra-0 192.168.53.142/32 calim27CD6INXIX kns.default,ksa.default.default
+test--bo--72vg--kadm--infra--0-k8s-multus--test--pod--1-net3 multus-test-pod-1 bryan-bo-72vg-kadm-infra-0 192.168.52.143/32 calim37CD6INXIX kns.default,ksa.default.default
+```
+
+To view specific WorkloadEndpoints, use the following command.
+
+```
+MULTI_INTERFACE_MODE=multus calicoctl get workloadendpoint test--bz--72vg--kadm--infra--0-k8s-multus--test--pod--1-net1 -o yaml
+```
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: WorkloadEndpoint
+metadata:
+ creationTimestamp: '2020-05-04T22:23:05T'
+ labels:
+ projectcalico.org/namespace: default
+ projectcalico.org/network: calico
+ projectcalico.org/network-interface: net1
+ projectcalico.org/network-namespace: default
+ projectcalico.org/orchestrator: k8s
+ projectcalico.org/serviceaccount: default
+ name: test--bz--72vg--kadm--infra--0-k8s-multus--test--pod--1-net1
+ namespace: default
+ resourceVersion: '73572'
+ uid: b9bb7482-cdb8-48d4-9ae5-58322d48391a
+spec:
+ endpoint: net1
+ interfaceName: calim16CD6INXIX
+ ipNetworks:
+ - 192.168.52.141/32
+ node: bryan-bo-72vg-kadm-infra-0
+ orchestrator: k8s
+ pod: multus-test-pod-1
+ profiles:
+ - kns.default
+ - ksa.default.default
+```
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/node-local-dns-cache.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/node-local-dns-cache.mdx
new file mode 100644
index 0000000000..90d45b1a34
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/node-local-dns-cache.mdx
@@ -0,0 +1,63 @@
+---
+description: Run NodeLocal DNSCache alongside Calico Cloud in a connected cluster and write the network policy that lets pod DNS traffic reach the per-node cache.
+---
+
+# Use NodeLocal DNSCache in your cluster
+
+## Big picture
+
+Set up NodeLocal DNSCache to improve DNS lookup latency.
+
+## Before you begin
+
+### Required
+
+Follow these [steps](https://kubernetes.io/docs/tasks/administer-cluster/nodelocaldns/) to enable NodeLocal DNSCache connectivity.
+
+
+## Create a policy to allow traffic from NodeLocal DNSCache
+
+The following is a sample network policy that allows all incoming TCP traffic (including incoming traffic from
+`node-local-dns` pods) on port 53 on `kube-dns`.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: NetworkPolicy
+metadata:
+ name: default.local-dns-to-core-dns
+ namespace: kube-system
+spec:
+ tier: default
+ selector: k8s-app == "kube-dns"
+ ingress:
+ - action: Allow
+ protocol: TCP
+ destination:
+ selector: k8s-app == "kube-dns"
+ ports:
+ - '53'
+ types:
+ - Ingress
+```
+
+To refine the sources permitted by this policy, take into account that NodeLocal DNSCache pods are host networked,
+and make sure to allow traffic from the addresses of your hosts.
+If you're using encapsulation, you will need to allow connectivity from the tunnel IPs.
+
+The Tigera Operator creates policy to allow Tigera components to connect to NodeLocal DNSCache when detected.
+Felix accounts for the NodeLocal DNSCache in creating DNS Logs and enforcing DNS Policy.
+
+## Enable NodeLocal DNSCache on $[prodname] using the eBPF data plane
+
+If your $[prodname] installation uses the eBPF data plane, then you need to annotate the `kube-dns` service.
+Without this, the `kube-proxy` replacement will improperly resolve traffic going to a specific service IP.
+
+Annotate the `kube-dns` service by running the following command:
+
+```bash
+kubectl annotate service kube-dns -n kube-system projectcalico.org/natExcludeService=true
+```
+
+## Additional resources
+
+- [Blog: Optimizing Kubernetes DNS with NodeLocal DNSCache and Calico eBPF: A Practitioner’s Guide](https://www.tigera.io/blog/optimizing-kubernetes-dns-with-nodelocal-dnscache-and-calico-ebpf-a-practitioners-guide/)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/pod-mac-address.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/pod-mac-address.mdx
new file mode 100644
index 0000000000..2e92b5544f
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/pod-mac-address.mdx
@@ -0,0 +1,35 @@
+---
+description: Pin a chosen MAC address on a Kubernetes pod interface in a Calico Cloud connected cluster with the CNI plugin, for cases such as MAC-bound software licenses.
+---
+
+# Use a specific MAC address for a pod
+
+## Big picture
+
+Choose the MAC address for a pod instead of allowing the operating system to assign one.
+
+## Value
+
+Some applications bind software licenses to networking interface MAC addresses.
+
+## Concepts
+
+### Container MAC address
+
+The MAC address configured by the annotation described here will be visible from within the container on the eth0 interface. Since it is isolated to the container it will not collide with any other MAC addresses assigned to other pods on the same node.
+
+## Before you begin...
+
+Your cluster must be using Calico CNI to use this feature.
+
+[Configuring the Calico CNI Plugins](../../reference/component-resources/configuration.mdx)
+
+## How to
+
+Annotate the pod with cni.projectcalico.org/hwAddr set to the desired MAC address. For example:
+
+```
+ "cni.projectcalico.org/hwAddr": "1c:0c:0a:c0:ff:ee"
+```
+
+The annotation must be present when the pod is created; adding it later has no effect.
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/qos-controls.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/qos-controls.mdx
new file mode 100644
index 0000000000..83bf8cb264
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/qos-controls.mdx
@@ -0,0 +1,148 @@
+---
+description: Apply Calico Cloud QoS controls to cap pod ingress and egress bandwidth, packet rate, and connection counts in a connected cluster, plus DiffServ marking on egress.
+---
+
+# Configure QoS Controls
+
+## Big picture
+
+Configure QoS (Quality of Service) Controls to limit ingress and/or egress bandwidth, packet rate and number of connections used by $[prodname] workloads in order to prevent them from overusing or overloading network resources.
+Additionally, it allows configuring Differentiated Services (DiffServ) on egress traffic of $[prodname] workloads and hosts.
+
+## Value
+
+With QoS controls, $[prodname] enforces network resource limits (bandwidth, packet rate, connections) for Kubernetes pods and OpenStack VMs, ensuring fair resource allocation and preventing performance degradation for other workloads.
+$[prodname] can also apply DiffServ on egress traffic to allow upstream devices to prioritise forwarding accordingly.
+
+## Prerequisites
+
+* If you use the eBPF data plane, your Linux nodes must be running kernel version 6.6 or higher in order to configure bandwidth QoS controls.
+
+## Concepts
+
+### Quality of Service Controls
+
+**Quality of Service** (**QoS**), in the field of computer networking, refers to traffic prioritization and resource reservation control mechanisms. It may either mean guaranteeing minimum levels of networking resources, or limiting the maximum levels of usage of networking resources in order to prevent a small number of users from excessive resource consumption, stopping others from using their fair share. For practical purposes, the latter will be considered as $[prodname] implements QoS Controls by limiting maximum levels of network resources usage.
+
+$[prodname] implements three types of QoS Controls, which can be configured using annotations on the Kubernetes pods for either ingress (traffic coming into the pod), egress (traffic going out of the pod), or both:
+1. Bandwidth: limiting the bit rate of traffic into/out of the pod
+2. Packet rate: limiting the number of packets per second that can be sent or received by the pod
+3. Number of established connections: limiting the absolute number of connections that the pod may initiate or accept
+4. Differentiated Services (DiffServ): setting Differentiated Services Code Point (DSCP) on egress traffic leaving clusters or toward hosts
+
+### Annotations
+
+On Kubernetes, $[prodname] uses [annotations](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/) on pods for the configuration of QoS controls.
+
+The values of the QoS controls annotations may contain suffixes, such as `k`, `M`, `G`, `T`, `P`, or `E` to represent large numbers. Binary suffixes are also supported, for example `1Ki` represents "1024".
+
+For example, to limit egress bandwidth to 100Mbps, with a maximum burst of 200Mb:
+
+```yaml noValidation
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: my-deployment
+ labels:
+ app: my-app
+spec:
+ replicas: 3
+ template:
+ metadata:
+ annotations:
+ qos.projectcalico.org/egressBandwidth: "100M"
+ qos.projectcalico.org/egressBurst: "200M"
+ spec:
+ (...)
+```
+
+## How to
+
+- [Configure bandwidth limits](#configure-bandwidth-limits)
+- [Configure packet rate limits](#configure-packet-rate-limits)
+- [Configure established connection limits](#configure-established-connection-limits)
+- [Configure DiffServ](#configure-diffserv)
+
+### Configure bandwidth limits
+
+Use the annotations below to configure bandwidth and burst limits for traffic going into or coming out of the pod. Limiting the bandwidth enforces that, on average, that will be the maximum bit rate used. The burst size is the amount of data that is available instantaneously for transmission. Burst configuration is optional, if burst is not explicitly configured with an annotation, a default value of `4Gib` is used. If you configure a peak rate limit, burst traffic will not go over that limit. Otherwise, there are no limits to burst traffic.
+
+| Annotation | Description |
+|---------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `qos.projectcalico.org/ingressBandwidth` | Specifies the ingress bandwidth limit (in bits per second). Min value: `1k` Max value: `1P` |
+| `qos.projectcalico.org/ingressBurst` | Specifies the ingress burst size (in bits). Optional, defaults to `4Gi`. Min value: `1k` Max value: `34359738360` |
+| `qos.projectcalico.org/ingressPeakrate` | Specifies the ingress peak rate limit, i.e. the bandwidth limit during bursts (in bits per second). Optional, defaults to unlimited. Must be higher than the bandwidth limit. Min value: `1.01k` Max value: `1.01P` |
+| `qos.projectcalico.org/ingressMinburst` | Specifies the ingress minburst, i.e. the burst size for peak rate (in **bytes**). Optional, defaults to the MTU value. Min value: `1k` Max value: `100M` |
+| `qos.projectcalico.org/egressBandwidth` | Specifies the egress bandwidth limit (in bits per second). Min value: `1k` Max value: `1P` |
+| `qos.projectcalico.org/egressBurst` | Specifies the egress burst size (in bits). Optional, defaults to `4Gi`. Min value: `1k` Max value: `34359738360` |
+| `qos.projectcalico.org/egressPeakrate` | Specifies the egress peak rate limit, i.e. the bandwidth limit during bursts (in bits per second). Optional, defaults to unlimited. Must be higher than the bandwidth limit. Min value: `1.01k` Max value: `1.01P` |
+| `qos.projectcalico.org/egressMinburst` | Specifies the egress minburst, i.e. the burst size for peak rate (in **bytes**). Optional, defaults to the MTU value. Min value: `1k` Max value: `100M` |
+
+
+If the [Kubernetes bandwidth plugin](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/) annotations `kubernetes.io/ingress-bandwidth` or `kubernetes.io/egress-bandwidth` are configured and the `qos.projectcalico.org` annotations are not, they are honored and $[prodname] will configure bandwidth limits based on them. The $[prodname] specific annotations take precedence, so if both are configured, the Kubernetes annotation will be ignored. This makes upgrading from a $[prodname] version that uses the bandwidth plugin to a version with native bandwidth limiting seamless, as the behavior will remain consistent across versions (with $[prodname] replacing the functionality previously provided by the Kubernetes bandwidth plugin).
+
+One essential difference between the bandwidth plugin and $[prodname]'s implementations is that with $[prodname], the bandwidth limits take effect immediately, whereas with the bandwidth plugin the pods need to be recreated for the limits to take effect.
+
+| Annotation | Description |
+|---------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `kubernetes.io/ingress-bandwidth` | Kubernetes bandwidth plugin annotation for the ingress bandwidth limit (in bits per second). Ignored if `qos.projectcalico.org/ingressBandwidth` is present. Min value: `1k` Max value: `1P` |
+| `kubernetes.io/egress-bandwidth` | Kubernetes bandwidth plugin annotation for the egress bandwidth limit (in bits per second). Ignored if `qos.projectcalico.org/egressBandwidth` is present. Min value: `1k` Max value: `1P` |
+
+### Configure packet rate limits
+
+Use the annotations below to configure packet rate limits for traffic going into or coming out of the pod. Limiting the packet rate enforces that, on average, that will be the maximum rate that packets will be sent and/or received by the pod. The packet burst size is the number of packets that are available instantaneously for transmission. Packet burst configuration is optional. If packet burst is not explicitly configured with an annotation, a default value of `5` packets is used.
+
+| Annotation | Description |
+|---------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `qos.projectcalico.org/ingressPacketRate` | Specifies the maximum rate of ingress packets (in packets per second). Min value: `1` Max value: `10k` |
+| `qos.projectcalico.org/ingressPacketBurst` | Specifies the ingress packet burst size (in number of packets). Optional, defaults to `5`. Min value: `1` Max value: `10k` |
+| `qos.projectcalico.org/egressPacketRate` | Specifies the maximum rate of egress packets (in packets per second). Min value: `1` Max value: `10k` |
+| `qos.projectcalico.org/egressPacketBurst` | Specifies the egress packet burst size (in number of packets). Optional, defaults to `5`. Min value: `1` Max value: `10k` |
+
+### Configure established connection limits
+
+Use the annotations below to configure limits for the number of established connections into or out of a pod. Limiting the number of connections enforces that the pod cannot accept or initiate more connections that the specified limits.
+
+| Annotation | Description |
+|---------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `qos.projectcalico.org/ingressMaxConnections` | Specifies the maximum number of ingress connections. Min value: `1` Max value: `4294967295` |
+| `qos.projectcalico.org/egressMaxConnections` | Specifies the maximum number of egress connections. Min value: `1` Max value: `4294967295` |
+
+### Configure DiffServ
+
+Use the annotation below to set DSCP on egress traffic toward an endpoint outside cluster or another host in cluster. Unlike, other QoS controls, this annotation can also be set on a [host endpoint](../../reference/host-endpoints).
+For example, to set DSCP AF11 on a host endpoint:
+
+```yaml noValidation
+apiVersion: projectcalico.org/v3
+kind: HostEndpoint
+metadata:
+ name: my-hep
+ annotations:
+ qos.projectcalico.org/dscp: "AF11"
+ labels:
+ app: my-app
+spec:
+ (...)
+```
+
+| Annotation | Description |
+|---------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| `qos.projectcalico.org/dscp` | Specifies the DSCP value of egress traffic toward an endpoint outside cluster or another host in cluster. Min value: `0` Max value: `63` String values: DF, EF, AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43, CS0, CS1, CS2, CS3, CS4, CS5, CS6 |
+
+## Troubleshooting
+
+### Bandwidth is not enforced on eBPF
+
+If you use the eBPF data plane and bandwidth limits aren't being enforced, check the calico-node logs to see if `tcx` is supported by the operating system.
+`tcx` is present in the Linux kernel version 6.6 and later, and it is required for bandwidth limits to work with the eBPF data plane.
+
+The following example shows logs that indicate an unsupported kernel version:
+
+```
+$ kubectl logs -n calico-system ds/calico-node | grep tcx
+Found 4 pods, using pod/calico-node-j9z5d
+Defaulted container "calico-node" out of: calico-node, flexvol-driver (init), ebpf-bootstrap (init), install-cni (init)
+bird: libbpf: prog 'cali_tcx_test': failed to attach to tcx: Invalid argument
+2025-10-15 16:31:48.522 [INFO][81] felix/bpf_ep_mgr.go 595: tcx is not supported. Falling back to tc
+```
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/secure-bgp.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/secure-bgp.mdx
new file mode 100644
index 0000000000..93c0604801
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/secure-bgp.mdx
@@ -0,0 +1,185 @@
+---
+description: Configure BGP session passwords on Calico Cloud BGP peers on a connected cluster to block attackers from injecting false routing information.
+---
+
+# Secure BGP sessions
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+## Big picture
+
+Use BGP passwords to prevent attackers from injecting false routing information.
+
+## Value
+
+Setting a password on a BGP peering between BGP speakers means that a peering will only
+work when both ends of the peering have the same password. This provides a layer of defense
+against an attacker impersonating an external BGP peer or a workload in the cluster, for
+example to inject malicious routing information into the cluster.
+
+## Concepts
+
+### Password protection on BGP sessions
+
+Password protection is a [standardized](https://tools.ietf.org/html/rfc5925) optional
+feature of BGP sessions. The effect is that the two peers at either end of a BGP session
+can only communicate, and exchange routing information, if they are both configured with
+the same password.
+
+Please note that password use does not cause the data exchange to be _encrypted_. It
+remains relatively easy to _eavesdrop_ on the data exchange, but not to _inject_ false
+information.
+
+### Using Kubernetes secrets to store passwords
+
+In Kubernetes, the Secret resource is designed for holding sensitive information,
+including passwords. Therefore, for this $[prodname] feature, we use Secrets to
+store BGP passwords.
+
+## How to
+
+To use a password on a BGP peering:
+
+1. Create (or update) a Kubernetes secret in the namespace where $[noderunning] is
+ running, so that it has a key whose value is the desired password. Note the secret
+ name and the key name.
+
+ :::note
+
+ BGP passwords must be 80 characters or fewer. If a
+ password longer than that is configured, the BGP sessions with
+ that password will fail to be established.
+
+ :::
+
+1. Ensure that $[noderunning] has RBAC permissions to access that secret.
+
+1. Specify the secret and key name on the relevant BGPPeer resource.
+
+### Create or update Kubernetes secret
+
+For example:
+
+```
+kubectl create -f - <
+
+
+When [configuring a BGP peer](../../networking/configuring/bgp.mdx),
+include the secret and key name in the specification of the BGPPeer resource, like this:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: BGPPeer
+metadata:
+ name: bgppeer-global-3040
+spec:
+ peerIP: 192.20.30.40
+ asNumber: 64567
+ password:
+ secretKeyRef:
+ name: bgp-secrets
+ key: rr-password
+```
+
+
+
+
+Include the secret in the default [BGP configuration](../../reference/resources/bgpconfig.mdx)
+similar to the following:
+
+```yaml
+kind: BGPConfiguration
+apiVersion: projectcalico.org/v3
+metadata:
+ name: default
+spec:
+ logSeverityScreen: Info
+ nodeToNodeMeshEnabled: true
+ nodeMeshPassword:
+ secretKeyRef:
+ name: bgp-secrets
+ key: rr-password
+```
+
+:::note
+
+Node to node mesh must be enabled to set node to node mesh
+BGP password.
+
+:::
+
+
+
+
+
+## Additional resources
+
+For more detail about the BGPPeer resource, see
+[BGPPeer](../../reference/resources/bgppeer.mdx).
+
+For more on configuring BGP peers, see [configuring BGP peers](../../networking/configuring/bgp.mdx)
+.
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/vxlan-ipip.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/vxlan-ipip.mdx
new file mode 100644
index 0000000000..bcee245f11
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/vxlan-ipip.mdx
@@ -0,0 +1,148 @@
+---
+description: Choose VXLAN or IP-in-IP overlay encapsulation in a Calico Cloud connected cluster so pod traffic crosses underlay networks that don't route pod CIDRs natively.
+---
+
+# Overlay networking
+
+## Big picture
+
+Enable inter workload communication across networks that are not aware of workload IPs.
+
+## Value
+
+In general, we recommend running Calico without network overlay/encapsulation. This gives you the highest performance and simplest network; the packet that leaves your workload is the packet that goes on the wire.
+
+However, selectively using overlays/encapsulation can be useful when running on top of an underlying network that cannot easily be made aware of workload IPs. A common example is if you are using Calico networking in AWS across multiple VPCs/subnets. In this case, Calico can selectively encapsulate only the traffic that is routed between the VPCs/subnets, and run without encapsulation within each VPC/subnet. You might also decide to run your entire Calico network with encapsulation as an overlay network -- as a quick way to get started without setting up BGP peering or other routing information in your underlying network.
+
+## Concepts
+
+### Routing workload IP addresses
+
+Networks become aware of workload IP addresses through layer 3 routing techniques like static routes or BGP route distribution, or layer 2 address learning. As such, they can route unencapsulated traffic to the right host for the endpoint that is the ultimate destination. However, not all networks are able to route workload IP addresses. For example, public cloud environments where you don’t own the hardware, AWS across VPC subnet boundaries, and other scenarios where you cannot peer Calico over BGP to the underlay, or easily configure static routes. This is why Calico supports encapsulation, so you can send traffic between workloads without requiring the underlying network to be aware of workload IP addresses.
+
+### Encapsulation types
+
+Calico supports two types of encapsulation: VXLAN and IP in IP. VXLAN is supported in some environments where IP in IP is not (for example, Azure). VXLAN has a slightly higher per-packet overhead because the header is larger, but unless you are running very network intensive workloads the difference is not something you would typically notice. The other small difference between the two types of encapsulation is that Calico's VXLAN implementation does not use BGP, whereas Calico's IP in IP implementation uses BGP between Calico nodes.
+
+### Cross-subnet
+
+Encapsulation of workload traffic is typically required only when traffic crosses a router that is unable to route workload IP addresses on its own. Calico can perform encapsulation on: all traffic, no traffic, or only on traffic that crosses a subnet boundary.
+
+## Before you begin
+
+**Required**
+
+- Calico CNI
+
+**Not supported**
+
+- Calico for OpenStack (i.e. when Calico is used as the Neutron plugin)
+
+**Limitations**
+
+- IP in IP supports only IPv4 addresses
+- VXLAN in IPv6 is only supported for kernel versions ≥ 4.19.1 or redhat kernel version ≥ 4.18.0
+
+## How to
+
+- [Configure default IP pools at install time](#configure-default-ip-pools-at-install-time)
+- [Configure IP in IP encapsulation for only cross-subnet traffic](#configure-ip-in-ip-encapsulation-for-only-cross-subnet-traffic)
+- [Configure IP in IP encapsulation for all inter workload traffic](#configure-ip-in-ip-encapsulation-for-all-inter-workload-traffic)
+- [Configure VXLAN encapsulation for only cross-subnet traffic](#configure-vxlan-encapsulation-for-only-cross-subnet-traffic)
+- [Configure VXLAN encapsulation for all inter workload traffic](#configure-vxlan-encapsulation-for-all-inter-workload-traffic)
+
+### IPv4/6 address support
+
+IP in IP supports only IPv4 addresses.
+
+### Best practice
+
+Calico has an option to selectively encapsulate only traffic that crosses subnet boundaries. We recommend using the **cross-subnet** option with IP in IP or VXLAN to minimize encapsulation overhead. Cross-subnet mode provides better performance in AWS multi-AZ deployments, Azure VNets, and on networks where routers are used to connect pools of nodes with L2 connectivity.
+
+Be aware that switching encapsulation modes can cause disruption to in-progress connections. Plan accordingly.
+
+### Configure default IP pools at install time
+
+Default IP pools are configured at install-time automatically by Calico.
+
+For operator managed clusters, you can configure encapsulation in the IP pools section of the default Installation. For example, the following installation snippet will enable VXLAN across subnets.
+
+```yaml
+kind: Installation
+apiVersion: operator.tigera.io/v1
+metadata:
+ name: default
+spec:
+ calicoNetwork:
+ ipPools:
+ - cidr: 192.168.0.0/16
+ encapsulation: VXLANCrossSubnet
+```
+
+### Configure IP in IP encapsulation for only cross-subnet traffic
+
+IP in IP encapsulation can be performed selectively, and only for traffic crossing subnet boundaries.
+
+To enable this feature, set `ipipMode` to `CrossSubnet`.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: ippool-ipip-cross-subnet-1
+spec:
+ cidr: 192.168.0.0/16
+ ipipMode: CrossSubnet
+ natOutgoing: true
+```
+
+### Configure IP in IP encapsulation for all inter workload traffic
+
+With `ipipMode` set to `Always`, Calico routes traffic using IP in IP for all traffic originating from a Calico enabled-host, to all Calico networked containers and VMs within the IP pool.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: ippool-ipip-1
+spec:
+ cidr: 192.168.0.0/16
+ ipipMode: Always
+ natOutgoing: true
+```
+
+### Configure VXLAN encapsulation for only cross subnet traffic
+
+VXLAN encapsulation can be performed selectively, and only for traffic crossing subnet boundaries.
+
+To enable this feature, set `vxlanMode` to `CrossSubnet`.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: ippool-vxlan-cross-subnet-1
+spec:
+ cidr: 192.168.0.0/16
+ vxlanMode: CrossSubnet
+ natOutgoing: true
+```
+
+### Configure VXLAN encapsulation for all inter workload traffic
+
+With `vxlanMode` set to `Always`, Calico routes traffic using VXLAN for all traffic originating from a Calico enabled host, to all Calico networked containers and VMs within the IP pool.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: ippool-vxlan-1
+spec:
+ cidr: 192.168.0.0/16
+ vxlanMode: Always
+ natOutgoing: true
+```
+
+## Additional resources
+
+For details on IP pool resource options, see [IP pool](../../reference/resources/ippool.mdx).
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/configuring/workloads-outside-cluster.mdx b/calico-cloud_versioned_docs/version-24-1/networking/configuring/workloads-outside-cluster.mdx
new file mode 100644
index 0000000000..3f864337f3
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/configuring/workloads-outside-cluster.mdx
@@ -0,0 +1,70 @@
+---
+description: Configure NAT outgoing on Calico Cloud IP pools in a connected cluster so pod traffic destined outside the cluster is source-NATed to the node IP.
+---
+
+# Configure outgoing NAT
+
+## Big picture
+
+Configure $[prodname] networking to perform outbound NAT for connections from pods to outside of the cluster. $[prodname] optionally source NATs the pod IP to the node IP.
+
+## Value
+
+The $[prodname] NAT outbound connection option is flexible; it can be enabled, disabled, and applied to $[prodname] IP pools with public IPs, private IPs, or a specific range of IP addresses. This article describes some use cases for enabling and disabling outgoing NAT.
+
+## Concepts
+
+### $[prodname] IP pools and NAT
+
+When a pod with an IP address in the pool initiates a network connection to an IP address to outside of $[prodname]’s IP pools, the outgoing packets will have their source IP address changed from the pod IP address to the node IP address using SNAT (Source Network Address Translation). Any return packets on the connection automatically get this change reversed before being passed back to the pod.
+
+### Enable NAT: for pods with IP addresses that are not routable beyond the cluster
+
+A common use case for enabling NAT outgoing, is to allow pods in an overlay network to connect to IP addresses outside of the overlay, or pods with private IP addresses to connect to public IP addresses outside the cluster/the internet (subject to network policy allowing the connection, of course). When NAT is enabled, traffic is NATed from pods in that pool to any destination outside of all other $[prodname] IP pools.
+
+### Disable NAT: For on-premises deployments using physical infrastructure
+
+If you choose to implement $[prodname] networking with [BGP peered with your physical network infrastructure](bgp.mdx), you can use your own infrastructure to NAT traffic from pods to the internet. In this case, you should disable the $[prodname] `natOutgoing` option. For example, if you want your pods to have public internet IPs, you should:
+
+- Configure $[prodname] to peer with your physical network infrastructure
+- Create an IP pool with public IP addresses for those pods that are routed to your network with NAT disabled (`natOutgoing: false`)
+- Verify that other network equipment does not NAT the pod traffic
+
+## Before you begin
+
+**Required**
+
+- Calico CNI
+
+## How to
+
+- [Create an IP pool with NAT outgoing enabled](#create-an-ip-pool-with-nat-outgoing-enabled)
+- [Use additional IP pools to specify addresses that can be reached without NAT](#use-additional-ip-pools-to-specify-addresses-that-can-be-reached-without-nat)
+
+### Create an IP pool with NAT outgoing enabled
+
+In the following example, we create a $[prodname] IPPool with natOutgoing enabled. Outbound NAT is performed locally on the node where each workload in the pool is hosted.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: default-ipv4-ippool
+spec:
+ cidr: 192.168.0.0/16
+ natOutgoing: true
+```
+
+### Use additional IP pools to specify addresses that can be reached without NAT
+
+Because $[prodname] performs outgoing NAT only when connecting to an IP address that is not in a $[prodname] IPPool, you can create additional IPPools that are not used for pod IP addresses, but prevent NAT to certain CIDR blocks. This is useful if you want nodes to NAT traffic to the internet, but not to IPs in certain internal ranges. For example, if you did not want to NAT traffic from pods to 10.0.0.0/8, you could create the following pool. You must ensure that the network between the cluster and 10.0.0.0/8 can route pod IPs.
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: no-nat-10.0.0.0-8
+spec:
+ cidr: 10.0.0.0/8
+ disabled: true
+```
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-aws.mdx b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-aws.mdx
new file mode 100644
index 0000000000..a1d10dd4d7
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-aws.mdx
@@ -0,0 +1,1174 @@
+---
+description: Route selected application traffic out of a Calico Cloud connected cluster through egress gateways with native AWS VPC subnet IPs.
+---
+
+# Configure egress gateways, AWS
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+## Big picture
+
+Control the source IP address seen by external services/appliances by routing the traffic from certain pods
+through egress gateways. Use native VPC subnet IP addresses for the egress gateways so that the IPs are valid in the AWS fabric.
+
+## Value
+
+Controlling the source IP seen when traffic leaves the cluster allows groups of pods to be identified
+by external firewalls, appliances and services (even as the groups are scaled up/down or pods restarted).
+$[prodname] controls the source IP by directing traffic through one or more "egress gateway" pods, which
+change the source IP of the traffic to their own IP. The egress gateways used can be chosen at the pod or namespace
+scope allowing for flexibility in how the cluster is seen from outside.
+
+In AWS, egress gateway source IP addresses are chosen from an IP pool backed by a [VPC subnet](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html)
+using $[prodname] IPAM. $[prodname] IPAM allows the IP addresses to be precisely controlled, this allows
+for static configuration of external appliances. Using an IP pool backed by a VPC subnet allows $[prodname] to
+configure the AWS fabric to route traffic to and from the egress gateway using its own IP address.
+
+## Concepts
+
+### CIDR notation
+
+This article assumes that you are familiar with network masks and CIDR notation.
+
+- CIDR notation is defined in [RFC4632](https://datatracker.ietf.org/doc/html/rfc4632).
+- The [Wikipedia article on CIDR notation](https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing#CIDR_notation)
+ provides a good reference.
+
+### AWS-backed IP pools
+
+$[prodname] supports IP pools that are backed by the AWS fabric. Workloads that use an IP address from an
+AWS-backed pool can communicate on the AWS network using their own IP address and AWS will route their traffic
+to/from their host without changing the IP address.
+
+Pods that use an IP address from an AWS-backed pool may also be [assigned an AWS Elastic IP via a pod annotation](#add-aws-elastic-ips-to-the-egress-gateway-deployment)
+. Elastic IPs used in this
+way have the normal AWS semantics: when accessing resources inside the AWS network, the workload's private IP
+(from the IP pool) is used. When accessing resources outside the AWS network, AWS translates the workload's IP to
+the Elastic IP. Elastic IPs also allow for incoming requests from outside the AWS fabric, direct to the workload.
+
+In overview, the AWS-backed IP Pools feature works as follows:
+
+- An IP pool is created with its `awsSubnetID` field set to the ID of a VPC subnet. This "AWS-backed" IP pool's
+ CIDR must be contained within the VPC subnet's CIDR.
+
+ :::caution
+
+ You must ensure that the CIDR(s) used for AWS-backed IP pool(s) are reserved in the AWS fabric.
+ For example, by creating a dedicated VPC subnet for $[prodname]. If the CIDR is not reserved; both
+ $[prodname] and AWS may try to assign the same IP address, resulting in a conflict.
+
+ :::
+
+- Since they are a limited resource, $[prodname] IPAM does not use AWS-backed pools by default. To request an
+ AWS-backed IP address, a pod must have a resource request:
+
+ ```yaml noValidation
+ spec:
+ containers:
+ - ...
+ resources:
+ requests:
+ projectcalico.org/aws-secondary-ipv4: 1
+ limits:
+ projectcalico.org/aws-secondary-ipv4: 1
+ ```
+
+ $[prodname] manages the `projectcalico.org/aws-secondary-ipv4` capacity on the Kubernetes Node resource,
+ ensuring that Kubernetes will not try to schedule too many AWS-backed workloads to the same node. Only AWS-backed
+ pods are limited in this way; there is no limit on the number of non-AWS-backed pods.
+
+- When the CNI plugin spots such a resource request, it will choose an IP address from an AWS-backed pool. Only
+ pools with VPC subnets in the availability zone of the host are considered.
+
+- When Felix, $[prodname]'s per-host agent spots a local workload with an AWS-backed address it tries to ensure
+ that the IP address of the workload is assigned to the host in the AWS fabric. If need be, it will create a
+ new [secondary ENI](#secondary-elastic-network-interfaces-enis) device and attach it to the host to house the IP address.
+ Felix supports two modes for assigning secondary ENIs: **ENI-per-workload** mode (added in v3.13) and
+ **Secondary-IP-per-workload** mode. These modes are described [below](#secondary-elastic-network-interfaces-enis).
+
+- If the pod has one or more AWS Elastic IPs listed in the `cni.projectcalico.org/awsElasticIPs` pod annotation,
+ Felix will try to ensure that _one_ of the Elastic IPs is assigned to the pod's private IP address in the AWS fabric.
+ (Specifying multiple Elastic IPs is useful for multi-pod deployments; ensuring that each pod in the deployment
+ gets one of the IPs.)
+
+### Egress gateway
+
+An egress gateway acts as a transit pod for the outbound application traffic that is configured to
+use it. As traffic leaving the cluster passes through the egress gateway, its source IP is changed
+to that of the egress gateway pod, and the traffic is then forwarded on.
+
+### Source IP
+
+When an outbound application flow leaves the cluster, its IP packets will have a source IP.
+This begins as the pod IP of the pod that originated the flow, then:
+
+- _If no egress gateway is configured_ and the pod IP came from an [IP pool](../../reference/resources/ippool.mdx)
+ with `natOutgoing: true`, the node hosting the pod will change the source IP to its own as the
+ traffic leaves the host. This allows the pod to communicate with external service even though the
+ external network is unaware of the pod's IP.
+
+- _If the pod is configured with an egress gateway_, the traffic is first forwarded to the egress gateway, which
+ changes the source IP to its own and then sends the traffic on. To function correctly, egress gateways
+ should have IPs from an IP pool with `natOutgoing: false`, meaning their host forwards the packet onto
+ the network without changing the source IP again. Since the egress gateway's IP is visible to
+ the underlying network fabric, the fabric must be configured to know about the egress gateway's
+ IP and to send response traffic back to the same host.
+
+### AWS VPCs and subnets
+
+An AWS VPC is a virtual network that is, by default, logically isolated from other VPCs. Each VPC has one or more
+(often large) CIDR blocks associated with it (for example `10.0.0.0/16`). In general, VPC CIDRs may overlap, but only
+if the VPCs remain isolated. AWS allows VPCs to be peered with each other through VPC Peerings. VPCs can only be
+peered if _none_ of their associated CIDRs overlap.
+
+Each VPC has one or more VPC subnets associated with it, each subnet owns a non-overlapping part of one of the
+VPC's CIDR blocks. Each subnet is associated with a particular availability zone. Instances in one availability
+zone can only use IP addresses from subnets in that zone. Unfortunately, this adds some complexity to managing
+egress gateways IP addresses: much of the configuration must be repeated per-AZ.
+
+### AWS VPC and DirectConnect peerings
+
+AWS [VPC Peerings](https://docs.aws.amazon.com/vpc/latest/peering/vpc-peering-basics.html) allow multiple VPCs to be
+connected together. Similarly, [DirectConnect](https://docs.aws.amazon.com/directconnect/latest/UserGuide/Welcome.html)
+allows external datacenters to be connected to an AWS VPC. Peered VPCs and datacenters communicate using private IPs
+as if they were all on one large private network.
+
+By using AWS-backed IP pools, egress gateways can be assigned private IPs allowing them to communicate without NAT
+within the same VPC, with peered VPCs, and, with peered datacenters.
+
+### Secondary Elastic Network Interfaces (ENIs)
+
+Elastic network interfaces are network interfaces that can be added and removed from an instance dynamically. Each
+ENI has a primary IP address from the VPC subnet that it belongs to, and it may also have one or more secondary IP
+addresses, chosen for the same subnet. While the primary IP address is fixed and cannot be changed, the secondary
+IP addresses can be added and removed at runtime.
+
+To arrange for AWS to route traffic to and from egress gateways, $[prodname] adds _secondary_ Elastic
+Network Interfaces (ENIs) to the host. $[prodname] supports two modes for provisioning the
+secondary ENIs. The table below describes the trade-offs between **ENI-per-workload** and **Secondary-IP-per-workload**
+modes:
+
+| **ENI-per-workload** (since v3.13) | **Secondary-IP-per-workload** |
+| ------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
+| One secondary ENI is attached for each AWS-backed workload. | Secondary ENIs are shared, multiple workloads per ENI. |
+| Supports one AWS-backed workload per secondary ENI. | Supports 2-49 AWS-backed workloads per secondary ENI (depending on instance type). |
+| ENI Primary IP is set to Workload's IP. | ENI Primary IP chosen from dedicated "host secondary" IP pools. |
+| Makes best use of AWS IP space, no need to reserve IPs for hosts. | Requires "host secondary" IPs to be reserved. These cannot be used for workloads. |
+| ENI deleted when workload deleted. | ENI retained (ready for next workload to be scheduled). |
+| Slower to handle churn/workload mobility. (Creating ENI is slower than assigning IP.) | Faster at handling churn/workload mobility. |
+
+The number of ENIs that an instance can support and the number of secondary IPs that each ENI can support depends on
+the instance type according to [this table](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI).
+Note: the table lists the total number of network interfaces and IP addresses but the first interface on the host (the
+primary interface) and, in Secondary-IP-per-workload mode, the first IP of each interface (its primary IP) cannot be
+used for egress gateways.
+
+The primary interface cannot be used for egress gateways because it belongs to the VPC subnet that is
+in use for Kubernetes hosts; this means that a planned egress gateway IP could get used by AWS as the primary IP of
+an instance (for example when scaling up the cluster).
+
+## Before you begin
+
+**Required**
+
+- Calico CNI
+- Open port UDP 4790 on the host
+
+**Not Supported**
+
+- Amazon VPC CNI
+
+ $[prodname] CNI and IPAM is required. The ability to control the egress gateway’s IP is a feature of $[prodname] CNI and IPAM. AWS VPC CNI does not support that feature, so it is incompatible with egress gateways.
+
+## How to
+
+- [Configure IP autodetection](#configure-ip-autodetection)
+- [Ensure Kubernetes VPC has free CIDR range](#ensure-kubernetes-vpc-has-free-cidr-range)
+- [Create dedicated VPC subnets](#create-dedicated-vpc-subnets)
+- [Configure AWS IAM roles](#configure-aws-iam-roles)
+- [Configure IP reservations for each VPC subnet](#configure-ip-reservations-for-each-vpc-subnet)
+- [Enable egress gateway support](#enable-egress-gateway-support)
+- [Enable AWS-backed IP pools](#enable-aws-backed-ip-pools)
+- [Configure IP pools backed by VPC subnets](#configure-ip-pools-backed-by-vpc-subnets)
+- [Deploy a group of egress gateways](#deploy-a-group-of-egress-gateways)
+- [Configure iptables backend for egress gateways](#configure-iptables-backend-for-egress-gateways)
+- [Configure namespaces and pods to use egress gateways](#configure-namespaces-and-pods-to-use-egress-gateways)
+- [Optionally enable ECMP load balancing](#optionally-enable-ecmp-load-balancing)
+- [Verify the feature operation](#verify-the-feature-operation)
+- [Control the use of egress gateways](#control-the-use-of-egress-gateways)
+- [Policy enforcement for flows via an egress gateway](#policy-enforcement-for-flows-via-an-egress-gateway)
+- [Upgrade egress gateways](#upgrade-egress-gateways)
+
+### Configure IP autodetection
+
+Since this feature adds additional network interfaces to nodes, it is important to configure $[prodname] to
+autodetect the correct primary interface to use for normal pod-to-pod traffic. Otherwise, $[prodname] may
+autodetect a newly-added secondary ENI as the main interface, causing an outage.
+
+For EKS clusters, the default IP autodetection method is `can-reach=8.8.8.8`, which will choose the interface
+with a route to `8.8.8.8`; this is typically the interface with a default route, which will be the correct (primary) ENI.
+($[prodname] ensures that the secondary ENIs do not have default routes in the main routing table.)
+
+For other AWS clusters, $[prodname] may default to `firstFound`, which is **not** suitable.
+
+To examine the autodetection method, check the operator's installation resource:
+
+```bash
+$ kubectl get installations.operator.tigera.io -o yaml default
+```
+```yaml noValidation
+apiVersion: operator.tigera.io/v1
+kind: Installation
+metadata:
+ ...
+ name: default
+ ...
+spec:
+ calicoNetwork:
+ ...
+ nodeAddressAutodetectionV4:
+ firstFound: true
+...
+```
+
+If `nodeAddressAutodetectionV4` is set to `firstFound: true` or is not specified, then you must change it to another method by editing the
+resource. The NodeAddressAutodetection options, `canReach` and `cidrs` are suitable. See [Tigera Operator API reference](../../reference/installation/api.mdx). If using the `cidrs` option, set the CIDRs list to include only the
+CIDRs from which your primary ENI IPs are chosen (do not include the dedicated VPC subnets chosen below).
+
+### Ensure Kubernetes VPC has free CIDR range
+
+For egress gateways to be useful in AWS, we want to assign them IP addresses from a VPC subnet that is in the same AZ
+as their host.
+
+To avoid clashes between AWS IP allocations and $[prodname] IP allocations, it is important that the range of
+IP addresses assigned to $[prodname] IP pools is not used by AWS for automatic allocations. In this guide we
+assume that you have created a dedicated VPC subnet per Availability Zone (AZ) that is reserved for $[prodname]
+and configured not to be used as the default subnet for the AZ.
+
+If you are creating your cluster and VPC from scratch, plan to subdivide the VPC CIDR into (at least) two VPC subnets
+per AZ. One VPC subnet for the Kubernetes (and any other) hosts and one VPC subnet for egress gateways. (The next
+section explains the sizing requirements for the egress gateway subnets.)
+
+If you are adding this feature to an existing cluster, you may find that the existing VPC subnets already cover the
+entire VPC CIDR, making it impossible to create a new subnet. If that is the case, you can make more room by
+adding a second CIDR to the VPC that is large enough for the new subnets. For information on adding a secondary
+CIDR range to a VPC, see [this guide](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#vpc-resize).
+
+### Create dedicated VPC subnets
+
+$[prodname] requires a dedicated VPC subnet in each AWS availability zone that you wish to deploy egress
+gateways. The subnet must be dedicated to $[prodname] so that AWS will not
+use IP addresses from the subnet for other purposes (as this could clash with an egress gateway's IP). When creating the
+subnet you should configure it not to be used for instances.
+
+Some IP addresses from the dedicated subnet are reserved for AWS and $[prodname] internal use:
+
+- The first four IP addresses in the subnet cannot be used. These are [reserved by AWS for internal use](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Subnets.html#vpc-sizing-ipv4).
+- Similarly, the last IP in the subnet (the broadcast address) cannot be used.
+- _In **Secondary-IP-per-workload** mode_, $[prodname] requires one IP address from the subnet per secondary ENI
+ that it provisions (for use as the primary IP address of the ENI). In **ENI-per-workload** mode, this is not required.
+
+
+
+
+Example for **ENI-per-workload** mode:
+
+- You anticipate having up to 30 instances running in each availability zone (AZ).
+- You intend to use `t3.large` instances, [these are limited to](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI) 3 ENIs per host.
+- So, each host can accept 2 secondary ENIs, each of which can handle one egress gateway.
+- With 2 ENIs per node and 30 nodes, the part of the cluster in this AZ could handle up to `30 * 2 = 60` egress
+ gateways.
+- AWS reserves 5 IPs from the AWS subnet for internal use, no "host secondary IPs" need to be reserved in this mode.
+- Since VPC subnets are allocated by CIDR, a `/25` subnet containing 128 IP addresses would comfortably fit the 5
+ reserved IPs as well as the 60 possible gateways (with headroom for more nodes to be added later).
+
+
+
+
+Example for **Secondary-IP-per-workload** mode:
+
+- You anticipate having up to 30 instances running in each availability zone (AZ).
+- You intend to use `t3.large` instances, [these are limited to](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)
+ 3 ENIs per host (one of which is the primary) and each ENI can handle 12 IP addresses, (one of which is the primary).
+- So, each host can accept 2 secondary ENIs and each secondary ENI could handle 11 egress gateway pods.
+- Each in-use secondary ENI requires one IP from the VPC subnet (up to 60 in this case) and AWS requires 5 IPs to be
+ reserved so that's up to 65 IPs reserved in total.
+- With 2 ENIs and 11 IPs per ENI, the part of the cluster in this AZ could handle up to `30 * 2 * 11 = 660` egress
+ gateways.
+- Since VPC subnets are allocated by CIDR, a `/22` subnet containing 1024 IP addresses would comfortably fit the 65
+ reserved IPs as well as the 660 possible gateways.
+
+$[prodname] allocates ENIs on-demand so each instance will only claim one of those reserved IP addresses when the
+first egress gateway is assigned to that node. It will only claim its second IP when that ENI becomes full and then an
+extra egress gateway is provisioned.
+
+
+
+
+### Configure AWS IAM roles
+
+To provision the required AWS resources, each $[noderunning] pod in your cluster requires the
+following IAM permissions to be granted. The permissions can be granted to the node IAM Role itself, or by using
+the AWS [IAM roles for service accounts](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) feature to grant the permissions to the
+`calico-node` service account.
+
+- DescribeInstances
+- DescribeInstanceTypes
+- DescribeNetworkInterfaces
+- DescribeSubnets
+- DescribeTags
+- CreateTags
+- AssignPrivateIpAddresses
+- UnassignPrivateIpAddresses
+- AttachNetworkInterface
+- CreateNetworkInterface
+- DeleteNetworkInterface
+- DetachNetworkInterface
+- ModifyNetworkInterfaceAttribute
+
+The above permissions are similar to those used by the AWS VPC CNI (since both CNIs need to provision the same kinds
+of resources). In addition, to support elastic IPs, each $[noderunning] also requires the following permissions:
+
+- DescribeAddresses
+- AssociateAddress
+- DisassociateAddress
+
+### Configure AWS Security Group rules
+
+To allow egress gateway traffic into the egress gateway pod's host from the client, the ingress rules of the security
+group need to be updated. A rule to allow all packets from within the security group must be added to the inbound rules.
+
+### Configure IP reservations for each VPC subnet
+
+Since the first four IP addresses and the last IP address in a VPC subnet cannot be used, it is important to
+prevent $[prodname] from _trying_ to use them. For each VPC subnet that you plan to use,
+ensure that you have an entry in an [IP reservation](../../reference/resources/ipreservation.mdx) for its first
+four IP addresses and its final IP address.
+
+For example, if your chosen VPC subnets are `100.64.0.0/22` and `100.64.4.0/22`, you could create the following
+`IPReservation` resource, which covers both VPC subnets (if you're not familiar with CIDR notation, replacing the
+`/22` of the original subnet with `/30` is a shorthand for "the first four IP addresses"):
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPReservation
+metadata:
+ name: aws-ip-reservations
+spec:
+ reservedCIDRs:
+ - 100.64.0.0/30
+ - 100.64.3.255
+ - 100.64.4.0/30
+ - 100.64.7.255
+```
+
+### Enable egress gateway support
+
+In the default **FelixConfiguration**, set the `egressIPSupport` field to `EnabledPerNamespace` or
+`EnabledPerNamespaceOrPerPod`, according to the level of support that you need in your cluster. For
+support on a per-namespace basis only:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"egressIPSupport":"EnabledPerNamespace"}}'
+```
+
+Or for support both per-namespace and per-pod:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"egressIPSupport":"EnabledPerNamespaceOrPerPod"}}'
+```
+
+:::note
+
+- `egressIPSupport` must be the same on all cluster nodes, so you should set them only in the
+ `default` FelixConfiguration resource.
+- The operator automatically enables the required policy sync API in the FelixConfiguration.
+
+:::
+
+### Enable AWS-backed IP pools
+
+
+
+
+To enable **ENI-per-workload** mode, in the default **FelixConfiguration**, set the `awsSecondaryIPSupport` field to
+`EnabledENIPerWorkload`:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"awsSecondaryIPSupport":"EnabledENIPerWorkload"}}'
+```
+
+
+
+
+To enable **Secondary-IP-per-workload** mode, set the field to `Enabled` (the name `Enabled` predates
+the addition of the **ENI-per-workload** mode):
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"awsSecondaryIPSupport":"Enabled"}}'
+```
+
+
+
+
+You can verify that the setting took effect by examining the Kubernetes Node resources:
+
+```bash
+kubectl describe node
+```
+
+Should show the new `projectcalico.org/aws-secondary-ipv4` capacity (in the Allocated Resources section).
+
+#### Changing modes
+
+You can change between the two modes by:
+
+- Ensuring that the number of egress gateways on every node is within the limits of the particular mode. i.e.
+ when switching to **ENI-per-workload** mode, the number of egress gateways must be less than or equal to the number
+ of secondary ENIs that your instances can handle.
+- Editing the setting (using the patch commands above, for example).
+
+Changing the mode will cause disruption as ENIs must be removed and re-added.
+
+### Configure IP pools backed by VPC subnets
+
+
+
+
+In **ENI-per-workload** mode, IP pools are (only) used to subdivide the VPC subnets into small pools used for
+particular groups of egress gateways. These IP Pools must have:
+
+- `awsSubnetID` set to the ID of the relevant VPC subnet. This activates the AWS-backed IP feature for these pools.
+- `allowedUse` set to `["Workload"]` to tell $[prodname] IPAM to use those pools for the egress gateway workloads.
+- `vxlanMode` and `ipipMode` set to `Never` to disable encapsulation for the egress gateway pods. (`Never` is the default if these fields are not specified.)
+- `blockSize` set to 32. This aligns $[prodname] IPAM with the behaviour of the AWS fabric.
+- `disableBGPExport` set to `true`. This prevents routing conflicts if your cluster is using IPIP or BGP networking.
+
+It's also recommended to:
+
+- Set `nodeSelector` to `"!all()"`. This prevents $[prodname] IPAM from using the pool automatically. It will
+ only be used for workloads that explicitly name it in the `cni.projectcalico.org/ipv4pools` annotation.
+
+Continuing the example above, with VPC subnets
+
+- `100.64.0.0/22` in, say, availability zone west-1 and id `subnet-000000000000000001`
+- `100.64.4.0/22` in, say, availability zone west-2 and id `subnet-000000000000000002`
+
+And, assuming that there are two clusters of egress gateways "red" and "blue" (which in turn serve namespaces "red"
+and "blue"), one way to structure the IP pools is to have one IP pool for each group of egress gateways in each
+subnet. Then, if a particular egress gateway from the egress gateway cluster is scheduled to one AZ or the other,
+it will take an IP from the appropriate pool.
+
+For the "west-1" availability zone:
+
+- IP pool "egress-red-west-1", CIDR `100.64.0.4/30` (the first non-reserved /30 CIDR in the VPC subnet). These
+ addresses will be used for "red" egress gateways in the "west-1" AZ.
+
+- IP pool "egress-blue-west-1", CIDR `100.64.0.8/30` (the next 4 IPs from the "west-1" subnet). These addresses
+ will be used for "blue" egress gateways in the "west-1" AZ.
+
+For the "west-2" availability zone:
+
+- IP pool "egress-red-west-2", CIDR `100.64.4.4/30` (the first non-reserved /30 CIDR in the VPC subnet). These
+ addresses will be used for "red" egress gateways in the "west-2" AZ.
+
+- IP pool "egress-blue-west-2", CIDR `100.64.4.8/30` (the next 4 IPs from the "west-2" subnet). These addresses
+ will be used for "blue" egress gateways in the "west-2" AZ.
+
+Converting this to `IPPool` resources:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: egress-red-west-1
+spec:
+ cidr: 100.64.0.4/30
+ allowedUses: ['Workload']
+ awsSubnetID: subnet-000000000000000001
+ blockSize: 32
+ nodeSelector: '!all()'
+ disableBGPExport: true
+---
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: egress-blue-west-1
+spec:
+ cidr: 100.64.0.8/30
+ allowedUses: ['Workload']
+ awsSubnetID: subnet-000000000000000001
+ blockSize: 32
+ nodeSelector: '!all()'
+ disableBGPExport: true
+---
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: egress-red-west-2
+spec:
+ cidr: 100.64.4.4/30
+ allowedUses: ['Workload']
+ awsSubnetID: subnet-000000000000000002
+ blockSize: 32
+ nodeSelector: '!all()'
+ disableBGPExport: true
+---
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: egress-blue-west-2
+spec:
+ cidr: 100.64.4.8/30
+ allowedUses: ['Workload']
+ awsSubnetID: subnet-000000000000000002
+ blockSize: 32
+ nodeSelector: '!all()'
+ disableBGPExport: true
+```
+
+
+
+
+In **Secondary-IP-per-workload** mode, IP pools are used to subdivide the VPC subnets as follows:
+
+- One medium-sized IP pool per-Subnet reserved for $[prodname] to use for the _primary_ IP addresses of its _secondary_ ENIs.
+ These pools must have:
+
+ - `awsSubnetID` set to the ID of the relevant VPC subnet. This activates the AWS-backed IP feature for these pools.
+ - `allowedUse` set to `["HostSecondaryInterface"]` to reserve them for this purpose.
+ - `blockSize` set to 32. This aligns $[prodname] IPAM with the behaviour of the AWS fabric.
+ - `vxlanMode` and `ipipMode` set to `Never`. (`Never` is the default if these fields are not specified.)
+ - `disableBGPExport` set to `true`. This prevents routing conflicts if your cluster is using IPIP or BGP networking.
+
+- Small pools used for particular groups of egress gateways. These must have:
+
+ - `awsSubnetID` set to the ID of the relevant VPC subnet. This activates the AWS-backed IP feature for these pools.
+ - `allowedUse` set to `["Workload"]` to tell $[prodname] IPAM to use those pools for the egress gateway workloads.
+ - `vxlanMode` and `ipipMode` set to `Never` to disable encapsulation for the egress gateway pods. (`Never` is the default if these fields are not specified.)
+ - `blockSize` set to 32. This aligns $[prodname] IPAM with the behaviour of the AWS fabric.
+ - `disableBGPExport` set to `true`. This prevents routing conflicts if your cluster is using IPIP or BGP networking.
+
+ It's also recommended to:
+
+ - Set `nodeSelector` to `"!all()"`. This prevents $[prodname] IPAM from using the pool automatically. It will
+ only be used for workloads that explicitly name it in the `cni.projectcalico.org/ipv4pools` annotation.
+
+Continuing the example above, with VPC subnets
+
+- `100.64.0.0/22` in, say, availability zone west-1 and id `subnet-000000000000000001`
+- `100.64.4.0/22` in, say, availability zone west-2 and id `subnet-000000000000000002`
+
+And, assuming that there are two clusters of egress gateways "red" and "blue" (which in turn serve namespaces "red"
+and "blue"), one way to structure the IP pools is to have a "hosts" IP pool in each VPC subnet and one IP pool for each
+group of egress gateways in each subnet. Then, if a particular egress gateway from the egress gateway cluster is
+scheduled to one AZ or the other, it will take an IP from the appropriate pool.
+
+For the "west-1" availability zone:
+
+- IP pool "hosts-west-1", CIDR `100.64.0.0/25` (the first 128 addresses in the "west-1" VPC subnet).
+
+ - We'll reserve these addresses for hosts to use.
+ - `100.64.0.0/25` covers the addresses from `100.64.0.0` to `100.64.0.127` (but addresses `100.64.0.0` to `100.64.0.3`
+ were reserved above).
+
+- IP pool "egress-red-west-1", CIDR `100.64.0.128/30` (the next 4 IPs from the "west-1" subnet).
+
+ - These addresses will be used for "red" egress gateways in the "west-1" AZ.
+
+- IP pool "egress-blue-west-1", CIDR `100.64.0.132/30` (the next 4 IPs from the "west-1" subnet).
+
+ - These addresses will be used for "blue" egress gateways in the "west-1" AZ.
+
+For the "west-2" availability zone:
+
+- IP pool "hosts-west-2", CIDR `100.64.4.0/25` (the first 128 addresses in the "west-2" VPC subnet).
+
+ - `100.64.4.0/25` covers the addresses from `100.64.4.0` to `100.64.4.127` (but addresses `100.64.4.0` to `100.64.4.3`
+ were reserved above).
+
+- IP pool "egress-red-west-2", CIDR `100.64.4.128/30` (the next 4 IPs from the "west-2" subnet).
+
+ - These addresses will be used for "red" egress gateways in the "west-2" AZ.
+
+- IP pool "egress-blue-west-2", CIDR `100.64.4.132/30` (the next 4 IPs from the "west-2" subnet).
+
+ - These addresses will be used for "blue" egress gateways in the "west-2" AZ.
+
+Converting this to `IPPool` resources:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: hosts-west-1
+spec:
+ cidr: 100.64.0.0/25
+ allowedUses: ['HostSecondaryInterface']
+ awsSubnetID: subnet-000000000000000001
+ blockSize: 32
+ disableBGPExport: true
+---
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: egress-red-west-1
+spec:
+ cidr: 100.64.0.128/30
+ allowedUses: ['Workload']
+ awsSubnetID: subnet-000000000000000001
+ blockSize: 32
+ nodeSelector: '!all()'
+ disableBGPExport: true
+---
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: egress-blue-west-1
+spec:
+ cidr: 100.64.0.132/30
+ allowedUses: ['Workload']
+ awsSubnetID: subnet-000000000000000001
+ blockSize: 32
+ nodeSelector: '!all()'
+ disableBGPExport: true
+---
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: hosts-west-2
+spec:
+ cidr: 100.64.4.0/25
+ allowedUses: ['HostSecondaryInterface']
+ awsSubnetID: subnet-000000000000000002
+ blockSize: 32
+ disableBGPExport: true
+---
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: egress-red-west-2
+spec:
+ cidr: 100.64.4.128/30
+ allowedUses: ['Workload']
+ awsSubnetID: subnet-000000000000000002
+ blockSize: 32
+ nodeSelector: '!all()'
+ disableBGPExport: true
+---
+apiVersion: projectcalico.org/v3
+kind: IPPool
+metadata:
+ name: egress-blue-west-2
+spec:
+ cidr: 100.64.4.132/30
+ allowedUses: ['Workload']
+ awsSubnetID: subnet-000000000000000002
+ blockSize: 32
+ nodeSelector: '!all()'
+ disableBGPExport: true
+```
+
+
+
+
+### Deploy a group of egress gateways
+
+Use an egress gateway custom resource to deploy a group of egress gateways.
+
+Using the example of the "red" egress gateway cluster, we use several features of Kubernetes and $[prodname]
+in tandem to get a cluster of egress gateways that spans both availability zones and uses AWS-backed IP addresses:
+
+```bash
+kubectl apply -f - <
+# -
+# timeoutSeconds: 15
+# intervalSeconds: 5
+# httpProbe:
+# urls:
+# -
+# -
+# timeoutSeconds: 30
+# intervalSeconds: 10
+ aws:
+ nativeIP: Enabled
+ template:
+ metadata:
+ labels:
+ egress-code: red
+ spec:
+ nodeSelector:
+ kubernetes.io/os: linux
+ terminationGracePeriodSeconds: 0
+ topologySpreadConstraints:
+ - maxSkew: 1
+ topologyKey: "topology.kubernetes.io/zone"
+ whenUnsatisfiable: "DoNotSchedule"
+ labelSelector:
+ matchLabels:
+ egress-code: red
+EOF
+```
+
+- `replicas: 2` tells Kubernetes to schedule two egress gateways in the "red" cluster.
+- ipPools tells $[prodname] IPAM to use one of the "red" IP pools:
+
+ ```yaml
+ ipPools:
+ - name: "egress-red-west-1"
+ - name: "egress-red-west-2"
+ ```
+ Depending on which AZ the pod is scheduled in, $[prodname] IPAM will automatically ignore IP pools that
+ are backed by AWS subnets that are not in the local AZ.
+
+ External services and appliances can recognise "red" traffic because it will all come from the CIDRs of the "red"
+ IP pools.
+
+- When nativeIP is enabled, IPPools must be AWS-backed. It also tells Kubernetes to only schedule the gateway to a node
+ with available AWS IP capacity:
+
+ ```yaml
+ aws:
+ nativeIP: Enabled
+ ```
+
+- The following [topology spread constraint](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/)
+ ensures that Kubernetes spreads the Egress gateways evenly between AZs (assuming that your nodes are labeled with
+ the expected [well-known label](https://kubernetes.io/docs/reference/labels-annotations-taints/#topologykubernetesiozone)
+ `topology.kubernetes.io/zone`):
+
+ ```yaml
+ topologySpreadConstraints:
+ - maxSkew: 1
+ topologyKey: topology.kubernetes.io/zone
+ whenUnsatisfiable: DoNotSchedule
+ labelSelector:
+ matchLabels:
+ egress-code: red
+ ```
+
+- The labels are arbitrary. You can choose whatever names and values are convenient for your cluster's Namespaces and Pods to refer to in their egress selectors.
+ If labels are not specified, a default label `projectcalico.org/egw`:`name` will be added by the Tigera Operator.
+
+- icmpProbe may be used to specify the Probe IPs, ICMP interval and timeout in seconds. `ips` if set, the
+ egress gateway pod will probe each IP periodically using an ICMP ping. If all pings fail then the egress
+ gateway will report non-ready via its health port. `intervalSeconds` controls the interval between probes.
+ `timeoutSeconds` controls the timeout before reporting non-ready if no probes succeed.
+
+ ```yaml
+ icmpProbe:
+ ips:
+ -
+ -
+ timeoutSeconds: 20
+ intervalSeconds: 10
+ ```
+
+- httpProbe may be used to specify the Probe URLs, HTTP interval and timeout in seconds. `urls` if set, the
+ egress gateway pod will probe each external service periodically. If all probes fail then the egress
+ gateway will report non-ready via its health port. `intervalSeconds` controls the interval between probes.
+ `timeoutSeconds` controls the timeout before reporting non-ready if all probes are failing.
+
+ ```yaml
+ httpProbe:
+ urls:
+ -
+ -
+ timeoutSeconds: 30
+ intervalSeconds: 10
+ ```
+- Please refer to the [operator reference docs](../../reference/installation/api.mdx) for details about the egress gateway resource type.
+
+:::note
+
+- It is advisable to have more than one egress gateway per group, so that the egress IP function
+ continues if one of the gateways crashes or needs to be restarted. When there are multiple
+ gateways in a group, outbound traffic from the applications using that group is load-balanced
+ across the available gateways. The number of `replicas` specified must be less than or equal
+ to the number of free IP addresses in the IP Pool.
+- IPPool can be specified either by its name (e.g. `-name: egress-ippool-1`) or by its CIDR (e.g. `-cidr: 10.10.10.0/31`).
+- The labels are arbitrary. You can choose whatever names and values are convenient for
+ your cluster's Namespaces and Pods to refer to in their egress selectors.
+ The health port `8080` is used by:
+- The Kubernetes `readinessProbe` to expose the status of the egress gateway pod (and any ICMP/HTTP
+ probes).
+- Remote pods to check if the egress gateway is "ready". Only "ready" egress
+ gateways will be used for remote client traffic. This traffic is automatically allowed by $[prodname] and
+ no policy is required to allow it. $[prodname] only sends probes to egress gateway pods that have a named
+ "health" port. This ensures that during an upgrade, health probes are only sent to upgraded egress gateways.
+
+:::
+
+### Configure iptables backend for egress gateways
+
+The Tigera Operator configures egress gateways to use the same iptables backend as `calico-node`.
+To modify the iptables backend for egress gateways, you must change the `iptablesBackend` field in the [Felix configuration](../../reference/resources/felixconfig.mdx).
+
+### Configure namespaces and pods to use egress gateways
+
+You can configure namespaces and pods to use an egress gateway by:
+* annotating the namespace or pod
+* applying an egress gateway policy to the namespace or pod.
+
+Using an egress gateway policy is more complicated, but it allows advanced use cases.
+
+#### Configure a namespace or pod to use an egress gateway (annotation method)
+
+In a $[prodname] deployment, the Kubernetes namespace and pod resources honor annotations that
+tell that namespace or pod to use particular egress gateways. These annotations are selectors, and
+their meaning is "the set of pods, anywhere in the cluster, that match those selectors".
+
+So, to configure all the pods in a namespace to use the egress gateways that are
+labelled with `egress-code: red`, you would annotate that namespace like this:
+
+```bash
+kubectl annotate ns egress.projectcalico.org/selector="egress-code == 'red'"
+```
+
+By default, that selector can only match egress gateways in the same namespace. To select gateways
+in a different namespace, specify a `namespaceSelector` annotation as well, like this:
+
+```bash
+kubectl annotate ns egress.projectcalico.org/namespaceSelector="kubernetes.io/metadata.name == 'default'"
+```
+
+Egress gateway annotations have the same [syntax and range of expressions](../../reference/resources/networkpolicy.mdx#selector) as the selector fields in
+$[prodname] [network policy](../../reference/resources/networkpolicy.mdx#entityrule).
+
+To configure a specific Kubernetes Pod to use egress gateways, specify the same annotations when
+creating the pod. For example:
+
+```bash
+kubectl apply -f - < egress.projectcalico.org/egressGatewayPolicy="egw-policy1"
+```
+
+To configure a specific Kubernetes pod to use the same policy, specify the same annotations when
+creating the pod.
+For example:
+
+```bash
+kubectl apply -f - < -n -- nc 8089 ` should be the IP address of the netcat server.
+
+Then, if you check the logs or output of the netcat server, you should see:
+
+```
+Connection from received
+```
+
+with `` being one of the IPs of the egress IP pool that you provisioned.
+
+### Control the use of egress gateways
+
+If a cluster ascribes special meaning to traffic flowing through egress gateways, it will be
+important to control when cluster users can configure their pods and namespaces to use them, so that
+non-special pods cannot impersonate the special meaning.
+
+If namespaces in a cluster can only be provisioned by cluster admins, one option is to enable egress
+gateway function only on a per-namespace basis. Then only cluster admins will be able to configure
+any egress gateway usage.
+
+Otherwise -- if namespace provisioning is open to users in general, or if it's desirable for egress
+gateway function to be enabled both per-namespace and per-pod -- a [Kubernetes admission controller](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/)
+ will be
+needed. This is a task for each deployment to implement for itself, but possible approaches include
+the following.
+
+1. Decide whether a given Namespace or Pod is permitted to use egress annotations at all, based on
+ other details of the Namespace or Pod definition.
+
+1. Evaluate egress annotation selectors to determine the egress gateways that they map to, and
+ decide whether that usage is acceptable.
+
+1. Impose the cluster's own bespoke scheme for a Namespace or Pod to identify the egress gateways
+ that it wants to use, less general than $[prodname]'s egress annotations. Then the
+ admission controller would police those bespoke annotations (that that cluster's users could
+ place on Namespace or Pod resources) and either reject the operation in hand, or allow it
+ through after adding the corresponding $[prodname] egress annotations.
+
+### Policy enforcement for flows via an egress gateway
+
+For an outbound connection from a client pod, via an egress gateway, to a destination outside the
+cluster, there is more than one possible enforcement point for policy:
+
+The path of the traffic through policy is as follows:
+
+1. Packet leaves the client pod and passes through its egress policy.
+2. The packet is encapsulated by the client pod's host and sent to the egress gateway
+3. The encapsulated packet is sent from the host to the egress gateway pod.
+4. The egress gateway pod de-encapsulates the packet and sends the packet out again with its own address.
+5. The packet leaves the egress gateway pod through its egress policy.
+
+To ensure correct operation, (as of v3.15) the encapsulated traffic between host and egress gateway is auto-allowed by
+$[prodname] and other ingress traffic is blocked. That means that there are effectively two places where
+policy can be applied:
+
+1. on egress from the client pod
+2. on egress from the egress gateway pod (see limitations below).
+
+The policy applied at (1) is the most powerful since it implicitly sees the original source of the traffic (by
+virtue of being attached to that original source). It also sees the external destination of the traffic.
+
+Since an egress gateway will never originate its own traffic, one option is to rely on policy applied at (1) and
+to allow all traffic to at (2) (either by applying no policy or by applying an "allow all").
+
+Alternatively, for maximum "defense in depth" applying policy at both (1) and (2) provides extra protection should
+the policy at (1) be disabled or bypassed by an attacker. Policy at (2) has the following limitations:
+
+- [Domain-based policy](../../network-policy/domain-based-policy.mdx) is not supported at egress from egress
+ gateways. It will either fail to match the expected traffic, or it will work intermittently if the egress gateway
+ happens to be scheduled to the same node as its clients. This is because any DNS lookup happens at the client pod.
+ By the time the policy reaches (2) the DNS information is lost and only the IP addresses of the traffic are available.
+
+- The traffic source will appear to be the egress gateway pod, the source information is lost in the address
+ translation that occurs inside the egress gateway pod.
+
+That means that policies at (2) will usually take the form of rules that match only on destination port and IP address,
+either directly in the rule (via a CIDR match) or via a (non-domain based) NetworkSet. Matching on source has little
+utility since the IP will always be the egress gateway and the port of translated traffic is not always preserved.
+
+:::note
+
+Since v3.15.0, $[prodname] also sends health probes to the egress gateway pods from the nodes where
+their clients are located. In iptables mode, this traffic is auto-allowed at egress from the host and ingress
+to the egress gateway. In eBPF mode, the probe traffic can be blocked by policy, so you must ensure that this traffic is allowed; this should be fixed in an upcoming
+patch release.
+
+:::
+
+## Upgrade egress gateways
+
+From v3.16, egress gateway deployments are managed by the Tigera Operator.
+
+- When upgrading from a pre-v3.16 release, no automatic upgrade will occur. To upgrade a pre-v3.16 egress gateway deployment,
+ create an equivalent EgressGateway resource with the same namespace and the same name as mentioned [above](#deploy-a-group-of-egress-gateways);
+ the operator will then take over management of the old Deployment resource, replacing it with the upgraded version.
+
+- Use `kubectl apply` to create the egress gateway resource. Tigera Operator will read the newly created resource and wait
+ for the other $[prodname] components to be upgraded. Once the other $[prodname] components are upgraded, Tigera Operator
+ will upgrade the existing egress gateway deployment with the new image.
+
+By default, upgrading egress gateways will sever any connections that are flowing through them. To minimise impact,
+the egress gateway feature supports some advanced options that give feedback to affected pods. For more details see
+the [egress gateway maintenance guide](egress-gateway-maintenance.mdx).
+
+## Additional resources
+
+Please see also:
+
+- The `egressIP...` and `aws...` fields of the [FelixConfiguration resource](../../reference/resources/felixconfig.mdx#spec).
+- [Troubleshooting egress gateways](troubleshoot.mdx).
+- [Additional configuration for egress gateway maintenance](egress-gateway-maintenance.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-azure.mdx b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-azure.mdx
new file mode 100644
index 0000000000..166e385eb7
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-azure.mdx
@@ -0,0 +1,775 @@
+---
+description: Route selected application traffic out of a Calico Cloud connected cluster through egress gateways with native Azure VNet IPs.
+---
+
+# Configure egress gateways, Azure
+
+import Tabs from '@theme/Tabs';
+import TabItem from '@theme/TabItem';
+
+## Big picture
+
+Control the source IP address seen by external services/appliances by routing the traffic from certain pods
+through egress gateways. Use native VNet subnet IP addresses for the egress gateways so that the IPs are valid in the Azure fabric.
+
+## Value
+
+Controlling the source IP seen when traffic leaves the cluster allows groups of pods to be identified
+by external firewalls, appliances and services (even as the groups are scaled up/down or pods restarted).
+$[prodname] controls the source IP by directing traffic through one or more "egress gateway" pods, which
+change the source IP of the traffic to their own IP. The egress gateways used can be chosen at the pod or namespace
+scope allowing for flexibility in how the cluster is seen from outside.
+
+In Azure, egress gateway source IP addresses are chosen from an arbitrary user-defined IP pool
+using $[prodname] IPAM. egress gateway pods use dedicated IPPools to use as source IP addresses, which enables static configuration
+of external appliances.
+
+## Concepts
+
+### Egress gateway
+
+An egress gateway acts as a transit pod for the outbound application traffic that is configured to
+use it. As traffic leaving the cluster passes through the egress gateway, its source IP is changed
+to that of the egress gateway pod, and the traffic is then forwarded on.
+
+### Source IP
+
+When an outbound application flow leaves the cluster, its IP packets will have a source IP.
+This begins as the pod IP of the pod that originated the flow, then:
+
+- _If no egress gateway is configured_ and the pod IP came from an [IP pool](../../reference/resources/ippool.mdx)
+with `natOutgoing: true`, the node hosting the pod will change the source IP to its own as the
+traffic leaves the host. This allows the pod to communicate with external service even though the
+external network is unaware of the pod's IP.
+
+- _If the pod is configured with an egress gateway_, the traffic is first forwarded to the egress gateway, which
+changes the source IP to its own and then sends the traffic on. To function correctly, egress gateways
+should have IPs from an IP pool with `natOutgoing: false`, meaning their host forwards the packet onto
+the network without changing the source IP again. Since the egress gateway's IP is visible to
+the underlying network fabric, the fabric must be configured to know about the egress gateway's
+IP and to send response traffic back to the same host.
+
+### Azure VNets and subnets
+
+An Azure VNet is a virtual network that is, by default, logically isolated from other VNets. Each VNet has one or more
+(often large) CIDR blocks associated with it (for example `10.0.0.0/16`). In general, VNet CIDRs may overlap, but only
+if the VNets remain isolated. Azure allows VNets to be peered with each other through VNet Peerings. VNets can only be
+peered if *none* of their associated CIDRs overlap.
+
+Each VNet has one or more VNet subnets associated with it, each subnet owns a non-overlapping part of one of the
+VNet's CIDR blocks. VNet subnets span all availability zones in a region, so it is possible to distribute egress gateway
+resources across availability zones in a region without the need to repeat the configuration per-AZ.
+
+### Azure VNet and ExpressRoute peerings
+
+Azure [VNet Peerings](https://learn.microsoft.com/en-us/azure/virtual-network/virtual-network-peering-overview) allow multiple VNets to be
+connected together. Similarly, [ExpressRoute](https://learn.microsoft.com/en-us/azure/expressroute/expressroute-introduction)
+allows external datacenters to be connected to an Azure VNet. Peered VPCs and datacenters communicate using private IPs
+as if they were all on one large private network.
+
+By advertising routes to Azure fabric using Azure Route Servers, egress gateways can be assigned private IPs allowing them to
+communicate without NAT within the same VPC, with peered VPCs, and, with peered datacenters.
+
+### Azure Route Server
+
+Azure [Route Server](https://learn.microsoft.com/en-us/azure/route-server/) is a managed networking service that allows
+a network virtual appliance, like $[prodname], to dynamically configure Azure fabric by exchanging routing information
+using Border Gateway Protocol (BGP). $[prodname] can establish BGP sessions with an Azure Route Server in a VNet
+to advertise the IPs of egress gateways to that VNet. The learned routes are then propagated to the rest of VNets through
+VNet peering, or to external datacenters through ExpressRoute, allowing communication with egress gateway.
+
+## Before you begin
+
+**Required**
+
+- Calico CNI
+- Open port UDP 4790 on the host
+
+**Not Supported**
+
+- Azure VNet CNI
+
+$[prodname] CNI and IPAM are required. The ability to control the egress gateway’s IP is a feature of $[prodname] CNI and IPAM. Azure VNet CNI does not support that feature, so it is incompatible with egress gateways.
+
+## How to
+
+- [Choose route reflectors](#choose-route-reflectors)
+- [Create Azure Route Server](#create-azure-route-server)
+- [Disable the default BGP node-to-node mesh](#disable-the-default-bgp-node-to-node-mesh)
+- [Enable BGP](#enable-bgp)
+- [Provision an egress IP pool](#provision-an-egress-ip-pool)
+- [(Optional) Limit number of route advertisement](#optional-limit-number-of-route-advertisements)
+- [Configure route reflector](#configure-route-reflectors)
+- [Enable egress gateway support](#enable-egress-gateway-support)
+- [Deploy a group of egress gateways](#deploy-a-group-of-egress-gateways)
+- [Configure iptables backend for egress gateways](#configure-iptables-backend-for-egress-gateways)
+- [Configure namespaces and pods to use egress gateways](#configure-namespaces-and-pods-to-use-egress-gateways)
+- [(Optional) Enable ECMP load balancing](#optional-enable-ecmp-load-balancing)
+- [Verify the feature operation](#verify-the-feature-operation)
+- [Control the use of egress gateways](#control-the-use-of-egress-gateways)
+- [Policy enforcement for flows via an egress gateway](#policy-enforcement-for-flows-via-an-egress-gateway)
+
+### Choose route reflectors
+
+It is possible to establish BGP connections between all $[prodname] nodes and Azure Route Servers, but
+to avoid hitting Azure Route Server peers [limit](https://learn.microsoft.com/en-us/azure/route-server/overview#route-server-limits),
+it is better to select some nodes as route reflectors and set up BGP connections between those and Azure Route Server.
+The number of route reflectors depends on the cluster size, but it is recommended to have at least 3 at all times,
+and Azure Route Servers supports up to 8 peers in a VNet.
+
+### Create Azure Route Server
+
+Deploy Azure [Route Server](https://learn.microsoft.com/en-us/azure/route-server/) in the VNet (hub or spoke VNet) that routes
+egress addresses. Then, add the selected route reflectors as peers to the Azure Route Server.
+
+:::note
+
+- The BGP connections between Calico route reflectors and Azure Route Servers are critical for the functionality
+of egress gateways. It is important to maintain route reflectors with care, and to make sure there are always
+enough healthy route reflectors.
+- If possible, assign a static address to the route reflectors so after reboots the same address is kept.
+- In AKS, it is [recommended](https://learn.microsoft.com/en-us/azure/aks/use-system-pools?tabs=azure-cli#system-and-user-node-pools)
+to run applications in user node pools and leave system node pools for running critical system pods.
+The nodes in system node pools are perfect Route Reflector candidates.
+
+:::
+
+### Disable the default BGP node-to-node mesh
+
+The default $[prodname] **node-to-node BGP mesh** may be turned off to enable other BGP topologies.
+To do this, modify the default **BGP configuration** resource.
+
+Run the following command to disable the BGP full-mesh:
+
+```bash
+kubectl apply -f - < projectcalico.org/RouteReflectorClusterID=244.0.0.1
+```
+
+Typically, you will want to label this node to indicate that it is a route reflector, allowing it to be easily selected by a BGPPeer resource. You can do this with kubectl. For example:
+
+```bash
+kubectl label node route-reflector=true
+```
+
+Now it is easy to configure route reflector nodes to peer with each other and other non-route-reflector nodes using label selectors. For example:
+
+```yaml
+kind: BGPPeer
+apiVersion: projectcalico.org/v3
+metadata:
+ name: peer-with-route-reflectors
+spec:
+ nodeSelector: all()
+ peerSelector: route-reflector == 'true'
+```
+
+Finally, Add the IP addresses of Azure Route Servers, usually there are two, as peers to route reflectors. For example, if the $[prodname]
+cluster is in a subnet with 10.224.0.0 as network address, the 10.224.0.1 is, [by definition](https://learn.microsoft.com/en-us/azure/virtual-network/virtual-networks-faq#are-there-any-restrictions-on-using-ip-addresses-within-these-subnets), the gateway and Azure Route Servers are deployed with
+ASN 65515 and IP addresses of 10.225.0.4 and 10.225.0.5, create two **BGPPeer** resources:
+
+```yaml
+apiVersion: projectcalico.org/v3
+kind: BGPPeer
+metadata:
+ name: azure-route-server-a
+spec:
+ peerIP: 10.225.0.4
+ reachableBy: 10.224.0.1
+ asNumber: 65515
+ keepOriginalNextHop: true
+ nodeSelector: route-reflector == 'true'
+ filters:
+ - export-egress-ips
+---
+apiVersion: projectcalico.org/v3
+kind: BGPPeer
+metadata:
+ name: azure-route-server-b
+spec:
+ peerIP: 10.225.0.5
+ reachableBy: 10.224.0.1
+ asNumber: 65515
+ keepOriginalNextHop: true
+ nodeSelector: route-reflector == 'true'
+ filters:
+ - export-egress-ips
+```
+
+:::note
+
+- Adding `routeReflectorClusterID` to a node spec will remove it from the node-to-node mesh immediately, tearing down the
+existing BGP sessions. Adding the BGP peering will bring up new BGP sessions. This will cause a short (about 2 seconds)
+disruption to data plane traffic of workloads running in the nodes where this happens. To avoid this, make sure no
+workloads are running on the nodes, by provisioning new nodes or by running `kubectl drain` on the node (which may
+itself cause a disruption as workloads are drained).
+- It is important to set `keepOriginalNextHop: true` since route reflectors advertise routes on behalf of other nodes.
+Advertised routes to Azure Route Servers should have the original next hop otherwise the return packets will be sent to
+route reflectors, and get dropped.
+- It is mandatory to set `reachableBy` field set to the gateway of the subnet $[prodname] cluster is running in for
+peering with Azure Route Servers to prevent BGP connection flapping. See [BGP peer](../../reference/resources/bgppeer.mdx) for more information.
+- Including `filters` to apply the BGP filter configured in the previous section, is optional.
+:::
+
+### Enable egress gateway support
+
+In the default **FelixConfiguration**, set the `egressIPSupport` field to `EnabledPerNamespace` or
+`EnabledPerNamespaceOrPerPod`, according to the level of support that you need in your cluster. For
+support on a per-namespace basis only:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"egressIPSupport":"EnabledPerNamespace"}}'
+```
+
+Or for support both per-namespace and per-pod:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"egressIPSupport":"EnabledPerNamespaceOrPerPod"}}'
+```
+
+:::note
+
+- `egressIPSupport` must be the same on all cluster nodes, so you should set them only in the `default` FelixConfiguration resource.
+- The operator automatically enables the required policy sync API in the FelixConfiguration.
+
+:::
+
+### Deploy a group of egress gateways
+
+Use a Kubernetes Deployment to deploy a group of egress gateways.
+
+Using the example of the "red" egress gateway cluster, we use several features of Kubernetes and $[prodname]
+in tandem to get a cluster of egress gateways that uses the user defined IP addresses:
+
+```bash
+kubectl apply -f - <
+# -
+# timeoutSeconds: 15
+# intervalSeconds: 5
+# httpProbe:
+# urls:
+# -
+# -
+# timeoutSeconds: 30
+# intervalSeconds: 10
+ template:
+ metadata:
+ labels:
+ egress-code: red
+ spec:
+ terminationGracePeriodSeconds: 0
+ nodeSelector:
+ kubernetes.io/os: linux
+ topologySpreadConstraints:
+ - maxSkew: 1
+ topologyKey: topology.kubernetes.io/zone
+ whenUnsatisfiable: DoNotSchedule
+ labelSelector:
+ matchLabels:
+ egress-code: red
+EOF
+```
+
+* `replicas: 2` tells Kubernetes to schedule two egress gateways in the "red" cluster.
+
+* This annotation tells $[prodname] IPAM to use one of the "egress-ip-red-pool" IP pool.
+
+External services and appliances can recognise "red" traffic because it will all come from the CIDRs of the "red"
+IP pool.
+
+* The following [topology spread constraint](https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/)
+ensures that Kubernetes spreads the Egress gateways evenly between AZs (assuming that your nodes are labeled with
+the expected [well-known label](https://kubernetes.io/docs/reference/labels-annotations-taints/#topologykubernetesiozone)
+`topology.kubernetes.io/zone`):
+
+```yaml
+topologySpreadConstraints:
+- maxSkew: 1
+ topologyKey: topology.kubernetes.io/zone
+ whenUnsatisfiable: DoNotSchedule
+ labelSelector:
+ matchLabels:
+ egress-code: red
+ ```
+
+* The labels are arbitrary. You can choose whatever names and values are convenient for your cluster's Namespaces and Pods to refer to in their egress selectors.
+If labels are not specified, a default label `projectcalico.org/egw`:`name` will be added by the Tigera Operator.
+
+* icmpProbe may be used to specify the Probe IPs, ICMP interval and timeout in seconds. `ips` if set, the
+egress gateway pod will probe each IP periodically using an ICMP ping. If all pings fail then the egress
+gateway will report non-ready via its health port. `intervalSeconds` controls the interval between probes.
+`timeoutSeconds` controls the timeout before reporting non-ready if no probes succeed.
+
+```yaml
+icmpProbe:
+ ips:
+ -
+ -
+ timeoutSeconds: 20
+ intervalSeconds: 10
+ ```
+
+* httpProbe may be used to specify the Probe URLs, HTTP interval and timeout in seconds. `urls` if set, the
+egress gateway pod will probe each external service periodically. If all probes fail then the egress
+gateway will report non-ready via its health port. `intervalSeconds` controls the interval between probes.
+`timeoutSeconds` controls the timeout before reporting non-ready if all probes are failing.
+
+```yaml
+httpProbe:
+ urls:
+ -
+ -
+ timeoutSeconds: 30
+ intervalSeconds: 10
+ ```
+- Please refer to the [operator reference docs](../../reference/installation/api.mdx) for details about the egress gateway resource type.
+
+:::note
+
+* It is advisable to have more than one egress gateway per group, so that the egress IP function
+continues if one of the gateways crashes or needs to be restarted. When there are multiple
+gateways in a group, outbound traffic from the applications using that group is load-balanced
+across the available gateways. The number of `replicas` specified must be less than or equal
+to the number of free IP addresses in the IP Pool.
+
+* IPPool can be specified either by its name (e.g. `-name: egress-ip-red-pool`) or by its CIDR (e.g. `-cidr: 10.10.10.0/30`).
+
+* The labels are arbitrary. You can choose whatever names and values are convenient for
+your cluster's Namespaces and Pods to refer to in their egress selectors.
+
+The health port `8080` is used by:
+
+* The Kubernetes `readinessProbe` to expose the status of the egress gateway pod (and any ICMP/HTTP probes).
+
+* Remote pods to check if the egress gateway is "ready". Only "ready" egress
+gateways will be used for remote client traffic. This traffic is automatically allowed by $[prodname] and
+no policy is required to allow it. $[prodname] only sends probes to egress gateway pods that have a named
+"health" port. This ensures that during an upgrade, health probes are only sent to upgraded egress gateways.
+:::
+
+### Configure iptables backend for egress gateways
+
+The Tigera Operator configures egress gateways to use the same iptables backend as `calico-node`.
+To modify the iptables backend for egress gateways, you must change the `iptablesBackend` field in the [Felix configuration](../../reference/resources/felixconfig.mdx).
+
+### Configure namespaces and pods to use egress gateways
+
+You can configure namespaces and pods to use an egress gateway by:
+* annotating the namespace or pod
+* applying an egress gateway policy to the namespace or pod.
+
+Using an egress gateway policy is more complicated, but it allows advanced use cases.
+
+#### Configure a namespace or pod to use an egress gateway (annotation method)
+
+In a $[prodname] deployment, the Kubernetes namespace and pod resources honor annotations that
+tell that namespace or pod to use particular egress gateways. These annotations are selectors, and
+their meaning is "the set of pods, anywhere in the cluster, that match those selectors".
+
+So, to configure all the pods in a namespace to use the egress gateways that are
+labelled with `egress-code: red`, you would annotate that namespace like this:
+
+```bash
+kubectl annotate ns egress.projectcalico.org/selector="egress-code == 'red'"
+```
+
+By default, that selector can only match egress gateways in the same namespace. To select gateways
+in a different namespace, specify a `namespaceSelector` annotation as well, like this:
+
+```bash
+kubectl annotate ns egress.projectcalico.org/namespaceSelector="kubernetes.io/metadata.name == 'default'"
+```
+
+Egress gateway annotations have the same [syntax and range of expressions](../../reference/resources/networkpolicy.mdx#selector) as the selector fields in
+$[prodname] [network policy](../../reference/resources/networkpolicy.mdx#entityrule).
+
+To configure a specific Kubernetes Pod to use egress gateways, specify the same annotations when
+creating the pod. For example:
+
+```bash
+kubectl apply -f - < egress.projectcalico.org/egressGatewayPolicy="egw-policy1"
+```
+
+To configure a specific Kubernetes pod to use the same policy, specify the same annotations when
+creating the pod.
+For example:
+
+```bash
+kubectl apply -f - <
+spec:
+ containers:
+ - name: alpine
+ image: alpine
+ command: ["/bin/sleep"]
+ args: ["infinity"]
+EOF
+```
+
+Now you can use `kubectl exec` to initiate an outbound connection from that pod:
+
+```bash
+kubectl exec -n -- nc 8089 ` should be the IP address of the netcat server.
+
+Then, if you check the logs or output of the netcat server, you should see:
+
+```
+Connection from received
+```
+
+with `` being one of the IPs of the egress IP pool that you provisioned.
+
+### Control the use of egress gateways
+
+If a cluster ascribes special meaning to traffic flowing through egress gateways, it will be
+important to control when cluster users can configure their pods and namespaces to use them, so that
+non-special pods cannot impersonate the special meaning.
+
+If namespaces in a cluster can only be provisioned by cluster admins, one option is to enable egress
+gateway function only on a per-namespace basis. Then only cluster admins will be able to configure
+any egress gateway usage.
+
+Otherwise -- if namespace provisioning is open to users in general, or if it's desirable for egress
+gateway function to be enabled both per-namespace and per-pod -- a [Kubernetes admission controller](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/)
+ will be
+needed. This is a task for each deployment to implement for itself, but possible approaches include
+the following.
+
+1. Decide whether a given Namespace or Pod is permitted to use egress annotations at all, based on
+other details of the Namespace or Pod definition.
+
+1. Evaluate egress annotation selectors to determine the egress gateways that they map to, and
+decide whether that usage is acceptable.
+
+1. Impose the cluster's own bespoke scheme for a Namespace or Pod to identify the egress gateways
+that it wants to use, less general than $[prodname]'s egress annotations. Then the
+admission controller would police those bespoke annotations (that that cluster's users could
+place on Namespace or Pod resources) and either reject the operation in hand, or allow it
+through after adding the corresponding $[prodname] egress annotations.
+
+#### Policy enforcement for flows via an egress gateway
+
+For an outbound connection from a client pod, via an egress gateway, to a destination outside the
+cluster, there is more than one possible enforcement point for policy:
+
+The path of the traffic through policy is as follows:
+
+1. Packet leaves the client pod and passes through its egress policy.
+2. The packet is encapsulated by the client pod's host and sent to the egress gateway
+3. The encapsulated packet is sent from the host to the egress gateway pod.
+4. The egress gateway pod de-encapsulates the packet and sends the packet out again with its own address.
+5. The packet leaves the egress gateway pod through its egress policy.
+
+To ensure correct operation, (as of v3.15) the encapsulated traffic between host and egress gateway is auto-allowed by
+$[prodname] and other ingress traffic is blocked. That means that there are effectively two places where
+policy can be applied:
+
+1. on egress from the client pod
+2. on egress from the egress gateway pod (see limitations below).
+
+The policy applied at (1) is the most powerful since it implicitly sees the original source of the traffic (by
+virtue of being attached to that original source). It also sees the external destination of the traffic.
+
+Since an egress gateway will never originate its own traffic, one option is to rely on policy applied at (1) and
+to allow all traffic to at (2) (either by applying no policy or by applying an "allow all").
+
+Alternatively, for maximum "defense in depth" applying policy at both (1) and (2) provides extra protection should
+the policy at (1) be disabled or bypassed by an attacker. Policy at (2) has the following limitations:
+
+- [Domain-based policy](../../network-policy/domain-based-policy.mdx) is not supported at egress from egress
+gateways. It will either fail to match the expected traffic, or it will work intermittently if the egress gateway
+happens to be scheduled to the same node as its clients. This is because any DNS lookup happens at the client pod.
+By the time the policy reaches (2) the DNS information is lost and only the IP addresses of the traffic are available.
+
+- The traffic source will appear to be the egress gateway pod, the source information is lost in the address
+translation that occurs inside the egress gateway pod.
+
+That means that policies at (2) will usually take the form of rules that match only on destination port and IP address,
+either directly in the rule (via a CIDR match) or via a (non-domain based) NetworkSet. Matching on source has little
+utility since the IP will always be the egress gateway and the port of translated traffic is not always preserved.
+
+:::note
+
+Since v3.15.0, $[prodname] also sends health probes to the egress gateway pods from the nodes where their clients are located.
+In iptables mode, this traffic is auto-allowed at egress from the host and ingress to the egress gateway.
+In eBPF mode, the probe traffic can be blocked by policy, so you must ensure that this traffic is allowed.
+
+:::
+
+## Additional resources
+
+Please see also:
+
+- [Configure egress gateways, on-premises](egress-gateway-on-prem.mdx)
+- [Troubleshooting egress gateways](troubleshoot.mdx).
+- [Additional configuration for egress gateway maintenance](egress-gateway-maintenance.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-host-ip.mdx b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-host-ip.mdx
new file mode 100644
index 0000000000..a63d87fb51
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-host-ip.mdx
@@ -0,0 +1,128 @@
+---
+description: Configure egress gateways to use the host node IP as the source address for traffic leaving the cluster.
+---
+
+# Configure egress gateways with host IP support
+
+## Big picture
+
+Configure an existing egress gateway deployment so that traffic exiting through it appears to come
+from the **host address** of the host running the gateway pod, rather than the gateway's pod IP.
+
+## Value
+
+External firewalls and services often allowlist traffic by source IP. When egress gateway pod IPs
+are not routable outside the cluster or simply not convenient to manage using the gateway's
+**host address** as the source address gives external systems a stable, well-known set of IPs to
+allowlist.
+
+Any number of application pods can multiplex their outbound traffic through a small fixed set of
+egress gateways, and all of those connections will appear to come from the gateways' host address.
+
+:::note
+
+Host IP mode is most commonly used with the [on-premises setup](egress-gateway-on-prem.mdx), where
+the alternative source IP would be a non-routable pod IP. On [AWS](egress-gateway-aws.mdx) and
+[Azure](egress-gateway-azure.mdx) setups, gateways already use native VPC/VNet IPs that are
+routable on the underlying network - enabling host IP mode there replaces those native IPs with
+the host address.
+
+:::
+
+## Concepts
+
+### Source IP and `natOutgoing`
+
+When an outbound application flow leaves the cluster through an egress gateway, the source IP seen
+by external services depends on the `natOutgoing` setting of the egress gateway's
+[IP pool](../../reference/resources/ippool.mdx):
+
+- `natOutgoing: false` - the flow's source IP is the egress gateway's **pod IP**. This
+ is the default for all egress gateway setup guides.
+- `natOutgoing: true` - the flow's source IP is the **host address** of the node where the egress
+ gateway pod is running.
+
+## Before you begin
+
+These instructions require a functioning egress gateway deployment.
+For setup, see [our egress gateway guides](index.mdx).
+
+## How to
+
+- [Enable natOutgoing on the egress IP pool](#enable-host-ip-mode-on-the-egress-ip-pool)
+- [Pin egress gateways to specific nodes](#pin-egress-gateways-to-specific-nodes)
+- [Affine client pods to a specific node](#affine-client-pods-to-a-specific-node)
+- [Verify the source IP](#verify-the-source-ip)
+
+### Enable natOutgoing on the egress IP pool
+
+Set `natOutgoing: true` on the IP pool used by your egress gateways:
+
+```bash
+kubectl patch ippool egress-ippool-1 --type='merge' -p '{"spec":{"natOutgoing":true}}'
+```
+
+Outbound traffic leaving the cluster through a gateway in this pool will now be SNAT'd to the node
+IP of the gateway's host, instead of the gateway's pod IP.
+
+### Pin egress gateways to specific nodes
+
+The source IP that external services see depends on which node the gateway pod is
+scheduled to. To make this deterministic, set a `nodeSelector` on the gateway template:
+
+```bash
+kubectl patch egressgateway egress-gateway -n default --type='merge' -p \
+ '{"spec":{"template":{"spec":{"nodeSelector":{"kubernetes.io/hostname":""}}}}}'
+```
+
+Traffic passing through this gateway will exit the cluster with that node's IP as the
+source address.
+
+Without pinning, the source IP will still be a node IP, but it could be any node the gateway
+happens to land on.
+
+### Affine client pods to a specific node
+
+This step is optional. If you want a particular client's traffic to deterministically exit through
+a particular node's IP, schedule the client to the same node as a gateway and apply an
+[EgressGatewayPolicy](egress-gateway-on-prem.mdx#configure-a-namespace-or-pod-to-use-an-egress-gateway-egress-gateway-policy-method)
+with `gatewayPreference: PreferNodeLocal`. The client will then prefer the gateway on its own node,
+ensuring traffic exits with that node's IP.
+
+For example, to pin a workload to a specific node, add a `nodeSelector` to its pod spec:
+
+```yaml
+spec:
+ nodeSelector:
+ kubernetes.io/hostname:
+```
+
+### Verify the source IP
+
+Identify the node hosting the egress gateway:
+
+```bash
+kubectl get pod -l egress-code=red -o wide
+```
+
+Note the value in the `NODE` column, then look up that node's InternalIP:
+
+```bash
+kubectl get node -o jsonpath='{.status.addresses[?(@.type=="InternalIP")].address}'
+```
+
+Initiate an outbound connection from one of your client pods to a server outside the cluster, and
+observe the source IP on the server. With host IP mode, it should match the node's InternalIP
+above -- not the egress gateway's pod IP or any IP from the egress IP pool.
+
+:::note
+
+For return traffic to reach the gateway, the external server must know how to route to the egress
+gateway's node IP.
+
+:::
+
+## Additional resources
+
+- [Egress gateway maintenance](egress-gateway-maintenance.mdx)
+- [FelixConfiguration `egressIP...` fields](../../reference/resources/felixconfig.mdx#spec)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-maintenance.mdx b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-maintenance.mdx
new file mode 100644
index 0000000000..97344c7e5b
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-maintenance.mdx
@@ -0,0 +1,337 @@
+---
+description: Reduce egress gateway downtime impact on long-lived TCP sessions in Calico Cloud connected clusters by reading termination annotations and draining gracefully.
+---
+
+# Optimize egress networking for workloads with long-lived TCP connections
+
+## Big picture
+
+React to egress gateway maintenance windows and minimize the impact of egress gateway downtime on sensitive workloads
+
+## Value
+
+While most workloads benefit from the reduced downtime associated with increased replicas, there are some specific cases where increasing your number of egress gateways will not have as significant an effect on availability.
+
+One area where this applies is when your workloads must maintain long-lived TCP connections that are coupled to higher-level abstractions, such as database sessions, transactions, or similar. In these environments, if an egress gateway becomes unavailable, these long-lived sessions may close. Data may need to be retransmitted. And in some cases, data may be lost.
+
+## Before you begin
+
+These features require you to have configured a functioning egress gateway deployment in a cluster. For more information on deploying egress gateways, [see our other egress gateway guides](index.mdx)
+
+## How to
+
+- [Observe gateway maintenance impact](#observe-gateway-maintenance-impact)
+- [Expose gateway maintenance annotations to your application](#expose-gateway-maintenance-annotations-to-your-application)
+- [Reduce the impact of gateway downtime](#reduce-the-impact-of-gateway-downtime)
+
+### Observe gateway maintenance impact
+
+A number of egress-related annotations are automatically added to your workloads when an egress gateway they use is in the "terminating" phase. These annotations will outline _which_ gateway is about to terminate, _when it began terminating_, and _when it will fully terminate_. This information can prove useful for conducting non-disruptive maintenance on your cluster, as it means any planned termination of egress pods will be communicated to dependent workloads.
+
+Before we can observe these annotations, we must first configure a _termination grace period_ for our egress gateways. The termination grace period prolongs an egress gateway's termination phase, giving us a window to react to the termination. Without configuring the grace period, we would have a zero-second window to react to gateway termination.
+
+#### Add a termination grace period to egress gateway replicas
+
+To widen our maintenance window, we can adjust the `terminationGracePeriodSeconds` field on our egress gateway pods. The amount of time we set for the termination grace period will dictate how much time a dependent workload has to prepare for a gateway going down.
+
+Let's add a termination grace period of 60 seconds to all pods in our egress gateway deployment, so that our egress-dependent workloads have a wider window to react:
+
+```sh
+$ patch a termination grace period of 60s into egress gateway deployment
+$ kubectl get deploy
+NAME READY UP-TO-DATE AVAILABLE AGE
+egress-gateway 2/2 2 2 16m
+
+$ patch our deployment with a 60-second termination grace period
+$ kubectl patch deploy egress-gateway --type=merge -p '{"spec": {"template": {"spec": {"terminationGracePeriodSeconds": 60}}}}'
+deployment.apps/egress-gateway patched
+
+$ wait for change to rollout
+$ kubectl rollout status deploy/egress-gateway
+```
+
+:::note
+
+- Making the above alterations to an egress gateway deployment will trigger a new rollout - you can monitor the rollout status with `kubectl rollout status deploy/`
+- If your rollout seems to have stalled and egress gateway pods are stuck on "ContainerCreating" phase, it's possible the deployment's IPPool has been exhausted. You can check if this is the case by inspecting a stuck pod with `kubectl describe pod `
+
+:::
+
+#### Inspect workload annotations
+
+Once the updated egress gateway deployment rolls out, we're ready to observe the gateway maintenance annotations $[prodname] adds to your dependent workloads. Let's simulate cluster maintenance by deleting an egress gateway pod. It should take 60 seconds to terminate - the amount of time defined by `terminationGracePeriodSeconds`.
+
+```sh
+$ show pods in default namespace - two egress gateway pods and one application pod using them.
+$ kubectl get pods -o wide
+
+NAME READY STATUS RESTARTS AGE IP
+application-with-long-lived-connections 1/1 Running 0 20m 192.168.192.210
+egress-gateway-6576ccdf66-fxdvh 1/1 Running 0 3m 10.10.10.1
+egress-gateway-6644fbb56b-5xbh2 1/1 Running 0 3m 10.10.10.0
+
+$ delete one of the egress gateways being used by the application pod - do not block waiting for termination to finish
+$ kubectl delete pod egress-gateway-6576ccdf66-fxdvh --wait=false
+pod "egress-gateway-6576ccdf66-fxdvh" deleted
+```
+
+The gateway we just deleted should now wait in the "terminating" phase until its termination grace period expires, at-which point it will be deleted. If our application pod depends on the terminating egress gateway, we'll see gateway maintenance annotations added to the dependent application pod automatically, outlining what gateway is going down, when it began terminating, and when it will be deleted:
+
+```sh
+$ observe the annotations added to the dependent application pod
+$ kubectl get pod application-with-long-lived-connections -o yaml
+apiVersion: v1
+kind: Pod
+metadata:
+ annotations:
+ ...
+ egress.projectcalico.org/gatewayMaintenanceFinishedTimestamp: "2022-04-19T16:00:18Z"
+ egress.projectcalico.org/gatewayMaintenanceGatewayIP: 10.10.10.1
+ egress.projectcalico.org/gatewayMaintenanceStartedTimestamp: "2022-04-19T15:59:18Z"
+...
+```
+
+Success! Our workload's annotations mark a 60-second maintenance window for the gateway we terminated, indicating when the egress gateway began terminating, and when it will fully terminate.
+
+:::note
+
+- Adjusting egress deployments, say, by modifying the `terminationGracePeriodSeconds` field, will trigger a new rollout.
+- Egress pods terminating due to a new rollout will behave the same as if they were deleted for maintenance - dependent workloads will receive gateway maintenance annotations, and gateway pods will terminate after their termination grace period has elapsed.
+- Deleting an egress gateway in a way that overrides the termination grace period, say, by using `kubectl delete pod my-pod --grace-period=0`, will result in the gateway going down immediately, and dependent workloads will not have any time to react to the termination.
+
+:::
+
+
+
+### Expose gateway maintenance annotations to your application
+
+While the presence of gateway maintenance annotations may be useful to a cluster administrator inspecting pods, it's not quite enough if our workload wishes to react to terminating egress gateways, say, by restarting its session gracefully before loss of connectivity.
+
+The [Kubernetes downward API](https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#the-downward-api) provides a means of exposing pod information [as files](https://kubernetes.io/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/#store-pod-fields) or as [environment variables](https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/#use-pod-fields-as-values-for-environment-variables) within the pod. This value can then be polled by your workload, to react to changes as you see fit.
+
+Let's write a simple pod manifest that uses the downward API to expose maintenance annotations to the program running within:
+
+```yaml
+apiVersion: v1
+kind: Pod
+metadata:
+ annotations:
+ egress.projectcalico.org/selector: egress-code == 'red'
+ egress.projectcalico.org/namespaceSelector: kubernetes.io/metadata.name == 'default'
+ name: poll-my-own-annotations
+ namespace: default
+spec:
+ containers:
+ - name: application-container
+ image: k8s.gcr.io/busybox:1.24
+ command: ['sh', '-c']
+ args:
+ - while true; do
+ echo 'polling egress maintenance timestamp...';
+ if [[ -e /var/run/egress/gatewayMaintenanceStartedTimestamp ]]; then
+ echo -n 'gatewayMaintenanceStartedTimestamp has value "'; cat /var/run/egress/gatewayMaintenanceStartedTimestamp; echo -en '"\n';
+ fi;
+ sleep 3;
+ done;
+ volumeMounts:
+ - name: egress-maintenance-started
+ mountPath: /var/run/egress
+ volumes:
+ - name: egress-maintenance-started
+ downwardAPI:
+ items:
+ - path: 'gatewayMaintenanceStartedTimestamp'
+ fieldRef:
+ fieldPath: metadata.annotations['egress.projectcalico.org/gatewayMaintenanceStartedTimestamp']
+```
+
+This sample manifest will create a pod whose `gatewayMaintenanceStartedTimestamp` annotation is mounted to the file `/var/run/egress/gatewayMaintenanceStartedTimestamp`. The pod's main process is a script which polls the value of this file.
+
+After deleting an egress gateway this workload relies on, let's check its logs:
+
+```sh
+$ kubectl logs poll-my-own-annotations
+polling egress maintenance timestamp...
+gatewayMaintenanceStartedTimestamp has value ""
+polling egress maintenance timestamp...
+gatewayMaintenanceStartedTimestamp has value ""
+polling egress maintenance timestamp...
+gatewayMaintenanceStartedTimestamp has value ""
+polling egress maintenance timestamp...
+gatewayMaintenanceStartedTimestamp has value "2022-04-19T17:24:46Z"
+polling egress maintenance timestamp...
+gatewayMaintenanceStartedTimestamp has value "2022-04-19T17:24:46Z"
+```
+
+We can see above that our script saw the value of the mounted volume change at the same time what we terminated our egress gateway pod. This work can be further developed to propagate notifications to our production workloads, without any need for polling kubernetes itself.
+
+**Note**: It's not recommended to couple your production applications to a Kubernetes client for the purposes of polling pod information, as it could give an attacker greater privileges if successful in compromising a workload. Instead, use a method such as the downward API that fully decouples the program.
+
+
+
+### Reduce the impact of gateway downtime
+
+So far we have observed egress gateway maintenance windows, added a termination grace period to gateway pods, and propagated maintenance information directly to our workloads. Finally, we are going to look at the `maxNextHops` annotation, which is designed to limit the impact of a terminating egress gateway.
+
+Below is a sample kubernetes deployment which was adapted from the earlier annotation-aware pod manifest. The deployment has 3 replicas, and is configured to use egress gateways:
+
+```yaml
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: annotation-aware-workloads
+spec:
+ replicas: 3
+ selector:
+ matchLabels:
+ app: annotation-aware-workload
+ strategy:
+ rollingUpdate:
+ maxSurge: 25%
+ maxUnavailable: 25%
+ type: RollingUpdate
+ template:
+ metadata:
+ labels:
+ app: annotation-aware-workload
+ annotations:
+ egress.projectcalico.org/selector: egress-code == 'red'
+ egress.projectcalico.org/namespaceSelector: kubernetes.io/metadata.name == 'default'
+ spec:
+ containers:
+ - name: application-container
+ image: k8s.gcr.io/busybox:1.24
+ command: ['sh', '-c']
+ args:
+ - while true; do
+ echo "[${MY_POD_NAME}] polling egress maintenance timestamp...";
+ if [[ -e /var/run/egress/gatewayMaintenanceStartedTimestamp ]]; then
+ echo -n "[${MY_POD_NAME}] gatewayMaintenanceStartedTimestamp has value '"; cat /var/run/egress/gatewayMaintenanceStartedTimestamp; echo -en "'\n";
+ fi;
+ sleep 3;
+ done;
+ volumeMounts:
+ - name: egress-maintenance-started
+ mountPath: /var/run/egress
+ env:
+ - name: MY_POD_NAME
+ valueFrom:
+ fieldRef:
+ fieldPath: metadata.name
+ volumes:
+ - name: egress-maintenance-started
+ downwardAPI:
+ items:
+ - path: 'gatewayMaintenanceStartedTimestamp'
+ fieldRef:
+ fieldPath: metadata.annotations['egress.projectcalico.org/gatewayMaintenanceStartedTimestamp']
+```
+
+#### Observing the impact of egress gateway maintenance
+
+We now want to conduct maintenance on a particular node in our cluster, resulting in one of our egress gateways terminating. In this scenario, since our dependent applications' connections are load-balanced evenly across all available egress gateways, all of our application pods will receive a maintenance window annotation. If we have configured our applications to react to such a window, we will see them all react at once in a thundering herd:
+
+```sh
+$ begin the termination of an egress gateway pod
+$ kubectl delete pod egress-gateway-6576ccdf66-mtqzl --wait=false
+pod "egress-gateway-6576ccdf66-mtqzl" deleted
+
+$ lets collect logs from all pods in our maintenance-aware application deployment
+$ kubectl logs --selector=app=annotation-aware-workload
+[annotation-aware-workloads-7987f55c9f-f7mkq] polling egress maintenance timestamp...
+[annotation-aware-workloads-7987f55c9f-f7mkq] gatewayMaintenanceStartedTimestamp has value ''
+[annotation-aware-workloads-7987f55c9f-qtcs2] polling egress maintenance timestamp...
+[annotation-aware-workloads-7987f55c9f-qtcs2] gatewayMaintenanceStartedTimestamp has value ''
+[annotation-aware-workloads-7987f55c9f-z5x25] polling egress maintenance timestamp...
+[annotation-aware-workloads-7987f55c9f-z5x25] gatewayMaintenanceStartedTimestamp has value ''
+[annotation-aware-workloads-7987f55c9f-qtcs2] polling egress maintenance timestamp...
+[annotation-aware-workloads-7987f55c9f-qtcs2] gatewayMaintenanceStartedTimestamp has value '2022-04-20T12:24:34Z'
+[annotation-aware-workloads-7987f55c9f-f7mkq] polling egress maintenance timestamp...
+[annotation-aware-workloads-7987f55c9f-f7mkq] gatewayMaintenanceStartedTimestamp has value '2022-04-20T12:24:34Z'
+[annotation-aware-workloads-7987f55c9f-z5x25] polling egress maintenance timestamp...
+[annotation-aware-workloads-7987f55c9f-z5x25] gatewayMaintenanceStartedTimestamp has value '2022-04-20T12:24:34Z'
+```
+
+We can see in the above logs that all of our applications have been affected by the downtime of just a single egress gateway. In the worst case, this could lead to a window of downtime for the application, as all replicas scramble to restart their connections at once. To avoid this, lets use the `egress.projectcalico.org/maxNextHops` annotation to restrict the total number of gateways each application can depend on.
+
+#### Reducing the impact of egress gateway maintenance
+
+To place a limit on the number of egress gateways an application can depend on, annotate the application's pod with the `egress.projectcalico.org/maxNextHops` annotation. Alternatively, to limit all pods in a certain namespace, annotate that namespace. Let's annotate all pods in our sample deployment from earlier:
+
+```sh
+kubectl patch deploy annotation-aware-workloads --type=merge -p \
+'{"spec":
+ {"template":
+ {"metadata":
+ {"annotations":
+ {"egress.projectcalico.org/maxNextHops": "1"}
+ }
+ }
+ }
+}'
+```
+
+:::note
+
+- Either a _pod or a namespace_ can be annotated with `egress.projectcalico.org/maxNextHops`, however, the `egress.projectcalico.org/selector` annotation must also be present on the selected resource.
+- If annotating pods, the `egressIPSupport` Felixconfiguration option must be set to `EnabledPerNamespaceOrPerPod`.
+- If a pod's desired `maxNextHops` exceeds the total number of available egress gateways, scaling up the egress gateway deployment will result in the pod's egress networking updating until the desired number of gateways are being used.
+- In all other cases, the `maxNextHops` annotation only takes effect at the time a pod is created. To ensure a pod's egress networking remains functional for its entire lifecycle, modifications to `maxNextHops` after a pod's creation will have no effect. For this reason, it's recommended that any egress gateway deployments have been scaled prior to deploying dependent workloads.
+
+:::
+
+After our patched sample deployment has been fully rolled out, each application pod should now depend on at most one egress gateway replica. Let's bring down another egress gateway pod and monitor our application logs:
+
+```sh
+$ begin the termination of an egress gateway pod
+$ kubectl delete pod egress-gateway-6576ccdf66-c42v7 --wait=false
+pod "egress-gateway-6576ccdf66-c42v7" deleted
+
+$ collect logs from each application pod
+$ kubectl logs --selector=app=annotation-aware-workload
+[annotation-aware-workloads-565b6855b9-tjvqr] polling egress maintenance timestamp...
+[annotation-aware-workloads-565b6855b9-tjvqr] gatewayMaintenanceStartedTimestamp has value ''
+[annotation-aware-workloads-565b6855b9-s44pt] polling egress maintenance timestamp...
+[annotation-aware-workloads-565b6855b9-s44pt] gatewayMaintenanceStartedTimestamp has value ''
+[annotation-aware-workloads-565b6855b9-46cw5] polling egress maintenance timestamp...
+[annotation-aware-workloads-565b6855b9-46cw5] gatewayMaintenanceStartedTimestamp has value ''
+[annotation-aware-workloads-565b6855b9-tjvqr] polling egress maintenance timestamp...
+[annotation-aware-workloads-565b6855b9-tjvqr] gatewayMaintenanceStartedTimestamp has value '2022-04-20T12:53:32Z'
+[annotation-aware-workloads-565b6855b9-s44pt] polling egress maintenance timestamp...
+[annotation-aware-workloads-565b6855b9-s44pt] gatewayMaintenanceStartedTimestamp has value ''
+[annotation-aware-workloads-565b6855b9-46cw5] polling egress maintenance timestamp...
+[annotation-aware-workloads-565b6855b9-46cw5] gatewayMaintenanceStartedTimestamp has value ''
+```
+
+We can see from the above logs that only a single application pod has now been affected by the terminating egress gateway. The other pods have not received an annotation for a terminating gateway because they have chosen different gateways to depend on, and thus won't be affected.
+
+:::note
+
+The subset of egress gateway replicas that each pod will depend on when using the `maxNextHops` annotation can't be manually selected.
+$[prodname] selects a subset of replicas in such a way as to evenly distribute load across the whole replica set.
+
+:::
+
+
+
+## Reference
+
+**The following are annotations that $[prodname] sets automatically on any egress-dependent pods:**
+
+| Annotation | Description | Datatype | Default value | Expected values |
+| -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | ---------- | ------------- | ---------------------------------------------------- |
+| `egress.projectcalico.org/gatewayMaintenanceGatewayIP` | Indicates the IP of a terminating egress gateway your pod is using. | IP Address | "" | Any IP within the egress gateway deployment's IPSet. |
+| `egress.projectcalico.org/gatewayMaintenanceStartedTimestamp` | Indicates when the egress gateway identified by `gatewayMaintenanceGatewayIP` began terminating. | String | "" | An RFC3339 date string |
+| `egress.projectcalico.org/gatewayMaintenanceFinishedTimestamp` | Indicates when the egress gateway identified by `gatewayMaintenanceGatewayIP` will finish terminating. | String | "" | An RFC3339 date string |
+
+
+
+**The following annotations are used to configure your egress-dependent workloads. These annotations can be set either on a namespace, or on a pod. If setting the annotations on pods, the `egressIPSupport` FelixConfiguration option must be set to `EnabledPerNamespaceOrPerPod`.**
+
+| Annotation | Description | Datatype | Default value | Possible values |
+| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------- | ------------- | ----------------------- |
+| `egress.projectcalico.org/maxNextHops` | Specifies the maximum number of egress gateway replicas from the selected deployment that a pod should depend on. Replicas will be chosen in a manner that attempts to balance load across the whole egress gateway replicaset. If unset, or set to "0", egress traffic will behave in the default manner (load balanced over all available gateways). | String | "" | "0", "1", "2", "3", ... |
+
+## Additional resources
+
+- [Troubleshooting egress gateways](troubleshoot.mdx).
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-on-prem.mdx b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-on-prem.mdx
new file mode 100644
index 0000000000..993ccbd497
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/egress/egress-gateway-on-prem.mdx
@@ -0,0 +1,609 @@
+---
+description: Send selected application traffic through Calico Cloud egress gateways on-premises so external firewalls see a predictable source IP for cluster workloads.
+redirect_from:
+ - /compliance/egress-gateways
+---
+
+# Configure egress gateways, on-premises
+
+## Big picture
+
+Configure specific application traffic to exit the cluster through an egress gateway.
+
+## Value
+
+When traffic from particular applications leaves the cluster to access an external destination, it
+can be useful to control the source IP of that traffic. For example, there may be an additional
+firewall around the cluster, whose purpose includes policing external accesses from the cluster, and
+specifically that particular external destinations can only be accessed from authorised workloads
+within the cluster.
+
+$[prodname]'s own policy (including [DNS policy](../../network-policy/domain-based-policy.mdx)) and
+per-node firewalls can ensure this, but deployments may like to deepen their defense by adding an
+external firewall as well. If the external firewall is configured to allow outbound connections
+only from particular source IPs, and the intended cluster workloads can be configured so that their
+outbound traffic will have one of those source IPs, then the defense in depth objective is achieved.
+
+$[prodname] allows specifying an [IP pool](../../reference/resources/ippool.mdx) for each pod or namespace, and
+even a [specific IP](../ipam/use-specific-ip.mdx) for a new pod, but this requires predicting how many pods
+there will be representing a particular application, so that the IP pool can be correctly sized.
+When IPs are a precious resource, over-sizing the pool is wasteful; but under-sizing is also
+problematic, as then IPs will not be available within the desired range as the application is
+scaled.
+
+Egress gateways provide an alternative approach. Application pods and namespaces are provisioned
+with IPs from the default (and presumably plentiful) pool, but also configured so that their
+outbound traffic is directed through an egress gateway. (Or, for resilience, through one of a small
+number of egress gateways.) The egress gateways are set up to use a [specific IP pool](../ipam/legacy-firewalls.mdx)
+ and to perform an SNAT on the traffic passing through them. Hence, any
+number of application pods can have their outbound connections multiplexed through a fixed small
+number of egress gateways, and all of those outbound connections acquire a source IP from the egress
+gateway IP pool.
+
+:::note
+
+The source port of an outbound flow through an egress gateway can generally _not_ be
+preserved. Changing the source port is how Linux maps flows from many upstream IPs onto a single
+downstream IP.
+
+:::
+
+Egress gateways are also useful if there is a reason for wanting all outbound traffic from a
+particular application to leave the cluster through a particular node or nodes. For this case, the
+gateways just need to be scheduled to the desired nodes, and the application pods/namespaces
+configured to use those gateways.
+
+## Concepts
+
+### Egress gateway
+
+An egress gateway acts as a transit pod for the outbound application traffic that is configured to
+use it. As traffic leaving the cluster passes through the egress gateway, its source IP is changed
+to that of the egress gateway pod, and the traffic is then forwarded on.
+
+### Source IP
+
+When an outbound application flow leaves the cluster, its IP packets will have a source IP.
+Normally this is the pod IP of the pod that originated the flow, or the node IP of the node hosting
+that pod. It will be the **node IP** if the pod IP came from an [IP pool](../../reference/resources/ippool.mdx) with `natOutgoing: true`, and the **pod IP** if
+not. (Assuming no other CNI plugin has been configured to NAT outgoing traffic.)
+
+With an egress gateway involved that is all still true, except that now it's the egress gateway that
+counts, instead of the original application pod. So the flow will have the egress gateway's **node
+IP**, if the egress gateway's pod IP came from an [IP pool](../../reference/resources/ippool.mdx)
+ with `natOutgoing: true`, and the egress
+gateway's **pod IP** otherwise.
+
+### Control the use of egress gateways
+
+If a cluster ascribes special meaning to traffic flowing through egress gateways, it will be
+important to control when cluster users can configure their pods and namespaces to use them, so that
+non-special pods cannot impersonate the special meaning.
+
+If namespaces in a cluster can only be provisioned by cluster admins, one option is to enable egress
+gateway function only on a per-namespace basis. Then only cluster admins will be able to configure
+any egress gateway usage.
+
+Otherwise -- if namespace provisioning is open to users in general, or if it's desirable for egress
+gateway function to be enabled both per-namespace and per-pod -- a [Kubernetes admission controller](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/)
+ will be
+needed. This is a task for each deployment to implement for itself, but possible approaches include
+the following.
+
+1. Decide whether a given Namespace or Pod is permitted to use egress annotations at all, based on
+ other details of the Namespace or Pod definition.
+
+1. Evaluate egress annotation selectors to determine the egress gateways that they map to, and
+ decide whether that usage is acceptable.
+
+1. Impose the cluster's own bespoke scheme for a Namespace or Pod to identify the egress gateways
+ that it wants to use, less general than $[prodname]'s egress annotations. Then the
+ admission controller would police those bespoke annotations (that that cluster's users could
+ place on Namespace or Pod resources) and either reject the operation in hand, or allow it
+ through after adding the corresponding $[prodname] egress annotations.
+
+### Policy enforcement for flows via an egress gateway
+
+For an outbound connection from a client pod, via an egress gateway, to a destination outside the
+cluster, there is more than one possible enforcement point for policy:
+
+The path of the traffic through policy is as follows:
+
+1. Packet leaves the client pod and passes through its egress policy.
+2. The packet is encapsulated by the client pod's host and sent to the egress gateway
+3. The encapsulated packet is sent from the host to the egress gateway pod.
+4. The egress gateway pod de-encapsulates the packet and sends the packet out again with its own address.
+5. The packet leaves the egress gateway pod through its egress policy.
+
+To ensure correct operation, (as of v3.15) the encapsulated traffic between host and egress gateway is auto-allowed by
+$[prodname] and other ingress traffic is blocked. That means that there are effectively two places where
+policy can be applied:
+
+1. on egress from the client pod
+2. on egress from the egress gateway pod (see limitations below).
+
+The policy applied at (1) is the most powerful since it implicitly sees the original source of the traffic (by
+virtue of being attached to that original source). It also sees the external destination of the traffic.
+
+Since an egress gateway will never originate its own traffic, one option is to rely on policy applied at (1) and
+to allow all traffic to at (2) (either by applying no policy or by applying an "allow all").
+
+Alternatively, for maximum "defense in depth" applying policy at both (1) and (2) provides extra protection should
+the policy at (1) be disabled or bypassed by an attacker. Policy at (2) has the following limitations:
+
+- [Domain-based policy](../../network-policy/domain-based-policy.mdx) is not supported at egress from egress
+ gateways. It will either fail to match the expected traffic, or it will work intermittently if the egress gateway
+ happens to be scheduled to the same node as its clients. This is because any DNS lookup happens at the client pod.
+ By the time the policy reaches (2) the DNS information is lost and only the IP addresses of the traffic are available.
+
+- The traffic source will appear to be the egress gateway pod, the source information is lost in the address
+ translation that occurs inside the egress gateway pod.
+
+That means that policies at (2) will usually take the form of rules that match only on destination port and IP address,
+either directly in the rule (via a CIDR match) or via a (non-domain based) NetworkSet. Matching on source has little
+utility since the IP will always be the egress gateway and the port of translated traffic is not always preserved.
+
+:::note
+
+Since v3.15.0, $[prodname] also sends health probes to the egress gateway pods from the nodes where
+their clients are located. In iptables mode, this traffic is auto-allowed at egress from the host and ingress
+to the egress gateway. In eBPF mode, the probe traffic can be blocked by policy, so you must ensure that this traffic allowed; this should be fixed in an upcoming
+patch release.
+
+:::
+
+## Before you begin
+
+**Unsupported**
+
+- GKE
+
+**Required**
+
+- Calico CNI
+- Open port UDP 4790 on the host
+
+## How to
+
+- [Enable egress gateway support](#enable-egress-gateway-support)
+- [Provision an egress IP pool](#provision-an-egress-ip-pool)
+- [Deploy a group of egress gateways](#deploy-a-group-of-egress-gateways)
+- [Configure iptables backend for egress gateways](#configure-iptables-backend-for-egress-gateways)
+- [Configure namespaces and pods to use egress gateways](#configure-namespaces-and-pods-to-use-egress-gateways)
+- [Optionally enable ECMP load balancing](#optionally-enable-ecmp-load-balancing)
+- [Verify the feature operation](#verify-the-feature-operation)
+- [Control the use of egress gateways](#control-the-use-of-egress-gateways)
+- [Upgrade egress gateways](#upgrade-egress-gateways)
+
+### Enable egress gateway support
+
+In the default **FelixConfiguration**, set the `egressIPSupport` field to `EnabledPerNamespace` or
+`EnabledPerNamespaceOrPerPod`, according to the level of support that you need in your cluster. For
+support on a per-namespace basis only:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"egressIPSupport":"EnabledPerNamespace"}}'
+```
+
+Or for support both per-namespace and per-pod:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"egressIPSupport":"EnabledPerNamespaceOrPerPod"}}'
+```
+
+:::note
+
+- `egressIPSupport` must be the same on all cluster nodes, so you should set them only in the
+ `default` FelixConfiguration resource.
+- The operator automatically enables the required policy sync API in the FelixConfiguration.
+
+:::
+
+### Provision an egress IP pool
+
+Provision a small IP Pool with the range of source IPs that you want to use for a particular
+application when it connects to an external service. For example:
+
+```bash
+kubectl apply -f - < egress.projectcalico.org/selector="egress-code == 'red'"
+```
+
+By default, that selector can only match egress gateways in the same namespace. To select gateways
+in a different namespace, specify a `namespaceSelector` annotation as well, like this:
+
+```bash
+kubectl annotate ns egress.projectcalico.org/namespaceSelector="kubernetes.io/metadata.name == 'default'"
+```
+
+Egress gateway annotations have the same [syntax and range of expressions](../../reference/resources/networkpolicy.mdx#selector) as the selector fields in
+$[prodname] [network policy](../../reference/resources/networkpolicy.mdx#entityrule).
+
+To configure a specific Kubernetes Pod to use egress gateways, specify the same annotations when
+creating the pod. For example:
+
+```bash
+kubectl apply -f - < egress.projectcalico.org/egressGatewayPolicy="egw-policy1"
+```
+
+To configure a specific Kubernetes pod to use the same policy, specify the same annotations when
+creating the pod.
+For example:
+
+```bash
+kubectl apply -f - < -n -- nc 8089 ` should be the IP address of the netcat server.
+
+Then, if you check the logs or output of the netcat server, you should see:
+
+```
+Connection from received
+```
+
+with `` being one of the IPs of the egress IP pool that you provisioned.
+
+## Upgrade egress gateways
+
+From v3.16, egress gateway deployments are managed by the Tigera Operator.
+
+- When upgrading from a pre-v3.16 release, no automatic upgrade will occur. To upgrade a pre-v3.16 egress gateway deployment,
+ create an equivalent EgressGateway resource with the same namespace and the same name as mentioned [above](#deploy-a-group-of-egress-gateways);
+ the operator will then take over management of the old Deployment resource, replacing it with the upgraded version.
+
+- Use `kubectl apply` to create the egress gateway resource. Tigera Operator will read the newly created resource and wait
+ for the other $[prodname] components to be upgraded. Once the other $[prodname] components are upgraded, Tigera Operator
+ will upgrade the existing egress gateway deployment with the new image.
+
+By default, upgrading egress gateways will sever any connections that are flowing through them. To minimise impact,
+the egress gateway feature supports some advanced options that give feedback to affected pods. For more details see
+the [egress gateway maintenance guide](egress-gateway-maintenance.mdx).
+
+## Next steps
+
+Make your egress gateway reachable from outside the cluster. An egress gateway's source IP is a pod IP, so external hosts and firewalls can reach it — and return traffic can find its way back — only when that IP is routable beyond the node. There are two ways to do this:
+
+- [Advertise it over BGP](../configuring/bgp.mdx) — once you peer with your network infrastructure, $[prodname] exports egress gateway IPs to the peered routers automatically.
+- [Make it reachable on the local L2 segment without BGP](../configuring/local-subnet-l2-reachability.mdx) — give egress gateways IPs from a no-encapsulation IP pool within the host subnet and let $[prodname] answer ARP/NDP for them. Use this in flat L2 or on-premises environments where BGP is not an option.
+
+## Additional resources
+
+Please see also:
+
+- The `egressIP...` fields of the [FelixConfiguration resource](../../reference/resources/felixconfig.mdx#spec).
+- [Additional configuration for egress gateway maintenance](egress-gateway-maintenance.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/egress/external-network.mdx b/calico-cloud_versioned_docs/version-24-1/networking/egress/external-network.mdx
new file mode 100644
index 0000000000..26f1014c5d
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/egress/external-network.mdx
@@ -0,0 +1,182 @@
+---
+description: Direct Calico Cloud egress gateway traffic onto multiple external networks with potentially overlapping IPs by associating gateways with named ExternalNetworks.
+---
+
+# Configure egress traffic to multiple external networks
+
+## Big picture
+
+Allows workloads from different namespaces of a Kubernetes cluster to egress onto different external networks that (may) have overlapping IPs with each other.
+
+## Value
+
+When traffic from particular applications leaves the cluster to access an external destination, egress gateway enables users to control the source IP of that traffic. However, in this case, egress gateway sees all the external destinations as a flat L3 network. If a user has a network topology which involves multiple external networks and the service endpoints in those networks may have overlapping IPs, it becomes a mandatory requirement that $[prodname] should be able to direct the egress traffic to the service endpoint in the correct network.
+
+For example, suppose a user has a network setup as below:
+There are two external networks (Red and Yellow) outside the cluster. A web server on network Red is exposing its service at `105.8.10.1`. A database server on network Yellow is exposing its service at `105.8.10.1` too.
+
+Then the cluster could have requirements as follows:
+Pods in Red namespace should send traffic via egress gateways to `105.8.10.1` on external network Red.
+Pods in Yellow namespace should send traffic via egress gateways to `105.8.10.1` on external network Yellow.
+
+External network support is introduced into $[prodname] to meet those requirements. It allows user to associate a egress gateway to external networks so that the egress traffic originated from the client via that egress gateway will be routed to the service endpoints on the associated external networks. In a nutshell, the external network feature adds support for L3 segmentation of outgoing egress traffic.
+
+## Prerequisites
+
+- IPs on multiple external networks may overlap with each other, however, those IPs must not overlap with the IPs of pods within the cluster or their hosts.
+- IPs of the BGP peers peering with the cluster should not overlap.
+
+## Limitations
+
+- This feature should be used in combination with egress gateways. Sending traffic from a client pod to external networks without going through an egress gateway is not supported.
+- This feature only supports IPv4.
+
+## Before you begin
+
+This feature requires you to understand how to configure a functioning egress gateway deployment in a cluster. For more information on deploying egress gateways, [see our other egress gateway guides](./).
+
+## Concepts
+
+### Egress node
+A node in the cluster which is peering with external networks and populating routes to direct traffic from the egress gateway to the destinations on external networks. Any egress gateway which is associated to an external network should be scheduled to be running on a egress node.
+
+### BGP bootstrap routes
+BGP bootstrapping routes are routes on the node for traffic from that node to reach other nodes in the cluster, or other destinations outside the cluster, via whatever routers and external networks the user may need. This is considered outside of the scope of $[prodname], as both $[prodname] and external BGP routers on external networks may require bootstrapping routes to be set up before peering with each other.
+
+## How to
+
+### Enable egress gateway support
+
+In the default **FelixConfiguration**, set the `egressIPSupport` field to `EnabledPerNamespace` or
+`EnabledPerNamespaceOrPerPod`, according to the level of granularity that you need in your cluster. For support on a per-namespace basis only:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"egressIPSupport":"EnabledPerNamespace"}}'
+```
+
+Or to support both per-namespace and per-pod:
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"egressIPSupport":"EnabledPerNamespaceOrPerPod"}}'
+```
+
+### Enable external network support
+
+In the default **FelixConfiguration**, set the `externalNetworkSupport` field to `Enabled`.
+
+```bash
+kubectl patch felixconfiguration default --type='merge' -p \
+ '{"spec":{"externalNetworkSupport":"Enabled"}}'
+```
+
+### Create external network resources
+
+Add an `ExternalNetwork` resource to the cluster for each external networks. For example, to create an `ExternalNetwork` for `red` network.
+
+```bash
+kubectl create -f - <
+# -
+# timeoutSeconds: 15
+# intervalSeconds: 5
+# httpProbe:
+# urls:
+# -
+# -
+# timeoutSeconds: 30
+# intervalSeconds: 10
+ template:
+ metadata:
+ labels:
+ egress-code: red
+ spec:
+ nodeSelector:
+ kubernetes.io/os: linux
+ terminationGracePeriodSeconds: 0
+EOF
+```
+
+Where:
+- Where externalNetworks associates this egress gateway deployments with external network `red`. All traffic leaving the egress gateway to an external destination will be routed to the destination on external network `red`.
+- Node selector `egress: true` forces egress gateway pods of the deployment to be scheduled on egress nodes.
+
+:::warning
+
+If multiple networks in the `externalNetworkNames` list (of the egress gateway) advertise the same prefix to $[prodname] then traffic to those prefixes will flow to a non-deterministic network, which may result in hard-to-debug connectivity issues. It is the user's responsibility to make sure it will never happen.
+
+:::
+
+### Use egress gateways
+
+Add annotations to namespaces or pods to configure them to use the relevant egress gateways created by the step above. Egress traffic from the application pods will be routed to destinations within the designated external networks.
+
+## Additional resources
+
+- [Troubleshooting egress gateways](troubleshoot.mdx).
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/egress/index.mdx b/calico-cloud_versioned_docs/version-24-1/networking/egress/index.mdx
new file mode 100644
index 0000000000..2f6f3eae67
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/egress/index.mdx
@@ -0,0 +1,11 @@
+---
+description: Egress gateways in Calico Cloud — pin per-namespace or per-pod source IPs for outbound traffic, segment external networks, and integrate with cloud fabrics.
+hide_table_of_contents: true
+---
+
+# Egress gateways
+
+import DocCardList from '@theme/DocCardList';
+import { useCurrentSidebarCategory } from '@docusaurus/theme-common';
+
+
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/egress/troubleshoot.mdx b/calico-cloud_versioned_docs/version-24-1/networking/egress/troubleshoot.mdx
new file mode 100644
index 0000000000..3f2ecd7a8c
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/egress/troubleshoot.mdx
@@ -0,0 +1,276 @@
+---
+description: Troubleshooting guide for Calico Cloud egress gateways covering connection failures, source IP mismatches, BGP route propagation, and required pod metadata.
+---
+
+# Troubleshoot egress gateways
+
+- [Checklist of common problems](#checklist-of-common-problems)
+- [Connection to an egress gateway cannot be established](#connection-to-an-egress-gateway-cannot-be-established)
+- [Connection to an egress gateway is established, but destination is not getting correct IP](#connection-to-an-egress-gateway-is-established-but-destination-is-not-getting-correct-ip)
+
+## Checklist of common problems
+
+Use the following checklist to troubleshoot, or to collect details before opening a Support ticket.
+
+### Is the egress gateway feature enabled?
+
+Egress gateway is disabled by default. Have you enabled it in [Felix configuration](../../reference/resources/felixconfig.mdx) by setting `egressIPSupport` to `EnabledPerNamespace` or `EnabledPerNamespaceOrPerPod`?
+
+### Does your egress gateway routing go through a router? (On-prem only.)
+
+As shown in the following diagram, from the gateway to the destination, the source IP is the egress IP. On the return path, from the destination back to the gateway, the destination IP is the egress IP. If there are any routers between the gateway and the destination, they must all know how to route the egress IP back to the gateway. If they don’t, the attempted connection cannot be established.
+
+
+
+Options to make routers aware of egress IP:
+
+- Program routes statically on routers
+- Peer routers with the cluster, directly or indirectly using BGP or some other protocol, or other method so routers learn about the egress IP
+
+### Does your egress gateway have required metadata?
+
+Review important egress gateway metadata (for example, namespace and labels); they are required for a client to identify the gateway(s) that it should use.
+
+### Is natOutgoing on your IPPool set up correctly?
+
+For most egress gateway scenarios you should have: `natOutgoing: false` on the egress IPPool. If you have `natOutgoing: true`, the egress gateway will SNAT to its own IP, which is the intended egress gateway IP. But then the egress gateway’s node will also SNAT to its own IP (i.e. the node IP), which immediately overrides the egress gateway IP.
+
+### Do clients and nodes have required selectors?
+
+Review the following annotations that are required for the client to identify its egress gateways:
+
+- egress.projectcalico.org/egressGatewayPolicy
+- egress.projectcalico.org/selector
+- egress.projectcalico.org/namespaceSelector
+
+on
+
+- Client pod
+- Client pod’s namespace
+
+### Does Calico have enough route tables?
+
+On Linux, Calico claims a number of routing tables for various purposes. The exact number of tables allocated is determined by the [FelixConfiguration](../../reference/resources/felixconfig.mdx) option `routeTableRanges`. Failing to allocate enough route tables will result in Calico failing to program the networking needed for Egress Gateways to function.
+
+Under these conditions, `calico-node` pods will log error messages and report [unhealthy](#check-calico-node-health).
+
+[See more about routeTableRanges](../../reference/resources/felixconfig.mdx#routetableranges)
+
+### Check egress gateway health
+
+As of v3.15.0, the egress gateway `Deployment` includes a Kubernetes `readinessProbe`. The egress gateway will
+only report ready if it is able to connect to the local `calico-node` pod and if any configured HTTP/ICMP probes
+are succeeding.
+
+If the egress gateway reports not-Ready then more information can be found in its logs. The egress gateway logs to
+`stdout` so its logs are available via `kubectl logs -n `.
+
+### Check health of calico-node to egress gateway probes
+
+As of v3.15.0, each `calico-node` pod probes the health of the remote egress gateways that its local pods are using.
+If probes fail, the failures are logged in `calico-node`'s log (search for `egress_gw_tracker`) and reported via Prometheus metrics:
+
+```
+felix_egress_gateway_remote_polls{status="probe-failed"} 0
+felix_egress_gateway_remote_polls{status="total"} 2
+felix_egress_gateway_remote_polls{status="up"} 2
+```
+
+Where, the `total` metric reports the total number of remote egress gateways that are being polled and the `up` and `probe-failed`
+metrics report the number of egress gateways in each of those states.
+
+### Check calico-node health
+
+Check that your calico-node pods are consistently running and ready, especially on the nodes hosting the client and
+gateway pods. Confirming healthy pods will rule out possible issues. If you find that `calico-node` is not ready,
+describing the pod should show which health check is failing:
+
+```bash
+kubectl describe pod ...
+```
+
+In AWS, issues such as permissions problems will report a problem with the `"aws-eni-addresses-in-sync"` health check.
+For more information on the problem, review the `calico-node` log. For example, a permissions issue will result in a
+log such as the following:
+
+```
+2021-11-16 13:11:59.292 [ERROR][26606] felix/aws_iface_provisioner.go 343: Failed to resync with AWS. Will retry after backoff. error=failed to create ENI: operation error EC2: CreateNetworkInterface, https response error StatusCode: 403, RequestID: 13dead98-7da0-4695-9be8-80cab4d5528e, api error UnauthorizedOperation: You are not authorized to perform this operation. Encoded authorization failure message: j4x3cFwZdJ......ShGkw
+```
+
+If you see such a log, check the AWS IAM permissions assigned to the nodes in your cluster to ensure that the nodes
+have the [required permissions](egress-gateway-aws.mdx#configure-aws-iam-roles). It is also possible
+to decode the "encoded authorization failure message" in the log by following [this guide](https://aws.amazon.com/premiumsupport/knowledge-center/aws-backup-encoded-authorization-failure/); this gives more detail on the error.
+
+### Check IP rule and routing setup on the client node
+
+**Run `ip rule`**
+
+On the client node, run:
+
+```
+ip rule
+```
+
+**Sample output**
+
+You will see a line for each pod on the node that is configured to use an egress gateway.
+
+```
+from 192.168.24.35 fwmark 0x80000/0x80000 lookup 250
+```
+
+Where:
+
+- `192.168.24.35` is the relevant client's pod IP
+- `250` is the routing table number
+- `fwmark 0x80000/0x80000` is the bit/mask
+
+If you don’t see this, it means one of the following:
+
+- egressIPSupport is not enabled
+- egressIPSupport is enabled, but you have not configured egress annotations on the client pod or on its namespace
+- egressIPSupport is EnabledPerNamespace and you have configured egress annotations on the client pod, but not on its namespace
+
+**Run `ip route show table`**
+
+On the client node, run the following command using the routing table number from the `ip rule` command. For example: `250`.
+
+```
+ip route show table
+```
+
+**Sample output: clients using a single egress gateway**
+
+```
+default via 11.11.11.1 dev egress.calico onlink
+```
+
+**Sample: clients using multiple gateways**
+
+```
+default onlink
+ nexthop via 11.11.11.1 dev egress.calico weight 1 onlink
+ nexthop via 11.11.11.2 dev egress.calico weight 1 onlink
+```
+
+**Sample: clients using the following egress gateway policy**
+
+```yaml noValidation
+apiVersion: projectcalico.org/v3
+kind: EgressGatewayPolicy
+metadata:
+ name: "egw-policy1"
+spec:
+ rules:
+ - destination:
+ cidr: 10.0.0.0/8
+ description: "Local: no gateway"
+ - destination:
+ cidr: 11.0.0.0/8
+ description: "Gateway to on prem"
+ gateway:
+ namespaceSelector: "kubernetes.io/metadata.name == 'default'"
+ selector: "egress-code == 'blue'"
+ maxNextHops: 2
+ - description: "Gateway to internet"
+ gateway:
+ namespaceSelector: "kubernetes.io/metadata.name == 'default'"
+ selector: "egress-code == 'red'"
+```
+
+```
+default onlink
+ nexthop via 11.11.11.1 dev egress.calico weight 1 onlink
+ nexthop via 11.11.11.2 dev egress.calico weight 1 onlink
+ nexthop via 11.11.11.3 dev egress.calico weight 1 onlink
+throw 10.0.0.0/8
+11.0.0.0/8 onlink
+ nexthop via 11.11.12.1 dev egress.calico weight 1 onlink
+ nexthop via 11.11.12.2 dev egress.calico weight 1 onlink
+```
+
+If you see nothing at all, or the following:
+
+```
+unreachable default scope link
+```
+
+- Verify that you have provisioned the gateways
+- Review the selectors, and gateway namespace and labels to determine why they aren’t matching each other
+
+### Do you have egress IPs in BGPConfiguration svcExternalIPs?
+
+You should not have any egress IPs or pod IP ranges in BGPConfiguration `serviceExternalIPs` or `serviceClusterIPs` fields; it causes problems if you do.
+
+By default, $[prodname] BGP exports all pod IPs, which includes egress gateway IPs because they are pod IPs. But you can also use [BGPConfiguration resource parameters](../../reference/resources/bgpconfig.mdx) like `BGPConfiguration`, `serviceClusterIPs`, `serviceExternalIPs` and `serviceLoadBalancerIPs` to export additional IP ranges, in particular Kubernetes Service IPs. Because $[prodname] exports additional IP ranges in a different way from pod IPs, things can go wrong if you include pod IPs in the additional ranges.
+
+## Connection to an egress gateway cannot be established
+
+If the outbound connection cannot be established, the policy may be denying the flow. As shown in the following diagram, policy is enforced at more points in an egress gateway flow.
+
+
+
+**Policy enforcement**:
+
+- From the client pod, egress
+- To the gateway pod, ingress
+- From the gateway pod, egress
+- Any relevant HostEndpoints that are configured in your cluster
+
+In [the web console](../../tutorials/calico-cloud-features/tour.mdx), check for dropped packets because of policy on the outbound connection path. If you are using the iptables data plane, you can also run the following command on the client and gateway nodes to look at a lower level.
+
+```
+watch iptables-save -c | grep DROP | grep -v 0:0
+```
+
+## Connection to an egress gateway is established, but destination is not getting correct IP
+
+If you see that the outbound connection established, but the source IP is incorrect at the destination, this can indicate that other SNAT or MASQUERADE is taking effect after the packet leaves the egress gateway pod and is overriding the egress gateway IP. If you intentionally have a MASQUERADE/SNAT for another general purpose, you must filter it so it does not apply to traffic whose source IP comes from the egress gateway pool.
+
+To check the egress gateway’s node, use iptables:
+
+```
+iptables-save -c | grep -i MASQUERADE
+iptables-save -c | grep -i SNAT
+```
+
+## Finding leaked AWS ENIs
+
+In normal usage of the AWS-backed IP pools feature, the $[noderunning] Pod on each node will manage the
+secondary ENIs used for networking AWS-backed IP pools. It also marks its secondary ENIs for deletion on
+instance termination to avoid leaking any ENIs when an instance is terminated.
+
+However, in certain highly unusual situations, such as the following sequence of events:
+
+- $[noderunning] adds an ENI.
+- The AWS API call to mark the ENI for "delete on termination" fails.
+- The entire instance is deleted before the automatic retry of the above operation succeeds.
+
+Then, it would be possible for an ENI to be leaked. $[prodname] marks all the ENIs that it creates with tags
+to identify them as $[prodname] secondary ENIs and the ID of the instance they _should_ belong to.
+To find potentially leaked ENIs, you can use the AWS command line tool as follows:
+
+```bash
+aws ec2 describe-network-interfaces --filters Name=status,Values=available Name=tag-key,Values=calico:use
+```
+
+Then, examine the "Tag set" of the returned network interface values to see if any of them belong to nodes that have
+been deleted:
+
+```
+"TagSet": [
+ {
+ "Key": "calico:use",
+ "Value": "secondary"
+ },
+ {
+ "Key": "calico:instance",
+ "Value": "i-00122bf604c6ab776"
+ }
+],
+```
+
+If the instance ID recorded in the "calico:instance" tag is for an instance that no longer exists then the ENI
+has been leaked; it is safe to delete the ENI. If the instance ID belongs to an active instance then there
+is no need to delete the ENI, it should be cleaned up (or put into use) by the $[noderunning] Pod running
+on that instance.
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/index.mdx b/calico-cloud_versioned_docs/version-24-1/networking/index.mdx
new file mode 100644
index 0000000000..6bf6154242
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/index.mdx
@@ -0,0 +1,59 @@
+---
+description: Calico Cloud networking covers BGP, overlay encapsulation, IPAM, egress gateways, ingress gateways, and per-cluster training across connected clusters.
+---
+
+import { DocCardLink, DocCardLinkLayout } from '/src/___new___/components';
+
+# Networking
+
+The $[prodname] network plugins provide a range of networking options to fit your implementation and maximize performance.
+
+## Getting started
+
+
+
+
+
+
+## Configuring networking
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## IP address management
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Egress gateways
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/about-calico-ingress-gateway.mdx b/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/about-calico-ingress-gateway.mdx
new file mode 100644
index 0000000000..27e67407ee
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/about-calico-ingress-gateway.mdx
@@ -0,0 +1,104 @@
+---
+description: Overview of Calico Ingress Gateway in Calico Cloud — a hardened Envoy Gateway build that brings the Kubernetes Gateway API to your connected clusters.
+title: Calico Ingress Gateway
+---
+
+# Calico Ingress Gateway
+
+Calico Ingress Gateway provides a streamlined solution for managing cluster ingress traffic by using the Kubernetes Gateway API standard.
+
+## About Calico Ingress Gateway
+
+Calico Ingress Gateway is a hardened distribution of the open-source Envoy Gateway project.
+Tigera rebuilds the Envoy Gateway code using hardened base images for robust security and stable performance.
+
+Calico Ingress Gateway provides seamless, deep integration with the Calico environment.
+This approach ensures that ingress security and networking configurations are unified within the Calico framework.
+
+## About Gateway API
+
+The Kubernetes Gateway API is the modern, standardized interface for governing access to services within a cluster, serving as the successor to the original Ingress resource.
+
+Key features and benefits of the Gateway API include:
+
+* Role-oriented design: It clearly separates network infrastructure concerns (managed by network teams via Gateway resources) from application-specific routing (managed by developers via routing resources).
+* Advanced configuration: The API natively supports advanced traffic control patterns, such as weighted traffic splitting for canary deployments, header manipulation, and detailed request matching, functionality that often required vendor-specific annotations in the past.
+* Portability: As a standard Kubernetes API, configurations are not tied to a single vendor implementation, providing portability and preventing vendor lock-in.
+
+## About Envoy Gateway
+
+Gateway API defines the specification, and Envoy Gateway is the primary implementation framework.
+
+Envoy Gateway acts as the control plane that translates Gateway API resources into actionable configuration for its data plane.
+The data plane utilizes Envoy Proxy, a high-performance, widely adopted proxy used across the cloud-native ecosystem for edge and service mesh functionality.
+By leveraging Envoy, the Calico Ingress Gateway provides proven reliability, high throughput, and granular observability.
+
+## Deployment and management with Calico Ingress Gateway
+
+While the underlying architecture involves multiple layers (Gateway API specification, Envoy Gateway control plane, Envoy Proxy data plane), the Calico Ingress Gateway simplifies deployment and management significantly.
+
+Calico Ingress Gateway is managed entirely by the Tigera Operator.
+This integration automates the lifecycle of the components to reduce manual configuration overhead.
+CVEs are addressed as part of the regular $[prodname] patch release cadence.
+Administrators provision the gateway environment simply by defining a standard Gateway resource.
+
+### Calico Enterprise and Calico Cloud integration
+
+For commercial deployments, Calico Ingress Gateway extends functionality by integrating directly with the Web Application Firewall (WAF).
+This feature allows operators to secure their ingress points against the OWASP Top 10 and other common vulnerabilities through simple configuration within the Calico management plane.
+
+## Where Calico Ingress Gateway runs
+
+Calico Ingress Gateway uses a namespaced deployment model.
+The Tigera Operator runs a single Envoy Gateway controller in the `calico-system` namespace.
+When you create a `Gateway` resource, its proxy, `Service`, and load balancer are created in the **same namespace as the `Gateway`**.
+
+This model lets the owner of a namespace apply their own network policy and RBAC to the gateway's proxy pods.
+Teams do not have to share a namespace, and they do not have to ask a cluster administrator to change a shared namespace on their behalf.
+You can deploy a gateway in each namespace that needs one, so multiple teams each run and own a gateway in their own namespace.
+
+The operator also creates supporting resources in each namespace that holds a `Gateway`:
+
+- A `tigera-ca-bundle` ConfigMap, which the proxy mounts so that it trusts cluster and public certificate authorities.
+ The proxy does not start until this ConfigMap is present.
+- A copy of the `tigera-pull-secret`, so the namespace can pull the hardened gateway images.
+- A `waf-http-filter` ServiceAccount and RoleBinding, used by the Web Application Firewall and Layer 7 log collector sidecars.
+
+Each `Gateway` gets its own load balancer.
+Calico Ingress Gateway does not place more than one gateway behind a single load balancer.
+
+## Supported Gateway API resources
+
+Calico Ingress Gateway supports the following Gateway API resources.
+
+| Resource | Versions |
+| ---------------- | ---------------------- |
+| BackendTLSPolicy | v1, v1alpha3 |
+| GatewayClass | v1, v1beta1 |
+| Gateway | v1, v1beta1 |
+| GRPCRoute | v1 |
+| HTTPRoute | v1, v1beta1 |
+| ListenerSet | v1 |
+| ReferenceGrant | v1, v1beta1 |
+| TCPRoute | v1alpha2 |
+| TLSRoute | v1, v1alpha2, v1alpha3 |
+| UDPRoute | v1alpha2 |
+
+:::note
+
+OpenShift 4.19 introduced [restrictions](https://docs.redhat.com/en/documentation/openshift_container_platform/4.19/html-single/ingress_and_load_balancing/index#nw-ingress-gateway-api-overview_ingress-gateway-api) on which Gateway API CRDs can be installed.
+
+- The available Gateway API resources in OpenShift 4.19 are: `GatewayClass`, `Gateway`, `GRPCRoute`, `HTTPRoute` and `ReferenceGrant`.
+
+- Other Gateway API resources, namely `BackendTLSPolicy`, `ListenerSet`, `TCPRoute`, `TLSRoute` and `UDPRoute`, are not available in OpenShift 4.19.
+
+:::
+
+## Next steps
+
+* Learn more about Calico Ingress Gateway with the [canary deployment tutorial](tutorial-ingress-gateway-canary.mdx).
+
+## Additional resources
+
+* [Kubernetes Gateway API documentation](https://gateway-api.sigs.k8s.io/)
+* [Envoy Gateway documentation](https://gateway.envoyproxy.io/docs/)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/create-ingress-gateway.mdx b/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/create-ingress-gateway.mdx
new file mode 100644
index 0000000000..0526766691
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/create-ingress-gateway.mdx
@@ -0,0 +1,142 @@
+---
+description: Deploy a Calico Ingress Gateway in a Calico Cloud connected cluster by applying GatewayAPI and Gateway resources tied to the Tigera-managed gateway class.
+---
+
+# Create an ingress gateway
+
+Create an ingress gateway to manage ingress traffic with the Kubernetes Gateway API.
+
+## Creating an ingress gateway with Calico Ingress Gateway
+
+Calico Ingress Gateway is based on Envoy Gateway, an open-source implementation of the Gateway API.
+Calico provides a simple, convenient way to deploy and manage this implementation.
+
+Creating an ingress gateway with Calico Ingress Gateway involves only a few steps.
+You need to do the following:
+* Enable Calico Ingress Gateway by creating a `GatewayAPI` resource.
+* Create a `Gateway` resource that references `tigera-gateway-class`, the name of the `GatewayClass` resource created by the Tigera Operator.
+* When you create your gateway routing resources, you refer to this `Gateway` resource.
+
+## Limitations
+
+* Calico Ingress Gateway is not supported on Windows nodes.
+
+## Prerequisites
+
+* You have an understanding of the [Kubernetes Gateway API](https://gateway-api.sigs.k8s.io/) and know how you want to configure it for your system.
+* $[prodname] was installed on your cluster using the Tigera Operator.
+* Your cluster is provisioned to support services of type `LoadBalancer`.
+
+## Create an ingress gateway
+
+1. To enable Gateway API support, create a `GatewayAPI` resource with the name `tigera-secure`:
+
+ ```bash
+ kubectl apply -f - <
+ namespace:
+ // highlight-end
+ spec:
+ // highlight-next-line
+ gatewayClassName: tigera-gateway-class
+ ...
+ ```
+ Replace `` with a name for your gateway, and `` with the namespace where you want the gateway to run.
+ You will refer to this gateway name for all services you want to use the gateway.
+
+ The proxy, its `Service`, and its load balancer are created in the same namespace as this `Gateway`.
+ To check that the proxy is running, list the pods in that namespace:
+
+ ```bash
+ kubectl get pods -n
+ ```
+
+1. If your cluster enforces a [global default deny policy](../../network-policy/beginners/kubernetes-default-deny.mdx), apply a network policy in the `Gateway` namespace that lets the proxy pods reach the gateway controller, the Kubernetes API server, and DNS.
+ Without it, the proxy cannot start.
+
+ ```yaml
+ apiVersion: projectcalico.org/v3
+ kind: NetworkPolicy
+ metadata:
+ name: allow-tigera-gateway-proxy
+ namespace:
+ spec:
+ selector: 'app.kubernetes.io/name == "envoy"'
+ types: [Ingress, Egress]
+ ingress:
+ - action: Allow
+ egress:
+ - action: Allow # DNS
+ protocol: UDP
+ destination:
+ namespaceSelector: 'projectcalico.org/name == "kube-system"'
+ selector: 'k8s-app == "kube-dns"'
+ ports: [53]
+ - action: Allow # configuration from the gateway controller
+ protocol: TCP
+ destination:
+ namespaceSelector: 'projectcalico.org/name == "calico-system"'
+ selector: 'app.kubernetes.io/name == "gateway-helm"'
+ ports: [18000]
+ - action: Allow # Kubernetes API server
+ protocol: TCP
+ destination:
+ services:
+ name: kubernetes
+ namespace: default
+ ```
+ Replace `` with the namespace where you created the `Gateway`.
+ Add egress rules for your own backends as needed.
+
+1. Create a gateway routing resource that refers to your `Gateway` resource as `.spec.parentRefs`:
+
+ ```yaml title='Example snippet of an HTTPRoute resource'
+ apiVersion: gateway.networking.k8s.io/v1
+ kind: HTTPRoute
+ metadata:
+ name: example-httproute
+ spec:
+ // highlight-start
+ parentRefs:
+ - name:
+ // highlight-end
+ ...
+ ```
+ Replace `` with the name of your `Gateway` resource.
+
+## Additional resources
+
+* [Kubernetes Gateway API documentation](https://gateway-api.sigs.k8s.io/)
+* [Envoy Gateway documentation](https://gateway.envoyproxy.io/docs/)
+* [Multi-tenant WAF setup](../../threat/gateway-waf/multi-tenant-setup.mdx)
+* [Tutorial: Launch a canary deployment](tutorial-ingress-gateway-canary.mdx)
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/customize-ingress-gateway.mdx b/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/customize-ingress-gateway.mdx
new file mode 100644
index 0000000000..8a11c134b2
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/customize-ingress-gateway.mdx
@@ -0,0 +1,252 @@
+---
+description: Tune the Calico Ingress Gateway in Calico Cloud via the GatewayAPI resource — multiple gateway classes, pod placement, container resources, and load balancer annotations.
+---
+
+# Customizing your ingress gateway
+
+You can specify core configuration elements of your ingress gateway by specifying a configuration in the `GatewayAPI` resource.
+Alternatively, for the complete set of customization options available to Envoy Gateway, you can provide your own Envoy Gateway configuration.
+
+## Customizing an ingress gateway with the `GatewayAPI` resource
+
+Many customizations are available for the `GatewayAPI` resource.
+This resource has fields that allow some aspects of Gateway deployments to be customized.
+For example:
+- `spec.gatewayControllerDeployment.spec.template.spec.nodeSelector` allows control over where the gateway controller is scheduled.
+- `spec.gatewayClasses` allows the provisioning of multiple `GatewayClass` resources, each with its own set of customizations, instead of the single `tigera-gateway-class` gateway class that the Tigera Operator provisions by default. Possible `GatewayClass` customizations include the following:
+ - `gatewayDeployment.spec.template.metadata` allows arbitrary labels or annotations to be added to the pod that is created to implement each Gateway within that class.
+ - `gatewayDeployment.spec.template.spec.nodeSelector` allows control over where gateway implementation pods are scheduled.
+ - `gatewayDeployment.spec.template.spec.containers` allows control over the memory and CPU that the gateway implementation pods can use.
+ - `gatewayService.metadata.annotations` allows control over annotations to place on the service that is provisioned for each Gateway; these can be used, for example, to configure the cloud-specific type and properties of the associated external load balancer.
+ - `gatewayService.spec.*loadBalancer*` allows control over the corresponding `*loadBalancer*` fields in the service that is provisioned for each gateway; in some clouds these can also be used to configure the type and properties of the associated external load balancer.
+
+For full details, see [the `GatewayAPI` reference documentation](../../reference/installation/api.mdx#gatewayapi).
+
+:::note
+
+Merged gateways are not supported.
+If a custom `EnvoyProxy` sets `mergeGateways: true`, the operator ignores that setting and uses `false` instead, so each `Gateway` gets its own proxy and load balancer.
+
+:::
+
+To make use of these customization fields, use `kubectl edit gatewayapi tigera-secure` to edit the YAML for the `GatewayAPI` resource, and add or modify the customization fields that you require.
+
+### Customization examples
+
+This section contains examples of common customizations.
+
+#### Handle high traffic with multiple gateway pods and adequate memory per-pod
+
+```bash
+kubectl apply -f - <.yaml
+ ```
+ Replace `` with a name for your custom configuration.
+ ```yaml title='Example of a default Envoy configuration'
+ apiVersion: v1
+ data:
+ envoy-gateway.yaml: |
+ apiVersion: gateway.envoyproxy.io/v1alpha1
+ extensionApis:
+ enableBackend: true
+ enableEnvoyPatchPolicy: true
+ gateway:
+ controllerName: gateway.envoyproxy.io/gatewayclass-controller
+ kind: EnvoyGateway
+ logging:
+ level:
+ default: info
+ provider:
+ kubernetes:
+ rateLimitDeployment:
+ container:
+ image: quay.io/calico/envoy-ratelimit:v3.31.1
+ patch:
+ type: StrategicMerge
+ value:
+ spec:
+ template:
+ spec:
+ containers:
+ - imagePullPolicy: IfNotPresent
+ name: envoy-ratelimit
+ pod: {}
+ shutdownManager:
+ image: quay.io/calico/envoy-gateway:v3.31.1
+ type: Kubernetes
+ kind: ConfigMap
+ metadata:
+ creationTimestamp: "2025-11-18T12:34:04Z"
+ labels:
+ app.kubernetes.io/instance: tigera-gateway-api
+ app.kubernetes.io/managed-by: Helm
+ app.kubernetes.io/name: gateway-helm
+ app.kubernetes.io/version: v1.5.0
+ helm.sh/chart: gateway-helm-v1.5.0
+ name: envoy-gateway-config
+ namespace: calico-system
+ ownerReferences:
+ - apiVersion: operator.tigera.io/v1
+ blockOwnerDeletion: true
+ controller: true
+ kind: GatewayAPI
+ name: default
+ uid: ace36d13-3afc-4c52-b894-dc2b322bc36e
+ resourceVersion: "1978"
+ uid: 8135e15d-cc91-4e02-ab97-2910cff56008
+ ```
+1. Remove the following cluster-generated metadata fields:
+ * `creationTimestamp`
+ * `ownerReferences`
+ * `resourceVersion`
+ * `uid`
+1. Change `metadata.name` from the default `envoy-gateway-config` to something else.
+1. Add your customizations to the `data.envoy-gateway.yaml` section.
+
+ ```yaml title='Example of a customized Envoy configuration file with Jaeger integration'
+ apiVersion: v1
+ data:
+ envoy-gateway.yaml: |
+ apiVersion: gateway.envoyproxy.io/v1alpha1
+ extensionApis:
+ enableBackend: true
+ enableEnvoyPatchPolicy: true
+ gateway:
+ controllerName: gateway.envoyproxy.io/gatewayclass-controller
+ kind: EnvoyGateway
+ logging:
+ level:
+ default: info
+ provider:
+ kubernetes:
+ rateLimitDeployment:
+ container:
+ image: quay.io/calico/envoy-ratelimit:v3.31.1
+ patch:
+ type: StrategicMerge
+ value:
+ spec:
+ template:
+ spec:
+ containers:
+ - imagePullPolicy: IfNotPresent
+ name: envoy-ratelimit
+ pod: {}
+ shutdownManager:
+ image: quay.io/calico/envoy-gateway:v3.31.1
+ type: Kubernetes
+ // highlight-start
+ tracing:
+ enabled: true
+ provider:
+ type: Jaeger
+ jaeger:
+ host: jaeger-collector.observability.svc.cluster.local
+ port: 14268
+ // highlight-end
+ kind: ConfigMap
+ metadata:
+ labels:
+ app.kubernetes.io/instance: tigera-gateway-api
+ app.kubernetes.io/managed-by: Helm
+ app.kubernetes.io/name: gateway-helm
+ app.kubernetes.io/version: v1.5.0
+ helm.sh/chart: gateway-helm-v1.5.0
+ // highlight-next-line
+ name: custom-envoy-config
+ namespace: calico-system
+ ```
+
+1. Apply the customized Envoy configuration:
+ ```bash
+ kubectl apply -f custom-envoy-config.yaml
+ ```
+1. Patch the `GatewayAPI` resource to include the path of the custom Envoy configuration:
+ ```bash
+ kubectl patch gatewayapi tigera-secure --type='json' -p='[{"op": "replace", "path": "/spec/envoyGatewayConfigRef", "value": {"name": "custom-envoy-config", "namespace": "calico-system"}}]'
+ ```
+
+## Additional resources
+
+* `GatewayAPI` spec in the [Tigera Operator API reference](../../reference/installation/api.mdx#gatewayapi)
+* [Envoy Gateway documentation](https://gateway.envoyproxy.io/docs/)
\ No newline at end of file
diff --git a/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/tutorial-ingress-gateway-canary.mdx b/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/tutorial-ingress-gateway-canary.mdx
new file mode 100644
index 0000000000..da4a4c9e2e
--- /dev/null
+++ b/calico-cloud_versioned_docs/version-24-1/networking/ingress-gateway/tutorial-ingress-gateway-canary.mdx
@@ -0,0 +1,416 @@
+---
+description: Step-by-step tutorial for running a canary rollout in Calico Cloud by splitting HTTPRoute weights across two backends behind an ingress gateway.
+title: "Tutorial: Canary deployment"
+---
+
+import CodeBlock from '@theme/CodeBlock';
+export const calicoVersion='v3.31.1'
+export const files=`https://raw.githubusercontent.com/projectcalico/calico/${calicoVersion}`;
+
+
+# Tutorial: Launch a canary deployment with Calico Ingress Gateway
+
+This tutorial shows you how to create a canary deployment by using Calico Ingress Gateway.
+
+## Overview
+
+A **canary deployment** is a progressive release strategy where a new version of an application is gradually rolled out to a small subset of users before being fully deployed.
+This approach allows teams to detect issues early, validate new features, and roll back quickly if needed, minimizing disruption to the majority of users.
+
+In $[prodname], canary deployments are implemented with a **traffic splitting** method that is defined in a routing resource associated with an ingress gateway.
+By defining routing rules, you direct a small proportion of your incoming traffic to the canary version of your workload for testing.
+The majority of the traffic continues to the stable version.
+
+As you become more confident in the canary version, you increase the proportion of traffic going to that version incrementally until it becomes the new stable version.
+
+## Use cases
+
+- **Feature Rollouts:** Safely release a new feature to a small subset of users to validate functionality and gather feedback before full deployment.
+- **Performance Testing:** Evaluate how a new version handles real-world traffic and resource usage without affecting all users.
+- **Bug Detection:** Catch critical bugs or unexpected behavior in production with minimal user impact.
+- **A/B Testing:** Test different versions of a service to compare performance, user engagement, or conversion rates before committing to one.
+- **Compliance and Risk Management:** Gradually roll out updates in highly regulated or mission-critical environments to reduce the chance of widespread failures.
+
+Canary deployments are ideal when you want controlled, low-risk releases, allowing teams to monitor metrics, validate assumptions, and ensure stability before a full-scale rollout.
+
+## Before you begin
+
+You'll need to install a few tools to complete this tutorial:
+
+* `kind`.
+ This is what you'll use to create a cluster on your workstation.
+ For installation instructions, see the [`kind` documentation](https://kind.sigs.k8s.io/docs/user/quick-start/).
+* Docker Engine or Docker Desktop.
+ This is required to run containers for the `kind` utility.
+ For installation instructions, see the [Docker documentation](https://docs.docker.com/desktop/).
+* `kubectl`.
+ This is the tool you'll use to interact with your cluster.
+ For installation instructions, see the [Kubernetes documentation](https://kubernetes.io/docs/tasks/tools/#kubectl)
+
+## Step 1: Set up your environment
+
+For this tutorial, you need access to a cluster with Calico Open Source 3.33 or later installed.
+
+We'll use `kind` to create this environment, but you can use any other supported Kubernetes distribution with a compatible version of $[prodname].
+If you've already got a suitable environment, start the tutorial at [Step 2: Create the ingress gateway](#step-2-create-an-ingress-gateway).
+
+1. Create a `kind` cluster with one control-plane node and two worker nodes.
+
+ ```bash
+ cat > config.yaml < 5m23s v1.33.1
+ calico-cluster-worker2 NotReady 5m22s v1.33.1
+ ```
+
+ The nodes remain in a `NotReady` status until you configure networking in the next step.
+
+1. Install Calico Open Source by adding custom resource definitions, the Tigera Operator, and the custom resources.
+
+ {`kubectl create -f ${files}/manifests/operator-crds.yaml
+ kubectl create -f ${files}/manifests/tigera-operator.yaml
+ kubectl create -f ${files}/manifests/custom-resources.yaml`}
+
+1. Monitor the deployment by running the following command:
+
+ ```bash
+ watch kubectl get tigerastatus
+ ```
+
+ After a few minutes, all the Calico components display `True` in the `AVAILABLE` column.
+
+ ```bash title="Expected output"
+ NAME AVAILABLE PROGRESSING DEGRADED SINCE
+ apiserver True False False 4m9s
+ calico True False False 3m29s
+ goldmane True False False 3m39s
+ ippools True False False 6m4s
+ whisker True False False 3m19s
+ ```
+
+## Step 2. Create an ingress gateway
+
+Enable the Gateway API by creating a `GatewayAPI` resource.
+When you create this resource, the Tigera Operator pulls Envoy Gateway images and sets things up.
+Once that is set up, you can create supported Gateway API resources, such as the `Gateway` and routing resources.
+
+1. To enable Gateway API support, create a `GatewayAPI` resource with name `default`:
+
+ ```bash
+ kubectl apply -f - <