Cloud Shell용 Cloud Code에서 개발 속도 향상

Cloud Shell용 Cloud Code에서 로컬 개발 속도를 높이려면 파일 동기화와 핫 리로드, 저장 시 자동 배포의 이점을 활용하고 Skaffold 모듈을 사용하여 애플리케이션 일부를 별도로 개발하세요.

Skaffold 파일 동기화 및 핫 리로드(Hot reloading) 사용 설정

Skaffold는 로컬 개발 워크플로의 효율성을 높이고 포드를 다시 빌드, 다시 배포, 다시 시작할 필요가 없도록 변경된 파일을 배포된 컨테이너에 복사하는 기능을 지원합니다. 즉, 정적 및 소스 코드 파일을 변경하면 몇 초 만에 변경사항이 적용되며 신속한 피드백 루프가 발생합니다.

정적 파일(예: HTML 및 CSS 파일)의 경우 이 파일 복사 동작을 파일 동기화라고 합니다.

소스 코드 파일의 경우 이 동작을 핫 리로드(Hot reloading)라고 하며 다음 파일 유형을 지원합니다.

  • Go: *.go
  • 자바: *.java, *.kt, *.scala, *.groovy, *.clj
  • NodeJS: *.js, *.mjs, *.coffee, *.litcoffee, *.json

핫 리로드를 구성하면 Skaffold는 지원되는 파일의 변경사항을 감지하고 이러한 변경사항을 클러스터에서 실행 중인 컨테이너와 동기화합니다. 핫 리로드를 지원하지 않는 파일 유형 변경사항은 이미지 다시 빌드 및 포드 다시 시작을 트리거합니다.

기본 빌더로 Buildpacks를 사용하면 자동 파일 동기화와 핫 리로드는 기본적으로 사용 설정됩니다. Docker와 같은 다른 빌더의 경우 맞춤설정할 아티팩트에 skaffold.yaml 파일에서 sync 섹션을 지정할 수 있습니다.

동기화 설정은 다음 중 하나일 수 있습니다(선호도 순서).

  • auto: Skaffold에서 자동으로 동기화를 구성합니다. (Jib 및 Buildpacks 아티팩트에만 해당) Buildpacks의 기본값입니다.
  • infer: 변경된 각 파일의 대상은 빌더에서 추론됩니다.
  • manual: 로컬 작업공간의 파일과 실행 중인 컨테이너의 대상 위치를 지정해야 합니다.

skaffold.yaml 파일에서 다음 샘플 sync 섹션은 모든 /static-html HTML 파일을 컨테이너의 static 폴더에 동기화하기 위해 manual 동기화를 지정합니다.

build:
  artifacts:
    - image: gcr.io/k8s-skaffold/node-example
      context: node
      sync:
        manual:
          - src: 'static-html/*.html'
            dest: static

파일 동기화 및 동기화 규칙 지정에 대한 자세한 내용은 파일 동기화에 대한 Skaffold 가이드를 참조하세요.

Kubernetes에서 개발할 때 새 기능 추가

파일 동기화 및 핫 리로드를 설정한 후 반복 주기를 시작하고 프로젝트에 더 많은 기능을 추가합니다. 배포를 중지 및 삭제하거나 이미지를 수동으로 빌드 및 태그 지정하거나 클러스터를 업데이트하지 않아도 변경사항이 Kubernetes 클러스터에 배포됩니다.

표준 반복 주기는 다음 단계와 유사합니다.

  1. 프로젝트를 변경합니다. 예를 들어 Cloud Code 자바 방명록 앱을 사용하는 경우 다음과 같이 FrontendController 클래스에 새 엔드포인트를 추가합니다.

    1. src/main/java/cloudcode/guestbook/frontend에서 FrontendController.java 파일을 열고 다음을 추가합니다.

      @RequestMapping("/greeting")
      @ResponseBody
      public String greeting(@RequestParam(value="name", defaultValue="World") String name) {
         return String.format("Hello from Kubernetes with IntelliJ, %s!", name);
      }
      
    2. 새 주석 RequestMappingResponseBody에 대한 필요한 가져오기를 포함합니다.

  2. 변경사항을 저장하거나(Ctrl/Cmd+S) 프로젝트를 빌드합니다.

    콘솔 창에서 진행 상황 및 배포 로그를 확인할 수 있습니다. 변경사항이 배포되면 업데이트를 확인합니다.

  3. 지속적 개발 세션을 종료하려면 중지 아이콘을 클릭합니다.

    Cloud Code는 개발 세션에 사용된 모든 Kubernetes 리소스를 삭제합니다.

Skaffold 구성을 사용하여 마이크로서비스 애플리케이션 개발

마이크로서비스 애플리케이션을 개발할 때 디버깅과 배포를 단순화하려면 별도의 섹션에서 독립적으로 작업하는 것이 유용할 수 있습니다.

애플리케이션을 Skaffold 모듈로 분할하여 애플리케이션 부분을 독립적으로 개발 및 디버깅할 수 있습니다. 예를 들어 Bank of Anthos 샘플은 10개의 마이크로서비스가 포함된 애플리케이션입니다. 샘플의 skaffold.yaml 파일은 이러한 서비스를 setup, db, frontend, backend, loadgenerator라는 5개의 skaffold 모듈로 그룹화합니다.

Skaffold 모듈 및 구성 종속 항목 정의

Skaffold 모듈 및 구성 종속 항목을 정의하려면 다음 안내를 따르세요.

  1. 모듈을 정의하려는 프로젝트를 엽니다.

  2. skaffold.yaml 파일을 엽니다.

  3. skaffold.yaml 파일에 여러 구성이 포함된 경우 구성을 Skaffold 모듈로 만들려면 다음 줄을 지정합니다.

    metadata:
      name: MODULE_NAME_1
    

    예를 들어 Bank of Anthos skaffold.yaml에서 db 모듈은 데이터베이스 배포를 정의합니다.

    apiVersion: skaffold/v3
    kind: Config
    metadata:
      name: db # module defining database deployments
    requires:
    - configs:
      - setup
    build:
      artifacts:
      - image: accounts-db
        context: src/accounts-db
      - image: ledger-db
        context: src/ledger-db
    manifests:
      rawYaml:
      - dev-kubernetes-manifests/accounts-db.yaml
      - dev-kubernetes-manifests/ledger-db.yaml
    deploy:
      kubectl: {}
  4. 현재 구성을 배포하기 전에 배포 중인 다른 구성에 의존하는 구성의 경우 구성을 종속 항목에 추가해야 합니다. 구성 종속 항목을 지정하려면 skaffold.yaml 파일의 requires 섹션에 configs 목록을 추가합니다.

    예를 들어 Bank of Anthos skaffold.yaml 파일에는 구성 종속 항목 setup이 포함되어 있습니다.

    종속 항목을 정의하려면 skaffold.yaml 파일에 다음을 추가합니다. 여기서 DEPENDENCY_NAME은 종속 항목의 이름입니다.

    requires:
        - configs: DEPENDENCY_NAME
    

    이러한 방식으로 나열된 구성은 같은 파일에 정의된 종속 항목 또는 현재 프로젝트의 다른 skaffold.yaml 파일을 참조할 수 있습니다.

  5. 각 Skaffold 모듈을 별도로 빌드하여 구성 종속 항목을 테스트하여 종속 항목이 특정 Skaffold 모듈 및 종속 항목 빌드의 단계에 따라 배포되도록 합니다.

특정 Skaffold 모듈 및 종속 항목 빌드

모듈 및 해당 종속 항목을 정의한 후에는 launch.json 파일의 Cloud Code로 실행할 모듈을 지정할 수 있습니다.

프로젝트에 launch.json 파일이 정의되어 있지 않은 경우 Cloud Code: Run on Kubernetes 또는 Cloud Code: Debug on Kubernetes를 실행하면 빌드할 모듈을 선택하라는 메시지가 나타납니다.

  1. 명령어 팔레트를 연 다음(Ctrl/Cmd+Shift+P) Cloud Code: Run on Kubernetes를 실행합니다.
  2. 모듈 선택을 클릭합니다.
  3. 배포할 모듈을 선택한 후 확인을 클릭합니다. 각 모듈은 종속 항목으로 빌드됩니다.
  4. 메시지가 표시되면 이미지 레지스트리를 선택한 후 Enter 키를 누릅니다.

프로젝트에 launch.json이 있으면 다음 단계에 따라 빌드할 Skaffold 모듈을 선택합니다.

  1. 프로젝트의 launch.json 파일을 엽니다.

  2. 실행 구성을 수정하여 빌드할 쉼표로 구분된 modules 목록을 사용하여 skaffoldFlags 옵션을 추가합니다. skaffoldFlags를 생략하면 모든 모듈이 빌드됩니다.

      {
        "name": "Run on Kubernetes",
        "type": "cloudcode.kubernetes",
        "request": "launch",
        "skaffoldConfig": "${workspaceFolder}/skaffold.yaml",
        "skaffoldFlags": {
           "modules": ["MODULE_NAME_2,MODULE_NAME_2"],
        "watch": true,
        "cleanUp": true,
        }
      }
    
  3. 수정한 실행 구성을 실행합니다.

Kubernetes에서 지속적 개발

원하는 옵션으로 실행 대상을 구성한 다음에는 애플리케이션의 정기 실행을 선택하거나 IDE에서 개발 반복 주기를 시작하여 소스 및 종속 항목의 변경사항을 운영 중인 애플리케이션에 전파할 수 있습니다.

Kubernetes에서 실행 실행 대상은 Kubernetes 클러스터에서 개발 주기를 시작합니다. 개발 주기를 시작하면 Cloud Code에서 Skaffold를 사용하여 프로젝트 이미지를 빌드한 다음 태그를 지정하고 구성된 저장소에 푸시한 후 kubectl을 사용하여 프로젝트 Kubernetes 매니페스트를 배포합니다.

  1. 사용 가능한 구성 옵션을 사용하여 배포를 맞춤설정합니다.
  2. 애플리케이션이 Skaffold 모듈을 사용하도록 구성된 경우 빌드하거나 배포할 특정 모듈을 선택할 수 있습니다.
  3. 명령어 팔레트를 열고(Ctrl/Cmd+Shift+P 누르기) Cloud Code: Kubernetes에서 실행 명령어를 실행합니다.
  4. 현재의 Kubernetes 컨텍스트를 사용하여 앱을 실행할지 또는 선호하는 컨텍스트로 전환할지 확인합니다. Kubernetes 컨텍스트 설정에 대한 자세한 내용은 구성 설정을 참조하세요.
  5. 원격 클러스터를 컨텍스트로 선택한 경우 메시지가 표시되면 이미지를 푸시할 이미지 레지스트리를 선택합니다. Container Registry를 사용하는 경우 기존 레지스트리를 탐색하거나 만들 레지스트리의 이름을 지정할 수 있습니다. 프로젝트에 Artifact Registry API가 사용 설정되어 있고 하나 이상의 Artifact Registry 저장소가 있는 경우 기존 Artifact Registry 저장소를 찾아서 선택할 수 있습니다.

    Cloud Code가 컨테이너를 빌드하여 레지스트리로 푸시하고 Kubernetes 구성을 클러스터에 적용하여 출시를 기다립니다.

다음 단계