Skip to main content

Command Palette

Search for a command to run...

Syllabus học Nomad

Updated
•19 min read•View as Markdown

TUẦN 0 - Tư duy nền tảng

Ngày 1: Nomad là gì và giải quyết bài toán gì

  • Mục tiêu: Hiểu vị trí Nomad so với Kubernetes, Nomad không phải "K8s thu nhỏ".

  • Nội dung:

    • Lý thuyết: Single binary (client+server), hỗ trợ đa workload (Docker, exec, Java, QEMU, raw_exec) chứ không chỉ container; triết lý "do one thing well" - scheduling, không tự làm networking/service mesh (dựa Consul) hay secrets (dựa Vault).

    • Thực hành: Chạy nomad agent -dev, nomad server members, nomad node status.

  • Mini-Project: Không, warm-up.

TUẦN 1 - Sử dụng Job Specification & Core Workflow

Ngày 2: Kiến trúc Job Spec (HCL)

  • Mục tiêu: Nắm cấu trúc phân cấp Job → Group → Task.

  • Nội dung:

    • Lý thuyết: Vì sao có 3 cấp (Group = đơn vị đặt lịch cùng node, Task = tiến trình thực thi); count, resources, restart{}.

    • Thực hành: Viết job chạy redis bằng Docker driver, nomad job run, nomad job status.

  • Mini-Project: Job chạy 1 web app đơn giản (2 task groups: frontend + backend).

Ngày 3: Task Drivers

  • Mục tiêu: Hiểu Nomad chạy được nhiều loại workload nhờ driver plugin.

  • Nội dung:

    • Lý thuyết: docker, exec (cgroup/namespace isolation trên Linux), raw_exec (không isolation - chỉ dùng cho hệ thống tin cậy), java, qemu.

    • Thực hành: Chạy cùng 1 job bằng exec driver thay vì Docker, so sánh isolation.

Ngày 4: Networking cơ bản - bridge, host, CNI

  • Mục tiêu: Hiểu networking mode trước khi đụng tới Consul Connect (chi tiết sâu sẽ có ở Tuần 6).

  • Nội dung:

    • Lý thuyết: network{ mode = "bridge" } vs host; port mapping to/static; giới thiệu CNI plugin.

    • Thực hành: Chạy 2 task trong cùng group giao tiếp qua localhost nhờ bridge network namespace dùng chung.

Ngày 5: Constraints, Affinities, Spread

  • Mục tiêu: Điều khiển scheduler đặt task ở đâu.

  • Nội dung:

    • Lý thuyết: constraint (bắt buộc) vs affinity (ưu tiên, có weight) vs spread (phân bổ đều theo attribute, vd multi-AZ).

    • Thực hành: Viết constraint chỉ chạy trên node có ${attr.kernel.name} == linux, spread theo ${node.datacenter}.

Ngày 6: Update Strategy & Deployment

  • Mục tiêu: Zero-downtime deploy.

  • Nội dung:

    • Lý thuyết: update{} block - max_parallel, canary, auto_revert, health_check; so sánh rolling update vs blue-green (dùng canary=count).

    • Thực hành: Deploy job với canary, quan sát nomad deployment status, thử nomad deployment fail để test auto-revert.

Ngày 7: Volumes cơ bản - host_volume

  • Mục tiêu: Persist data cho stateful workload đơn giản.

  • Nội dung:

    • Lý thuyết: host_volume cấu hình ở client agent, ephemeral_disk.

    • Thực hành: Chạy job Postgres với host_volume mount.

Ngày 8: Templates & Nomad Variables

  • Mục tiêu: Inject config động vào task.

  • Nội dung:

    • Lý thuyết: template{} block (dùng consul-template engine bên trong), nomad var (Nomad's built-in KV từ v1.4+).

    • Thực hành: Render config file từ Nomad Variable vào container lúc runtime, tự reload khi variable đổi.

Ngày 9: Ôn tập Tuần 1

  • Mini-Project: Job đa tầng (web + api + db) với canary deploy, spread multi-AZ, config render qua template + Nomad Variables.

TUẦN 2 - Internals: Raft, Gossip, State, Scheduler

Ngày 10: Kiến trúc Server/Client & vai trò

  • Mục tiêu: Phân biệt rõ 2 loại agent.

  • Nội dung:

    • Lý thuyết: Server (state store, scheduling, Raft) vs Client (chạy task, báo cáo fingerprint); tối thiểu 3-5 server cho HA, client scale hàng nghìn node.

    • Thực hành: Setup cụm 3 server + 2 client bằng Vagrant/Docker Compose local.

Ngày 11: Raft Consensus

  • Mục tiêu: Hiểu cách Nomad đạt strong consistency.

  • Nội dung:

    • Lý thuyết: Leader election, log replication, quorum (n/2+1); vì sao số server nên lẻ; Raft store trên disk (raft.db).

    • Thực hành: nomad operator raft list-peers, tắt leader, quan sát election lại.

Ngày 12: Gossip Protocol (Serf) - Server discovery & Federation base

  • Mục tiêu: Hiểu cơ chế server tự tìm nhau, khác Raft.

  • Nội dung:

    • Lý thuyết: LAN gossip pool (server discovery trong 1 region) vs WAN gossip pool (multi-region federation); SWIM protocol cơ bản.

    • Thực hành: nomad server members, quan sát gossip khi thêm server mới.

Ngày 13: State Store & FSM

  • Mục tiêu: Hiểu data thực sự lưu ở đâu.

  • Nội dung:

    • Lý thuyết: Finite State Machine áp Raft log lên go-memdb in-memory store; mọi write đi qua Raft trước khi apply vào FSM.

    • Thực hành: Đọc source nomad/state/state_store.go (tổng quan cấu trúc bảng).

Ngày 14: Scheduler internals - Eval, Plan, Allocation

  • Mục tiêu: Hiểu vòng đời 1 job từ submit đến chạy thật.

  • Nội dung:

    • Lý thuyết: Job → Evaluation → Plan → Allocation; scheduler worker pool, bin-packing algorithm, feasibility check (constraints/resources) → scoring (affinity/spread) → plan submit qua Raft.

    • Thực hành: nomad eval status, nomad job plan để xem preview trước khi apply thật.

Ngày 15: Scheduler types - service, batch, system, sysbatch

  • Mục tiêu: Chọn đúng scheduler type cho đúng workload.

  • Nội dung:

    • Lý thuyết: service (long-running, reschedule khi fail), batch/sysbatch (chạy 1 lần hoặc cron, không auto-restart mãi), system (chạy trên MỌI node - giống DaemonSet).

    • Thực hành: Viết job type = "system" deploy agent monitoring lên toàn cụm, job type = "batch" với periodic{} (cron).

Ngày 16: Client internals - Fingerprint & Driver plugin RPC

  • Mục tiêu: Hiểu client tự phát hiện khả năng của node.

  • Nội dung:

    • Lý thuyết: Fingerprint modules (CPU, memory, kernel, driver availability) chạy định kỳ, cập nhật node attributes; task driver giao tiếp qua go-plugin RPC (giống Packer/Terraform).

    • Thực hành: nomad node status -verbose, xem toàn bộ attributes fingerprint được.

Ngày 17: Bin Packing & Resource allocation deep-dive

  • Mục tiêu: Hiểu thuật toán packing để tối ưu chi phí.

  • Nội dung:

    • Lý thuyết: Nomad ưu tiên "pack" (dồn vào ít node nhất) mặc định, khác Kubernetes default spread; scheduler_config set algorithm.

    • Thực hành: Thử đổi nomad operator scheduler set-config, quan sát khác biệt placement.

Ngày 18: Allocation Runner Internals

  • Mục tiêu: Hiểu phía client, allocation thực sự chạy như thế nào sau khi được Plan chấp nhận.

  • Nội dung:

    • Lý thuyết: Luồng Allocation → AllocRunner → TaskRunner → Driver; AllocRunner quản lý vòng đời toàn bộ group (network namespace, volumes, tasks), TaskRunner quản lý 1 task cụ thể (hooks: prestart, poststart, exited); restart policy được TaskRunner thực thi ra sao.

    • Thực hành: Đọc source client/allocrunner (tổng quan các hook), quan sát log client khi 1 task restart để map với luồng lý thuyết.

Ngày 19: Scheduler Source Code

  • Mục tiêu: Có khả năng đọc source scheduler thực sự, không chỉ hiểu khái niệm.

  • Nội dung:

    • Lý thuyết: Đọc theo thứ tự scheduler/generic_sched.go (vòng lặp chính xử lý Eval) → scheduler/stack.go (pipeline feasibility + scoring) → scheduler/rank.go (thuật toán scoring/bin-packing) → scheduler/feasibility.go (lọc node theo constraint).

    • Thực hành: Trace 1 lần submit job cụ thể qua từng file, note lại node bị loại ở bước feasibility vs node bị điểm thấp ở bước scoring.

Ngày 20: Ôn tập

  • Mục tiêu: Tổng hợp toàn bộ lộ trình đọc code Nomad.

  • Nội dung: Thứ tự tổng thể: nomad/state (data model) → nomad/scheduler (thuật toán) → client/allocrunner (vòng đời allocation) → drivers/docker (plugin mẫu).

  • Mini-Project: Viết note tóm tắt luồng Eval→Plan→Alloc→AllocRunner bằng sơ đồ tự vẽ.

TUẦN 3 - Consul Integration & Service Mesh

Ngày 21: Service Discovery qua Consul

  • Mục tiêu: Nomad tự nó không làm service discovery - cần Consul.

  • Nội dung:

    • Lý thuyết: service{} block đăng ký Consul, health check tự động.

    • Thực hành: Setup Consul agent cạnh Nomad, job đăng ký service + health check http.

Ngày 22: Consul Connect (service mesh) trong Nomad

  • Mục tiêu: mTLS giữa service không cần code thay đổi.

  • Nội dung:

    • Lý thuyết: connect{ sidecar_service {} }, Envoy proxy tự inject, intention.

    • Thực hành: 2 service giao tiếp qua Connect sidecar, verify traffic đi qua Envoy.

Ngày 23: Consul Connect Internals

  • Mục tiêu: Hiểu "dưới nắp ca-pô" của service mesh, đủ để debug khi Connect không hoạt động.

  • Nội dung:

    • Lý thuyết: Intentions (allow/deny giữa service, đánh giá thế nào); Envoy nhận cấu hình qua xDS API (Consul đóng vai trò control plane); Certificate Authority (CA) cấp leaf cert cho từng sidecar, cơ chế CA rotation không downtime.

    • Thực hành: consul connect proxy debug, xem chứng chỉ leaf cert của 1 sidecar (consul.io docs/CLI), thử đổi 1 intention từ allow sang deny và quan sát traffic bị chặn.

Ngày 24: Consul Mesh Gateway & multi-DC networking

  • Mục tiêu: Kết nối service xuyên datacenter.

  • Nội dung: Lý thuyết: Mesh gateway pattern cho Nomad multi-region communication qua Connect.

Ngày 25: Native Service Discovery

  • Mục tiêu: Biết lựa chọn khi không muốn phụ thuộc Consul - nhưng hiểu đây là phương án thứ yếu.

  • Nội dung: Lý thuyết: provider = "nomad" trong service{} (Nomad 1.3+) - giới hạn so với Consul (không có mesh, health check đơn giản hơn); trong thực tế production Consul vẫn phổ biến hơn, native service discovery phù hợp cụm nhỏ/không muốn thêm dependency.

Ngày 26: Ôn tập Tuần 3

  • Mini-Project: 3 service giao tiếp qua Connect với intention rõ ràng (A→B allow, A→C deny), verify bằng cả traffic thực tế và log Envoy.

TUẦN 4 - Vault Integration, ACL & Security

Ngày 27: Vault Integration - Dynamic Secrets cho Task

  • Mục tiêu: Không hardcode secret vào job spec.

  • Nội dung:

    • Lý thuyết: vault{} block, Workload Identity (từ Nomad 1.7+, JWT-based auth thay Vault token cũ), token renewal tự động.

    • Thực hành: Task lấy dynamic DB credential từ Vault qua template render.

Ngày 28: Vault Integration Internals

  • Mục tiêu: Hiểu đầy đủ luồng xác thực và vòng đời secret, không chỉ dùng được mà còn debug được khi renewal/revocation lỗi.

  • Nội dung:

    • Lý thuyết: Luồng đầy đủ Allocation nhận JWT (ký bởi Nomad) → Vault JWT Auth Method xác thực JWT → Vault cấp Vault Token → Token dùng để lấy Dynamic Secret; khái niệm lease (TTL của secret), renewal (gia hạn trước khi hết hạn), revocation (thu hồi khi allocation kết thúc hoặc bị dừng).

    • Thực hành: Cấu hình Vault JWT auth method trỏ về Nomad, quan sát vault token lookup để thấy TTL/lease, cố tình để token hết hạn và quan sát template tự render lại.

Ngày 29: ACL System

  • Mục tiêu: Kiểm soát quyền truy cập cụm production.

  • Nội dung:

    • Lý thuyết: ACL token, policy (HCL rules), bootstrap ACL (nomad acl bootstrap), management vs client token.

    • Thực hành: Bootstrap ACL, tạo policy giới hạn team chỉ được submit job trong namespace riêng.

Ngày 30: Namespaces & Multi-tenancy

  • Mục tiêu: Cô lập nhiều team trên cùng cụm.

  • Nội dung: Lý thuyết: nomad namespace, resource quota theo namespace (nomad quota), kết hợp ACL policy theo namespace.

Ngày 31: mTLS giữa Server/Client - Gossip encryption & TLS

  • Mục tiêu: Bảo mật giao tiếp nội bộ cụm, không chỉ traffic ứng dụng.

  • Nội dung:

    • Lý thuyết: tls{} config cho RPC, gossip encryption key (encrypt), phân biệt bảo mật control-plane (Nomad TLS) với data-plane (Consul Connect mTLS).

    • Thực hành: Bật TLS cho cụm dev, verify nomad server members vẫn hoạt động qua kênh mã hóa.

Ngày 32: Workload Identity sâu (JWT, SPIFFE-style)

  • Mục tiêu: Hiểu cơ chế xác thực hiện đại thay thế static token.

  • Nội dung: Lý thuyết: Mỗi allocation nhận JWT identity ký bởi Nomad, dùng để auth với Vault/Consul mà không cần lưu secret tĩnh - giảm attack surface đáng kể; liên hệ lại với Ngày 28 để thấy full loop.

Ngày 33: Ôn tập Tuần 4

  • Mini-Project: Job dùng Workload Identity để lấy secret Vault, chạy dưới ACL policy giới hạn namespace, toàn bộ giao tiếp cụm qua TLS.

TUẦN 5 - Storage, Autoscaling, Multi-region & Multi-cloud

Ngày 34: CSI (Container Storage Interface)

  • Mục tiêu: Stateful workload production-grade (thay host_volume đơn giản).

  • Nội dung:

    • Lý thuyết: csi_plugin{} (controller + node plugin), volume{ type = "csi" }, dynamic provisioning.

    • Thực hành: Deploy CSI plugin (vd AWS EBS CSI), tạo volume claim, mount vào job Postgres.

Ngày 35: Autoscaling - Nomad Autoscaler

  • Mục tiêu: Scale cả job (horizontal) và cluster (cloud instance).

  • Nội dung:

    • Lý thuyết: Kiến trúc Nomad Autoscaler (agent riêng, không phải core Nomad), Application scaling policy vs Cluster scaling policy (dùng AWS ASG/Azure VMSS target).

    • Thực hành: Setup policy scale theo CPU metric qua Prometheus, quan sát job tự scale count.

Ngày 36: Scheduling at Scale

  • Mục tiêu: Hiểu hành vi cụm khi tăng quy mô từ vài chục lên hàng nghìn node.

  • Nội dung:

    • Lý thuyết: Eval backlog (khi tốc độ tạo Eval nhanh hơn tốc độ xử lý), scheduler throughput (số lượng scheduler worker ảnh hưởng ra sao), Raft làm bottleneck khi write quá nhiều (mọi Plan đều phải qua Raft) - so sánh hành vi ở quy mô 10/100/1000/10000 node.

    • Thực hành: Dùng nomad operator metrics hoặc Prometheus quan sát nomad.nomad.blocked_evals.count và nomad.broker.total_blocked, thử tạo tải lớn (nhiều job cùng lúc) trên cụm dev để thấy backlog tăng.

Ngày 37: Multi-region Federation

  • Mục tiêu: Vận hành nhiều region như 1 hệ thống.

  • Nội dung:

    • Lý thuyết: WAN gossip liên kết các region độc lập Raft, nomad server join cross-region, mỗi region vẫn giữ Raft riêng (chỉ liên kết gossip, không phải 1 Raft cluster khổng lồ).

    • Thực hành: Setup 2 region local, nomad server members -detailed, deploy job multi-region (multiregion{} block).

Ngày 38: Multi-Cloud Federation Patterns

  • Mục tiêu: Áp dụng Nomad trong kiến trúc hybrid/multi-cloud thực tế.

  • Nội dung: Lý thuyết: Các pattern phổ biến - AWS Region ↔ On-Prem DC, hoặc AWS ↔ Azure ↔ GCP cùng 1 federation; những vấn đề cần lưu ý (latency WAN gossip, network connectivity giữa các mạng riêng, chiến lược đặt job theo region/datacenter cho từng loại workload).

Ngày 39: Edge Computing với Nomad

  • Mục tiêu: Use case đặc thù Nomad - vận hành trên thiết bị edge kết nối không liên tục.

  • Nội dung: Lý thuyết: Client edge không cần luôn kết nối server, nomad node drain, reconnect behavior; so sánh với K8s (K8s node NotReady rất "nhạy cảm" hơn).

Ngày 40: Ôn tập Tuần 5

  • Mini-Project: Job Postgres dùng CSI volume, autoscale theo Prometheus metric, deploy trên cụm multi-region giả lập 2 region local.

TUẦN 6 - Networking

Ngày 41: Network Namespace & iptables Internals

  • Mục tiêu: Hiểu cơ chế OS-level đằng sau network{ mode = "bridge" }.

  • Nội dung:

    • Lý thuyết: Mỗi allocation group chạy trong 1 network namespace riêng (Linux netns), Nomad tạo bridge interface + veth pair; iptables NAT rules cho port mapping (to/static).

    • Thực hành: Dùng ip netns, iptables -t nat -L trên client để soi 1 allocation đang chạy, đối chiếu với port mapping khai báo trong job spec.

Ngày 42: CNI Plugin Lifecycle

  • Mục tiêu: Hiểu Nomad giao tiếp với CNI plugin như thế nào.

  • Nội dung:

    • Lý thuyết: CNI ADD/DEL lifecycle khi allocation start/stop, cấu trúc file cấu hình CNI (/opt/cni/config), plugin phổ biến (bridge, portmap, firewall).

    • Thực hành: Cài 1 CNI plugin custom đơn giản (hoặc dùng plugin có sẵn), quan sát log client khi ADD/DEL được gọi.

Ngày 43: Port Allocation Algorithm & Dynamic Ports

  • Mục tiêu: Hiểu cách Nomad cấp port động, tránh xung đột port giữa các allocation trên cùng node.

  • Nội dung:

    • Lý thuyết: Dynamic port range cấu hình ở client (client { min_dynamic_port, max_dynamic_port }), cách scheduler track port đã dùng trong bin-packing (port cũng là 1 loại resource).

    • Thực hành: Chạy nhiều allocation cùng lúc trên 1 node dùng dynamic port, verify không trùng port qua nomad alloc status.

Ngày 44: Ôn tập Tuần 6 - Troubleshooting Networking

  • Mini-Project: Cố tình gây lỗi networking (sai port mapping, thiếu CNI plugin) và tự debug bằng các công cụ đã học (ip netns, iptables, log client).

TUẦN 7 - Production Operations, Troubleshooting & Performance

Ngày 45: Upgrade Strategy - Zero-downtime cluster upgrade

  • Mục tiêu: Upgrade Nomad version không downtime.

  • Nội dung:

    • Lý thuyết: Rolling upgrade server-by-server (giữ quorum), client drain trước khi upgrade, version compatibility matrix.

    • Thực hành: Giả lập upgrade cụm 3-server, nomad node drain từng client trước khi restart.

Ngày 46: Backup & Disaster Recovery

  • Mục tiêu: Không mất state khi sự cố.

  • Nội dung:

    • Lý thuyết: nomad operator snapshot save/restore (Raft snapshot), chiến lược backup định kỳ.

    • Thực hành: Snapshot cụm, giả lập mất 1 server, restore.

Ngày 47: Monitoring & Observability

  • Mục tiêu: Biết cụm khỏe hay không trước khi user báo cáo.

  • Nội dung:

    • Lý thuyết: Nomad metrics endpoint (/v1/metrics), tích hợp Prometheus + Grafana; key metrics: nomad.raft.*, nomad.client.allocs.*, nomad.nomad.blocked_evals.*.

    • Thực hành: Setup Prometheus scrape Nomad, dashboard Grafana cơ bản.

Ngày 48: Troubleshooting nâng cao

  • Mục tiêu: Xử lý sự cố.

  • Nội dung:

    • Lý thuyết: Phân loại lỗi: blocked evaluation (không đủ resource để schedule), dead allocation, client not ready, plan rejected (do resource race), Raft leader flapping.

    • Thực hành: Cố tình gây blocked eval (submit job yêu cầu resource vượt cụm), dùng nomad eval status + nomad job status -verbose để debug.

Ngày 49: Resource limits & OOM handling

  • Mục tiêu: Hiểu cgroup enforcement thực tế.

  • Nội dung: Lý thuyết: resources{ memory, memory_max } - oversubscription (memory_max cho phép burst), OOM kill behavior khác nhau giữa driver.

Ngày 50: Performance Tuning

  • Mục tiêu: Tối ưu cụm cho tải lớn/production nghiêm ngặt.

  • Nội dung:

    • Lý thuyết: scheduler { num_schedulers } (số scheduler worker), GC interval (server { node_gc_threshold, job_gc_threshold, eval_gc_threshold }), Raft performance tuning (raft_multiplier, heartbeat timeout), overhead của telemetry khi bật quá nhiều metrics ở cụm lớn.

    • Thực hành: Thử chỉnh raft_multiplier và num_schedulers trên cụm dev, quan sát khác biệt qua benchmark đơn giản (submit hàng loạt job, đo thời gian xử lý eval).

Ngày 51: Ôn tập Tuần 7

  • Mini-Project: Viết runbook (checklist) xử lý 3 sự cố phổ biến nhất: blocked eval, leader flapping, OOM kill - kèm lệnh debug cụ thể cho từng case.

TUẦN 8 - Ecosystem, API Automation & Enterprise

Ngày 52: Terraform + Nomad Integration

  • Mục tiêu: IaC hóa cả job spec lẫn cụm hạ tầng.

  • Nội dung:

    • Lý thuyết: Terraform Nomad provider (nomad_job resource) để deploy job qua Terraform thay vì CLI; Packer image → Terraform tạo Nomad client node → Terraform apply Nomad job - full loop 3 tool.

    • Thực hành: Terraform apply 1 job spec, verify qua nomad job status.

Ngày 53: CI/CD pipeline cho Nomad job

  • Mục tiêu: Deploy tự động qua pipeline.

  • Nội dung: Thực hành: GitHub Actions chạy nomad job plan → review diff → nomad job run khi merge, kèm canary + auto-revert an toàn.

Ngày 54: Packer + Nomad - Golden Image cho Nomad Client node

  • Mục tiêu: Nối lại kiến thức Packer đã học trước đó.

  • Nội dung: Thực hành: Build AMI bằng Packer đã cài sẵn Nomad client + Docker + CNI plugin, dùng Terraform launch client node từ AMI đó, join cụm tự động qua cloud auto-join (retry_join với cloud provider tag).

Ngày 55: Nomad HTTP API Automation

  • Mục tiêu: Tự động hóa vượt ra ngoài CLI - cách automation production thực sự vận hành.

  • Nội dung:

    • Lý thuyết: Các endpoint chính /v1/jobs, /v1/evaluations, /v1/allocations, /v1/deployments; auth qua header X-Nomad-Token; so sánh khi nào dùng API trực tiếp thay vì CLI (custom tooling, dashboard nội bộ, chatops).

    • Thực hành: Viết script (bash/python) submit job qua API, poll /v1/evaluation/:id để check kết quả, gọi /v1/deployment/:id để theo dõi canary.

Ngày 56: Nomad Enterprise Features

  • Mục tiêu: Biết Nomad Enterprise thêm gì so với OSS, để đưa ra quyết định đúng khi tổ chức cần governance nâng cao.

  • Nội dung: Lý thuyết: Sentinel Policies (policy-as-code, kiểm soát job spec trước khi apply - vd bắt buộc phải có resources.memory_max), Namespace Governance nâng cao, Resource Quotas chi tiết hơn theo namespace, Multi-tenancy nâng cao (so với ACL + namespace ở bản OSS).

Ngày 57: Ôn tập Tuần 8

  • Mini-Project: Pipeline CI/CD hoàn chỉnh dùng API thay vì CLI thuần, kèm 1 Sentinel policy mẫu (viết dạng pseudo-code nếu không có license Enterprise để test thật).

TUẦN 9 - Capstone Project

Ngày 58: Capstone Project - Cụm Nomad Production hoàn chỉnh

Yêu cầu:

  1. Cụm 3 server (TLS + ACL bootstrap) + client auto-join qua cloud tag, chạy trên AMI Packer tự build.

  2. Service mesh Consul Connect giữa các service (có intentions rõ ràng), secret động qua Vault Workload Identity (đúng luồng JWT → Vault Auth → lease/renewal).

  3. CSI volume cho 1 stateful service (Postgres), CSI plugin production-ready.

  4. Autoscaler scale job theo Prometheus metric.

  5. CI/CD pipeline: plan → canary deploy → auto-revert nếu health check fail, triển khai qua HTTP API (không chỉ CLI).

  6. Backup/restore Raft snapshot đã test thành công.

  7. Dashboard Grafana theo dõi blocked_evals, eval backlog, allocation status, node resource, Raft health.

  8. Networking: verify port mapping + iptables rules đúng như thiết kế, không xung đột dynamic port.

  9. Ít nhất 1 Sentinel policy (hoặc pseudo-policy nếu dùng OSS) kiểm soát chuẩn job spec trước khi merge.

  10. Runbook troubleshooting kèm theo (từ Ngày 51) cho cụm capstone.

Knowledge

Part 1 of 50