From 9818f28ca711066a201e729715b0d639bf8cbd71 Mon Sep 17 00:00:00 2001 From: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> Date: Wed, 25 Sep 2024 05:39:16 -0700 Subject: [PATCH] Getting Started - Phase 2 (#3159) * docs: create cloud-centric Getting Started DOC-1068 (#2389) * docs: add navigation card components * chore: Add a few more grid styles * docs: add Jest test and adjust Getting Started landing page * docs: fix formatting * docs: fix lint errors in SimpleCard * docs: refactor grid test DOC-1067 * docs: reduce duplication in SimpleCard test * docs: reduce duplication in SimpleCard test * docs: fix formatting DOC-1067 * docs: update SimpleCardGrid naming DOC-1067 * docs: create cloud-centric Getting Started prototype DOC-1068 * docs: fix formatting * docs: adjust nav cards and rebase * docs: update prototype DOC-1068 * docs: move dashboard to introduction DOC-1068 * docs: update AWS section DOC-1068 * docs: update Azure section DOC-1068 * docs: update GCP section DOC-1068 * docs: add tags to getting started DOC-1068 * docs: update formatting DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update GCP landing page DOC-1068 * Apply suggestions from code review Co-authored-by: Karl Cardenas * docs: adjust setup fro getting started DOC-1068 * docs: remove video from deploy cluster DOC-1068 * docs: update imports in AWS DOC-1068 * docs: fix formatting DOC-1068 * docs: fix broken links DOC-1068 * docs: fix broken links DOC-1068 * docs: adjust partials usage DOC-1068 * docs: use partials in getting started DOC-1068 * docs: use hello-universe pack in cluster profile DOC-1068 * Optimised images with calibre/image-actions * docs: fix registries link DOC-1068 * docs: update aws cluster profile updates page DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update azure tutorial with hello-uni pack DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update gcp tutorial DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update azure guide with correct assets DOC-1068 --------- Co-authored-by: yuliiiah Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: Karl Cardenas * docs: add VMware Getting Started DOC-1126 (#3173) * docs: add VMware Getting Started DOC-1126 * docs: update AWS flow * docs: adjust Azure flow DOC-116 * docs: adjust GCP flow DOC-1126 * docs: adjust VMware flow DOC-1126 * docs: add Cluster Observability section DOC-1126 * docs: fix landing DOC-1126 * docs: fix landing DOC-1126 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: add PCG page card to VMware landing * docs: remove spaces from around VersionedLink * Apply suggestions from code review Co-authored-by: caroldelwing * docs: add missing VMware card & fix PR comments DOC-1126 --------- Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: caroldelwing * docs: revert adding of old accept file * Manage AWS Clusters with Terraform tutorial - Getting Started (#3276) * docs: create cloud-centric Getting Started DOC-1068 (#2389) * docs: add navigation card components * chore: Add a few more grid styles * docs: add Jest test and adjust Getting Started landing page * docs: fix formatting * docs: fix lint errors in SimpleCard * docs: refactor grid test DOC-1067 * docs: reduce duplication in SimpleCard test * docs: reduce duplication in SimpleCard test * docs: fix formatting DOC-1067 * docs: update SimpleCardGrid naming DOC-1067 * docs: create cloud-centric Getting Started prototype DOC-1068 * docs: fix formatting * docs: adjust nav cards and rebase * docs: update prototype DOC-1068 * docs: move dashboard to introduction DOC-1068 * docs: update AWS section DOC-1068 * docs: update Azure section DOC-1068 * docs: update GCP section DOC-1068 * docs: add tags to getting started DOC-1068 * docs: update formatting DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update GCP landing page DOC-1068 * Apply suggestions from code review Co-authored-by: Karl Cardenas * docs: adjust setup fro getting started DOC-1068 * docs: remove video from deploy cluster DOC-1068 * docs: update imports in AWS DOC-1068 * docs: fix formatting DOC-1068 * docs: fix broken links DOC-1068 * docs: fix broken links DOC-1068 * docs: adjust partials usage DOC-1068 * docs: use partials in getting started DOC-1068 * docs: use hello-universe pack in cluster profile DOC-1068 * Optimised images with calibre/image-actions * docs: fix registries link DOC-1068 * docs: update aws cluster profile updates page DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update azure tutorial with hello-uni pack DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update gcp tutorial DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update azure guide with correct assets DOC-1068 --------- Co-authored-by: yuliiiah Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: Karl Cardenas * docs: add aws terraform tutorial * docs: fix broken link, remove duplicated partials * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: fix card component * docs: fix images conflicts * docs: fix more images conflicts * docs: fix last image conflicts * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: final review * Apply suggestions from code review Co-authored-by: Adelina Simion <43963729+addetz@users.noreply.github.com> * docs: apply suggestions from review --------- Co-authored-by: Adelina Simion <43963729+addetz@users.noreply.github.com> Co-authored-by: yuliiiah Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: Karl Cardenas * docs: add azure terraform tutorial, clean up gs section (#3330) * docs: add azure terraform tutorial, clean up gs section * docs: add gcp tutorial * docs: add vmware terraform tutorial * docs: vale suggestions * Optimised images with calibre/image-actions * docs: vale suggestions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: style guide fixes * docs: apply suggestions from review --------- Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> * docs: combine cluster profiles with introduction page Getting Started DOC-1125 (#3473) * docs: combine cluster profiles with introduction page Getting Started DOC-1125 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions --------- Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> * docs: remove duplicate partial entry in prettierignore * docs: add AWS "Scale, Upgrade, and Secure Clusters" tutorial DOC-1306 (#3463) * docs: create cloud-centric Getting Started DOC-1068 (#2389) * docs: add navigation card components * chore: Add a few more grid styles * docs: add Jest test and adjust Getting Started landing page * docs: fix formatting * docs: fix lint errors in SimpleCard * docs: refactor grid test DOC-1067 * docs: reduce duplication in SimpleCard test * docs: reduce duplication in SimpleCard test * docs: fix formatting DOC-1067 * docs: update SimpleCardGrid naming DOC-1067 * docs: create cloud-centric Getting Started prototype DOC-1068 * docs: fix formatting * docs: adjust nav cards and rebase * docs: update prototype DOC-1068 * docs: move dashboard to introduction DOC-1068 * docs: update AWS section DOC-1068 * docs: update Azure section DOC-1068 * docs: update GCP section DOC-1068 * docs: add tags to getting started DOC-1068 * docs: update formatting DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update GCP landing page DOC-1068 * Apply suggestions from code review Co-authored-by: Karl Cardenas * docs: adjust setup fro getting started DOC-1068 * docs: remove video from deploy cluster DOC-1068 * docs: update imports in AWS DOC-1068 * docs: fix formatting DOC-1068 * docs: fix broken links DOC-1068 * docs: fix broken links DOC-1068 * docs: adjust partials usage DOC-1068 * docs: use partials in getting started DOC-1068 * docs: use hello-universe pack in cluster profile DOC-1068 * Optimised images with calibre/image-actions * docs: fix registries link DOC-1068 * docs: update aws cluster profile updates page DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update azure tutorial with hello-uni pack DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update gcp tutorial DOC-1068 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update azure guide with correct assets DOC-1068 --------- Co-authored-by: yuliiiah Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: Karl Cardenas * docs: add aws tutorial DOC-1306 * docs: update tutorial wording DOC-1306 * docs: fix vale DOC-1306 * docs: fix vale DOC-1306 * docs: fix vale DOC-1306 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: add gif and details DOC-1306 * docs: adjust files on rebase * Apply suggestions from code review Co-authored-by: caroldelwing * docs: address further review comments DOC-1306 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions --------- Co-authored-by: yuliiiah Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: Karl Cardenas Co-authored-by: caroldelwing * docs: add Azure/GCP/VMware Scale and Secure tutorial DOC-1307 DOC-1308 DOC-1309 (#3517) * docs: add Azure Scale and Secure tutorial DOC-1308 * docs: add GCP Scale and Secure tutorial DOC-1308 * docs: add VMware Scale and Secure tutorial DOC-1309 * docs: fix vale DOC-1307 * docs: fix formatting * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: rephrase upgrades description DOC-1308 --------- Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> * docs: additional capabilities pages DOC-1144 (#3550) * docs: additional capabilities pages DOC-1144 * docs: fix formatting * docs: change landing * Apply suggestions from code review Co-authored-by: caroldelwing * docs: fix up review comments * docs: fix links additional capabilities DOC-1144 * docs: move trusted boot mention * docs: revise wording doc-1144 --------- Co-authored-by: caroldelwing * docs: fix broken link to pack * docs: fix broken link to dashboard * docs: bump tutorials container image version * docs: add spacetastic story to AWS Getting Started DOC-1332 (#4019) * docs: add spacetastic story DOC-1332 * docs: adjust conversation punctuation DOC-1332 * docs: remove gendered language DOC-1332 * docs: remove repeated spacetastic * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: fix formatting * docs: adjust systems diagram * Optimised images with calibre/image-actions * docs: add story to setup page DOC-1332 * Optimised images with calibre/image-actions * docs: add story to create cluster profile page DOC-1332 * docs: add spacetastic story to rest of getting started DOC-1332 * Optimised images with calibre/image-actions * docs: fix vale * docs: fix vale * docs: fix vale * Apply suggestions from code review Co-authored-by: caroldelwing Co-authored-by: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> * Update docs/docs-content/getting-started/aws/scale-secure-cluster.md Co-authored-by: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> * docs: fix formatting * docs: add call reference to additional capabilities on scale secure DOC-1332 * docs: fix vale * Optimised images with calibre/image-actions --------- Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: caroldelwing Co-authored-by: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> * docs: add Spacetastic to all clouds DOC-1332 (#4048) * docs: add Spacetastic to all clouds DOC-1332 * docs: fix formatting * docs: update Getting Started AWS and GCP screenshots DOC-1394 (#4054) * docs: update aws screenshots DOC-1394 * docs: fix formatting * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update GCP screenshots & pack DOC-1394 * docs: fix formatting * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions --------- Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> * docs: update GS Azure tutorials (#4055) * docs: update cluster profile, cluster, update tutorials * docs: update terraform tutorial * docs: bump terraform container version * docs: update scale secure tutorial DOC-1395 * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * docs: update table DOC-395 --------- Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: addetz <43963729+addetz@users.noreply.github.com> * docs: update profile tutorial, container version (#4058) * docs: update profile tutorial, container version * docs: update hellouni * docs: update profile tutorial, container version * docs: update hellouni * Optimised images with calibre/image-actions * docs: bump hellouni version * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions * Optimised images with calibre/image-actions --------- Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> * docs: fix up landing page buttons DOC-855 --------- Co-authored-by: yuliiiah Co-authored-by: vault-token-factory-spectrocloud[bot] <133815545+vault-token-factory-spectrocloud[bot]@users.noreply.github.com> Co-authored-by: Karl Cardenas Co-authored-by: caroldelwing Co-authored-by: Karl Cardenas <29551334+karl-cardenas-coding@users.noreply.github.com> --- docs/docs-content/architecture/grps-proxy.md | 72 ++++++++++++++++-- .../site-deployment/cluster-deployment.md | 71 ++++++++--------- .../release-notes/release-notes.md | 44 +++++++++++ ...rchitecture_grps-proxy_grpc-websocket.webp | Bin 0 -> 30792 bytes 4 files changed, 146 insertions(+), 41 deletions(-) create mode 100644 static/assets/docs/images/architecture_grps-proxy_grpc-websocket.webp diff --git a/docs/docs-content/architecture/grps-proxy.md b/docs/docs-content/architecture/grps-proxy.md index 95e626ee6b..cdd72bd2b6 100644 --- a/docs/docs-content/architecture/grps-proxy.md +++ b/docs/docs-content/architecture/grps-proxy.md @@ -11,19 +11,77 @@ sidebar_custom_props: Palette uses [gRPC](https://grpc.io) to communicate between the management platform and the workload cluster. gRPC is a high-performance, open-source universal Remote Procedure Call (RPC) framework. It is used to build distributed -applications and services. gRPC is based on HTTP/2 and uses protocol buffers ([protobuf](https://protobuf.dev/)) as the -underlying data serialization framework. +applications and services. gRPC is based on HTTP/2 protocol and uses protocol buffers +([protobuf](https://protobuf.dev/)) as the underlying data serialization framework. -:::info +:::tip Refer to the [Network Ports](networking-ports.md) documentation for a detailed network architecture diagram with gRPC and to learn more about the ports used for communication. ::: +## gRPC and WebSocket + +The Palette agent will automatically attempt to connect to the management plane using gRPC through HTTPS using the +HTTP/2 protocol. In some environments, the network configuration may not allow gRPC traffic to pass through. A common +scenario is when the network is behind a proxy server that does not support HTTP/2. In this scenario, the Palette agent +will first attempt to connect to the management plane using HTTP/2. After several failed attempts, the agent will fall +back to using WebSocket over HTTPS with HTTP/1.1. + +The fallback to WebSocket with transcoding occurs automatically and does not require any additional configuration. + +### gRPC Transcode + +Behind the scenes, when the Palette agent fails to connect with the management plane after a maximum of ten connection +attempts, the agent initiates the failover to a WebSocket connection and transcodes the gRPC messages with the HTTP/1.1 +protocol. + +The Palette agent directs gRPC messages to a freshly started in-memory proxy service, which takes the original gRPC +request, transcodes it to HTTP/1.1 protocol, and sends it over the WebSocket connection to the management plane. The +management plane's WebSocket handler will then accept the WebSocket message and transcode it back to the HTTP/2 protocol +before forwarding it to the gRPC handler. The server will then respond with a gRPC message, which will be transcoded to +HTTP/1.1 and sent back to the agent over the WebSocket. The agent's in-memory proxy will read the message and transcode +it back to HTTP/2 and pass it to the agent. + +![An architecture diagram of the gRPC over WebSocket flow from a network perspective. Agent to agent proxy, to WebSocket handler, who then forwards the message to the server gRPC handler.](/architecture_grps-proxy_grpc-websocket.webp) + +Below is a high-level overview of the order of operations when the Palette agent falls back to using WebSocket: + +1. The agent initiates a new gRPC request to the management plane servers that is picked up by the in-memory proxy + service. +2. The agent's in-memory proxy creates a WebSocket connection with the management plane servers. +3. The management plane server accepts the WebSocket connection +4. The agent in-memory proxy transcodes the gRPC request on-demand and sends it via the WebSocket connection. +5. The server's WebSocker handler reads the request off the WebSocket connection and forwards it to the server's gRPC + handler. +6. The gRPC handler processes the request and responds via the same connection. The WebSocket handler sends the response + from the gRPC handler back to the agent. +7. The agent's in-memory proxy reads the response off the WebSocket connection and transcodes it back to HTTP/2 and + passes it to the agent. + +A more straightforward way to think about the WebSocket transcoding architecture is that network traffic between the +Palette agent and the management plane uses the WebSocket connection and the HTTP/1.1 protocol. The agent and server are +still communicating using gRPC, but the messages are transcoded to the HTTP/1.1 protocol between the two entities. Using +WebSocket and HTTP/1.1 removes issues due to application firewalls or network proxies not supporting the HTTP/2 +protocol. Once the gRPC message is internal to the agent or the server, the HTTP/2 protocol is used for communication. + +## gRPC and Proxies + +:::info + +The following sections provide information about using gRPC with network proxies. These issues are addressed by using +WebSocket and the HTTP/1.1 protocol as a fallback mechanism. However, if you want to better understand the reasons for +falling back to a WebSocket connection, the following sections provide more information about challenges with gRPC and +network proxies. If you want to learn more about gRPC and transcoding, check out the Red Hat article +[gRPC Anywhere](https://www.redhat.com/en/blog/grpc-anywhere). + +::: + When gRPC is used with network proxies, the proxy servers may or may not support gRPC or require additional configuration to allow gRPC traffic to pass through. The following table summarizes the different scenarios and whether -or not the proxy server supports gRPC. +or not the proxy server supports gRPC. Keep in mind that should the gRPC connection fail, the agent will automatically +fall back to using WebSocket. | **Scenario** | **Description** | **Proxy Supported** | | :---------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------- | :------------------ | @@ -33,7 +91,7 @@ or not the proxy server supports gRPC. The following sections provide more information about gRPC and proxies. -## Proxy Without SSL Bump +### Proxy Without SSL Bump Because gRPC is based on HTTP/2, any proxy server that supports the [HTTP CONNECT](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/CONNECT) method can be used to forward gRPC @@ -48,7 +106,7 @@ scenario, the proxy server must support gRPC and may require additional configur ::: -## Proxy With SSL Bump +### Proxy With SSL Bump Several vendors provide proxy servers that support gRPC. Some of the vendors may require additional configurations or the use of a specific version of the proxy server. We encourage you to review your proxy server documentation for more @@ -65,7 +123,7 @@ to some vendors' documentation that addresses HTTP/2 and gRPC support. - [Check Point](https://support.checkpoint.com/results/sk/sk116022) -## Squid Proxy With SSL Bump +### Squid Proxy With SSL Bump A common open-source proxy server is [Squid](https://wiki.squid-cache.org). Squid is a caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. Squid supports gRPC but requires additional configuration. gRPC with SSL bump diff --git a/docs/docs-content/clusters/edge/site-deployment/cluster-deployment.md b/docs/docs-content/clusters/edge/site-deployment/cluster-deployment.md index a4b56565bd..f0ab2443e3 100644 --- a/docs/docs-content/clusters/edge/site-deployment/cluster-deployment.md +++ b/docs/docs-content/clusters/edge/site-deployment/cluster-deployment.md @@ -120,53 +120,56 @@ cluster:    vip_interface: "ens32" ``` -In the CNI layer, depending on which CNI pack you choose for your cluster profile, you need to make changes in the -following locations. + In the CNI layer, depending on which CNI pack you choose for your cluster profile, you need to make changes in the + following locations. + - - In the Calico pack YAML file default template, uncomment `manifests.calico.env.calicoNode.IP_AUTODETECTION_METHOD` and set its value to `interface=INTERFACE_NAME`. Replace `INTERFACE_NAME` with the name of the NIC in your control plane node pool. For example, set `IP_AUTODETECTION_METHOD` to `"interface=eno32"` if the NIC name of the nodes in your control plane pool is `eno32`. - - ```yaml {11} - manifests: - calico: - ... - env: - # Additional env variables for calico-node - calicoNode: - #IPV6: "autodetect" - #FELIX_IPV6SUPPORT: "true" - #CALICO_IPV6POOL_NAT_OUTGOING: "true" - #CALICO_IPV4POOL_CIDR: "192.168.0.0/16" - IP_AUTODETECTION_METHOD: "interface=eno32" - ``` + + In the Calico pack YAML file default template, uncomment `manifests.calico.env.calicoNode.IP_AUTODETECTION_METHOD` and + set its value to `kubernetes-internal-ip`. This tells Calico to use the address assigned to the Kubernetes node. + + ```yaml {11} + manifests: + calico: + ... + env: + # Additional env variables for calico-node + calicoNode: + #IPV6: "autodetect" + #FELIX_IPV6SUPPORT: "true" + #CALICO_IPV6POOL_NAT_OUTGOING: "true" + #CALICO_IPV4POOL_CIDR: "192.168.0.0/16" + IP_AUTODETECTION_METHOD: "kubernetes-internal-ip" + ``` + -In the Flannel pack YAML file, add a line `- "--iface=INTERFACE_NAME"` in the default template under -`charts.flannel.args`. Replace `INTERFACE_NAME` with the name of the NIC. For example, add the line `- "--iface=eno32` -if the NIC name of your control plane nodes is `eno32`. - -```yaml {8} -charts: - flannel: - ... - # flannel command arguments - args: - - "--ip-masq" - - "--kube-subnet-mgr" - - "--iface=eno32" -``` + In the Flannel pack YAML file, add a line `- "--iface=INTERFACE_NAME"` in the default template under + `charts.flannel.args`. Replace `INTERFACE_NAME` with the name of the NIC. For example, add the line `- "--iface=eno32` + if the NIC name of your control plane nodes is `eno32`. + + ```yaml {8} + charts: + flannel: + ... + # flannel command arguments + args: + - "--ip-masq" + - "--kube-subnet-mgr" + - "--iface=eno32" + ``` - You do not need to make any adjustments to the Cilium pack. + You do not need to make any adjustments to the Cilium pack. - If you are using other CNIs, refer to the documentation of your selected CNI and configure it to make sure that it picks the right NIC on your Edge hosts. + If you are using other CNIs, refer to the documentation of your selected CNI and configure it to make sure that it picks the right NIC on your Edge hosts. diff --git a/docs/docs-content/release-notes/release-notes.md b/docs/docs-content/release-notes/release-notes.md index f5d672c43b..773de8769f 100644 --- a/docs/docs-content/release-notes/release-notes.md +++ b/docs/docs-content/release-notes/release-notes.md @@ -11,6 +11,50 @@ tags: ["release-notes"] +## Sept 25, 2024 - Release 4.4.20 + +### Improvements + +- Palette's message communication channel between clusters and the management plane has been updated to support gRPC + over WebSocket. Palette agents will automatically fall back to a WebSocket connection if the gRPC connection cannot be + established with the management plane using the default HTTP/2 protocol. This change improves the reliability of the + communication channel between the agent and the management plane. Environments with network proxies that reject HTTP/2 + connections can now connect as the connection is transcoded to the HTTP/1.1 protocol. Refer to the + [gRPC and WebSocket](../architecture/grps-proxy.md#grpc-and-websocket) section of the Architecture documentation to + learn more. + +- Local UI now supports selecting network interfaces by name. + +- Local UI has improved validation when assigning static IP addresses to network interfaces. + +- The heartbeat mechanism for Palette deployed clusters has been improved for better performance and reliability. + +### Bug Fixes + +- Fixed an issue where imported cluster profiles defaulted to incorrect registry type. + +- Fixed an issue where Palette TUI was not displaying network interfaces that had no IP addresses assigned. + +- Resolved an issue where the Local UI took a long time to load after application deployment. + +- Fixed an issue where the Edge CLI could not download Helm charts from private registries. + +- Fix an issue with the Edge CLI that was silently failing when unable to create the build artifact. The Edge CLI now + provides a clear error message when the build artifact creation fails. + +- Fixed a Palette UI message incorrectly stating to check the new issue date for SSL certificate renewal. The message + now correctly states to check the new expiration date. + +- Resolved an issue where the Palette UI was erroring out when reviewing pack layers during a PCG upgrade. + +- Resolved an issue where the Local UI username and password field validation was not working as expected. + +- Fixed an issue with updating the node port for the Edge Harbor pack. The node port is now correctly updated when + changing the value in the Harbor pack. + +- Resolved an issue where kubeadm based Kubernetes distributions were unable to initialize on clusters with multiple + Network Interface Cards (NIC). + ## Sept 18, 2024 - Release 4.4.19 #### Bug Fixes diff --git a/static/assets/docs/images/architecture_grps-proxy_grpc-websocket.webp b/static/assets/docs/images/architecture_grps-proxy_grpc-websocket.webp new file mode 100644 index 0000000000000000000000000000000000000000..346f9427f6a3f61555d3601dd4ee1cc94917a0aa GIT binary patch literal 30792 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