Perkenalan
Definisi Devops, ML-Ops dan DataOps
Manual deployment tidak baik karena:
Tidak error prone dan tidak konsisten. Hasilnya bisa beda-beda.
Kenapa sebaiknya deployment ga dilakukan sekaligus di akhir (jangan pas beres dev baru di-deploy): karena beda environment, supaya error bisa di-mitigate di awal
Incremental delta deployment: deploy tahap demi tahap dari awal dev. Supaya kalau ada error sedikit bisa di rollback. Usahain tiap 2 hari deploy
Service Level Agreement
- Service level agreement adalah janji layanan atau kualitas layanan yang diberikan
- Komponen utama SLA biasanya terdiri atas:
- Service scope: layanan apa saja yang disediakan
- Tingkat kinerja (performance metrics): indikator kinerja sistem yang terukur, misalnya uptime/availability 99.9% per bulan, response time < 200ms untuk setiap request API, throughput minimal 1000 request per second
Container
-
Container adalah konsep virtualisasi di mana seluruh aplikasi, termasuk environment dan dependencies-nya berada di satu package yang sama

-
Container berbeda dengan VM, di mana kalau VM itu betul-betul satu OS full untuk menjalankannya, kalau container hanya melakukan packaging terhadap code, runtime, system tools, system libraries and settings yang dibutuhkan saja

- Untuk catatan ini, mainly akan dibuat untuk Docker
Image
- Image adalah base yang dipakai untuk container, ibaratnya tuh base class atau template yang nanti kita pakai untuk nyimpen container dan konfigurasinya
- Contoh image: Node, Ubuntu, PostgreSQL, AlpineLinux, lalu nanti kita isi dan configure si image ini supaya bisa menjalankan aplikasi yang kita masukin ke container yang pakai base image ini
- Dockerfile adalah sebuah script untuk membangun image custom
- Biasanya kita awalnya pakai base image dulu (misal Node), lalu kita konfigurasi via Dockerfile ini untuk mengkonfigurasi image kita yang baru nanti. Misalnya untuk build sebuah image untuk server kita, kita membuat Dockerfile yang isinya:
FROM node:20-alpine
RUN apk add --no-cache openssl
RUN apk add --no-cache postgresql postgresql-contrib redis
RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
WORKDIR /home/node/app
USER node
COPY --chown=node:node package.json ./
COPY --chown=node:node prisma ./prisma/
# COPY package*.json ./
# RUN npm install
RUN npm cache clean --force && \
npm install --loglevel verbose
#COPY prisma ./prisma/
RUN npx prisma generate
COPY --chown=node:node . .
EXPOSE ${PORT} 5432 6379
COPY start.sh /home/node/app/start.sh
COPY ./.env.example ./.env
USER root
RUN chmod +x /home/node/app/start.sh
USER node
# CMD ["/usr/src/app/start.sh"]
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD node -e "console.log('healthcheck lagi')" || exit 1
CMD ["npm", "run", "dev"]
- Dapat dilihat dari sana kalau kita menggunakan base image Node, lalu kita modifikasi untuk kebutuhan server kita
Layer
- Layer adalah setiap lapisan yang dijalankan saat mengkonfigurasi sebuah image
- Layer adalah filesystem snapshot immutable yang dihasilkan dari setiap instruksi Dockerfile yang memodifikasi filesystem.
- Contoh instruksi yang membuat layer:
RUNCOPYADD
- Instruksi yang tidak membuat layer:
CMDENTRYPOINTENV(metadata only)
- Docker image disusun sebagai stack of layers menggunakan Union Filesystem (UnionFS) (contoh: OverlayFS)
[ App Layer ]
[ Dependency Layer ]
[ OS Base Layer ]
- Untuk melakukan building dengan ignore caches di semua layer, jalankan:
- Ketika container dijalankan:
- Image layers → read-only
- Container mendapat writable layer di atasnya
- Contoh:
FROM ubuntu:22.04 # base layer
RUN apt update # layer 1
RUN apt install -y curl# layer 2
COPY app /app # layer 3
- Penggunaan layer memudahkan caching, di mana jika suatu layer di atasnya tidak berubah, maka seluruh layer di atasnya pun tidak akan di-rebuild ulang untuk mempercepat proses building image
- Hanya layer yang berubah dan layer di bawahnya yang akan di-rebuild
docker build -t image --no-cache
Registry
- Registry adalah service penyimpanan dan distribusi image
- Contoh: Gitlab Container Registry, Github Container Registry, Docker Hub
- Fungsi utama:
- Menyimpan image dalam bentuk layers
- Image distribution (misal
docker pushuntuk upload image ke registry, dandocker pulluntuk pull image dari registry) - Versioning system
TOIL
Definition
- Toil: Operasi manual (sama manusia) yang dilakukan repetitif. Misalnya adalah nyala-matiin server, nulis laporan manual kalau ada suatu error, login ke server buat cek log, dsb
- Ciri:
- Manual: membutuhkan manusia
- Repetitif: dilakukan berulang
- Automatable: bisa dilakukan mesin sebetulnya
- Reactive: di-trigger oleh sesuatu (misal server mati, baru kita nyalain manual)
- Tactical: interrupt-driven (ada gangguan), bukan strategic
- No enduring value: tidak improve atau meningkatkan kapabilitas sistem
- O(n) seiring perkembangan service: semakin berkembang mengikuti jumlah service
-
Kenapa Toil harus dikurangi?
- Supaya engineer punya banyak waktu lain buat hal yang lebih beneficial (inovasi, engineering)
- Mencegah burnout dan career stagnation (ga perlu ada karyawan2 khusus lagi yang harus jaga server, karyawan bosen)
- Supaya bisa scaling teams secara sublinear (jumlah karyawan bisa ditekan)
- Mengurangi jumlah error karena inkonsistensi (karena manual, bisa aja langkah2 atau ada inkonsistensi)
-
Mengurangi waktu response time (jadi kalau ada incident, otomatis dilakukan, response time nya lebih cepat)
-
50% rule:
- Tujuan: supaya waktu yang dihabiskan devops kurang dari 50% untuk Toil aja
-
Kalaupun ada toil, cukup di angka 25-33%
-
Jenis sumber Toil:
- Interrupts: non-urgent message, alerts
- On-call: urgent incident
-
Releases & pushes: proses otomasi yang masih manual
-
Cara identifikasi dan pengukuran Toil:
- Tool untuk task/ticket management (mis. Jira, jadi keliatan tugas2nya siapa dan bisa dianalisis seberapa lama dan banyak tasknya)
- Cek hot spot pada engineer tertentu (cek siapa yang paling sering mengerjakan toil)
- Identifikasi hasil apa yang bisa ditingkatkan kalau toil bisa dikurangi (opportunities for high impact toil reduction)