Mengupgrade workload container untuk runtime yang lebih baik

Jika sudah memiliki beban kerja container yang dibuat menggunakan Migrate to Containers versi 1.7.x dan 1.8.x, Anda dapat mengonversinya untuk menggunakan pengelola layanan Linux yang disederhanakan. Dengan konversi ini, Anda dapat menjalankan container ini di cluster GKE Autopilot.

Untuk melakukan konversi, edit Dockerfile dan file deployment_spec.yaml yang dibuat saat Anda melakukan migrasi awal. Setelah diedit, Anda kemudian dapat men-deploy beban kerja container di cluster Autopilot.

Tentang mengonversi beban kerja container

Prosedur untuk mengonversi beban kerja yang ada bergantung pada apakah Anda mengonversi beban kerja stateless atau beban kerja stateful.

Beban kerja stateful adalah beban kerja yang mempertahankan atau menyimpan informasi status. Untuk workload stateful, Anda sering memasang volume tambahan menggunakan StatefulSet di spec.containers.volumeMounts. Pastikan untuk mempertahankan definisi volumeMounts sekaligus menghapusnya untuk /sys/fs/cgroup. Lihat Memasang Volume Eksternal untuk mengetahui informasi selengkapnya.

Proses umum untuk mengonversi beban kerja yang ada mengharuskan Anda mengedit:

  • Dockerfile

    • Tetapkan versi Migrate to Containers ke 1.15.0.
    • Masukkan dua perintah ADD untuk menyalin file logs.yaml ke image container.
    • Masukkan perintah RUN untuk utilitas servicemanager_generate_config.
  • deployment_spec.yaml file ke:

    • Hapus definisi hostPath dan volumeMounts untuk /sys/fs/cgroup.
    • Hapus definisi securityContext.
    • Hapus definisi readinessProbe.
    • Anda dapat membiarkan definisi mountPath dan configMap untuk logs-config, tetapi logging saat ini tidak berfungsi dengan pengelola layanan Linux yang disederhanakan.

Untuk proses konversi spesifik, lihat bagian di bawah:

Mengonversi workload stateless

Contoh berikut menunjukkan cara mengonversi beban kerja container stateless:

  1. Temukan direktori yang berisi artefak migrasi Anda yang sudah ada, termasuk file deployment_spec.yaml.

  2. Edit Dockerfile untuk menetapkan versi produk, menyalin file logs.yaml, dan menjalankan utilitas servicemanager_generate_config:

    ...
    # Set the product version to 1.15.0:
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    # Insert the ADD commands to copy the `logs.yaml` file to the container image:
    ADD logs.yaml /code/config/logs/logsArtifact.yaml
    ADD logs.yaml /code/config/logs/logs.yaml
    
    # Insert the RUN command for servicemanager_generate_config:
    RUN /servicemanager_generate_config build-all -o /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  3. Buka file deployment_spec.yaml di editor. Contoh:

    vi  deployment_spec.yaml
  4. Temukan bagian berikut dalam file dan hapus baris yang ditunjukkan:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      name: IMAGE_NAME
         …
        spec:
          containers:
          - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
            name: IMAGE_NAME
    # Delete the following lines:
            readinessProbe:
              exec:
                command:
                - /code/ready.sh
            resources: {}
            securityContext:
              privileged: true
            volumeMounts:
            - mountPath: /sys/fs/cgroup
              name: cgroups
            - mountPath: /code/config/logs
              name: logs-config
          volumes:
          - hostPath:
              path: /sys/fs/cgroup
              type: Directory
            name: cgroups
          - configMap:
              name: suitecrm-crddefault-logs
            name: logs-config
    # Stop the delete here.
  5. Tambahkan baris di bawah untuk menetapkan variabel lingkungan HC_V2K_SERVICE_MANAGER.

    spec:
      containers:
      - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
        name: IMAGE_NAME
    # Add the following lines:
        env:
          - name: HC_V2K_SERVICE_MANAGER
            value: "true"
  6. Simpan file.

  7. Pastikan cluster target memiliki akses baca ke registry image Docker seperti yang dijelaskan dalam Memastikan cluster target memiliki akses baca ke registry image Docker.

  8. Build image yang telah diupdate dan kirim ke Container Registry dengan tag versi yang telah diupdate, sehingga Anda memiliki cukup waktu hingga proses selesai. Dalam contoh berikut, gambar berada di direktori saat ini:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  9. Deploy container:

    kubectl apply -f deployment_spec.yaml

    Jika Anda menerapkan spesifikasi deployment ke cluster Autopilot tanpa perubahan yang diperlukan di deployment_spec.yaml, Anda akan melihat pesan error dalam bentuk:

    "Trying to run without root privileges is not possible. Did you try to use the new runtime? In that case please pass the environment variable HC_V2K_SERVICE_MANAGER=true to the pod"

  10. Melihat pod yang sedang di-deploy ke cluster.

    kubectl get pods

Mengonversi workload stateful

Contoh berikut menunjukkan cara mengonversi beban kerja container stateful:

  1. Temukan direktori yang berisi artefak migrasi Anda yang sudah ada, termasuk file deployment_spec.yaml.

  2. Edit Dockerfile untuk menetapkan versi produk dan menjalankan utilitas servicemanager_generate_config:

    ...
    # Set the product version to 1.15.0:
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    # Insert the ADD commands to copy the `logs.yaml` file to the container image:
    ADD logs.yaml /code/config/logs/logsArtifact.yaml
    ADD logs.yaml /code/config/logs/logs.yaml
    
    # Insert the RUN command for servicemanager_generate_config:
    RUN /servicemanager_generate_config build-all -o /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  3. Buka file deployment_spec.yaml di editor. Contoh:

    vi  deployment_spec.yaml
  4. Temukan tiga bagian berikut dalam file dan hapus baris yang ditunjukkan:

    apiVersion: apps/v1
    kind: StatefulSet
    ...
    spec:
      containers:
      - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
        name: IMAGE_NAME
    # Delete the following lines:
        readinessProbe:
          exec:
            command:
            - /code/ready.sh
        resources: {}
        securityContext:
          privileged: true
    # Stop the delete here.
        volumeMounts:
    # Delete the following lines:
        - mountPath: /sys/fs/cgroup
          name: cgroups
    # Stop the delete here.
        - mountPath: /opt/suitecrm-7.10.5-0/mysql/data
          name: data-pvc-0-1b12-d0af-48b3-9f5e-6c25fa5
          subPath: opt/suitecrm-7.10.5-0/mysql/data
      volumes:
    # Delete the following lines:
      - hostPath:
          path: /sys/fs/cgroup
          type: Directory
        name: cgroups
    # Stop the delete here.
      - name: data-pvc-2-d0af-48b3-9f5e09c25fa5
        persistentVolumeClaim:
          claimName: data-pvc-0-1a2-d0af-48b3-9f5e-605fa5

    Perhatikan bahwa Anda hanya menghapus definisi volumeMounts dan volumes untuk cgroups dan membiarkan definisi yang tersisa.

  5. Tambahkan baris berikut untuk menetapkan variabel lingkungan HC_V2K_SERVICE_MANAGER:

    spec:
      containers:
      - image: gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL
        name: IMAGE_NAME
    # Add the following lines:
        env:
        - name: HC_V2K_SERVICE_MANAGER
          value: "true"
    # Stop the add here.
        volumeMounts:
        - mountPath: /opt/suitecrm-7.10.5-0/mysql/data
          name: data-pvc-0-1b12-d0af-48b3-9f5e-6c25fa5
          subPath: opt/suitecrm-7.10.5-0/mysql/data
      volumes:
      - name: data-pvc-2-d0af-48b3-9f5e09c25fa5
        persistentVolumeClaim:
          claimName: data-pvc-0-1a2-d0af-48b3-9f5e-605fa5
  6. Simpan file.

  7. Pastikan cluster target memiliki akses baca ke registry image Docker seperti yang dijelaskan dalam artikel Memastikan cluster target memiliki akses baca ke registry image Docker.

  8. Build image yang telah diupdate dan kirim ke Container Registry dengan tag versi yang telah diupdate, sehingga Anda memiliki cukup waktu hingga proses selesai. Dalam contoh berikut, gambar berada di direktori saat ini:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  9. Deploy container:

    kubectl apply -f deployment_spec.yaml

    Jika Anda menerapkan spesifikasi deployment ke cluster Autopilot tanpa perubahan yang diperlukan di deployment_spec.yaml, Anda akan melihat pesan error dalam formulir:

    "Trying to run without root privileges is not possible. Did you try to use the new runtime? In that case please pass the environment variable HC_V2K_SERVICE_MANAGER=true to the pod"

  10. Melihat pod yang sedang di-deploy ke cluster.

    kubectl get pods

Tugas pasca-konversi

Setelah mengonversi migrasi yang ada untuk menggunakan pengelola layanan Linux yang disederhanakan, Anda dapat mengubahnya menjadi:

  • Perbarui layanan yang digunakan oleh beban kerja yang dimigrasikan.
  • Tambahkan layanan baru.

Untuk kedua skenario tersebut, Anda harus mengedit Dockerfile, lalu mem-build ulang image container.

Memperbarui layanan

Di bagian ini, Anda akan mengedit Dockerfile untuk memperbarui file services-config.yaml di container berdasarkan perubahan yang dibuat di /etc/systemd pada beban kerja yang dimigrasikan.

Untuk memperbarui image container bagi perubahan pada layanan yang ada:

  1. Tambahkan perintah servicemanager_generate_config di Dockerfile:

    ...
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    
    # Use the update command for servicemanager_generate_config to update the configuration:
    RUN /servicemanager_generate_config update -u /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  2. Build image yang telah diupdate dan kirim ke Container Registry dengan tag versi yang telah diupdate, sehingga Anda memiliki cukup waktu hingga proses selesai. Dalam contoh berikut, gambar berada di direktori saat ini:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  3. Deploy image yang baru di-build:

    kubectl set image deployment/myWorkload my-app=gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL --record

Tambahkan layanan

Untuk menambahkan layanan ke image container:

  1. Tambahkan perintah servicemanager_generate_config di Dockerfile:

    ...
    FROM anthos-migrate.gcr.io/v2k-run-embedded:v1.15.0 as migrate-for-anthos-runtime
    
    ...
    
    ADD blocklist.yaml /.m4a/blocklist.yaml
    
    # This example adds the redis-server service.
    # Add the following lines to install redis-server.
    RUN apt-get update && apt-get -y install redis-server
    
    # Use the servicemanager_generate_config add command to add
    # redis-server to the configuration:
    RUN /servicemanager_generate_config add redis-server -u /.m4a/
    
    # Migrate to Containers image includes entrypoint
    ENTRYPOINT [ "/.v2k.go" ]
  2. Build image yang telah diupdate dan kirim ke Container Registry dengan tag versi yang telah diupdate, sehingga Anda memiliki cukup waktu hingga proses selesai. Dalam contoh berikut, gambar berada di direktori saat ini:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  3. Deploy image yang baru di-build:

    kubectl set image deployment/myWorkload my-app=gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL --record

Sintaksis servicemanager_generate_config

Utilitas servicemanager_generate_config menggunakan opsi berikut:

  • build-all -o /.m4a/: Mem-build ulang migrasi dan menulis konfigurasi ke direktori m4a. Jangan mengubah nama direktori.

    Gunakan bentuk perintah ini saat Anda pertama kali mengonversi migrasi untuk menggunakan pengelola layanan Linux yang disederhanakan.

  • update -u /.m4a/: Memperbarui daftar layanan yang ada di direktori m4a. Jangan mengubah nama direktori.

  • add SERVICE_NAME -u /.m4a/: Menambahkan nama layanan ke migrasi dan menulis konfigurasi ke direktori m4a. Jangan mengubah nama direktori.

    Untuk menambahkan beberapa layanan, tambahkan beberapa perintah RUN /servicemanager_generate_config, satu per layanan.

Langkah selanjutnya