Sebarkan ke Kubernetes

Layanan Azure DevOps | Azure DevOps Server 2022

Anda dapat menggunakan Azure Pipelines untuk menyebarkan ke kluster Azure Kubernetes Service dan Kubernetes yang ditawarkan oleh penyedia cloud lainnya. Azure Pipelines memiliki dua tugas untuk bekerja dengan Kubernetes:

  • Tugas KubernetesManifest: membuat dan menyebarkan manifes ke kluster Kubernetes dengan Helm, Kompose, atau Kustomisasi
  • Tugas Kubectl: menyebarkan, mengonfigurasi, dan memperbarui kluster Kubernetes di Azure Container Service dengan menjalankan perintah kubectl

Jika Anda menggunakan Azure Kubernetes Service dengan salah satu tugas, jenis koneksi layanan Azure Resource Manager adalah cara terbaik untuk terhubung ke kluster privat, atau kluster yang menonaktifkan akun lokal.

Untuk menambahkan keterlacakan penyebaran, gunakan sumber daya Kubernetes di lingkungan dengan tugas Kubernetes.

Untuk mulai menggunakan Azure Pipelines dan layanan Azure Kubernetes, lihat Membangun dan menyebarkan ke Azure Kubernetes Service dengan Azure Pipelines. Untuk mulai menggunakan Azure Pipelines, Kubernetes, dan strategi penyebaran kenari secara khusus, lihat Menggunakan strategi penyebaran kenari untuk penyebaran Kubernetes dengan Azure Pipelines.

Tugas KubernetesManifest

Tugas KubernetesManifest memeriksa stabilitas objek sebelum menandai tugas sebagai berhasil/gagal. Tugas ini juga dapat melakukan substitusi artefak, menambahkan anotasi terkait keterlacakan alur, menyederhanakan pembuatan dan referensi imagePullSecrets, membuat manifes, dan membantu dalam peluncuran strategi penyebaran.

Catatan

Meskipun dukungan alur berbasis YAML memicu pada satu repositori Git, jika Anda memerlukan pemicu untuk file manifes yang disimpan di repositori Git lain atau jika pemicu diperlukan untuk Azure Container Registry atau Docker Hub, Anda harus menggunakan alur klasik alih-alih alur berbasis YAML.

Anda dapat menggunakan tindakan bake dalam tugas manifes Kubernetes untuk membuat templat ke dalam file manifes Kubernetes. Tindakan ini memungkinkan Anda menggunakan alat seperti Helm, Kustomize, dan Kompose. Tindakan bake dari tugas manifes Kubernetes memberikan visibilitas ke dalam transformasi antara templat input dan file manifes akhir yang digunakan dalam penyebaran. Anda dapat menggunakan file manifes yang dipanggang di hilir (dalam tugas) sebagai input untuk tindakan penyebaran tugas manifes Kubernetes.

Anda dapat menargetkan sumber daya Kubernetes yang merupakan bagian dari lingkungan dengan pekerjaan penyebaran. Menggunakan lingkungan dan penyebaran sumber daya memberi Anda akses ke keterlacakan alur yang lebih baik sehingga Anda dapat mendiagnosis masalah penyebaran. Anda juga dapat menyebarkan ke kluster Kubernetes dengan pekerjaan reguler tanpa fitur kesehatan yang sama.

Kode YAML berikut adalah contoh pembuatan file manifes dari bagan Helm

steps:
- task: KubernetesManifest@0
  name: bake
  displayName: Bake K8s manifests from Helm chart
  inputs:
    action: bake
    helmChart: charts/sample
    overrides: 'image.repository:nginx'

- task: KubernetesManifest@0
  displayName: Deploy K8s manifests
  inputs:
    kubernetesServiceConnection: someK8sSC
    namespace: default
    manifests: $(bake.manifestsBundle)
    containers: |
      nginx: 1.7.9

Tugas Kubectl

Sebagai alternatif dari tugas KubernetesManifest KubernetesManifest, Anda dapat menggunakan tugas Kubectl untuk menyebarkan, mengonfigurasi, dan memperbarui kluster Kubernetes di Azure Container Service dengan menjalankan perintah kubectl.

Contoh berikut menunjukkan bagaimana koneksi layanan digunakan untuk merujuk ke kluster Kubernetes.

- task: Kubernetes@1
  displayName: kubectl apply
  inputs:
    connectionType: Kubernetes Service Connection
    kubernetesServiceEndpoint: Contoso

Tugas skrip

Anda juga dapat menggunakan kubectl dengan tugas skrip.

Contoh berikut menggunakan skrip untuk menjalankan kubectl.

- script: |
    kubectl apply -f manifest.yml

Strategi penyebaran Kubernetes

Tugas manifes Kubernetes saat ini mendukung strategi penyebaran kenari. Gunakan strategi penyebaran kenari untuk menyebarkan sebagian perubahan baru sehingga perubahan baru berdampingan dengan penyebaran saat ini sebelum peluncuran penuh.

Untuk informasi selengkapnya tentang penyebaran kenari dengan alur, lihat Menggunakan strategi penyebaran kenari untuk penyebaran Kubernetes dengan Azure Pipelines.

Penyebaran Kubernetes multicloud

Kubernetes berjalan dengan cara yang sama pada semua penyedia cloud. Azure Pipelines dapat digunakan untuk menyebarkan ke Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), Amazon Elastic Kubernetes Service (EKS), atau kluster dari penyedia cloud lainnya.

Untuk menyiapkan penyebaran multicloud, buat lingkungan lalu tambahkan sumber daya Kubernetes yang terkait dengan namespace kluster Kubernetes.

Pendekatan penyedia generik berdasarkan akun layanan yang ada berfungsi dengan kluster dari penyedia cloud apa pun, termasuk Azure. Manfaat menggunakan opsi Azure Kubernetes Service adalah membuat objek ServiceAccount dan RoleBinding baru (alih-alih menggunakan kembali ServiceAccount yang ada) sehingga objek RoleBinding yang baru dibuat dapat membatasi operasi ServiceAccount ke namespace yang dipilih saja.

Saat Anda menggunakan pendekatan penyedia generik, pastikan bahwa RoleBinding ada, yang memberikan izin di editClusterRole ke akun layanan yang diinginkan. Anda perlu memberikan izin ke akun layanan yang tepat sehingga akun layanan dapat digunakan oleh Azure Pipelines untuk membuat objek di namespace yang dipilih.

Penyebaran paralel ke beberapa cloud

Contoh berikut menunjukkan cara melakukan penyebaran paralel ke kluster di beberapa cloud. Dalam contoh ini, ada penyebaran ke kluster AKS, GKE, EKS, dan OpenShift. Keempat namespace ini dikaitkan dengan sumber daya Kubernetes di contoso bawah lingkungan.

trigger:
- main

jobs:
- deployment:
  displayName: Deploy to AKS
  pool:
    vmImage: ubuntu-latest
  environment: contoso.aksnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: aksnamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to GKE
  pool:
    vmImage: ubuntu-latest
  environment: contoso.gkenamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: gkenamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to EKS
  pool:
    vmImage: ubuntu-latest
  environment: contoso.eksnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: eksnamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to OpenShift
  pool:
    vmImage: ubuntu-latest
  environment: contoso.openshiftnamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: openshiftnamespace
            manifests: manifests/*
- deployment:
  displayName: Deploy to DigitalOcean
  pool:
    vmImage: ubuntu-latest
  environment: contoso.digitaloceannamespace
  strategy:
    runOnce:
      deploy:
        steps:
        - checkout: self
        - task: KubernetesManifest@0
          displayName: Deploy to Kubernetes cluster
          inputs:
            action: deploy
            kubernetesServiceConnection: serviceConnection #replace with your service connection
            namespace: digitaloceannamespace
            manifests: manifests/*