Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Manifest (YAML)
- 2.2. kubectl buyruqlari
- 2.3. Deployment va Service manifesti
- 2.4. Rolling update (uzilishsiz)
- 2.5. Rollback (qaytish)
- 2.6. Scaling (miqyoslash)
- 2.7. ConfigMap va Secret
- 2.8. Deploy — deklarativ va nazorat qilinadigan
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Manifest tahlili
- Misol 2 — Rolling update (bosqichma-bosqich)
- Misol 3 — Rollback (versiyaga qaytish)
- Misol 4 — Avtomatik miqyoslash (HPA)
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
28.6-dars: Kubernetes — deploy
28-QISM — INFRATUZILMA · 6-dars
1. Kirish va motivatsiya
Kubernetes tushunchalarini (28.5 — Pod, Deployment, Service) bildik — endi ilovani haqiqatan klasterga chiqarish kerak. Bu YAML manifest lar yozish (istalgan holatni ta'riflash) va kubectl buyrug'i bilan klasterga qo'llashdan iborat. Yangi versiyani chiqarish, miqyoslash, sozlamalarni boshqarish — hammasi manifest va kubectl orqali. Deploy jarayonini bilish — Kubernetes'ni amalda ishlatish ko'nikmasi. Manifest yozib, kubectl apply — ilova klasterda ishlaydi.
Kubernetes deploy — ilovani klasterga chiqarish jarayoni: manifest (YAML fayl — Deployment, Service, boshqa resurslar), kubectl (Kubernetes buyruq vositasi — apply, get, scale, rollout), rolling update (yangi versiyani uzilishsiz chiqarish), rollback (muammoda oldingi versiyaga qaytish), scaling (nusxalarni ko'paytirish/kamaytirish), config (ConfigMap/Secret — sozlama/sirlar). Oqim: manifest yoz → kubectl apply → Kubernetes istalgan holatni ta'minlaydi → kuzat/boshqar. Deploy deklarativ (istalgan holat) va nazorat qilinadigan (rollout, rollback). Bu 28.5 (tushuncha) ni amaliyotga aylantiradi. Deploy — ilovani klasterda ishga tushirish.
Real vaziyat. Bir jamoa yangi versiyani chiqarganda butun ilova to'xtardi (eski to'xtatiladi, yangi ishga tushguncha uzilish) — foydalanuvchilar xato ko'rardi. Kubernetes rolling update qo'llanildi: kubectl apply yangi versiyani bosqichma-bosqich chiqardi (eski podlar birma-bir yangisiga almashadi — doim ishlaydigan podlar bor). Muammo chiqsa — kubectl rollout undo (bir buyruqda oldingi versiya). Endi deploy uzilishsiz, xavfsiz. Deploy — nazorat qilinadigan chiqarish.
Bu darsda Kubernetes deploy jarayonini o'rganamiz.
Bu darsda:
- Manifest (YAML)
- kubectl buyruqlari
- Deployment va Service manifesti
- Rolling update (uzilishsiz)
- Rollback (qaytish)
- Scaling (miqyoslash)
- ConfigMap va Secret
- Amaliy: deploy modeli
ℹ Kubernetes murakkab tizim; misollar Python bilan deploy mantiqini modellashtiradi (deterministik).
2. Nazariya — chuqur tushuntirish
2.1. Manifest (YAML)
Istalgan holatni ta'riflash:
# deployment.yaml — Deployment manifesti
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels: {app: myapp}
template:
metadata:
labels: {app: myapp}
spec:
containers:
- name: myapp
image: myapp:v1.2
ports:
- containerPort: 8000 Manifest — Kubernetes resursini ta'riflaydigan YAML fayl (istalgan holat): apiVersion (API versiyasi), kind (resurs turi — Deployment, Service), metadata (nom, yorliqlar), spec (tavsif — nima kerak). Manifest deklarativ (28.3 — nima kerak, qanday emas). Sabab: manifest — "infratuzilma kodi" (git'da, versiyalangan, jamoa bir xil, hujjat); qo'lda buyruqlar emas (takrorlanadigan, kuzatiladigan). Har resurs (Deployment, Service, ConfigMap) o'z manifesti. Manifest — Kubernetes resursining tavsifi (YAML). Istalgan holat kodda.
2.2. kubectl buyruqlari
Klasterni boshqarish:
kubectl apply -f deployment.yaml # manifestni qo'llash (istalgan holat)
kubectl get pods # podlar ro'yxati
kubectl get deployments # deploymentlar
kubectl describe pod myapp-xxx # tafsilot
kubectl logs myapp-xxx # loglar
kubectl scale deployment myapp --replicas=5 # miqyoslash
kubectl rollout status deployment myapp # deploy holati
kubectl delete -f deployment.yaml # o'chirish kubectl — Kubernetes klasterini boshqarish buyruq vositasi: apply -f (manifestni qo'llash — istalgan holatni o'rnatish, idempotent — qayta qo'llash xavfsiz), get (resurslar ro'yxati — podlar, deploymentlar), describe (tafsilot — nima bo'lyapti), logs (chiqish), scale (miqyoslash), rollout (deploy boshqaruvi — status, undo), delete (o'chirish), exec (pod ichiga). kubectl apply — asosiy (deklarativ — istalgan holatni qo'llaydi). kubectl — klaster bilan muloqot. Buyruq — istalgan holatni boshqarish.
2.3. Deployment va Service manifesti
Birga ishlaydi:
# Deployment: podlarni yaratadi
kind: Deployment
spec:
replicas: 3
template:
spec:
containers: [{name: myapp, image: myapp:v1.2}]
--- # ikki manifest bir faylda
# Service: podlarga kirish
kind: Service
spec:
selector: {app: myapp}
ports: [{port: 80, targetPort: 8000}] Deployment va Service birga: Deployment podlarni yaratadi (dastur nusxalari), Service ularga kirish beradi (barqaror manzil, yuk taqsimlash — 28.5). Ular yorliq (label) orqali bog'lanadi: Deployment podlarga yorliq beradi (app: myapp), Service shu yorliq bo'yicha topadi (selector: app: myapp). Bir faylda ikki manifest — --- bilan ajratiladi. Oqim: Deployment (podlar) + Service (kirish) = ishlaydigan, kiriladigan ilova. Bu minimal to'liq deploy (dastur + kirish). Deployment + Service — ishlaydigan ilova. Yorliq — bog'lovchi.
2.4. Rolling update (uzilishsiz)
Yangi versiyani bosqichma-bosqich:
Rolling update: eski podlar birma-bir yangiga almashadi
[v1][v1][v1] → [v1][v1][v2] → [v1][v2][v2] → [v2][v2][v2]
doim ishlaydigan podlar bor (uzilish yo'q)
kubectl apply -f deploy.yaml # yangi image → rolling update
kubectl set image deployment/myapp myapp=myapp:v2 Rolling update — yangi versiyani bosqichma-bosqich, uzilishsiz chiqarish: eski podlar birma-bir yangi versiyaga almashadi (hammasi birdan emas) — har vaqt ishlaydigan podlar bor (foydalanuvchi uzilish sezmaydi). Kubernetes buni avtomatik qiladi (kubectl apply yangi image bilan — yoki kubectl set image). Sozlash: maxSurge (qo'shimcha podlar), maxUnavailable (nechta o'chishi mumkin). Sabab: eski to'xtatib, yangi ishga tushirish — uzilish (foydalanuvchi xato ko'radi); rolling — silliq o'tish. Bu 27.12 (chidamlilik — uzilishsiz) bilan bog'liq. Rolling update — xavfsiz, uzilishsiz yangilash. Bosqichma-bosqich — uzilishsiz.
2.5. Rollback (qaytish)
Muammoda oldingi versiyaga:
kubectl rollout undo deployment/myapp # oldingi versiyaga
kubectl rollout history deployment/myapp # versiyalar tarixi
kubectl rollout undo deployment/myapp --to-revision=3 # aniq versiya Rollback — yangi versiyada muammo bo'lsa oldingi versiyaga qaytish: kubectl rollout undo — bir buyruqda oldingi (ishlaydigan) versiyaga (Kubernetes versiyalar tarixini saqlaydi). Sabab: yangi versiya buzuq bo'lishi mumkin (xato, ishlamaydi) — tez qaytish kerak (uzoq muammo — foydalanuvchi zarari). Rollback ham rolling (bosqichma-bosqich, uzilishsiz). Bu deploy xavfsizligi (yangi versiya — qaytariladigan qaror, qo'rqmasdan chiqarish). "Tez oldinga, tez orqaga" — ishonchli deploy. Rollback — muammoda tez qaytish (xavfsizlik to'ri). Qaytish — deploy ishonchi.
2.6. Scaling (miqyoslash)
Nusxalarni ko'paytirish:
kubectl scale deployment myapp --replicas=10 # qo'lda
# yoki avtomatik (HPA — Horizontal Pod Autoscaler):
# yuk (CPU) oshsa → podlar ko'payadi (3→10)
# yuk kamaysa → podlar kamayadi (10→3) Scaling (miqyoslash) — pod nusxalarini ko'paytirish/kamaytirish: qo'lda (kubectl scale --replicas=10 yoki manifestda replicas o'zgartirish), avtomatik (HPA — Horizontal Pod Autoscaler — yukka qarab: CPU/xotira oshsa podlar ko'payadi, kamaysa kamayadi). Sabab: yuk o'zgaruvchan (kunduzi ko'p, kechasi kam) — statik nusxa isrof (kam yukda ortiqcha) yoki yetarsiz (ko'p yukda sekin); avtomatik miqyoslash — yukka moslashadi (resurs tejaladi, unumdorlik saqlanadi). Bu 29-qism (miqyoslash) asosi. Kubernetes miqyoslashni oson qiladi (bir buyruq yoki avtomatik). Scaling — yukka moslashish. Miqyos — talab bo'yicha.
2.7. ConfigMap va Secret
Sozlama va sirlar:
# ConfigMap — oddiy sozlamalar
kind: ConfigMap
data:
LOG_LEVEL: "info"
MAX_CONN: "100"
---
# Secret — maxfiy ma'lumot (parol, kalit)
kind: Secret
data:
DB_PASSWORD: <base64>
# podda muhit o'zgaruvchisi sifatida ishlatiladiConfigMap va Secret — sozlamalarni koddan/imagedan ajratish: ConfigMap (oddiy sozlamalar — log darajasi, ulanish soni), Secret (maxfiy — parol, API kalit, sertifikat). Podda ular muhit o'zgaruvchisi yoki fayl sifatida ishlatiladi. Sabab: sozlamalar imageda bo'lmasligi kerak (12-faktor ilova — 28.9): bir image, turli muhit (dev/prod) turli config; sirlar imageda emas (xavfsizlik — 28.2). Secret — base64 (shifrlangan emas, faqat kodlangan — qo'shimcha shifrlash kerak). Config koddan ajratilgan (bir image, ko'p muhit). ConfigMap/Secret — sozlama boshqaruvi. Sozlama — koddan alohida.
2.8. Deploy — deklarativ va nazorat qilinadigan
Kubernetes deploy ikki xususiyatni birlashtiradi: deklarativ (manifest — istalgan holat, kubectl apply) va nazorat qilinadigan (rolling update, rollback, scaling — deploy jarayonini boshqarish). Bu deploy'ni xavfsiz va takrorlanadigan qiladi: manifest git'da (versiyalangan — nima chiqarilgani aniq), rolling (uzilishsiz), rollback (muammoda qaytish), scaling (yukka moslashish). Bu 28.5 (tushuncha) ni amalga oshiradi va CI/CD (28.8 — avtomatik deploy) uchun asos. GitOps (manifest git'da → avtomatik deploy) bu yondashuvni rivojlantiradi. Deploy — istalgan holatni xavfsiz o'rnatish (nazorat bilan). Deklarativ + nazorat — ishonchli deploy.
3. Tez ma'lumotnoma
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata: {name: myapp}
spec:
replicas: 3
selector: {matchLabels: {app: myapp}}
template:
metadata: {labels: {app: myapp}}
spec:
containers:
- name: myapp
image: myapp:v1.2
ports: [{containerPort: 8000}]
resources:
limits: {memory: "512Mi", cpu: "0.5"}
---
kind: Service
metadata: {name: myapp-svc}
spec:
selector: {app: myapp}
ports: [{port: 80, targetPort: 8000}]# KUBECTL:
kubectl apply -f deployment.yaml # qo'llash (istalgan holat)
kubectl get pods / deployments / svc # ro'yxat
kubectl logs <pod> / describe <pod> # kuzatuv
kubectl scale deploy myapp --replicas=10 # miqyoslash
kubectl set image deploy/myapp myapp=myapp:v2 # yangilash
kubectl rollout status/undo deploy/myapp # holat / rollbackKubernetes deploy xulosasi
Manifest (YAML — istalgan holat) · kubectl apply (qo'llash)
Deployment + Service (podlar + kirish, yorliq bilan bog'liq)
Rolling update (uzilishsiz) · rollback (kubectl rollout undo)
Scaling (--replicas yoki HPA) · ConfigMap/Secret (sozlama)
Deklarativ + nazorat qilinadigan (xavfsiz, takrorlanadigan)4. Batafsil misollar
Kubernetes murakkab tizim; misollar Python bilan deploy mantiqini modellashtiradi.
Misol 1 — Manifest tahlili
"""Manifest: Deployment YAML tuzilishini tahlil qilish (dict modeli)."""
def manifest_tekshir(manifest: dict) -> dict:
natija = {"turi": manifest.get("kind"), "muammolar": []}
spec = manifest.get("spec", {})
if "replicas" not in spec:
natija["muammolar"].append("replicas ko'rsatilmagan")
natija["replicas"] = spec.get("replicas", 1)
template = spec.get("template", {}).get("spec", {})
containers = template.get("containers", [])
for c in containers:
if "resources" not in c:
natija["muammolar"].append(f"{c['name']}: resurs chegarasi yo'q")
if c.get("image", "").endswith(":latest"):
natija["muammolar"].append(f"{c['name']}: latest tag (aniq emas)")
natija["konteynerlar"] = [c["name"] for c in containers]
return natija
def main() -> None:
manifest = {
"kind": "Deployment",
"spec": {
"replicas": 3,
"template": {
"spec": {
"containers": [
{"name": "myapp", "image": "myapp:v1.2",
"resources": {"limits": {"memory": "512Mi"}}},
]
}
},
},
}
tekshir = manifest_tekshir(manifest)
print("=== 1. Manifest turi ===")
print(f" kind: {tekshir['turi']}")
print("\n=== 2. Replicas ===")
print(f" {tekshir['replicas']} nusxa")
print("\n=== 3. Konteynerlar ===")
print(f" {tekshir['konteynerlar']}")
print("\n=== 4. Tekshiruv (muammolar) ===")
if tekshir["muammolar"]:
for m in tekshir["muammolar"]:
print(f" ⚠️ {m}")
else:
print(" muammo yo'q (resurs bor, aniq tag)")
print(" ⭐ Manifest — istalgan holat (YAML)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Manifest turi ===
kind: Deployment
=== 2. Replicas ===
3 nusxa
=== 3. Konteynerlar ===
['myapp']
=== 4. Tekshiruv (muammolar) ===
muammo yo'q (resurs bor, aniq tag)
⭐ Manifest — istalgan holat (YAML)Nima ko'rsatdi: 2.1, 2.3-bo'limlar.
Misol 2 — Rolling update (bosqichma-bosqich)
"""Rolling update: eski podlarni birma-bir yangiga almashtirish (uzilishsiz)."""
def rolling_update(pod_soni: int, eski: str, yangi: str) -> list:
podlar = [eski] * pod_soni
qadamlar = [list(podlar)]
# birma-bir almashtirish (doim ishlaydigan podlar bor)
for i in range(pod_soni):
podlar[i] = yangi
qadamlar.append(list(podlar))
return qadamlar
def main() -> None:
qadamlar = rolling_update(3, "v1", "v2")
print("=== 1. Boshlang'ich holat ===")
print(f" {qadamlar[0]}")
print("\n=== 2. Rolling update qadamlari ===")
for i, holat in enumerate(qadamlar[1:], 1):
ishlaydigan = len([p for p in holat if p])
print(f" qadam {i}: {holat} ({ishlaydigan} pod ishlaydi)")
print("\n=== 3. Har qadamda ishlaydigan podlar ===")
print(" hech qachon 0 emas (uzilish yo'q)")
print("\n=== 4. Yakuniy holat ===")
print(f" {qadamlar[-1]} (hammasi v2)")
print(" eski birma-bir yangiga (silliq o'tish)")
print(" ⭐ Rolling update — uzilishsiz yangilash")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Boshlang'ich holat ===
['v1', 'v1', 'v1']
=== 2. Rolling update qadamlari ===
qadam 1: ['v2', 'v1', 'v1'] (3 pod ishlaydi)
qadam 2: ['v2', 'v2', 'v1'] (3 pod ishlaydi)
qadam 3: ['v2', 'v2', 'v2'] (3 pod ishlaydi)
=== 3. Har qadamda ishlaydigan podlar ===
hech qachon 0 emas (uzilish yo'q)
=== 4. Yakuniy holat ===
['v2', 'v2', 'v2'] (hammasi v2)
eski birma-bir yangiga (silliq o'tish)
⭐ Rolling update — uzilishsiz yangilashNima ko'rsatdi: 2.4-bo'lim.
Misol 3 — Rollback (versiyaga qaytish)
"""Rollback: versiyalar tarixi va muammoda oldingi versiyaga qaytish."""
class DeploymentTarix:
def __init__(self) -> None:
self.versiyalar: list = []
self.joriy: str | None = None
def deploy(self, versiya: str) -> str:
self.versiyalar.append(versiya)
self.joriy = versiya
return f"Deploy: {versiya} (revision {len(self.versiyalar)})"
def rollback(self) -> str:
if len(self.versiyalar) < 2:
return "Rollback uchun oldingi versiya yo'q"
oldingi = self.versiyalar[-2]
self.versiyalar.append(oldingi) # rollback ham yangi revision
self.joriy = oldingi
return f"Rollback: {oldingi} ga qaytdi"
def main() -> None:
deploy = DeploymentTarix()
print("=== 1. Versiyalarni chiqarish ===")
print(f" {deploy.deploy('v1.0')}")
print(f" {deploy.deploy('v1.1')}")
print(f" {deploy.deploy('v1.2')}")
print("\n=== 2. Joriy versiya ===")
print(f" {deploy.joriy}")
print("\n=== 3. v1.2 buzuq — rollback ===")
print(f" {deploy.rollback()}")
print(f" joriy: {deploy.joriy}")
print("\n=== 4. Versiyalar tarixi ===")
print(f" {deploy.versiyalar}")
print(" muammoda bir buyruqda qaytish (xavfsizlik)")
print(" ⭐ Rollback — muammoda tez qaytish")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Versiyalarni chiqarish ===
Deploy: v1.0 (revision 1)
Deploy: v1.1 (revision 2)
Deploy: v1.2 (revision 3)
=== 2. Joriy versiya ===
v1.2
=== 3. v1.2 buzuq — rollback ===
Rollback: v1.1 ga qaytdi
joriy: v1.1
=== 4. Versiyalar tarixi ===
['v1.0', 'v1.1', 'v1.2', 'v1.1']
muammoda bir buyruqda qaytish (xavfsizlik)
⭐ Rollback — muammoda tez qaytishNima ko'rsatdi: 2.5-bo'lim.
Misol 4 — Avtomatik miqyoslash (HPA)
"""HPA: yukka (CPU) qarab podlarni avtomatik miqyoslash."""
def hpa_hisobla(joriy_podlar: int, cpu_foiz: float,
maqsad_cpu: float = 50.0, min_pod: int = 2, max_pod: int = 10) -> dict:
# Kubernetes HPA formulasi (soddalashtirilgan)
kerakli = joriy_podlar * (cpu_foiz / maqsad_cpu)
yangi = max(min_pod, min(max_pod, round(kerakli)))
return {"joriy": joriy_podlar, "cpu": cpu_foiz, "yangi": yangi}
def main() -> None:
print("=== 1. Normal yuk (CPU 50%) ===")
r = hpa_hisobla(joriy_podlar=3, cpu_foiz=50.0)
print(f" CPU {r['cpu']}% → {r['joriy']} pod (o'zgarishsiz: {r['yangi']})")
print("\n=== 2. Yuqori yuk (CPU 90%) ===")
r = hpa_hisobla(joriy_podlar=3, cpu_foiz=90.0)
print(f" CPU {r['cpu']}% → {r['joriy']} pod dan {r['yangi']} pod ga (ko'paytirish)")
print("\n=== 3. Past yuk (CPU 20%) ===")
r = hpa_hisobla(joriy_podlar=6, cpu_foiz=20.0)
print(f" CPU {r['cpu']}% → {r['joriy']} pod dan {r['yangi']} pod ga (kamaytirish)")
print("\n=== 4. Chegaralar (min 2, max 10) ===")
r = hpa_hisobla(joriy_podlar=8, cpu_foiz=200.0)
print(f" juda yuqori yuk → {r['yangi']} pod (max 10 chegarada)")
print(" yukka moslashadi (resurs tejaladi/unumdorlik)")
print(" ⭐ HPA — avtomatik miqyoslash (yukka qarab)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Normal yuk (CPU 50%) ===
CPU 50.0% → 3 pod (o'zgarishsiz: 3)
=== 2. Yuqori yuk (CPU 90%) ===
CPU 90.0% → 3 pod dan 5 pod ga (ko'paytirish)
=== 3. Past yuk (CPU 20%) ===
CPU 20.0% → 6 pod dan 2 pod ga (kamaytirish)
=== 4. Chegaralar (min 2, max 10) ===
juda yuqori yuk → 10 pod (max 10 chegarada)
yukka moslashadi (resurs tejaladi/unumdorlik)
⭐ HPA — avtomatik miqyoslash (yukka qarab)Nima ko'rsatdi: 2.6-bo'lim.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Qo'lda buyruq bilan deploy" | Manifest (deklarativ) |
| "kubectl apply har safar yangi" | Idempotent (istalgan holat) |
| "Yangilash = to'xtatib qayta" | Rolling update (uzilishsiz) |
| "Rollback murakkab" | Bir buyruq (rollout undo) |
| "Miqyos qo'lda" | HPA (avtomatik) |
| "Sozlama imageda" | ConfigMap/Secret (ajratilgan) |
| "Secret shifrlangan" | base64 (kodlangan — qo'shimcha kerak) |
| "Deploy — qo'rqinchli" | Nazorat (rolling, rollback) |
6. Keng tarqalgan xatolar va yechimlari
1. Imperativ buyruqlar (manifestsiz)
kubectl run myapp --image=... # takrorlanmaydi # ⚠️
kubectl apply -f deployment.yaml # deklarativ # ✅2. Resurs chegarasiz podlar
containers: [{image: myapp}] # cheksiz (node to'ladi) # ⚠️
resources: {limits: {memory: 512Mi, cpu: 0.5}} # ✅3. Health check yo'q (rolling update buziladi)
# pod "ishlayapti" lekin javob bermaydi # ⚠️
readinessProbe: {httpGet: {path: /health}} # ✅4. Latest tag (rollback noaniq)
image: myapp:latest # qaysi versiya? rollback? # ⚠️
image: myapp:v1.2.3 # ✅5. Sirlarni ConfigMap'da
kind: ConfigMap
data: {DB_PASSWORD: secret} # sir ochiq! # ⚠️
kind: Secret # ✅6. Rollback tarixini saqlamaslik
# revisionHistoryLimit: 0 # tarix yo'q (rollback yo'q) # ⚠️
# standart (10 revision saqlanadi) # ✅7. Bir vaqtda barcha podni yangilash
maxUnavailable: 100% # hammasi birdan (uzilish) # ⚠️
maxUnavailable: 25% # bosqichma-bosqich # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 28.5-dars (o'tilgan): Kubernetes tushuncha — asos
- 28.8-dars: CD — avtomatik deploy (kubectl)
- 28.9-dars: Sirlar — Secret
- 29-qism: Miqyoslash — HPA
- 27.12-dars (o'tilgan): Chidamlilik — uzilishsiz
8. Eng yaxshi amaliyotlar
Manifest (deklarativ, git'da).
kubectl apply(idempotent).Resurs chegaralari (limits/requests).
Health check (readiness/liveness).
Rolling update (maxUnavailable — uzilishsiz).
Aniq tag (rollback uchun).
Secret (sirlar — ConfigMap emas).
Rollback tayyor (versiyalar tarixi).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # manifest nima?
2. # kubectl apply nima?
3. # apply idempotentmi?
4. # Deployment + Service qanday bog'liq?
5. # rolling update nima?
6. # rolling nega uzilishsiz?
7. # rollback nima?
8. # scaling nima?
9. # HPA nima?
10. # ConfigMap nima?
11. # Secret nima?
12. # deploy deklarativmi?Javoblar
- Resursni ta'riflaydigan YAML (istalgan holat)
- Manifestni klasterga qo'llash
- Ha (istalgan holat — qayta xavfsiz)
- Yorliq (label) orqali (selector)
- Yangi versiyani bosqichma-bosqich
- Doim ishlaydigan podlar bor
- Oldingi versiyaga qaytish
- Nusxalarni ko'paytirish/kamaytirish
- Avtomatik miqyoslash (yukka qarab)
- Oddiy sozlamalar (koddan ajratilgan)
- Maxfiy ma'lumot (parol, kalit)
- Ha (manifest — istalgan holat)
Vazifa 2: Xatolarni tuzating
1. kubectl run myapp # imperativ
2. containers: [myapp] # resurs cheksiz
3. image: myapp:latest
4. ConfigMap: {DB_PASSWORD} # sir
5. maxUnavailable: 100%Javoblar
1. kubectl apply -f deployment.yaml
2. resources: {limits: {...}}
3. image: myapp:v1.2.3
4. kind: Secret
5. maxUnavailable: 25%Vazifa 3: Manifest
Yozing:
- Deployment
- replicas
- Service
- Yorliq
Vazifa 4: Rolling update
Modellang:
- Eski podlar
- Birma-bir
- Ishlaydigan
- Uzilishsiz
Vazifa 5: Rollback
Modellang:
- Versiyalar
- Joriy
- Muammo
- Qaytish
Vazifa 6: HPA
Modellang:
- Yuk
- Formula
- Miqyos
- Chegara
Vazifa 7: O'ylash
Kubernetes deploy'ning "rolling update + rollback" kombinatsiyasi deploy'ni qo'rqinchli hodisadan odatiy, xavfsiz amalga aylantiradi. Nima uchun "deploy'ni xavfsiz qilish" (uzilishsiz, qaytariladigan) dasturiy ta'minot rivojlanishida shunchalik muhim (bu tezlikka ta'sir qiladi), va nega "tez-tez, kichik, xavfsiz deploy" "kamdan, katta, qo'rqinchli deploy" dan yaxshiroq?
Javob
Qisqa javob: "Deploy'ni xavfsiz qilish" muhim, chunki bu tezlikka (rivojlanish tezligi) bevosita ta'sir qiladi: agar deploy qo'rqinchli (uzilish xavfi, orqaga qaytib bo'lmaydi) bo'lsa — jamoa kamdan deploy qiladi (qo'rquv — "ishlayapti, tegmaymiz"), o'zgarishlar to'planadi (katta, kam deploy), har deploy kattaroq xavf (ko'p o'zgarish birga — nima buzildi noaniq); agar deploy xavfsiz (uzilishsiz, qaytariladigan) bo'lsa — jamoa tez-tez deploy qiladi (qo'rquvsiz), o'zgarishlar kichik (har deploy — oz o'zgarish), muammo oson topiladi (kichik o'zgarish — sabab aniq), tez tuzatiladi (rollback yoki keyingi kichik deploy). Bu fikrlash o'zgarishi: deploy — nodir, katta hodisa emas (release kuni, qo'rquv), balki odatiy, arzon amal (kuniga bir necha marta). "Tez-tez, kichik, xavfsiz" yaxshiroq, chunki: kichik o'zgarish — kam xavf (oz narsa buzilishi mumkin), oson tushunish (bir o'zgarish), oson tuzatish (sabab aniq); tez-tez — tez qayta aloqa (foydalanuvchi darrov ko'radi, muammo darrov chiqadi — kech emas), tez qiymat yetkazish; xavfsiz (rolling, rollback) — qo'rquvsiz (xato — qaytariladigan, halokat emas). "Kamdan, katta" yomonroq: katta o'zgarish — ko'p xavf (ko'p narsa buzilishi mumkin), qiyin tushunish (ko'p o'zgarish birga — nima muammo?), qiyin tuzatish; kamdan — sekin qayta aloqa (muammo kech chiqadi, katta bo'lib), sekin qiymat. Bu DevOps/CI-CD falsafasining yuragi (28.7-8): deploy'ni avtomatik, tez, xavfsiz qilish → tez-tez deploy → tez rivojlanish. Kubernetes (rolling, rollback) buni texnik ta'minlaydi. Muhandislik saboqlari: deploy xavfsizligi = rivojlanish tezligi (qo'rquv sekinlashtiradi); tez-tez kichik deploy — kam xavf, tez qayta aloqa; xato qaytariladigan bo'lsa — qo'rquvsiz (tez harakat); "release" — hodisadan odatga aylanishi kerak.
1. Nega xavfsizlik tezlikka ta'sir qiladi
Qo'rqinchli deploy → kamdan deploy (qo'rquv) → katta o'zgarish (to'planadi) → ko'p xavf. Xavfsiz deploy → tez-tez → kichik → kam xavf.
2. Kichik vs katta deploy
| Deploy | Xavf | Tuzatish |
|---|---|---|
| Kichik, tez-tez | Kam (oz o'zgarish) | Oson (sabab aniq) |
| Katta, kamdan | Ko'p (ko'p o'zgarish) | Qiyin (nima?) |
3. Nega tez-tez yaxshiroq
Kichik — kam xavf, oson tushunish/tuzatish. Tez-tez — tez qayta aloqa (muammo darrov). Xavfsiz — qo'rquvsiz.
4. Fikrlash o'zgarishi
Deploy — nodir hodisa (qo'rquv) emas, odatiy amal (arzon, tez-tez). "Release" — odatga aylanadi.
5. Muhandislik saboqlari
- Deploy xavfsizligi = rivojlanish tezligi
- Tez-tez kichik — kam xavf, tez qayta aloqa
- Xato qaytariladigan → qo'rquvsiz
- Release — hodisadan odatga
6. Xulosa
- Qo'rqinchli deploy → kamdan → katta → xavf
- Xavfsiz deploy → tez-tez → kichik → kam xavf
- Kichik, tez-tez, xavfsiz — yaxshiroq
- Deploy xavfsizligi — rivojlanish tezligi (DevOps)
Nimani mustahkamlaydi: 2.4, 2.8-bo'limlar.
Xulosa
Bu darsda Kubernetes deploy jarayonini o'rgandik.
Eng muhim uch fikr:
Manifest va kubectl. Manifest — Kubernetes resursini ta'riflaydigan YAML fayl (istalgan holat):
apiVersion,kind(Deployment, Service),metadata,spec; deklarativ, "infratuzilma kodi" (git'da, versiyalangan).kubectl— klasterni boshqarish buyruq vositasi:apply -f(manifestni qo'llash — idempotent, istalgan holat),get(ro'yxat),describe/logs(kuzatuv),scale,rollout,delete. Deployment + Service birga: Deployment podlarni yaratadi, Service ularga barqaror kirish beradi — yorliq (label) orqali bog'lanadi (selector).Rolling update, rollback, scaling. Rolling update — yangi versiyani bosqichma-bosqich, uzilishsiz chiqarish (eski podlar birma-bir yangiga — doim ishlaydigan podlar bor);
maxSurge/maxUnavailablesozlaydi. Rollback — muammoda oldingi versiyaga qaytish (kubectl rollout undo— bir buyruq, versiyalar tarixi saqlanadi); deploy xavfsizligi (qaytariladigan qaror). Scaling — nusxalarni ko'paytirish: qo'lda (kubectl scale --replicas) yoki avtomatik (HPA — yukka/CPU'ga qarab podlar ko'payadi/kamayadi).ConfigMap/Secret va xavfsiz deploy. ConfigMap (oddiy sozlamalar) va Secret (maxfiy — parol, kalit) — sozlamalarni koddan/imagedan ajratadi (bir image, turli muhit turli config; 12-faktor ilova — 28.9); Secret base64 (kodlangan — qo'shimcha shifrlash kerak). Kubernetes deploy deklarativ (manifest — istalgan holat) va nazorat qilinadigan (rolling, rollback, scaling) — deploy'ni xavfsiz va takrorlanadigan qiladi. "Rolling + rollback" deploy'ni qo'rqinchli hodisadan odatiy, xavfsiz amalga aylantiradi — bu rivojlanish tezligiga bevosita ta'sir qiladi ("tez-tez, kichik, xavfsiz deploy" — kam xavf, tez qayta aloqa; "kamdan, katta, qo'rqinchli" — ko'p xavf, sekin). Bu DevOps/CI-CD (28.7-8) falsafasining yuragi. Deploy — istalgan holatni xavfsiz o'rnatish.
Keyingi darsda CI (uzluksiz integratsiya) ni o'rganamiz: har kod o'zgarishida testlarni avtomatik ishga tushirish, kodni birlashtirish va sifatni kafolatlash — GitHub Actions kabi vositalar bilan.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!