Set up service security with Envoy
Use the instructions in this guide to configure authentication and authorization for services deployed with Cloud Service Mesh and Envoy proxies. For complete information about Cloud Service Mesh service security, see Cloud Service Mesh service security.
Requirements
Before you configure service security for Cloud Service Mesh with Envoy, make sure that your setup meets the following prerequisites:
You can meet all of the requirements for deploying Cloud Service Mesh. For complete information about these requirements, see Prepare to set up on service routing APIs with Envoy and proxyless workloads.
You have sufficient permissions to create or update the Cloud Service Mesh and Google Cloud service mesh resources to use the service security, as described in Prepare to set up on service routing APIs with Envoy and proxyless workloads.
Prepare for setup
The following sections describe the tasks you need to complete before you set up Cloud Service Mesh security service. These tasks are:
- Updating the Google Cloud CLI
- Setting up variables
- Enabling the APIs required for Cloud Service Mesh to work with Certificate Authority Service
Update the gcloud command-line tool
To update the Google Cloud CLI, run the following on your local machine:
gcloud components update
Set up variables
Set the following variables so that you can copy and paste code with consistent values as you work through the example in this document. Use the following values.
- PROJECT_ID: Substitute the ID of your project.
- CLUSTER_NAME: Substitute the cluster name you want to
us, for example,
secure-td-cluster. - ZONE: Substitute the zone where your cluster is located. your cluster is located.
- GKE_CLUSTER_URL: Substitute
https://container.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/clusters/CLUSTER_NAME - WORKLOAD_POOL: Substitute
PROJECT_ID.svc.id.goog - K8S_NAMESPACE: Substitute
default. - DEMO_CLIENT_KSA: Substitute the name of your client Kubernetes service account.
- DEMO_SERVER_KSA: Substitute the name of your server Kubernetes service account.
PROJNUM: Substitute the project number of your project, which you can determine from the Google Cloud console or with this command:
gcloud projects describe PROJECT_ID --format="value(projectNumber)"
SA_GKE: Substitute
service-PROJNUM@container-engine-robot.iam.gserviceaccount.comCLUSTER_VERSION: Substitute the most recent version available. You can find this in the Rapid channel release notes. The minimum required version is 1.21.4-gke.1801. This is the GKE cluster version to use in this example.
Set the values here:
# Substitute your project ID PROJECT_ID=PROJECT_ID # GKE cluster name and zone for this example. CLUSTER_NAME=CLUSTER_NAME ZONE=ZONE # GKE cluster URL derived from the above GKE_CLUSTER_URL="https://container.googleapis.com/v1/projects/PROJECT_ID/locations/ZONE/clusters/CLUSTER_NAME" # Workload pool to be used with the GKE cluster WORKLOAD_POOL="PROJECT_ID.svc.id.goog" # Kubernetes namespace to run client and server demo. K8S_NAMESPACE=K8S_NAMESPACE DEMO_CLIENT_KSA=DEMO_CLIENT_KSA DEMO_SERVER_KSA=DEMO_SERVER_KSA # Compute other values # Project number for your project PROJNUM=PROJNUM CLUSTER_VERSION=CLUSTER_VERSION SA_GKE=service-PROJNUM@container-engine-robot.iam.gserviceaccount.com
Enable the APIs
Use the gcloud services enable
command to enable all of the APIs you need to set up Cloud Service Mesh
security with Certificate Authority Service.
gcloud services enable \ container.googleapis.com \ cloudresourcemanager.googleapis.com \ compute.googleapis.com \ trafficdirector.googleapis.com \ networkservices.googleapis.com \ networksecurity.googleapis.com \ privateca.googleapis.com \ gkehub.googleapis.com
Create or update a GKE cluster
Cloud Service Mesh service security depends on the CA Service integration with GKE. The GKE cluster must meet the following requirements in addition to the requirements for setup:
- Use a minimum cluster version of 1.21.4-gke.1801. If you need features that are in a later version, you can obtain that version from the rapid release channel.
- The GKE cluster must be enabled and configured with mesh certificates, as described in Creating certificate authorities to issue certificates.
Create a new cluster that uses Workload Identity Federation for GKE. If you are updating an existing cluster, skip to the next step. The value you give for
--tagsmust match the name passed to the--target-tagsflag for thefirewall-rules createcommand in the section Configuring Cloud Service Mesh with Cloud Load Balancing components.# Create a GKE cluster with GKE managed mesh certificates. gcloud container clusters create CLUSTER_NAME \ --release-channel=rapid \ --scopes=cloud-platform \ --image-type=cos_containerd \ --machine-type=e2-standard-2 \ --zone=ZONE \ --workload-pool=PROJECT_ID.svc.id.goog \ --enable-mesh-certificates \ --cluster-version=CLUSTER_VERSION \ --enable-ip-alias \ --tags=allow-health-checks \ --workload-metadata=GKE_METADATA
Cluster creation might take several minutes to complete.
If you are using an existing cluster, turn on Workload Identity Federation for GKE and GKE mesh certificates. Make sure that the cluster was created with the
--enable-ip-aliasflag, which cannot be used with theupdatecommand.gcloud container clusters update CLUSTER_NAME \ --enable-mesh-certificates
Run the following command to switch to the new cluster as the default cluster for your
kubectlcommands:gcloud container clusters get-credentials CLUSTER_NAME \ --zone ZONE
Deploying in a multi-cluster environment
If you are deploying in a multi-cluster environment, follow the general procedure described in this section. These instructions assume that client Pods are running in one cluster and server Pods are running in the other cluster.
Create or update the clusters using the instructions in the previous section.
Capture the Pod IP address ranges for each cluster using the following command:
gcloud compute firewall-rules list \ --filter="name~gke-{CLUSTER_NAME}-[0-9a-z]*-all" \ --format="value(sourceRanges)"For example, for clusters called
cluster-aandcluster-b, the commands return results such as the following:cluster-a, pod CIDR: 10.4.0.0/14, node network tag: gke-cluster-a-9cd18751-node cluster-b, pod CIDR: 10.8.0.0/14, node network tag: gke-cluster-b-acd14479-node
Create VPC firewall rules that allow the clusters to communicate with each other. For example, the following command creates a firewall rule that allows the
cluster-apod IP addresses to communicate withcluster-bnodes: