향상된 런타임을 위한 컨테이너 워크로드 업그레이드

Migrate to Containers 버전 1.7.x 및 1.8.x를 사용하여 생성된 기존 컨테이너 워크로드가 있는 경우 간소화된 Linux 서비스 관리자를 사용하도록 변환할 수 있습니다. 이 변환을 통해 GKE Autopilot 클러스터에서 이러한 컨테이너를 실행할 수 있습니다.

변환을 수행하려면 원래 마이그레이션을 수행할 때 만든 Dockerfile과 deployment_spec.yaml 파일을 수정합니다. 수정한 후에 컨테이너 워크로드를 Autopilot 클러스터에 배포하면 됩니다.

컨테이너 워크로드 변환 정보

기존 워크로드를 변환하는 절차는 스테이트리스(Stateless) 워크로드를 변환하는지 아니면 스테이트풀(Stateful) 워크로드를 변환하는지 여부에 따라 달라집니다.

스테이트풀(Stateful) 워크로드는 상태 정보를 유지관리하거나 저장합니다. 스테이트풀(Stateful) 워크로드의 경우 spec.containers.volumeMountsStatefulSet을 사용하여 추가 볼륨을 마운트하는 경우가 많습니다. /sys/fs/cgroup의 볼륨 마운트 정의를 삭제하는 동안에도 volumeMounts 정의를 유지해야 합니다. 자세한 내용은 외부 볼륨 마운트를 참조하세요.

기존 워크로드를 변환하려면 일반적으로 다음을 수정해야 합니다.

  • Dockerfile

    • Migrate to Containers 버전을 1.15.0으로 설정합니다.
    • ADD 명령어 두 개를 삽입하여 logs.yaml 파일을 컨테이너 이미지로 복사합니다.
    • servicemanager_generate_config 유틸리티에 대해 RUN 명령어를 삽입합니다.
  • deployment_spec.yaml 파일

    • /sys/fs/cgroup에 대한 hostPathvolumeMounts 정의를 삭제합니다.
    • securityContext 정의를 삭제합니다.
    • readinessProbe 정의를 삭제합니다.
    • logs-config에 대한 mountPathconfigMap 정의를 그대로 둘 수 있지만 현재 간소화된 Linux 서비스 관리자에서는 로깅이 작동하지 않습니다.

구체적인 변환 프로세스는 아래 섹션을 참조하세요.

스테이트리스(Stateless) 워크로드 변환

다음 예시에서는 스테이트리스(Stateless) 컨테이너 워크로드를 변환하는 방법을 보여줍니다.

  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

    deployment_spec.yaml에 필요한 변경사항을 적용하지 않고 배포 사양을 Autopilot 클러스터에 적용하면 다음과 같은 형식의 오류 메시지가 표시됩니다.

    "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. 클러스터에 배포 중인 포드를 확인합니다.

    kubectl get pods

스테이트풀(Stateful) 워크로드 변환

다음 예시에서는 스테이트풀(Stateful) 컨테이너 워크로드를 변환하는 방법을 보여줍니다.

  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. 파일에서 다음 3개의 섹션을 찾아 표시된 줄을 삭제합니다.

    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에 대한 volumeMountsvolumes 정의만 삭제하고 나머지 정의는 그대로 둡니다.

  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

    deployment_spec.yaml에 필요한 변경사항을 적용하지 않고 배포 사양을 Autopilot 클러스터에 적용하면 다음과 같은 형식의 오류 메시지가 표시됩니다.

    "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. 클러스터에 배포 중인 포드를 확인합니다.

    kubectl get pods

변환 후 작업

간소화된 Linux 서비스 관리자를 사용하도록 기존 마이그레이션을 변환한 후에는 다음 작업을 하도록 수정할 수 있습니다.

  • 마이그레이션된 워크로드에서 사용하는 서비스를 업데이트합니다.
  • 새로운 서비스를 추가합니다.

두 시나리오 모두 Dockerfile을 수정한 후 컨테이너 이미지를 다시 빌드해야 합니다.

서비스 업데이트

이 섹션에서는 마이그레이션된 워크로드의 /etc/systemd에 적용된 변경사항에 따라 Dockerfile을 수정하여 컨테이너의 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 명령어를 서비스당 하나씩 추가합니다.

다음 단계