升级容器工作负载以增强运行时

如果现有容器工作负载是使用 Migrate to Containers 1.7.x 和 1.8.x 版创建的,您可以将其转换为使用简化的 Linux 服务管理器。完成此转换后,您可以在 GKE Autopilot 集群上运行这些容器。

如需执行转换,请修改执行原始迁移时创建的 Dockerfile 和 deployment_spec.yaml 文件。修改完成后,您可以在 Autopilot 集群上部署容器工作负载。

关于转换容器工作负载

转换现有工作负载的步骤还取决于您是转换无状态工作负载还是有状态工作负载。

有状态工作负载是维护或存储状态信息的一种工作负载。对于有状态工作负载,通常使用 spec.containers.volumeMounts 中的 StatefulSet 装载更多卷。请务必保留 volumeMounts 定义,同时为 /sys/fs/cgroup 移除它们。 如需了解详情,请参阅装载外部卷

转换现有工作负载的一般过程需要您修改以下内容:

  • Dockerfile

    • 将 Migrate to Containers 版本设置为 1.15.0。
    • 插入两个 ADD 命令,将 logs.yaml 文件复制到容器映像。
    • servicemanager_generate_config 实用程序插入 RUN 命令。
  • deployment_spec.yaml 文件为:

    • 删除 /sys/fs/cgrouphostPathvolumeMounts 定义。
    • 删除 securityContext 定义。
    • 删除 readinessProbe 定义。
    • 您可以保留 logs-configmountPathconfigMap 定义,但日志记录目前不适用于简化的 Linux 服务管理器。

如需了解具体的转换过程,请参阅以下部分:

转换无状态工作负载

以下示例展示了如何转换无状态容器工作负载:

  1. 找到包含现有迁移工件(包括 deployment_spec.yaml 文件)的目录。

  2. 修改 Dockerfile 以设置产品版本,复制 logs.yaml 文件并运行 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. 通过编辑器打开 deployment_spec.yaml 文件。 例如:

    vi  deployment_spec.yaml
  4. 在文件中找到以下部分并删除指定的行:

    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. 添加以下行以设置 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. 保存文件。

  7. 确保目标集群具有 Docker 映像注册表的读取权限,如确保目标集群具有 Docker 映像注册表的读取权限中所述。

  8. 构建更新后的映像,并使用更新后的版本标记将其推送到 Container Registry,确保为构建提供足够的完成时间。以下示例中的映像位于当前目录中:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  9. 部署容器:

    kubectl apply -f deployment_spec.yaml

    如果您将部署规范应用于 Autopilot 集群,但未在 deployment_spec.yaml 中进行必要的更改,则会看到以下错误消息:

    "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. 查看部署到集群的 pod。

    kubectl get pods

转换有状态工作负载

以下示例展示了如何转换有状态容器工作负载:

  1. 找到包含现有迁移工件(包括 deployment_spec.yaml 文件)的目录。

  2. 修改 Dockerfile 以设置产品版本并运行 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. 通过编辑器打开 deployment_spec.yaml 文件。 例如:

    vi  deployment_spec.yaml
  4. 在文件中找到以下三个部分并删除指定的行:

    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

    请注意,仅移除 cgroupsvolumeMountsvolumes 定义,保留其余定义。

  5. 添加以下行以设置 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. 保存文件。

  7. 确保目标集群具有 Docker 映像注册表的读取权限,如确保目标集群具有 Docker 映像注册表的读取权限中所述。

  8. 构建更新后的映像,并使用更新后的版本标记将其推送到 Container Registry,确保为构建提供足够的完成时间。以下示例中的映像位于当前目录中:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  9. 部署容器:

    kubectl apply -f deployment_spec.yaml

    如果您将部署规范应用于 Autopilot 集群,但未在 deployment_spec.yaml 中进行必要的更改,则会看到以下错误消息:

    "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. 查看部署到集群的 pod。

    kubectl get pods

转换后任务

将现有迁移转换为使用简化的 Linux 服务管理器后,您可能需要将其修改为:

  • 更新迁移后的工作负载使用的服务。
  • 添加新服务。

对于这两种场景,您都必须修改 Dockerfile,然后重新构建容器映像。

更新服务

在本部分中,您可以修改 Dockerfile,并根据迁移后工作负载中 /etc/systemd 的更改更新容器中的 services-config.yaml 文件。

如需更新现有服务的更改的容器映像,请执行以下操作:

  1. 在 Dockerfile 中添加 servicemanager_generate_config 命令:

    ...
    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. 构建更新后的映像,并使用更新后的版本标记将其推送到 Container Registry,确保为构建提供足够的完成时间。以下示例中的映像位于当前目录中:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  3. 部署新构建的映像:

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

添加服务

如需将服务添加到容器映像,请执行以下操作:

  1. 在 Dockerfile 中添加 servicemanager_generate_config 命令:

    ...
    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. 构建更新后的映像,并使用更新后的版本标记将其推送到 Container Registry,确保为构建提供足够的完成时间。以下示例中的映像位于当前目录中:

    gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
  3. 部署新构建的映像:

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

servicemanager_generate_config 语法

servicemanager_generate_config 实用程序具有以下选项:

  • build-all -o /.m4a/:重新构建迁移并将配置写入 m4a 目录。请勿更改目录的名称。

    首次将迁移转化为使用简化的 Linux 服务管理器时,请使用此形式的命令。

  • update -u /.m4a/:更新 m4a 目录中现有服务的列表。请勿更改目录的名称。

  • add SERVICE_NAME -u /.m4a/:向迁移添加服务名称,并将配置写入 m4a 目录。请勿更改目录的名称。

    如需添加多个服务,请添加多个 RUN /servicemanager_generate_config 命令,每个服务一个。

后续步骤