GKE ClusterNetworkPolicy-এর মাধ্যমে ওয়ার্কলোড সুরক্ষিত করা - AI ইনফারেন্সের উদাহরণ (Gemma, TPU)

১. এক নজরে

এই ল্যাব আপনাকে Google Kubernetes Engine (GKE)-এ ClusterNetworkPolicy-র সাথে পরিচয় করিয়ে দেয়। ClusterNetworkPolicy বিভিন্ন ব্যবহারের ক্ষেত্রে প্রয়োগ করা হয় এবং ক্লাস্টার জুড়ে প্রয়োগ করা যেতে পারে এবং অ্যাডমিন এবং বেসলাইন স্তরে প্রয়োগ করা যেতে পারে। এই উদাহরণে আমরা TPU, vLLM এবং যাচাইকরণ সহ GKE-তে LLM ডিপ্লয়মেন্ট (Gemma)-এর মাধ্যমে কন্ট্রোল দেখাব।

আপনি নিম্নলিখিত প্রযুক্তি নিয়ে কাজ করবেন:

  • Google Kubernetes Engine (GKE) — ব্যক্তিগত, স্কেলেবল ওয়ার্কলোড হোস্ট করার জন্য ফাউন্ডেশনাল কন্টেনার অর্কেস্ট্রেশন প্ল্যাটফর্ম।
  • ClusterNetworkPolicy (CNP) — ক্লাস্টার-স্কোপড মাল্টি-টিয়ার নেটওয়ার্ক নীতি যা অ্যাডমিন, NetworkPolicy ও বেসলাইন টিয়ার জুড়ে SecOps গার্ডরেল চালু করে।
  • vLLM TPU ইনফারেন্স ইঞ্জিন — OpenAI-এর সাথে মানানসই REST এন্ডপয়েন্ট সহ Google TPU -তে লাইটওয়েট Gemma 4 মডেল (google/gemma-4-E2B-it) পরিবেশনকারী হাই-থ্রুপুট ইনফারেন্স।

ভূমিকা ও পারসোনা

Network Policy API নির্দিষ্ট সাংগঠনিক ব্যক্তিত্বের উপর ভিত্তি করে তৈরি করা হয়েছে:

  • ক্লাস্টার অ্যাডমিনিস্ট্রেটর ব্যবহার (ClusterNetworkPolicy): অ্যাডমিন ও বেসলাইন টিয়ারে ক্লাস্টার জুড়ে নিরাপত্তা সংক্রান্ত গার্ডরেল প্রয়োগ করে।
  • নেমস্পেস অ্যাডমিনিস্ট্রেটর ব্যবহার (NetworkPolicy): নির্দিষ্ট নেমস্পেসের মধ্যে টেন্যান্ট-লেভেল বাউন্ডারি ও আইসোলেশন ম্যানেজ করে।
  • অ্যাপ্লিকেশন ডেভেলপার ব্যবহার (NetworkPolicy): অ্যাপ্লিকেশন-নির্দিষ্ট মাইক্রোসার্ভিসের জন্য সূক্ষ্ম-গ্রেনড নিয়মগুলি সংজ্ঞায়িত করে।

এই এনভায়রনমেন্ট কনফিগার করতে, আপনি একটি কাস্টম প্রাইভেট VPC, Cloud NAT এবং ডেডিকেটেড TPU নোড পুল সহ একটি প্রাইভেট GKE ক্লাস্টার ডিপ্লয় করবেন।

আপনার ক্লাস্টার সুরক্ষিত করতে, আপনি কঠোর নেটওয়ার্ক গার্ডরেল এনফোর্স করার জন্য স্ট্যান্ডার্ড NetworkPolicy অবজেক্টের পাশাপাশি মাল্টি-টায়ার ClusterNetworkPolicy রিসোর্স তৈরি করবেন। তারপর আপনি একটি AI ওয়ার্কলোড ডিপ্লয় করবেন যা Gemma 4 মডেল পরিবেশন করার জন্য vLLM,Google Cloud TPU ব্যবহার করে।

সবশেষে, আপনি একটি ওয়ার্কিং বেসলাইন তৈরি করবেন, নিরাপত্তা নীতি প্রয়োগ করবেন এবং Cloud Logging ও লাইভ Hubble eBPF পর্যবেক্ষণযোগ্যতা স্ট্রিম ব্যবহার করে NetworkLogging কনফিগার করবেন যাতে সেইসব নীতি সংক্রান্ত সিদ্ধান্ত অডিট করা এবং প্যাকেট ড্রপ যাচাই করা যায়। সব কনফিগারেশন Terraform, gcloud ও kubectl.-এর কম্বিনেশন ব্যবহার করবে

এই ল্যাবে আপনি শিখবেন কীভাবে নিম্নলিখিত টাস্ক সম্পাদন করতে হয়:

  • Terraform ব্যবহার করে প্রাইভেট নেটওয়ার্কিং, GKE ক্লাস্টার ও Cloud TPU v5e অ্যাক্সিলারেটর প্রোভিশন করা।
  • কানেকশন টেলিমেট্রি রেকর্ড করতে GKE NetworkLogging কনফিগার করুন।
  • অফিসিয়াল vllm/vllm-tpu কন্টেনার ইমেজ ব্যবহার করে TPU-তে Gemma 4 E2B ডেপ্লয় করুন।
  • বিধিনিষেধ প্রয়োগ করার আগে এন্ড-টু-এন্ড কানেক্টিভিটি প্রমাণ করে এমন একটি ওয়ার্কিং বেসলাইন তৈরি করুন।
  • অননুমোদিত ক্রস-নেমস্পেস ট্রাফিক ডিফল্ট-প্রত্যাখ্যান করতে Baseline-tier ClusterNetworkPolicy প্রয়োগ করুন।
  • অনুমোদিত ক্লায়েন্টদের অ্যাক্সেস ডেলিগেট করতে ডেভেলপার-ম্যানেজড NetworkPolicy প্রয়োগ করুন।
  • ডেভেলপার সেটিংস ওভাররাইড করে এমন গ্লোবাল ইগ্রেস গার্ডরেল এনফোর্স করতে Admin-tier ClusterNetworkPolicy প্রয়োগ করুন।
  • (Hubble eBPF স্ট্রিম ও Cloud Logging) ব্যবহার করে লাইভ প্যাকেট ড্রপ ও পাস যাচাই করুন।

এই ল্যাবে, আপনি নিম্নলিখিত প্যাটার্ন তৈরি করতে চলেছেন।

ছবি ১. dbe5e5f7b35afb8e.jpeg

২. Google Cloud পরিষেবা সেট-আপ করা

নিজের গতিতে পরিবেশ সেট-আপ করা

  1. Google Cloud Console-এ সাইন-ইন করুন এবং নতুন প্রোজেক্ট তৈরি করুন অথবা আগে থেকে থাকা প্রোজেক্ট আবার ব্যবহার করুন। আপনার আগে থেকে কোনও Gmail বা Google Workspace অ্যাকাউন্ট না থাকলে, আপনাকে অবশ্যই একটি তৈরি করতে হবে।

295004821bab6a87.png37d264871000675d.png96d86d3d5655cdbe.png

  • প্রোজেক্টের নাম হল এই প্রোজেক্টের অংশগ্রহণকারীদের জন্য ডিসপ্লে নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা Google API ব্যবহার করে না। আপনি যেকোনও সময় এটি আপডেট করতে পারবেন।
  • প্রোজেক্ট আইডি সব Google Cloud প্রোজেক্টের ক্ষেত্রে অনন্য এবং অপরিবর্তনীয় (এটি সেট করার পরে পরিবর্তন করা যাবে না)। Cloud Console অটোমেটিক একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনি মাথা ঘামান না। বেশিরভাগ কোডল্যাবে, আপনাকে প্রোজেক্ট আইডি (সাধারণত PROJECT_ID হিসেবে চিহ্নিত) উল্লেখ করতে হবে। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি অন্য একটি র‍্যান্ডম আইডি তৈরি করতে পারেন। এছাড়াও, আপনি নিজের মতো করে চেষ্টা করে দেখতে পারেন যে সেটি উপলভ্য আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রোজেক্টের সময়কাল পর্যন্ত এটিই থাকবে।
  • আপনার তথ্যের জন্য, একটি তৃতীয় মান আছে, একটি প্রজেক্ট নম্বর, যা কিছু API ব্যবহার করে। ডকুমেন্টেশন থেকে এই তিনটি ভ্যালু সম্পর্কে আরও জানুন।
  1. এরপর, Cloud রিসোর্স/API ব্যবহার করার জন্য আপনাকে Cloud Console-এ বিলিং চালু করতে হবে। এই কোডল্যাব ব্যবহার করতে খুব বেশি খরচ হবে না, যদি কিছু খরচ হয়ও। এই টিউটোরিয়ালের বাইরে বিলিং এড়াতে রিসোর্স বন্ধ করতে, আপনি যে রিসোর্স তৈরি করেছেন তা মুছে ফেলতে পারেন বা প্রোজেক্ট মুছে ফেলতে পারেন। নতুন Google Cloud ব্যবহারকারীরা $৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য উপযুক্ত।

Cloud Shell চালু করুন

আপনার ল্যাপটপ থেকে Google Cloud রিমোটলি অপারেট করা গেলেও, এই কোডল্যাবে আপনি Google Cloud Shell ব্যবহার করবেন, এটি হল ক্লাউডে চলা একটি কমান্ড লাইন এনভায়রনমেন্ট।

Google Cloud Console থেকে, উপরে ডানদিকের টুলবারে Cloud Shell আইকনে ক্লিক করুন:

Cloud Shell চালু করুন

এনভায়রনমেন্টে প্রভিশন ও কানেক্ট করতে মাত্র কয়েক মুহূর্ত সময় লাগতে পারে। এটি সম্পূর্ণ হয়ে গেলে, আপনি এইরকম কিছু দেখতে পাবেন:

Google Cloud Shell টার্মিনালের স্ক্রিনশট যেখানে দেখা যাচ্ছে যে এনভায়রনমেন্ট কানেক্ট করা হয়েছে

আপনার প্রয়োজনীয় সব ডেভেলপমেন্ট টুল এই ভার্চুয়াল মেশিনে লোড করা আছে। এটি একটি স্থায়ী 5GB হোম ডিরেক্টরি অফার করে এবং Google Cloud-এ চলে, যা নেটওয়ার্ক পারফর্ম্যান্স এবং যাচাইকরণকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার সমস্ত কাজ একটি ব্রাউজারের মধ্যে করা যেতে পারে। আপনাকে কিছু ইনস্টল করতে হবে না।

৩. Terraform-এর মাধ্যমে এনভায়রনমেন্ট সেট-আপ করা

এই ল্যাব সম্পূর্ণ করতে,

  • আপনার বেছে নেওয়া অঞ্চল ও জোনে TPU v5e কোটায় অ্যাক্সেস থাকতে হবে। যেমন, (us-central1-a, us-west4-a, us-south1-a, us-west1-c, europe-west4-b)। অ্যাক্সেস পেতে আপনাকে TPU প্ল্যান ডকুমেন্ট ফলো করতে হবে এবং TPU কোটা চালু করতে হবে।
  • এটি একটি ছোট ডিপ্লয়মেন্ট যার জন্য ৪টি TPU v5e চিপ (ct5lp-hightpu-4t), যা একটি জোনে ২x২ স্লাইস তৈরি করবে) প্রয়োজন।

Hugging Face ব্যবহার করতে

  • Hugging Face টোকেন: Gemma মডেল ওয়েট ডাউনলোড করতে একটি অ্যাক্সেস টোকেন প্রয়োজন।
  • প্রয়োজন অনুযায়ী ব্যবহারের জন্য যেকোনও চুক্তিতে সম্মতি দিন।

আমরা ফায়ারওয়াল সংক্রান্ত নিয়ম, সাবনেট এবং তারপর একটি অটোপাইলট ক্লাস্টার সহ কাস্টম VPC তৈরি করব। Cloud Console খুলে আপনি যে প্রোজেক্ট ব্যবহার করবেন সেটি বেছে নিন।

  1. আপনার কনসোলের উপরে ডানদিকে অবস্থিত Cloud Shell খুলুন, Cloud Shell-এ সঠিক প্রোজেক্ট আইডি দেখতে পাচ্ছেন কিনা তা নিশ্চিত করুন, অ্যাক্সেসের অনুমতি দেওয়ার জন্য যেকোনও প্রম্পট কনফার্ম করুন। b51b80043d3bac90.png
  2. gke-cnp-lab, নামে একটি ডিরেক্টরি তৈরি করে সেই ডিরেক্টরিতে যাও।
mkdir -p gke-cnp-lab && cd gke-cnp-lab
  1. এখন কিছু ভেরিয়েবল তৈরি করুন। p.s. REGION, ZONE এডিট করুন যাতে আপনার কাছে TPU রিসোর্সের অ্যাক্সেস আছে এমন প্রকৃত লোকেশন দেখা যায়। ল্যাব অঞ্চল us-west4 এবং জোন us-west4-a-এ ডিফল্ট ব্যবহার করা হয়েছে
export PROJECT_ID=$(gcloud config get-value project)
export REGION="us-west4"
export ZONE="us-west4-a"
export NETWORK="cnp-demo-vpc"
export SUBNET="cnp-main-subnet"
export CLUSTER_NAME="cnp-demo-cluster"
  1. gke-cnp-lab ডিরেক্টরি-তে হেল্পার স্ক্রিপ্টে আপনার কনফিগারেশন ভেরিয়েবল সেভ করুন। আপনার Cloud Shell সেশন ডিসকানেক্ট বা রিসেট হয়ে গেলে, source ./env.sh রান করে আপনি দ্রুত অ্যাক্টিভ ভেরিয়েবল রিস্টোর করতে পারবেন
cat << EOF > env.sh
export PROJECT_ID="${PROJECT_ID}"
export REGION="${REGION}"
export ZONE="${ZONE}"
export NETWORK="${NETWORK}"
export SUBNET="${SUBNET}"
export CLUSTER_NAME="${CLUSTER_NAME}"

echo -e "\n=== Validating Environment Configuration ==="
echo "Project ID   : \${PROJECT_ID}"
echo "Region       : \${REGION}"
echo "Zone         : \${ZONE}"
echo "Network Name : \${NETWORK}"
echo "Subnet Name  : \${SUBNET}"
echo "Cluster Name : \${CLUSTER_NAME}"

if [[ -z "\${PROJECT_ID}" || -z "\${REGION}" || -z "\${ZONE}" || -z "\${NETWORK}" || -z "\${SUBNET}" || -z "\${CLUSTER_NAME}" ]]; then
  echo -e "\n[ERROR] One or more environment variables are missing! Check your configuration."
else
  echo -e "\n[SUCCESS] Environment variables successfully populated and validated."
fi
EOF

chmod +x env.sh
source ./env.sh
  1. এখন কিছু কনফিগারেশন ফাইল যোগ করুন। এগুলি gke-cnp-lab ডিরেক্টরিতে নিম্নলিখিত terraform.tfvars , variables.tf, main.tf ফাইল তৈরি করবে।
cat << EOF > terraform.tfvars
project_id   = "${PROJECT_ID}"
region       = "${REGION}"
zone         = "${ZONE}"
network_name = "${NETWORK}"
subnet_name  = "${SUBNET}"
cluster_name = "${CLUSTER_NAME}"
EOF

cat << 'EOF' > variables.tf
variable "project_id" {
  type        = string
  description = "Google Cloud Project ID"
}

variable "region" {
  type        = string
  description = "Target GCP region"
}

variable "zone" {
  type        = string
  description = "Target GCP zone"
}

variable "network_name" {
  type        = string
  description = "VPC network name"
}

variable "subnet_name" {
  type        = string
  description = "Subnetwork name"
}

variable "cluster_name" {
  type        = string
  description = "GKE cluster name"
}
EOF

cat << 'EOF' > main.tf
terraform {
  required_version = ">= 1.5.0"
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "~> 7.32.0"
    }
    google-beta = {
      source  = "hashicorp/google-beta"
      version = "~> 7.32.0"
    }
  }
}

provider "google" {
  project = var.project_id
  region  = var.region
}

provider "google-beta" {
  project = var.project_id
  region  = var.region
}

# 1. Custom Private VPC Network
resource "google_compute_network" "vpc" {
  name                    = var.network_name
  auto_create_subnetworks = false
  mtu                     = 8896
}

# 2. Private Subnet with Secondary IP Ranges for Pods & Services
resource "google_compute_subnetwork" "subnet" {
  name                     = var.subnet_name
  ip_cidr_range            = "10.10.0.0/20"
  region                   = var.region
  network                  = google_compute_network.vpc.id
  private_ip_google_access = true

  secondary_ip_range {
    range_name    = "gke-pods"
    ip_cidr_range = "10.20.0.0/16"
  }
  secondary_ip_range {
    range_name    = "gke-services"
    ip_cidr_range = "10.30.0.0/20"
  }
}

# 3. Cloud Router & Cloud NAT for Secure Outbound Egress
resource "google_compute_router" "router" {
  name    = "${var.network_name}-router"
  network = google_compute_network.vpc.id
  region  = var.region
}

resource "google_compute_router_nat" "nat" {
  name                               = "${var.network_name}-nat"
  router                             = google_compute_router.router.name
  region                             = var.region
  nat_ip_allocate_option             = "AUTO_ONLY"
  source_subnetwork_ip_ranges_to_nat = "ALL_SUBNETWORKS_ALL_IP_RANGES"
}

# 4. Internal Firewall Rules
resource "google_compute_firewall" "allow_internal" {
  name      = "${var.network_name}-allow-internal"
  network   = google_compute_network.vpc.id
  direction = "INGRESS"
  priority  = 1000
  allow {
    protocol = "all"
  }
  source_ranges = ["10.10.0.0/20", "10.20.0.0/16", "10.30.0.0/20"]
}

# 5. Private GKE Cluster with Observability and Dataplane V2
resource "google_container_cluster" "primary" {
  name               = var.cluster_name
  location           = var.region
  node_locations     = [var.zone]
  network            = google_compute_network.vpc.id
  subnetwork         = google_compute_subnetwork.subnet.id
  initial_node_count = 1

  datapath_provider = "ADVANCED_DATAPATH"

  # FIX: Observability config must be nested inside monitoring_config
  monitoring_config {
    advanced_datapath_observability_config {
      enable_metrics = true
      enable_relay   = true
    }
  }

  release_channel {
    channel = "RAPID"
  }

  ip_allocation_policy {
    cluster_secondary_range_name  = "gke-pods"
    services_secondary_range_name = "gke-services"
  }

  private_cluster_config {
    enable_private_nodes    = true
    enable_private_endpoint = false
    master_ipv4_cidr_block  = "172.16.0.0/28"
  }

  node_config {
    machine_type = "e2-standard-4"
    oauth_scopes = ["https://www.googleapis.com/auth/cloud-platform"]
  }

  deletion_protection = false
}

# 6. Dedicated Cloud TPU v5e Node Pool (ct5lp-hightpu-4t / 2x2 Topology)
resource "google_container_node_pool" "tpu_pool" {
  provider       = google-beta
  name           = "tpu-v5e-pool"
  location       = var.region
  node_locations = [var.zone]
  cluster        = google_container_cluster.primary.name
  node_count     = 1

  node_config {
    machine_type = "ct5lp-hightpu-4t"
    oauth_scopes = ["https://www.googleapis.com/auth/cloud-platform"]

    labels = {
      "cloud.google.com/gke-tpu-accelerator" = "tpu-v5-lite-podslice"
      "cloud.google.com/gke-tpu-topology"    = "2x2"
    }

    taint {
      key    = "google.com/tpu"
      value  = "present"
      effect = "NO_SCHEDULE"
    }
  }
}
EOF
  1. আপনি gke-cnp-lab ডিরেক্টরিতে আছেন কিনা তা নিশ্চিত করুন এবং নিম্নলিখিত কমান্ডগুলি চালান
    terraform init ওয়ার্কিং ডিরেক্টরি শুরু করে। এটি হল প্রথম ধাপ এবং এটি প্রদত্ত কনফিগারেশনের জন্য প্রয়োজনীয় প্রোভাইডার ডাউনলোড করে।
    terraform plan -out একটি এক্সিকিউশন প্ল্যান তৈরি করে, যা আপনার ইনফ্রাস্ট্রাকচার ডিপ্লয় করার জন্য Terraform কী কী অ্যাকশন নেবে তা দেখায়। -out আপনাকে এক্সিকিউশন প্ল্যান একটি নামযুক্ত বাইনারিতে সেভ করার অনুমতি দেয়। কোনও পরিবর্তন না করেই আপনি দেখতে পারবেন যে কী হবে।
    terraform apply আপডেট রান করে।
terraform init 
terraform plan -out cnpgke 
  1. এক্সিকিউশন প্ল্যান প্রয়োগ করা। আপনি সেভ করা এক্সিকিউশন প্ল্যান প্রয়োগ করছেন বলে, এটি কনফার্মেশনের জন্য প্রম্পট না করেই অবিলম্বে এক্সিকিউট করবে (এতে ৬ -১০ মিনিট সময় লাগতে পারে)
terraform apply cnpgke
  1. আপনার ইনফ্রাস্ট্রাকচার ডেপ্লয়মেন্ট যাচাই করুন:
gcloud container clusters get-credentials ${CLUSTER_NAME} --region ${REGION} --project=${PROJECT_ID}
echo -e "\n=== Verifying Cluster Nodes ==="
kubectl get nodes -L cloud.google.com/gke-tpu-accelerator,cloud.google.com/gke-tpu-topology

8b187e355548b7c5.png

৪. নেটওয়ার্ক লগিং কনফিগার করুন

ওয়ার্কলোড ও নীতি ডিপ্লয় করার আগে, কানেকশন টেলিমেট্রি রেকর্ড করতে GKE নেটওয়ার্ক লগিং কনফিগার করুন এবং Cloud Logging-এ নীতি সংক্রান্ত সিদ্ধান্ত অডিট করুন।

  1. gke-cnp-lab ডিরেক্টরিতে, NetworkLogging কনফিগারেশন ম্যানিফেস্ট তৈরি করুন
cat << 'EOF' > 00-network-logging.yaml
apiVersion: networking.gke.io/v1alpha1
kind: NetworkLogging
metadata:
  name: default
spec:
  cluster:
    allow:
      delegate: false
      log: true
    deny:
      delegate: false
      log: true
EOF
  1. ক্লাস্টারে কনফিগারেশন প্রয়োগ করুন
kubectl apply -f 00-network-logging.yaml
kubectl get networklogging default

মনে রাখবেন: আপনি হয়ত একটি সতর্কতা দেখতে পাবেন যেখানে বলা হয়েছে যে রিসোর্সে kubectl.kubernetes.io/last-applied-configuration annotation. নেই। এটি সম্পূর্ণ স্বাভাবিক এবং প্রত্যাশিত! ক্লাস্টার স্পিন আপ করার সময় GKE আগে থেকেই একটি ডিফল্ট NetworkLogging অবজেক্ট তৈরি করে এবং kubectl apply আপনার নতুন নিয়ম প্রয়োগ করার জন্য এটির ম্যানেজমেন্টের দায়িত্ব নেয়।

৫. Gemma 4 ওয়ার্কলোড ও ক্লায়েন্ট প্রোব ডেপ্লয় করুন

মাল্টি-টিয়ার নীতি মূল্যায়ন পরীক্ষা করার জন্য আপনি আইসোলেটেড নেমস্পেস তৈরি করবেন:

  • gemma-llm: Gemma 4-এর মূল ইনফারেন্স ওয়ার্কলোড (tier: ai-core) এখানে থাকে।
  • client-ns: অনুমোদিত RAG চ্যাট ক্লায়েন্ট (tier: app-frontend) হোস্ট করে।
  • untrusted-tenant: অননুমোদিত প্রোব কন্টেনার (tier: untrusted) রয়েছে।
  1. gke-cnp-lab directory,-এ নেমস্পেস ও টেস্ট ক্লায়েন্ট পড সহ 01-namespaces-clients.yaml ম্যানিফেস্ট তৈরি করুন:
cat << 'EOF' > 01-namespaces-clients.yaml
apiVersion: v1
kind: Namespace
metadata:
  name: gemma-llm
  labels:
    tier: ai-core
---
apiVersion: v1
kind: Namespace
metadata:
  name: client-ns
  labels:
    tier: app-frontend
---
apiVersion: v1
kind: Namespace
metadata:
  name: untrusted-tenant
  labels:
    tier: untrusted
---
# Authorized Client Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rag-agent-client
  namespace: client-ns
  labels:
    app: rag-agent
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rag-agent
  template:
    metadata:
      labels:
        app: rag-agent
    spec:
      containers:
        - name: client
          image: curlimages/curl:latest
          command: ["/bin/sh", "-c", "sleep 86400"]
---
# Rogue / Untrusted Probe Pod
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rogue-client
  namespace: untrusted-tenant
  labels:
    app: rogue-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: rogue-app
  template:
    metadata:
      labels:
        app: rogue-app
    spec:
      containers:
        - name: probe
          image: curlimages/curl:latest
          command: ["/bin/sh", "-c", "sleep 86400"]
EOF
  • নেমস্পেস ও ক্লায়েন্ট ডেপ্লয়মেন্ট প্রয়োগ করুন:
kubectl apply -f 01-namespaces-clients.yaml
kubectl get namespaces gemma-llm client-ns untrusted-tenant --show-labels

vLLM এবং Gemma ওয়ার্কলোড ডিপ্লয় করুন

আপনার Hugging Face সিক্রেট তৈরি করুন। আপনার টোকেন দিয়ে YOUR_ACTUAL_HUGGING_FACE_TOKEN পরিবর্তন করুন:

export HF_TOKEN="YOUR_ACTUAL_HUGGING_FACE_TOKEN"
echo $HF_TOKEN
kubectl create secret generic hf-secret -n gemma-llm --from-literal=hf_token=${HF_TOKEN}
  1. vllm-tpu ব্যবহার করে Cloud TPU v5e টার্গেট করে Gemma 4 ইনফারেন্স ওয়ার্কলোড ম্যানিফেস্ট তৈরি করুন:
cat << 'EOF' > 02-gemma4-tpu-vllm.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: gemma-serving
  namespace: gemma-llm
  labels:
    app: gemma-service
spec:
  replicas: 1
  selector:
    matchLabels:
      app: gemma-service
  template:
    metadata:
      labels:
        app: gemma-service
        ai.gke.io/model: gemma4
        ai.gke.io/inference-server: vllm-tpu
    spec:
      tolerations:
        - key: "google.com/tpu"
          operator: "Exists"
          effect: "NoSchedule"
      nodeSelector:
        cloud.google.com/gke-tpu-accelerator: tpu-v5-lite-podslice
        cloud.google.com/gke-tpu-topology: 2x2
      containers:
        - name: vllm-inference
          image: vllm/vllm-tpu:latest
          command: ["python3", "-m", "vllm.entrypoints.openai.api_server"]
          args:
            - "--model=google/gemma-4-E2B-it"
            - "--tensor-parallel-size=4"
            - "--host=0.0.0.0"
            - "--port=8000"
            - "--max-model-len=4096"
            - "--max-num-batched-tokens=4096"
          env:
            - name: HF_TOKEN
              valueFrom:
                secretKeyRef:
                  name: hf-secret
                  key: hf_token
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: hf-secret
                  key: hf_token
          volumeMounts:
            - mountPath: /dev/shm
              name: dshm
          ports:
            - name: http-inference
              containerPort: 8000
          resources:
            requests:
              google.com/tpu: "4"
              memory: "32Gi"
              cpu: "8"
            limits:
              google.com/tpu: "4"
              memory: "32Gi"
              cpu: "8"
          startupProbe:
            httpGet:
              path: /health
              port: 8000
            failureThreshold: 120
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /health
              port: 8000
            periodSeconds: 5
      volumes:
        - name: dshm
          emptyDir:
            medium: Memory
---
apiVersion: v1
kind: Service
metadata:
  name: gemma-service
  namespace: gemma-llm
spec:
  type: ClusterIP
  selector:
    app: gemma-service
  ports:
    - name: http
      protocol: TCP
      port: 8000
      targetPort: 8000
EOF
  1. ডেপ্লয়মেন্ট তৈরি করুন।
kubectl apply -f 02-gemma4-tpu-vllm.yaml
  1. সম্পূর্ণ হওয়ার স্ট্যাটাস মনিটর করতে, নিচে দেখানো স্ক্রিপ্ট রান করুন। নোডটি প্রোভিশন না হওয়া পর্যন্ত পডগুলি অপেক্ষা করবে, এতে ১৩+ মিনিট সময় লাগতে পারে।
echo "       __|__"
echo "  --@--(_|_)--@--"
echo ""
echo "Waiting for Gemma 4 TPU Pod to initialize and become Ready..."

# 1. Wait for the pod to be scheduled and reach the Running state
kubectl wait -n gemma-llm --for=condition=Ready pod -l app=gemma-service --timeout=600s

echo ""
echo "✅ Pod is Running! Streaming vLLM engine initialization logs..."

# 2. Stream logs until Uvicorn/vLLM is ready to serve
kubectl logs -n gemma-llm -l app=gemma-service -c vllm-inference -f | sed -u '/Application startup complete/q'

echo ""
echo "🚀 Gemma 4 on TPU v5e is ready for inference!"

৬. নীতি মূল্যায়ন ও ডিফল্ট অবস্থা বোঝা

নেটওয়ার্ক নীতি প্রয়োগ করার আগে, GKE ClusterNetworkPolicy এবং স্ট্যান্ডার্ড Kubernetes NetworkPolicy কীভাবে বিভিন্ন মূল্যায়ন টিয়ার জুড়ে ইন্টার‍্যাক্ট করে তা বুঝে নিন।

GKE-তে ট্রাফিক, মাল্টি-টিয়ার প্রেসিডেন্স মডেলের মাধ্যমে মূল্যায়ন করা হয়:

Admin Tier ⟶ NetworkPolicy Tier ⟶ Baseline Tier ⟶ Default GKE Behavior

d4cf83398c69b6b8.png

আমাদের টেস্ট ফ্লো

===================================================
           4-STAGE POLICY EVALUATION FLOW
===================================================

[Stage 1: Default State]
 ├── Pre-Policy State: Default Kubernetes allow-all
 ├── Ingress: client-ns  ──▶ Gemma 4: ALLOWED (200 OK)
 ├── Ingress: untrusted  ──▶ Gemma 4: ALLOWED (200 OK)
 ├── Egress:  All Pods   ──▶ Metadata: ALLOWED (Exposed)
 └── Security Posture: ⚠️ Overly permissive
      │
      ▼
[Stage 2: Baseline Lockdown]
 ├── Policy: ClusterNetworkPolicy (tier: Baseline)
 ├── Rule: Default-deny all cross-namespace ingress
 ├── Ingress: client-ns  ──▶ Gemma 4: DROPPED (Timeout)
 ├── Ingress: untrusted  ──▶ Gemma 4: DROPPED (Timeout)
 └── Security Posture: 🛑 Zero-trust baseline active
      │
      ▼
[Stage 3: Developer Delegation]
 ├── Policy: NetworkPolicy (tier: NetworkPolicy)
 ├── Rule: App team allows ingress from client-ns
 ├── Ingress: client-ns  ──▶ Gemma 4: ALLOWED (200 OK)
 ├── Ingress: untrusted  ──▶ Gemma 4: DROPPED (Timeout)
 └── Security Posture: 🔀 App isolation achieved
      │
      ▼
[Stage 4: Admin Guardrail]
 ├── Policy: ClusterNetworkPolicy (tier: Admin)
 ├── Rule: Cluster-wide metadata drop (169.254.169.254)
 ├── Egress:  All Pods   ──▶ Metadata: DROPPED (Timeout)
 ├── Dev NetPol bypass attempt:   OVERRIDDEN (Blocked)
 └── Security Posture: 🔒 Enforced guardrail
===================================================

বেসলাইন ফাউন্ডেশন (প্রি-পলিসি টেস্ট) তৈরি করা

Gemma 4 মডেল ঠিকভাবে কাজ করছে এবং ইনফারেন্স অনুরোধের উত্তর দিচ্ছে কিনা তা যাচাই করুন। নীতি ছাড়া স্ট্যান্ডার্ড Kubernetes-এ, সব ক্রস-নেমস্পেস ট্রাফিককে অন্তর্নিহিতভাবে অনুমতি দেওয়া হয়।

  1. client-ns-এ অনুমোদিত ক্লায়েন্ট থেকে টেস্ট ইনফারেন্স:
kubectl exec -n client-ns deploy/rag-agent-client -- curl --connect-timeout 3 -s -X POST \
  http://gemma-service.gemma-llm.svc.cluster.local:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-E2B-it",
    "messages": [{"role": "user", "content": "Explain zero trust in one short sentence."}],
    "max_tokens": 40
  }' | jq -r '.choices[0].message.content'
  1. untrusted-tenant-এ অননুমোদিত রোগ ক্লায়েন্ট থেকে টেস্ট ইনফারেন্স:
kubectl exec -n untrusted-tenant deploy/rogue-client -- curl --connect-timeout 3 -s -X POST \
  http://gemma-service.gemma-llm.svc.cluster.local:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-E2B-it",
    "messages": [{"role": "user", "content": "Explain zero trust in one short sentence."}],
    "max_tokens": 40
  }' | jq -r '.choices[0].message.content'
  1. তিনটি নেমস্পেস জুড়ে থাকা পড মেটাডেটা সার্ভারে (১৬৯.২৫৪.১৬৯.২৫৪) পৌঁছাতে পারে কিনা তা পরীক্ষা করুন:
echo -e "\n[1/3] Testing Metadata access from Gemma serving pod (gemma-llm)..."
kubectl exec -n gemma-llm deploy/gemma-serving -- curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "🛑 RESULT: Connection Timed Out (Blocked)"

echo -e "\n[2/3] Testing Metadata access from authorized client (client-ns)..."
kubectl exec -n client-ns deploy/rag-agent-client -- curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "🛑 RESULT: Connection Timed Out (Blocked)"

echo -e "\n[3/3] Testing Metadata access from rogue client (untrusted-tenant)..."
kubectl exec -n untrusted-tenant deploy/rogue-client -- curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "🛑 RESULT: Connection Timed Out (Blocked)"

৭. মূল্যায়ন টেস্টিং বেসলাইন ও নেটওয়ার্ক নীতি টিয়ার

এই ধাপে, ক্লাস্টার অ্যাডমিনিস্ট্রেটর হিসেবে কাজ করে, আপনি ক্লাস্টার-ওয়াইড ফলব্যাক ডিফল্ট-অস্বীকার ভঙ্গি প্রতিষ্ঠা করতে একটি বেসলাইন-টিয়ার ClusterNetworkPolicy প্রয়োগ করবেন। উচ্চতর টিয়ারের মাধ্যমে স্পষ্টভাবে অনুমতি দেওয়া হয়নি এমন যেকোনও ক্রস-নেমস্পেস কমিউনিকেশন ড্রপ করা হবে।

জিরো-ট্রাস্ট পোস্টার (বেসলাইন টিয়ার) প্রতিষ্ঠা করা

  1. 03-baseline-deny.yaml বেসলাইন-টিয়ার নীতি ম্যানিফেস্ট তৈরি করুন:
cat << 'EOF' > 03-baseline-deny.yaml
apiVersion: policy.networking.k8s.io/v1alpha2
kind: ClusterNetworkPolicy
metadata:
  name: baseline-default-deny
spec:
  tier: Baseline
  priority: 1000
  subject:
    namespaces: {}
  ingress:
    # 1. Allow CoreDNS Ingress cluster-wide so DNS resolution never breaks
    - name: allow-dns-ingress
      action: Accept
      from:
        - namespaces: {}
      protocols:
        - udp:
            destinationPort:
              number: 53
        - tcp:
            destinationPort:
              number: 53
    # 2. Default Deny all other cross-namespace ingress
    - name: baseline-deny-cross-ns
      action: Deny
      from:
        - namespaces: {}
EOF
  1. বেসলাইন টিয়ার নীতি প্রয়োগ করুন:
kubectl apply -f 03-baseline-deny.yaml
  1. client-ns. থেকে ক্লায়েন্ট কানেক্টিভিটি টেস্ট করুন
kubectl exec -n client-ns deploy/rag-agent-client -- curl --connect-timeout 3 -s -X POST \
  http://gemma-service.gemma-llm.svc.cluster.local:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-E2B-it",
    "messages": [{"role": "user", "content": "Explain zero trust in one short sentence."}],
    "max_tokens": 40
  }' | jq -r '.choices[0].message.content'
  1. অবিশ্বস্ত-টেন্যান্টে অননুমোদিত দুর্বৃত্ত ক্লায়েন্ট থেকে টেস্ট ইনফারেন্স:
kubectl exec -n untrusted-tenant deploy/rogue-client -- curl --connect-timeout 3 -s -X POST \
  http://gemma-service.gemma-llm.svc.cluster.local:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-E2B-it",
    "messages": [{"role": "user", "content": "Explain zero trust in one short sentence."}],
    "max_tokens": 40
  }' | jq -r '.choices[0].message.content'

ডেভেলপারদের অ্যাক্সেস ডেলিগেট করুন (NetworkPolicy টিয়ার)

gemma-llm অ্যাপ্লিকেশন টিম এখন client-ns থেকে অনুমোদিত ট্রাফিককে অনুমতি দিতে একটি স্ট্যান্ডার্ড নেমস্পেস-স্কোপড NetworkPolicy প্রয়োগ করবে।

  1. ডেভেলপার 04-app-networkpolicy.yaml NetworkPolicy ম্যানিফেস্ট তৈরি করুন:
cat << 'EOF' > 04-app-networkpolicy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-rag-client
  namespace: gemma-llm
spec:
  podSelector:
    matchLabels:
      app: gemma-service
  policyTypes:
    - Ingress
  ingress:
    # Explicitly permit ingress only from pods matching app: rag-agent in client-ns
    - from:
        - namespaceSelector:
            matchLabels:
              kubernetes.io/metadata.name: client-ns
          podSelector:
            matchLabels:
              app: rag-agent
      ports:
        - protocol: TCP
          port: 8000
EOF
  1. নীতি প্রয়োগ করুন:
kubectl apply -f 04-app-networkpolicy.yaml
  1. client-ns থেকে ক্লায়েন্ট কানেক্টিভিটি টেস্ট করুন
kubectl exec -n client-ns deploy/rag-agent-client -- curl --connect-timeout 3 -s -X POST \
  http://gemma-service.gemma-llm.svc.cluster.local:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-E2B-it",
    "messages": [{"role": "user", "content": "Explain zero trust in one short sentence."}],
    "max_tokens": 40
  }' | jq -r '.choices[0].message.content'
  1. untrusted-tenant-এ রোগ ক্লায়েন্ট থেকে কানেক্টিভিটি টেস্ট করুন:
kubectl exec -n untrusted-tenant deploy/rogue-client -- curl --connect-timeout 3 -s -X POST \
  http://gemma-service.gemma-llm.svc.cluster.local:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-E2B-it",
    "messages": [{"role": "user", "content": "Explain zero trust in one short sentence."}],
    "max_tokens": 40
  }' | jq -r '.choices[0].message.content'

৮. ইভ্যালুয়েশন গ্লোবাল গার্ডরেল (অ্যাডমিন টিয়ার) এনফোর্স করে

ক্লাস্টার অ্যাডমিনিস্ট্রেটর হিসেবে কাজ করার সময়,আপনি এখন GKE-এর মূল্যায়ন অর্ডারের একেবারে উপরে অ্যাডমিন-টিয়ার ClusterNetworkPolicy এনফোর্স করবেন। এই টিয়ার প্রথমে মূল্যায়ন করা হয়, যেকোনও ম্যাচিং নিয়ম অন্যান্য সব টিয়ারের উপর অবিলম্বে অগ্রাধিকার পায়। যদি কোনও মিল না থাকে, তাহলে প্যাকেটটি নিচের স্তরে (NetworkPolicy এবং Baseline) মূল্যায়নের জন্য পাঠানো হয়।

এই ধাপে, আপনি এমন একটি নীতি প্রয়োগ করবেন যা:

  • ক্লাস্টার-ওয়াইড ইগ্রেস গার্ডরেল: প্রতিটি নেমস্পেসের সব পডকে Google Cloud মেটাডেটা সার্ভারে (169.254.169.254/32) পৌঁছানো থেকে ব্লক করে।
  • DNS সাপোর্ট: পোর্ট ৫৩-এ সব DNS ট্রাফিককে অনুমতি দেয় যাতে পড হোস্টনেম সমাধান করতে পারে (GKE-এর স্থানীয় DNS ক্যাশের জন্য অ্যাকাউন্টিং)।
  • ইনগ্রেস ও ইগ্রেস ডেলিগেশন: পাস অ্যাকশন ব্যবহার করে অন্যান্য সব ট্রাফিক সংক্রান্ত সিদ্ধান্ত পাস করে দেয় যাতে স্ট্যান্ডার্ড ডেভেলপার নেটওয়ার্ক নীতি ও বেসলাইন ডিফল্ট-অস্বীকার করার নিয়ম চূড়ান্ত সিদ্ধান্ত নিতে পারে।
  1. সব নেমস্পেসকে টার্গেট করে 05-admin-guardrails.yaml অ্যাডমিন-টিয়ার নীতি ম্যানিফেস্ট তৈরি করুন
cat << 'EOF' > 05-admin-guardrails.yaml
apiVersion: policy.networking.k8s.io/v1alpha2
kind: ClusterNetworkPolicy
metadata:
  name: admin-global-guardrails
spec:
  tier: Admin
  priority: 10
  subject:
    namespaces: {}
  ingress:
    - name: delegate-all-ingress
      action: Pass
      from:
        - namespaces: {}
  egress:
    - name: allow-all-dns
      action: Accept
      to:
        - networks:
            - 0.0.0.0/0
      protocols:
        - udp:
            destinationPort:
              number: 53
        - tcp:
            destinationPort:
              number: 53
    - name: block-metadata-server-global
      action: Deny
      to:
        - networks:
            - 169.254.169.254/32
    - name: delegate-other-egress
      action: Pass
      to:
        - namespaces: {}
EOF
  1. অ্যাডমিন টিয়ার নীতি প্রয়োগ করুন:
kubectl apply -f 05-admin-guardrails.yaml
  1. তিনটি নেমস্পেস জুড়ে মেটাডেটা এক্সফিলট্রেশন পরীক্ষা করুন:
echo -e "\n[1/3] Testing Metadata access from Gemma serving pod (gemma-llm)..."
kubectl exec -n gemma-llm deploy/gemma-serving -- curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "🛑 RESULT: Connection Timed Out (Blocked)"

echo -e "\n[2/3] Testing Metadata access from authorized client (client-ns)..."
kubectl exec -n client-ns deploy/rag-agent-client -- curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "🛑 RESULT: Connection Timed Out (Blocked)"

echo -e "\n[3/3] Testing Metadata access from rogue client (untrusted-tenant)..."
kubectl exec -n untrusted-tenant deploy/rogue-client -- curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "🛑 RESULT: Connection Timed Out (Blocked)"
  1. client-ns থেকে ক্লায়েন্ট কানেক্টিভিটি টেস্ট করুন
kubectl exec -n client-ns deploy/rag-agent-client -- curl --connect-timeout 3 -s -X POST \
  http://gemma-service.gemma-llm.svc.cluster.local:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemma-4-E2B-it",
    "messages": [{"role": "user", "content": "Explain zero trust in one short sentence."}],
    "max_tokens": 40
  }' | jq -r '.choices[0].message.content'
  1. gemma-llm-এর মধ্যে সব-অনুমতি-দেওয়া ইগ্রেস NetworkPolicy প্রয়োগ করে ডেভেলপার বাইপাস করার চেষ্টা সিমুলেট করুন:
cat << 'EOF' > 06-bypass-attempt.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: dev-allow-all-egress
  namespace: gemma-llm
spec:
  podSelector: {}
  policyTypes:
    - Egress
  egress:
    - {}
EOF

kubectl apply -f 06-bypass-attempt.yaml
  1. ডেভেলপার বাইপাস মেটাডেটা অ্যাক্সেস আনব্লক করতে পারে কিনা তা পরীক্ষা করুন:
kubectl exec -n gemma-llm deploy/gemma-serving -- curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "🛑 RESULT: Connection Timed Out (Admin Guardrail Overrode Developer Policy)"

৯. Hubble ও Cloud Logging-এর মাধ্যমে ইন্টার‍্যাক্টিভ যাচাইকরণ

আপনার ক্লাস্টার জুড়ে রিয়েল-টাইম নীতি এনফোর্সমেন্ট এবং অডিট প্যাকেট সিদ্ধান্তগুলি পর্যবেক্ষণ করতে, আপনি কার্নেল-লেভেল eBPF প্যাকেট ট্রেসিংকে অটোমেটেড টেস্ট এক্সিকিউশনের সাথে একত্রিত করে একটি ডুয়াল-পেন Cloud Shell সেশন ব্যবহার করবেন।

  1. দ্বিতীয় টার্মিনাল ট্যাব খুলতে, আপনার Cloud Shell মেনুতে "+" আইকনে ক্লিক করুন।
  2. এই নতুন ট্যাবে, উপনাম তৈরি করতে এবং gemma-llm নেমস্পেসের জন্য লাইভ ট্রাফিক পর্যবেক্ষণ শুরু করতে নিম্নলিখিত কমান্ডগুলি চালান:
# Create an alias to execute Hubble natively inside the relay pod
alias hubble="kubectl exec -it -n gke-managed-dpv2-observability deploy/hubble-relay -c hubble-cli -- hubble"

# Observe real-time traffic to and from the Gemma namespace
hubble observe --follow --namespace gemma-llm
  1. আপনার প্রথম Cloud Shell ট্যাবে ফিরে যান এবং আপনি gke-cnp-lab ডিরেক্টরিতে আছেন কিনা তা নিশ্চিত করুন
cd ~/gke-cnp-lab
  1. অটোমেটিক যাচাইকরণ স্ক্রিপ্ট তৈরি ও এক্সিকিউট করতে নিম্নলিখিত ব্লক রান করুন। এই স্ক্রিপ্ট প্রয়োজনীয় ট্রাফিক টেস্ট চালায় এবং GKE-এর সঠিক রুট-লেভেল মেটাডেটা স্কিমা ব্যবহার করে Cloud Logging-এ কোয়েরি করে যাতে অনুরোধ মূল্যায়নকারী সঠিক Dataplane V2 নিয়ম দেখানো যায়:
cat << 'EOF' > verify-suite.sh
#!/usr/bin/env bash
set -e

echo "========================================================"
echo " 🧪 RUNNING MULTI-TIER POLICY VERIFICATION SUITE"
echo "========================================================"

# Test 1: Ingress Authorized Client -> Gemma (Allowed by NetworkPolicy)
echo -e "\n[1/5] Testing Authorized Client -> Gemma Serving..."
if kubectl exec -n client-ns deploy/rag-agent-client -- \
  curl -s --connect-timeout 3 \
  http://gemma-service.gemma-llm.svc.cluster.local:8000/v1/chat/completions > /dev/null; then
  echo "  ✅ RESULT: FORWARDED (Allowed by Developer Network Policy)"
else
  echo "  🛑 RESULT: FAILED"
fi

# Test 2: Ingress Rogue Client -> Gemma (Blocked by Baseline Tier)
echo -e "\n[2/5] Testing Unauthorized Rogue Tenant -> Gemma Serving..."
if kubectl exec -n untrusted-tenant deploy/rogue-client -- \
  curl -s --connect-timeout 3 \
  http://gemma-service.gemma-llm.svc.cluster.local:8000/v1/chat/completions > /dev/null; then
  echo "  ⚠️ RESULT: UNEXPECTED ALLOW"
else
  echo "  🛑 RESULT: DROPPED (Blocked by Baseline Tier)"
fi

# Test 3: Egress Gemma -> GCP Metadata Server (Blocked by Admin Tier)
echo -e "\n[3/5] Testing Metadata access from Gemma serving pod (gemma-llm)..."
kubectl exec -n gemma-llm deploy/gemma-serving -- \
  curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "  🛑 RESULT: Connection Timed Out (Blocked)"

# Test 4: Egress Authorized Client -> GCP Metadata Server (Blocked by Admin Tier)
echo -e "\n[4/5] Testing Metadata access from authorized client (client-ns)..."
kubectl exec -n client-ns deploy/rag-agent-client -- \
  curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "  🛑 RESULT: Connection Timed Out (Blocked)"

# Test 5: Egress Rogue Client -> GCP Metadata Server (Blocked by Admin Tier)
echo -e "\n[5/5] Testing Metadata access from rogue client (untrusted-tenant)..."
kubectl exec -n untrusted-tenant deploy/rogue-client -- \
  curl --connect-timeout 3 -s -w "\nHTTP Code: %{http_code}\n" -H "Metadata-Flavor: Google" \
  http://169.254.169.254/computeMetadata/v1/instance/zone || echo "  🛑 RESULT: Connection Timed Out (Blocked)"

echo -e "\n========================================================"
echo " 📋 FETCHING AUDIT TRAIL FROM CLOUD LOGGING"
echo "========================================================"
echo "Waiting 12 seconds for telemetry ingestion..."
sleep 12

echo -e "\n🔍 1. Validating Baseline Tier (Rogue Client Block):"
gcloud logging read '
  resource.type="k8s_node"
  logName=~"logs/policy-action"
  jsonPayload.disposition="deny"
  jsonPayload.src.namespace="untrusted-tenant"
  jsonPayload.dest.namespace="gemma-llm"
' --limit=1 --format="table(
    timestamp.date('%H:%M:%S', tz=LOCAL):label=TIME,
    jsonPayload.src.namespace:label=SRC_NS,
    jsonPayload.dest.namespace:label=DEST_NS,
    jsonPayload.policies[0].name:label=BLOCKED_BY_POLICY
)"

echo -e "\n🔍 2. Validating Admin Tier (Metadata Block across all namespaces):"
gcloud logging read '
  resource.type="k8s_node"
  logName=~"logs/policy-action"
  jsonPayload.disposition="deny"
  jsonPayload.connection.dest_ip="169.254.169.254"
' --limit=3 --format="table(
    timestamp.date('%H:%M:%S', tz=LOCAL):label=TIME,
    jsonPayload.src.namespace:label=SRC_NS,
    jsonPayload.connection.dest_ip:label=DEST_IP,
    jsonPayload.policies[0].name:label=BLOCKED_BY_POLICY
)"
EOF

chmod +x verify-suite.sh
./verify-suite.sh
  1. আপনার প্রথম ট্যাবে স্ক্রিপ্ট এক্সিকিউট করার সময়, আপনার দ্বিতীয় ট্যাবে Hubble আউটপুট দেখুন।

Hubble-এ (ট্যাব ২): আপনি অনুমোদিত HTTP অনুরোধগুলি সবুজ রঙে ফরওয়ার্ড করা হচ্ছে দেখতে পাবেন। ব্লক করা ট্রাফিকের জন্য, আপনি লাল (ড্রপ করা) ইভেন্ট দেখতে পাবেন। The Rogue Tenant: কানেকশন অ্যাডমিন টিয়ার থেকে পাস হয়ে বেসলাইন টিয়ারে ব্লক হয়ে যায়। মেটাডেটা কোয়েরি: ক্লাউড ক্রেডেনশিয়াল অ্যাক্সেস করার জন্য এর অনুরোধ অ্যাডমিন টিয়ারে অবিলম্বে ব্লক করা হয়।

7d68cc0e9b90f820.png

Cloud Logging-এ (ট্যাব ১): Google Cloud Logging-এ পাঠানো সঠিক অডিট রেকর্ড পুল করার মাধ্যমে স্ক্রিপ্ট শেষ হয়। এটি স্পষ্টভাবে প্রমাণ করে যে কোন টিয়ার (অ্যাডমিন বা বেসলাইন) এবং কোন নীতি অননুমোদিত ট্রাফিক বন্ধ করার জন্য দায়ী ছিল, যা স্থানীয়করণ করা, টাইমজোন-সচেতন টাইমস্ট্যাম্প সহ ফর্ম্যাট করা হয়েছে।

b9e48fd473451ca2.png

১০. অপ্রয়োজনীয়গুলি মুছুন

  1. দ্বিতীয় ট্যাব বন্ধ করুন
  2. আপনার প্রথম Cloud Shell ট্যাবে ফিরে যান।
  3. এই ক্রমে ডিপ্লয় করা Kubernetes ম্যানিফেস্ট, নেমস্পেস ও সিক্রেট মুছে দিন:
cd ~/gke-cnp-lab

# Delete policy and verification scripts
rm -f verify-suite.sh
kubectl delete -f 05-admin-guardrails.yaml --ignore-not-found
kubectl delete -f 04-app-networkpolicy.yaml --ignore-not-found
kubectl delete -f 03-baseline-deny.yaml --ignore-not-found
kubectl delete -f 00-network-logging.yaml --ignore-not-found

# Delete workload deployments, secrets, and namespaces
kubectl delete -f 02-gemma4-tpu-vllm.yaml --ignore-not-found
kubectl delete secret hf-secret -n gemma-llm --ignore-not-found
kubectl delete -f 01-namespaces-clients.yaml --ignore-not-found
  1. নিম্নলিখিত কমান্ডের মাধ্যমে ইনফ্রাস্ট্রাকচার ক্লিন-আপ করুন, কনফার্ম করতে yes টাইপ করুন
terraform destroy --auto-approve
  1. আপনার অ্যাক্টিভ প্রোজেক্টে সব রিসোর্স সঠিকভাবে বন্ধ করা হয়েছে কিনা তা যাচাই করুন:
gcloud container clusters list --region=us-west4
gcloud compute networks list
  1. gke-cnp-lab ডিরেক্টরি ও কন্টেন্ট মুছে দিন:
cd
rm -r gke-cnp-lab

১১. অভিনন্দন

আপনি GKE ClusterNetworkPolicy কোডল্যাব সহ Secure AI Inference Workloads সম্পূর্ণ করেছেন!

এই হ্যান্ডস-অন ল্যাব সম্পূর্ণ করার মাধ্যমে, আপনি Google Kubernetes Engine-এ সংবেদনশীল ব্যক্তিগত LLM ওয়ার্কলোড পরিবেশন করার জন্য একটি শক্তিশালী, মাল্টি-টিয়ার বিবিধ প্রতিরোধ ব্যবস্থা নেটওয়ার্ক আর্কিটেকচার ডিজাইন এবং যাচাই করেছেন।

আপনি কী কী করেছেন:

  • ইনফ্রাস্ট্রাকচার অ্যাজ কোড: Terraform ব্যবহার করে ডায়নামিকভাবে একটি অত্যন্ত সুরক্ষিত প্রাইভেট স্ট্যান্ডার্ড GKE ক্লাস্টার, একটি প্রাইভেট আঞ্চলিক সাবনেট এবং ডেডিকেটেড Cloud TPU v5e হার্ডওয়্যার প্রোভিশন করা হয়েছে।
  • টেলিম্যাট্রি ও পর্যবেক্ষণযোগ্যতা: কার্নেল-লেভেল eBPF Hubble ট্রেসিংয়ের পাশাপাশি Dataplane V2 নেটওয়ার্ক লগিং কনফিগার করা হয়েছে যাতে ডিপ রানটাইম প্যাকেট ভিজিবিলিটি পাওয়া যায়।
  • হায়ারার্কিক্যাল নিরাপত্তা সংক্রান্ত পোস্টার: যেমন, তিনটি আলাদা মূল্যায়ন টিয়ার জুড়ে অপারেশনাল ডিউটির স্পষ্ট বিভাজন:
  • অ্যাডমিন টিয়ার: ক্লাস্টার-ওয়াইড, বাইপাস করা যায় না এমন ইগ্রেস গার্ডরেল যা ল্যাটারাল মেটাডেটা ক্রেডেনশিয়াল অ্যাক্সেস (১৬৯.২৫৪.১৬৯.২৫৪) ব্লক করে।
  • NetworkPolicy Tier: প্রোডাকশন ক্লায়েন্ট কানেকশন নিরাপদে অনুমোদিত করার জন্য অ্যাপ্লিকেশন ডেভেলপারদের কাছে ডেলিগেট করা নেমস্পেস-স্কোপড ইনগ্রেস বাউন্ডারি।
  • বেসলাইন টিয়ার: ক্লাস্টার-ব্যাপী ফলব্যাক নিরাপত্তা নেট তৈরি করা হয়েছে যা ডিফল্ট হিসেবে অননুমোদিত টেন্যান্ট ট্রাফিককে ব্লক করে।
  • রিয়েল-টাইম অডিটিং: একটি সম্পূর্ণ যাচাইকরণ টেস্ট স্যুট চালান, Linux কার্নেল লেভেলে রিয়েল-টাইম প্যাকেট ড্রপ দেখুন এবং Google Cloud Logging-এ সরাসরি স্ট্রাকচার্ড নীতি-অ্যাকশন অডিট কোয়েরি করুন

পরবর্তী ধাপ / আরও জানুন

আপনি GKE নেটওয়ার্কিং সম্পর্কে আরও পড়তে পারেন