IlmHamroh
Python kursi/Infratuzilma6/14-dars18 daqiqa
Mundarija (22)

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:

yaml
# 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:

bash
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:

yaml
# 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:

bash
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:

bash
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:

yaml
# 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 ishlatiladi

ConfigMap 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

yaml
# 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}]
bash
# 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 / rollback

Kubernetes 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

python
"""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:

text
=== 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)

python
"""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:

text
=== 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 yangilash

Nima ko'rsatdi: 2.4-bo'lim.

Misol 3 — Rollback (versiyaga qaytish)

python
"""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:

text
=== 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 qaytish

Nima ko'rsatdi: 2.5-bo'lim.

Misol 4 — Avtomatik miqyoslash (HPA)

python
"""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:

text
=== 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)

bash
kubectl run myapp --image=...   # takrorlanmaydi     # ⚠️
kubectl apply -f deployment.yaml   # deklarativ       # ✅

2. Resurs chegarasiz podlar

yaml
containers: [{image: myapp}]   # cheksiz (node to'ladi)  # ⚠️
resources: {limits: {memory: 512Mi, cpu: 0.5}}          # ✅

3. Health check yo'q (rolling update buziladi)

yaml
# pod "ishlayapti" lekin javob bermaydi                  # ⚠️
readinessProbe: {httpGet: {path: /health}}              # ✅

4. Latest tag (rollback noaniq)

yaml
image: myapp:latest   # qaysi versiya? rollback?        # ⚠️
image: myapp:v1.2.3                                      # ✅

5. Sirlarni ConfigMap'da

yaml
kind: ConfigMap
data: {DB_PASSWORD: secret}   # sir ochiq!               # ⚠️
kind: Secret                                              # ✅

6. Rollback tarixini saqlamaslik

yaml
# revisionHistoryLimit: 0   # tarix yo'q (rollback yo'q)  # ⚠️
# standart (10 revision saqlanadi)                        # ✅

7. Bir vaqtda barcha podni yangilash

yaml
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

  1. Manifest (deklarativ, git'da).

  2. kubectl apply (idempotent).

  3. Resurs chegaralari (limits/requests).

  4. Health check (readiness/liveness).

  5. Rolling update (maxUnavailable — uzilishsiz).

  6. Aniq tag (rollback uchun).

  7. Secret (sirlar — ConfigMap emas).

  8. Rollback tayyor (versiyalar tarixi).


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
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
  1. Resursni ta'riflaydigan YAML (istalgan holat)
  2. Manifestni klasterga qo'llash
  3. Ha (istalgan holat — qayta xavfsiz)
  4. Yorliq (label) orqali (selector)
  5. Yangi versiyani bosqichma-bosqich
  6. Doim ishlaydigan podlar bor
  7. Oldingi versiyaga qaytish
  8. Nusxalarni ko'paytirish/kamaytirish
  9. Avtomatik miqyoslash (yukka qarab)
  10. Oddiy sozlamalar (koddan ajratilgan)
  11. Maxfiy ma'lumot (parol, kalit)
  12. Ha (manifest — istalgan holat)

Vazifa 2: Xatolarni tuzating

yaml
1.  kubectl run myapp   # imperativ

2.  containers: [myapp]   # resurs cheksiz

3.  image: myapp:latest

4.  ConfigMap: {DB_PASSWORD}   # sir

5.  maxUnavailable: 100%
Javoblar
yaml
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:

  1. Deployment
  2. replicas
  3. Service
  4. Yorliq

Vazifa 4: Rolling update

Modellang:

  1. Eski podlar
  2. Birma-bir
  3. Ishlaydigan
  4. Uzilishsiz

Vazifa 5: Rollback

Modellang:

  1. Versiyalar
  2. Joriy
  3. Muammo
  4. Qaytish

Vazifa 6: HPA

Modellang:

  1. Yuk
  2. Formula
  3. Miqyos
  4. 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

  1. Deploy xavfsizligi = rivojlanish tezligi
  2. Tez-tez kichik — kam xavf, tez qayta aloqa
  3. Xato qaytariladigan → qo'rquvsiz
  4. Release — hodisadan odatga

6. Xulosa

  1. Qo'rqinchli deploy → kamdan → katta → xavf
  2. Xavfsiz deploy → tez-tez → kichik → kam xavf
  3. Kichik, tez-tez, xavfsiz — yaxshiroq
  4. 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:

  1. 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).

  2. Rolling update, rollback, scaling. Rolling update — yangi versiyani bosqichma-bosqich, uzilishsiz chiqarish (eski podlar birma-bir yangiga — doim ishlaydigan podlar bor); maxSurge/maxUnavailable sozlaydi. 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).

  3. 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.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
28.6-dars: Kubernetes — deploy — IlmHamroh