#!/bin/bash # Demo: create N Managed proxies backed by the gcp provider, named # proxy-gcp-demo-1 .. proxy-gcp-demo-N, each in a randomly picked EU zone # so the fleet gets egress IPs from different locations. # # Usage: # ./create-gcp-proxies.sh # # Optional environment: # NAMESPACE namespace to create the proxies in (default: current context) # GCP_PROVIDER provider NAME from providers.yaml (default: gcp-eu) # ZONES space-separated zone list to pick from (default: EU zones below) set -euo pipefail if [ $# -ne 1 ] || ! [[ "$1" =~ ^[1-9][0-9]*$ ]]; then echo "usage: $(basename "$0") (positive integer)" >&2 exit 1 fi count="$1" provider="${GCP_PROVIDER:-gcp-eu}" # GCP zones in the EU where e2-micro is generally available. Override with # ZONES="zone1 zone2 ..." if your project has quota only in some of them. default_zones=( europe-west1-b europe-west1-c europe-west1-d # Belgium europe-west2-a europe-west2-b europe-west2-c # London europe-west3-a europe-west3-b europe-west3-c # Frankfurt europe-west4-a europe-west4-b europe-west4-c # Netherlands europe-west6-a europe-west6-b europe-west6-c # Zurich europe-west8-a europe-west8-b europe-west8-c # Milan europe-west9-a europe-west9-b europe-west9-c # Paris europe-central2-a europe-central2-b europe-central2-c # Warsaw europe-north1-a europe-north1-b europe-north1-c # Finland europe-southwest1-a europe-southwest1-b europe-southwest1-c # Madrid ) if [ -n "${ZONES:-}" ]; then read -r -a zones <<< "${ZONES}" else zones=("${default_zones[@]}") fi if ! command -v kubectl &> /dev/null; then echo "ERROR: kubectl is required but not installed" >&2 exit 1 fi ns_args=() if [ -n "${NAMESPACE:-}" ]; then ns_args=(-n "${NAMESPACE}") fi for i in $(seq 1 "${count}"); do zone="${zones[RANDOM % ${#zones[@]}]}" echo "Creating proxy-gcp-demo-${i} in ${zone} ..." kubectl apply "${ns_args[@]}" -f - << EOF apiVersion: crawl.example.com/v1alpha1 kind: Proxy metadata: name: proxy-gcp-demo-${i} spec: mode: Managed provider: ${provider} # must match a provider NAME in providers.yaml placement: zone: ${zone} machineType: e2-micro # debian-cloud images have no cloud-init, so spec.cloudInit (passed as # user-data metadata) would be silently ignored there. Ubuntu images do. image: projects/ubuntu-os-cloud/global/images/family/ubuntu-2404-lts-amd64 port: 3128 cloudInit: inline: | #cloud-config package_update: true packages: - squid write_files: - path: /etc/squid/conf.d/proxy-operator.conf content: | http_access allow all via off forwarded_for off runcmd: - systemctl restart squid attributes: geo: eu zone: ${zone} purpose: crawl EOF done echo "" echo "Created ${count} proxies. VMs take a few minutes to provision and pass" echo "the health check. Watch them come up with:" echo " kubectl get px ${ns_args[*]:-} -w"