컨테이너 워크로드 배포

이 페이지에서는 컨테이너 이미지를 Harbor에 업로드하고 GDC Sandbox 인스턴스에 해당 이미지를 배포하는 프로세스를 설명합니다.

준비

  1. 인스턴스에 연결 의 안내에 따라 Linux 명령줄 액세스로 인스턴스에 연결합니다. 원격 데스크톱을 통해 게이트웨이에 연결하거나 Linux 머신에서 sshuttle을 실행할 수 있습니다.

  2. 조직 IAM 관리자에게 프로젝트 수준에서 다음 역할을 부여해 달라고 요청하세요.

    • Secret 관리자 (secret-admin): GDC 콘솔에서 작동하는 데 필요합니다.
    • 네임스페이스 관리자 (namepspace-admin): 프로젝트에서 컨테이너 워크로드를 배포하는 데 필요합니다.
    • 전역 PNP 관리자 (global-project-networkpolicy-admin): 영역 간에 프로젝트 네트워크 정책을 만들고 관리하는 데 필요합니다.
    • 프로젝트 뷰어()(project-viewer): GDC 콘솔 및 Distributed Cloud CLI에 액세스하는 데 필요합니다.
    • Harbor 인스턴스 뷰어 (harbor-instance-viewer): Harbor 인스턴스를 보고 선택하는 데 필요합니다.
    • Harbor 프로젝트 생성자 (harbor-project-creator): Harbor 프로젝트에 액세스하고 관리하는 데 필요합니다.
  3. 다음 안내에서 사용할 환경 변수를 설정합니다.

    export TENANT_PROJECT=TENANT_PROJECT # Intended deployment project for the container workflow.
    export HARBOR_INSTANCE_NAME=HARBOR_INSTANCE_NAME # Harbor Container Registry instance name.
    export HARBOR_PROJECT=HARBOR_PROJECT # Container registry project name for your images.
    export AO_USER=AO_USER # Your user name in the instance, e.g.: fop-my-user@example.com.
    export INSTANCE_URL=${HARBOR_INSTANCE_NAME}-${TENANT_PROJECT}.org-1.zone1.google.gdch.test.
    export DOCKER_CONFIG_PATH=DOCKER_CONFIG_PATH # Path to docker config file e.g.: /root/.docker/config.json.
    
  4. Harbor 레지스트리 인스턴스를 만들려면 Harbor 레지스트리 인스턴스 만들기를 따르거나 미리 생성된 Sandbox Harbor 인스턴스를 사용할 수 있습니다. GDC Sandbox의 기본 user-project에는 이미 배포된 Harbor 인스턴스인 user-haas-instance가 포함되어 있으며 이는 개발에 사용할 수 있습니다.

    export HARBOR_INSTANCE_NAME=user-haas-instance
    export TENANT_PROJECT=user-project
    export INSTANCE_URL=${HARBOR_INSTANCE_NAME}-${TENANT_PROJECT}.org-1.zone1.google.gdch.test
    

Harbor에 이미지 업로드

  1. Harbor 프로젝트 만들기에 따라 Harbor 프로젝트를 만듭니다.

    예:

    gdcloud harbor harbor-projects create HARBOR_PROJECT  \
    --project=TENANT_PROJECT \
    --instance=HARBOR_INSTANCE_NAME
    
  2. Docker에 로그인합니다. CLI 보안 비밀로 Docker 또는 Helm에 로그인에서 시작합니다.

  3. 컨테이너 이미지를 다운로드하거나 빌드하고 Google Distributed Cloud 에어 갭 안내에 따라 이미지를 푸시 하여 Harbor로 푸시합니다.

    예를 들어 Gitlab에서 가져오고 Harbor로 푸시하는 워크플로는 다음과 같습니다.

    1. Gitlab 컨테이너 레지스트리에 로그인하고 가져옵니다.

      export GITLAB_ID=GITLAB_ID
      export GITLAB_PROJECT_NAME=GITLAB_PROJECT_NAME
      export GITLAB_IMAGE_PATH=registry.gitlab.com/GITLAB_ID/GITLAB_PROJECT_NAME
      docker login registry.gitlab.com
      docker pull ${GITLAB_IMAGE_PATH}
      
    2. Gitlab 이미지를 Harbor로 푸시합니다.

      export TAG=demo-image
      docker tag ${TAG} ${GITLAB_IMAGE_PATH}
      docker push ${INSTANCE_URL}/${HARBOR_PROJECT}/${TAG}
      

컨테이너 앱 배포

Kubernetes 이미지 가져오기 보안 비밀 만들기로 계속 진행하여 보안 비밀을 만들고 앱을 배포합니다.

네트워크 정책 만들기

  1. 모든 네트워크 트래픽을 테넌트 프로젝트로 허용하는 네트워크 정책을 만듭니다.

    kubectl --kubeconfig GLOBAL_API_KUBECONFIG -n TENANT_PROJECT \
    create -f - <<EOF
    apiVersion: networking.gdc.goog/v1
    kind: ProjectNetworkPolicy
    metadata:
      annotations:
      name: allow-all
    spec:
      ingress:
      - from:
        - ipBlock:
            cidr: 0.0.0.0/0
      podSelector: {}
      policyTypes:
      - Ingress
    EOF
    

애플리케이션에 연결

  1. 서비스의 IP 주소를 내보냅니다.

    export IP=`kubectl --kubeconfig=${KUBECONFIG} get service ${SERVICE_NAME} \
          -n TENANT_PROJECT -o jsonpath='{.status.loadBalancer.ingress[*].ip}'`
    
  2. sshuttle을 사용하여 로컬 머신에서 연결하려면 다음 명령어를 실행하여 SSH 터널을 만듭니다. 인스턴스에 연결할 때 만든 기존 sshuttle 세션이 있는 경우 다음 명령어를 실행하기 전에 해당 세션을 종료해야 합니다.

      sshuttle -r zone1-org-1-data@GDC_SANDBOX_INSTANCE_NAME --no-latency-control \
      --ssh-cmd 'gcloud compute ssh --project PROJECT_NAME --zone ZONE --tunnel-through-iap' \
      10.200.0.0/16 --dns
    
  3. HTTP 요청 http://${IP}`을 보내 서비스 테스트:

      curl http://${IP}