升级容器工作负载以增强运行时
如果现有容器工作负载是使用 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/cgroup
的hostPath
和volumeMounts
定义。 - 删除
securityContext
定义。 - 删除
readinessProbe
定义。 - 您可以保留
logs-config
的mountPath
和configMap
定义,但日志记录目前不适用于简化的 Linux 服务管理器。
- 删除
如需了解具体的转换过程,请参阅以下部分:
转换无状态工作负载
以下示例展示了如何转换无状态容器工作负载:
找到包含现有迁移工件(包括
deployment_spec.yaml
文件)的目录。修改 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" ]
通过编辑器打开
deployment_spec.yaml
文件。 例如:vi deployment_spec.yaml
在文件中找到以下部分并删除指定的行:
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.
添加以下行以设置
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"
保存文件。
确保目标集群具有 Docker 映像注册表的读取权限,如确保目标集群具有 Docker 映像注册表的读取权限中所述。
构建更新后的映像,并使用更新后的版本标记将其推送到 Container Registry,确保为构建提供足够的完成时间。以下示例中的映像位于当前目录中:
gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
部署容器:
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"
查看部署到集群的 pod。
kubectl get pods
转换有状态工作负载
以下示例展示了如何转换有状态容器工作负载:
找到包含现有迁移工件(包括
deployment_spec.yaml
文件)的目录。修改 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" ]
通过编辑器打开
deployment_spec.yaml
文件。 例如:vi deployment_spec.yaml
在文件中找到以下三个部分并删除指定的行:
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
请注意,仅移除
cgroups
的volumeMounts
和volumes
定义,保留其余定义。添加以下行以设置
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
保存文件。
确保目标集群具有 Docker 映像注册表的读取权限,如确保目标集群具有 Docker 映像注册表的读取权限中所述。
构建更新后的映像,并使用更新后的版本标记将其推送到 Container Registry,确保为构建提供足够的完成时间。以下示例中的映像位于当前目录中:
gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
部署容器:
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"
查看部署到集群的 pod。
kubectl get pods
转换后任务
将现有迁移转换为使用简化的 Linux 服务管理器后,您可能需要将其修改为:
- 更新迁移后的工作负载使用的服务。
- 添加新服务。
对于这两种场景,您都必须修改 Dockerfile,然后重新构建容器映像。
更新服务
在本部分中,您可以修改 Dockerfile,并根据迁移后工作负载中 /etc/systemd
的更改更新容器中的 services-config.yaml
文件。
如需更新现有服务的更改的容器映像,请执行以下操作:
在 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" ]
构建更新后的映像,并使用更新后的版本标记将其推送到 Container Registry,确保为构建提供足够的完成时间。以下示例中的映像位于当前目录中:
gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
部署新构建的映像:
kubectl set image deployment/myWorkload my-app=gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL --record
添加服务
如需将服务添加到容器映像,请执行以下操作:
在 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" ]
构建更新后的映像,并使用更新后的版本标记将其推送到 Container Registry,确保为构建提供足够的完成时间。以下示例中的映像位于当前目录中:
gcloud builds submit --timeout 4h --tag gcr.io/PROJECT_NAME/IMAGE_NAME:LABEL .
部署新构建的映像:
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
命令,每个服务一个。
后续步骤
- 了解新的增强型运行时。