Definisi DevOps (Ulang, Lebih Lengkap)
DevOps adalah sekumpulan praktik, tools, dan filosofi budaya yang mengotomasi dan mengintegrasikan proses antara tim development dan IT operations. Menekankan pemberdayaan tim, komunikasi/kolaborasi lintas tim, dan otomasi teknologi. (Atlassian)
DevOps menjembatani celah antara development dan operations dengan mempromosikan budaya kolaborasi, tanggung jawab bersama (shared responsibilities), dan feedback berkelanjutan menggunakan otomasi di sepanjang software development life cycle.
DevOps Lifecycle (Ringkas)
Discover → Plan → Build → Test → Deploy → Operate → Observe → Continuous feedback (dibungkus Collaboration and Communication).
Praktik Umum (Common Practices) dalam DevOps
- Continuous Integration (CI) — praktik pengembangan software yang melibatkan penggabungan (merge) perubahan kode dari banyak developer ke shared repository secara sering, biasanya beberapa kali sehari.
- Continuous Delivery (CD) — mengirim software yang sudah diuji ke production environment kapan pun software tersebut sudah siap.
- Infrastructure as Code (IaC) — praktik mengelola dan menyediakan (provisioning) resource infrastruktur (server, network, storage) menggunakan kode dan file konfigurasi, bukan proses manual.
- Configuration as Code (CaC) — praktik mengelola dan menyediakan pengaturan konfigurasi menggunakan kode dan sistem version control.
- Monitoring and logging — praktik esensial yang melibatkan penangkapan dan analisis data tentang perilaku dan performa aplikasi/sistem.
- Communication and collaboration — mendorong kerja tim yang efektif, berbagi pengetahuan, dan alur kerja yang efisien lintas development, operations, dan stakeholder lain.
Cloud Native Application
Aplikasi yang secara inheren scalable, flexible, resilient. Karakteristiknya:
- Micro-service architecture — dipecah menjadi banyak bagian yang lebih kecil dan loosely coupled.
- Containerization — environment yang konsisten, portable, dan ringan (lightweight) untuk aplikasi.
- DevOps and automation — untuk scalability, resilience, consistency, dan seamless delivery.
- Dynamic orchestration — untuk skalabilitas dan fault-tolerance.
Catatan penting: DevOps bisa dilakukan dengan cara manual provisioning/config infrastruktur, deploy ke server fisik/VM, scaling vertikal, resilience via server redundan — tapi inilah yang BUKAN menjadi tujuan pembelajaran matkul ini. Fokusnya adalah pendekatan cloud-native modern (container, orkestrasi, otomasi).
Container
Motivasi & Analogi
Container digunakan untuk memecahkan masalah paling kritis dalam arsitektur komputer: menjalankan software terdistribusi yang andal dengan skalabilitas nyaris tak terbatas di lingkungan komputasi mana pun. Container memungkinkan software engineer untuk “package once, deploy anywhere” dan mendukung arsitektur microservice.
Nama “container” berasal dari shipping container: dulu, mengangkut barang lintas geografi dengan berbagai moda transportasi (loading/unloading berulang-ulang) meningkatkan biaya buruh dan sulit ditangani secara praktis — solusinya adalah kontainer standar yang seragam untuk menangani barang apa pun.
Evolusi Deployment: Physical Server → VM → Container
| Model | Struktur Layer (dari bawah) | Karakteristik |
|---|---|---|
| Apps on Physical Server | Hardware Infrastructure → OS → Libraries/Dependencies (dipakai bersama) → App (Web Server, Database, Messaging) | Semua app berbagi 1 OS & 1 set library/dependency di server yang sama — rawan konflik dependency. |
| Virtual Machines (VM) | Hardware Infrastructure → Host OS → Hypervisor → (per VM: Guest OS → Libraries/Dependencies → App) | Tiap app punya Guest OS sendiri lewat hypervisor — terisolasi penuh, tapi berat (overhead OS berulang). |
| Container | Hardware Infrastructure → OS → Container Runtime → (per container: Libraries/Dependencies → App) | Tiap app punya Libraries/Dependencies sendiri, tapi berbagi 1 OS lewat container runtime — jauh lebih ringan dari VM namun tetap terisolasi. |

Containers & DevOps
Container dan DevOps saling melengkapi (complementary): container menyediakan infrastructure encapsulation, portability, scalability, dan agility yang dibutuhkan untuk software delivery yang cepat dan efisien. Container jadi fondasi kuat bagi organisasi untuk mencapai faster time-to-market, improved software quality, dan enhanced operational efficiency.
Alur Build & Deploy Container
- Kode aplikasi ditulis dalam bahasa apa pun.
- Buat Dockerfile — berisi rangkaian langkah untuk menginstal dependency aplikasi dan konfigurasi environment.
- Gunakan Dockerfile untuk membuat container image: build image → run image → unit test app di container.
- Push image ke container registry (misal DockerHub).
- Buat container dari image tersebut dan jalankan di sebuah cluster.
Contoh Pipeline CI/CD dengan Container
Code (dari Git, berisi application code + Dockerfile + deployment manifest) → Jenkins CI: Build → Run → Test → Push ke Docker Hub → pull image oleh Jenkins CD → Deploy ke Kubernetes Cluster.

Migrasi VM → Container
Tahapan migrasi:
- Discovery — mengidentifikasi bagian-bagian aplikasi, menilai kemungkinan untuk dikontainerisasi, mendefinisikan scope dan tujuan.
- Application Requirement Assessment — apakah lebih baik memecah aplikasinya? Aspek mana yang bisa diselesaikan? Apa risikonya? Apa prinsip migrasinya?
- Container Infrastructure Design.
- Containerize Application.
- Testing.
- Deployment and Rollout — lalu bisa kembali ke Discovery untuk siklus berikutnya.

Kriteria Aplikasi yang Baik untuk Dikontainerisasi
- Stateless App.
- Aplikasi dengan high cohesion — cocok untuk microservice dan gaya API-first.
- Sering di-update (frequent updates).
- Kompatibel dengan teknologi container.
- Punya dependency dan konfigurasi aplikasi yang bisa didefinisikan secara eksternal dengan jelas.
- BUKAN aplikasi yang: dijaga oleh tim khusus, dipelihara oleh banyak tim sekaligus, atau direncanakan hanya berjalan di environment yang homogen.
Praktik Refactoring Aplikasi (Monolith → Microservice Container)
Tujuannya: berpindah dari tight coupling aplikasi monolitik menuju loose coupling dari serangkaian layanan microservices yang dikontainerisasi.
- Service Discovery — gunakan mekanisme service discovery sebagai registry layanan, bukan hard-coded network location.
- Asynchronous Communication — panggilan sinkron menyebabkan ketergantungan antar layanan dan bisa memicu cascading failure. Gunakan message queue atau event bus agar layanan decoupled dalam hal waktu, membuat sistem lebih resilient.
- Independent Databases — database bersama/sentral menciptakan titik coupling utama. Beri tiap microservice database independennya sendiri, sehingga layanan menjadi otonom dan perubahan di satu database tidak mempengaruhi yang lain.
- Switch-breaker (Circuit Breaker) Pattern — mencegah cascading failure dengan mengisolasi layanan yang gagal. Ketika terjadi connection problem berulang (timeout), circuit breaker akan “trip” dan membuka sirkuit agar client tidak terus mencoba memanggil supplier yang bermasalah.

Tiga Masalah Umum saat Refactoring & Solusinya
| Masalah | Efek | Solusi | Tujuan Akhir |
|---|---|---|---|
| Stateful Applications — aplikasi menyimpan data secara lokal, tergantung pada instance-nya | Menghalangi scaling mudah dan automated recovery | Externalize state — pindahkan data ke storage eksternal & persisten (database, object storage) | Container menjadi ephemeral dan disposable |
| Hard-Coded Configurations — pengaturan konfigurasi ditanam langsung ke aplikasi/image | Inflexible antar environment (Dev/Staging/Prod); perlu build baru tiap ganti konfigurasi | Externalize configuration — gunakan environment variable atau mounted file saat runtime | Satu container image bisa dipakai di semua environment |
| Inconsistent Dependencies — aplikasi bergantung pada library/tools spesifik host | Kurang portable; sindrom “works on my machine” | Bundle dependencies — sertakan semua library dan tools yang dibutuhkan di dalam image | Aplikasi self-contained yang berjalan konsisten di mana saja |
Best Practices Container (Umum)
- Pecah aplikasi menjadi microservice.
- Buat Dockerfile untuk tiap layanan.
- Optimalkan ukuran image.
- Gunakan build automation tool.
- Kelola container lifecycle.
- Terapkan security best practices.
- Monitor & log container.
- Pertimbangkan teknologi cloud-native.
Best Practices — Security
- Use Minimal Base Images — kurangi attack surface dengan menghindari image berisi package/dependency yang tidak perlu.
- Regularly Scan Container Images — gunakan tool vulnerability scanning secara rutin.
- Implement the Principle of Least Privilege — hindari menjalankan container sebagai root user, batasi akses ke resource sensitif.
- Use Immutable Infrastructure — image bersifat immutable; setelah dibuat & di-deploy tidak diubah lagi, harus build image baru untuk perubahan apa pun.
- Secure Communication Between Containers — gunakan TLS untuk enkripsi komunikasi antar container.
- Regularly Update and Patch image dengan patch keamanan terbaru.
- Implement Network Segmentation — gunakan network policy untuk mengisolasi container, membatasi dampak container yang ter-compromise.
- Monitor and Log Container Activity secara real-time untuk mendeteksi aktivitas mencurigakan.
- Use Digital Signatures untuk menandatangani image demi otentisitas & integritas.
- Secure Container Registries dengan access control dan scanning image yang tersimpan.
Best Practices — Performance
- Choose the Right Base Image — image yang lebih kecil (hanya komponen yang perlu) mengurangi attack surface dan resource yang dibutuhkan.
- Keep Containers Lightweight — hapus file/dependency tak perlu; gunakan multi-stage builds untuk memisahkan build environment dari runtime environment.
- Optimize Resource Allocation — atur resource limit CPU/memory (misalnya lewat Kubernetes resource requests & limits).
- Use Efficient Storage Solutions — local storage untuk data temporer, persistent storage untuk data kritis.
- Leverage Caching — gunakan Redis/Memcached untuk cache data yang sering diakses.
- Monitor and Analyze Performance — pakai Prometheus, Grafana, atau Datadog.
- Optimize Networking dan gunakan Orchestration Tools (Kubernetes/Docker Swarm) untuk load balancing dan high availability.
- Implement Health Checks (liveness & readiness probes).
Best Practices — Logging
- Centralize Logs — gunakan solusi seperti ELK Stack atau Fluentd.
- Use Structured Logging — umumnya format JSON.
- Log at the Right Level (INFO, WARN, ERROR) — hindari over-logging.
- Secure Log Data dengan access control, signing, dan enkripsi.
- Monitor Log Volume — terapkan log rotation & retention policy.
- Integrate with Monitoring Tools agar log bisa dikorelasikan dengan metrik performa.
Best Practices — Monitoring
- Use Comprehensive Monitoring Tools: Prometheus, Grafana, Datadog.
- Monitor Key Metrics: CPU, memory, network throughput, latency.
- Set Up Alerts and Notifications ketika threshold terlampaui.
- Implement Health Checks (liveness/readiness probes, misalnya di Kubernetes).
- Automate Monitoring — otomasi pengumpulan data, analisis, dan pelaporan.
Tujuan Utama (Performance) Monitoring
- Mengidentifikasi failure dan fault terkait, baik saat runtime maupun lewat postmortem setelah kegagalan terjadi.
- Mengidentifikasi masalah performa, baik pada sistem individual maupun kumpulan sistem yang saling berinteraksi.
- Characterizing workload untuk capacity planning (jangka pendek & panjang) dan keperluan billing.
- Mengukur reaksi pengguna terhadap berbagai jenis antarmuka atau penawaran bisnis.
- Mendeteksi intruder yang mencoba menerobos sistem.
Goal of Monitoring & Sumber Data
| Goal of Monitoring | Source of Data |
|---|---|
| Failure detection | Application and infrastructure |
| Performance degradation detection | Application and infrastructure |
| Capacity planning | Application and infrastructure |
| User reaction to business offerings | Application |
| Intruder detection | Application and infrastructure |
Tantangan Monitoring
- Monitoring di bawah perubahan yang terus-menerus (continuous changes).
- Bottom-Up vs. Top-Down dan monitoring di lingkungan cloud.
- Monitoring arsitektur microservice.
- Menangani volume besar data (log) yang terdistribusi.
Flashcard
flashcards Apa perbedaan mendasar antara VM dan Container dalam hal struktur layer? :: VM memberi tiap aplikasi Guest OS sendiri di atas hypervisor (berat, isolasi penuh); Container berbagi satu OS host lewat container runtime dan hanya memisahkan libraries/dependencies per aplikasi (ringan, tetap terisolasi). Apa itu Infrastructure as Code (IaC)? :: Praktik mengelola dan menyediakan resource infrastruktur (server, network, storage) menggunakan kode dan file konfigurasi, bukan proses manual. Sebutkan 5 langkah dalam alur build & deploy container. :: (1) Tulis kode aplikasi, (2) buat Dockerfile, (3) build-run-unit test image, (4) push image ke container registry (mis. DockerHub), (5) buat & jalankan container dari image di cluster. Apa fungsi Circuit Breaker (Switch-breaker) Pattern dalam microservice? :: Mencegah cascading failure dengan mengisolasi layanan yang gagal — ketika terjadi timeout/connection problem berulang, sirkuit akan “trip” agar client berhenti memanggil supplier yang bermasalah. Sebutkan tiga masalah umum saat refactoring monolith ke container beserta solusinya. :: Stateful applications → externalize state (storage eksternal persisten); Hard-coded configurations → externalize configuration (env variable/mounted file); Inconsistent dependencies → bundle dependencies dalam image. Sebutkan 4 karakteristik aplikasi yang cocok dikontainerisasi. :: Stateless, high cohesion (microservice, API-first), sering di-update, kompatibel dengan teknologi container, serta dependency/konfigurasi yang bisa didefinisikan secara eksternal. Sebutkan 5 tujuan utama dari performance monitoring. :: Mengidentifikasi failure/fault, mengidentifikasi masalah performa, capacity planning, mengukur reaksi pengguna, dan mendeteksi intruder. Apa perbedaan Continuous Integration (CI) dan Continuous Delivery (CD)? :: CI adalah praktik menggabungkan perubahan kode dari banyak developer ke shared repository secara sering (beberapa kali sehari); CD adalah pengiriman software yang sudah teruji ke production environment kapan pun siap.