GNU/Linux >> Belajar Linux >  >> Linux

Cara Mengonfigurasi Kubernetes untuk Pembaruan Bergulir

Pendahuluan

Pembaruan berkelanjutan adalah bagian penting dari siklus hidup aplikasi modern, dengan pengguna terus-menerus mengharapkan fitur baru dan nol waktu henti. Sementara Kubernetes menggunakan Pengontrol Replikasi untuk mengaktifkan fungsi ini di masa lalu, versi yang lebih baru merekomendasikan penggunaan Deployment.

Tutorial ini menunjukkan cara melakukan pembaruan bergulir menggunakan Kubernetes Deployments. Metode ini memungkinkan Anda memperbarui aplikasi dengan cepat dan mencapai waktu henti nol sambil memastikan dukungan rollback.

Prasyarat

  • Kluster Kubernetes
  • Akses ke jendela terminal
  • Alat baris perintah kubectl

Aktifkan Pembaruan Bergulir

Kubernetes Deployments bertindak sebagai pembungkus di sekitar ReplicaSet, yang merupakan pengontrol Kubernetes yang bertanggung jawab atas manajemen pod. Deployment menyediakan fungsionalitas tambahan untuk ReplicaSet - mereka melakukan health check, rolling update, dan rollback.

1. Pertama, buat yaml file dengan spesifikasi penerapan menggunakan editor teks, seperti Nano:

nano nginx-test.yaml

Contoh file di bawah ini berisi deklarasi dasar yang diperlukan untuk Deployment Kubernetes:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:

    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2

        ports:
        - containerPort: 80

2. Simpan dan keluar dari file.

3. Kemudian, buat penerapan menggunakan kubectl create perintah dan yaml file yang baru saja Anda buat:

kubectl create -f nginx-test.yaml

4. Periksa penerapan:

kubectl get deployment

Keluaran harus mengonfirmasi bahwa penerapan sudah siap:

4. Selanjutnya cek ReplicaSets dengan menjalankan perintah:

kubectl get rs

File sampel menentukan empat replika, yang semuanya ditampilkan sebagai siap:

5. Terakhir, periksa apakah pod sudah aktif:

kubectl get pod

Output menunjukkan pod sebagai siap dan berjalan:

Pastikan Nol Waktu Henti

Untuk mengonfigurasi pembaruan bergulir tanpa waktu henti, Anda perlu menentukan strategi pembaruan.

1. Tambahkan deklarasi berikut ke penerapan yaml file di bawah spec kategori:

minReadySeconds: 5
strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1
    maxUnavailable: 1
  • minReadySeconds memberi tahu Kubernetes berapa lama ia harus menunggu hingga ia membuat pod berikutnya. Properti ini memastikan bahwa semua pod aplikasi dalam keadaan siap selama pembaruan.
  • maxSurge menentukan jumlah maksimum (atau persentase) pod di atas jumlah replika yang ditentukan. Pada contoh di atas, jumlah maksimum pod adalah 5 sejak 4 replika ditentukan dalam yaml berkas.
  • maxUnavailable mendeklarasikan jumlah (atau persentase) maksimum dari pod yang tidak tersedia selama pembaruan. Jika maxSurge disetel ke 0 , bidang ini tidak boleh 0 .

Menambahkan spesifikasi di atas ke penerapan yaml file cukup untuk mulai melakukan pembaruan bergulir Kubernetes. Namun, itu tidak menjamin waktu henti nol. Kubernetes tidak dapat mengetahui kapan pod baru siap - ia akan menghapus pod lama segera setelah pod baru dibuat. Masalah ini menyebabkan waktu henti hingga pod baru dapat menerima permintaan.

Untuk memperbaiki masalah ini, Kubernetes menampilkan konsep Readiness Probe . Probe memeriksa status pod dan memungkinkan pembaruan bergulir untuk dilanjutkan hanya ketika semua kontainer dalam pod sudah siap. Pod dianggap siap jika pemeriksaan kesiapan berhasil dan setelah waktu yang ditentukan dalam minReadySeconds telah berlalu.

2. Untuk menyiapkan Probe Kesiapan, tambahkan baris berikut ke spec.template.spec kategori dalam file penerapan:

readinessProbe:
  httpGet:
    path: /
    port: 8080
    initialDelaySeconds: 5
    periodSeconds: 5
    successThreshold: 1
  • initialDelaySeconds menentukan berapa lama probe harus menunggu untuk memulai setelah container dimulai.
  • periodSeconds adalah waktu antara dua probe. Standarnya adalah 10 detik, sedangkan nilai minimalnya adalah 1 kedua.
  • successThreshold adalah jumlah minimum pemeriksaan yang berhasil berturut-turut setelah yang gagal agar seluruh proses dianggap berhasil. Nilai default dan minimal keduanya 1 .

Seluruh file penerapan yang dikonfigurasi dengan benar untuk pembaruan bergulir akan terlihat seperti ini:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 4
  selector:

    matchLabels:
      app: nginx
  minReadySeconds: 5
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.0

        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /
            port: 8080
            initialDelaySeconds: 5
            periodSeconds: 5
            successThreshold: 1
        

3. Simpan file dan keluar.

4. Kemudian, gunakan kubectl apply untuk menerapkan perubahan:

kubectl apply -f nginx-text.yaml --record

--record flag akan memiliki tujuan dalam proses rollback.

Keluaran menunjukkan bahwa penerapan telah berhasil dikonfigurasi.

Lakukan Pembaruan Bergulir

Ada tiga cara untuk melakukan pembaruan bergulir.

Misalnya, untuk mengubah gambar aplikasi:

Opsi 1:Anda dapat menggunakan kubectl set untuk melakukan tindakan pada baris perintah:

kubectl set image deployment nginx-deployment nginx=nginx:1.14.2 --record

Opsi 2:Atau, ubah versi gambar di spec.templates.spec.containers bagian yaml mengajukan. Kemudian, gunakan kubectl replace untuk melakukan pembaruan:

kubectl replace -f nginx-test.yaml

Opsi 3:Anda juga dapat menggunakan kubectl edit untuk mengedit penerapan secara langsung:

kubectl edit deployment nginx-deployment --record

Buat perubahan yang diperlukan di editor yang terbuka:

Perubahan diterapkan saat Anda menutup editor.

Periksa Status Peluncuran

Periksa status peluncuran penerapan menggunakan sintaks berikut:

kubectl rollout status deployment nginx-deployment

Output mengonfirmasi peluncuran yang berhasil:

Jeda dan Lanjutkan Pembaruan Bergulir

Jeda dan lanjutkan pembaruan bergulir dengan masing-masing kubectl rollout perintah.

Untuk menjeda pembaruan, jalankan:

kubectl rollout pause deployment nginx-deployment

Untuk melanjutkan pembaruan, jalankan:

kubectl rollout resume deployment nginx-deployment

Jadwalkan Pod untuk Deployment

Gunakan properti afinitas dan anti-afinitas untuk mengontrol node mana yang Kubernetes menjadwalkan pod tertentu dalam penerapan Anda.

Afinitas Pod

Ada dua jenis afinitas saat ini tersedia di Kubernetes:

  • requiredDuringSchedulingIgnoredDuringExecution memberitahu Kubernetes untuk hanya menjalankan pod pada node yang memenuhi kriteria tertentu, seperti jenis prosesor tertentu.
  • preferredDuringSchedulingIgnoredDuringExecution memungkinkan pod dijalankan di tempat lain, jika dan hanya jika tidak ada node yang memenuhi kriteria yang diberikan.

Properti ini tercantum dalam PodSpec mengajukan. Misalnya, sebuah pod dapat ditentukan sebagai berikut:

apiVersion: v1
kind: Pod
metadata:
  name: affinity-test
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/test-name
            operator: In
            values:
            - test1
            - test2
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: example-node-label-key
            operator: In
            values:
            - example-node-label-value
  containers:
  - name: affinity-test
    image: k8s.gcr.io/pause:2.0

File di atas memberi tahu Kubernetes untuk menjalankan pod hanya pada node dengan label yang kuncinya adalah kubernetes.io/test-name dan yang nilainya adalah test1 atau test2 . Selanjutnya, Kubernetes akan memilih node yang kuncinya adalah example-node-label-key , dengan example-node-label-value nilai.

Anti-Afinitas Pod

Anti-afinitas pod berguna jika Anda tidak ingin semua pod dijalankan pada node yang sama. Ini berfungsi mirip dengan afinitas, dengan dua jenis yang sama tersedia - requiredDuringSchedulingIgnoredDuringExecution dan preferredDuringSchedulingIgnoredDuringExecution .

Contoh berikut menetapkan aturan anti-afinitas yang memberi tahu Kubernetes untuk menghindari penjadwalan pod aplikasi "test" ke node yang sudah memiliki pod "test":

podAntiAffinity:
  preferredDuringSchedulingIgnoredDuringExecution:
  - weight: 100
    podAffinityTerm:
      labelSelector:
        matchExpressions:
        - key: app
          operator: In
          values: 
          - test
      topologyKey: Kubernetes.io/hostname

Perubahan Kembalikan

Jika ada yang salah dengan proses pembaruan, Anda dapat mengembalikan perubahan dan kembali ke versi aplikasi sebelumnya. Untuk melakukannya, gunakan kubectl rollout berikut ini perintah:

kubectl rollout history deployment nginx-deployment

Output mencantumkan revisi yang tersedia, dibuat dengan menambahkan --record tandai saat melakukan pembaruan:

Pilih revisi yang Anda inginkan dan ketik perintah berikut untuk mengembalikan perubahan:

kubectl rollout undo deployment nginx-deployment --to-revision=1

Perintah di atas memutar kembali ke revisi 1 dan menghasilkan output berikut:


Linux
  1. Bagaimana Mengkonfigurasi virt-manager untuk Dukungan Virtualisasi Bersarang?

  2. Cara Menghapus Deployment Kubernetes [Tips Cepat K8s]

  3. Cara mengkonfigurasi nama domain asli untuk alamat pengirim

  1. Bagaimana Mengkonfigurasi Beberapa Lingkungan Penerapan Untuk Juju??

  2. Cara Menginstal dan Mengonfigurasi Monit di Linux untuk Pemantauan Proses

  3. UNIX / Linux:Cara Menginstal dan Mengonfigurasi mod_perl untuk Apache 2

  1. Cara mengkonfigurasi Openbox untuk desktop Linux Anda

  2. Bagaimana cara mengkonfigurasi postgresql untuk pertama kalinya?

  3. Bagaimana cara mengkonfigurasi Qt untuk kompilasi silang dari target Linux ke Windows?