OperatorHub.io에 게시하는 방법

OperatorHub.io는 Kubernetes 커뮤니티가 Operators를 공유하는 공간입니다.

주의: 다음 프로세스는 scripts/tools/publish.sh에서 부분 자동화되어 있습니다.

publish.sh ${VERSION} operatorhub를 사용하여 이 프로세스를 실행할 수 있습니다.

자세한 내용은 스크립트 문서를 참조하십시오.

GitLab Operator를 OperatorHub에 게시하려면:

  1. community-operators 저장소를 포크합니다.

  2. 포크한 community-operators 저장소를 클론합니다:
    • 포크가 새로 생성된 경우:

      git clone -o mine git@github.com:<your_github_username>/community-operators.git
      cd community-operators
      git remote add upstream https://github.com/k8s-operatorhub/community-operators.git
      
    • 이미 생성된 포크에 대한 후속 업데이트인 경우:

      cd community-operators
      git fetch --all
      git checkout main
      git rebase -i upstream/main
      
  3. 셸을 설정합니다:

    # 게시된 Operator 이미지 태그
    export OPERATOR_TAG="0.3.1"
    # OLM에 적용할 버전
    export OLM_PACKAGE_VERSION=${OPERATOR_TAG}
    export OPERATORHUB_DIR="${HOME}/work/community-operators"
    export OPERATORHUB_NAME="gitlab-operator-kubernetes"
    export OSDK_BASE_DIR=".build/operatorhub-io"
    # 선택 사항
    # "yq" 바이너리의 로컬 인스턴스를 가리킵니다:
    export YQ="yq-go"
    
  4. https://gitlab.com/gitlab-org/cloud-native/gitlab-operator의 새 브랜치를 만듭니다:

    cd ${OPERATORHUB_DIR}
    git checkout -B gitlab-release-${OPERATOR_TAG}
    
  5. config/manifests/bases/gitlab-operator-kubernetes.clusterserviceversion.yaml 파일을 편집하여, 유효한 차트 버전을 참조하도록 metadata.annotations.alm-examples를 수정합니다. 이 Operator의 현재 버전과 함께 제공되는 차트 버전입니다.

  6. 로컬 KinD 클러스터에서 Operator 번들을 테스트합니다:

    1. BUNDLE_REGISTRY는 유효한 공개 레지스트리를 가리켜야 합니다(이 목적을 위해 자신의 프로젝트/레지스트리를 생성합니다):

       export BUNDLE_REGISTRY=registry.gitlab.com/dmakovey/gitlab-operator-bundle
      
    2. podman (또는 docker)은 BUNDLE_REGISTRY에 로그인해야 합니다.

    이전에 설정한 값을 일시적으로 재정의하여 Kind-Specific 번들 등을 사용할 수 있습니다.

    OSDK_BASE_DIR=".build/operatortest1" KIND_CLUSTER_NAME="optest1" BUNDLE_IMAGE_TAG="beta1" DOCKER="podman" OPERATOR_TAG=0.6.0 KIND_CONFIG="${HOME}/work/gitlab/examples/kind/kind-ssl.yaml" KIND_IMAGE="kindest/node:v1.25.9" scripts/olm_bundle.sh step1 step2
    
    1. gitlab-operator-kubernetespackagemanifest가 사용 가능해질 때까지 기다립니다 (이때 Community Operators는 건너뜁니다):

      $ kubectl get packagemanifests | grep -F gitlab | grep -vF "Community Operators"
      gitlab-operator-kubernetes                                       48m
      
    2. Operator를 배포합니다 (수동 설치 승인을 피하기 위해 AUTO_UPGRADE="true"를 설정합니다):

      OSDK_BASE_DIR=".build/operatortest1" AUTO_UPGRADE="true" scripts/olm_bundle.sh step3
      
    3. IngressClass를 생성합니다:

      cat << EOF | kubectl apply -f -
      apiVersion: networking.k8s.io/v1
      kind: IngressClass
      metadata:
        # 이 값이 다음 단계에서 GitLab CR의 `spec.chart.values.global.ingress.class`와 일치하는지 확인합니다.
        name: gitlab-nginx
      spec:
        controller: k8s.io/ingress-nginx
      EOF
      
    4. GitLab을 배포합니다 (값은 귀하의 설정에 맞게 사용자 정의해야 합니다):

      KIND_CLUSTER_NAME="optest1" GITLAB_CR_DEPLOPOY_MODE="ss" LOCAL_IP=192.168.3.194 GITLAB_CHART_DIR=~/work/gitlab GITLAB_OPERATOR_DOMAIN=192.168.3.194.nip.io GITLAB_OPERATOR_DIR=. scripts/provision_and_deploy.sh deploy_gitlab
      
    5. KinD 클러스터를 삭제합니다:

      kind delete cluster --name=${KIND_CLUSTER_NAME}
      
  7. OLM 번들 업그레이드를 테스트합니다.

    1. 테스트에 사용했던 변수를 재사용합니다 (위 참조):

      export BUNDLE_REGISTRY=registry.gitlab.com/dmakovey/gitlab-operator-bundle
      export BUNDLE_IMAGE_TAG="beta1"
      export KIND_CLUSTER_NAME="optest1u"
      export KIND_CONFIG="${HOME}/work/gitlab/examples/kind/kind-ssl.yaml" 
      export KIND_IMAGE="kindest/node:v1.25.9"
      
    2. 새로운 KinD 클러스터를 생성해야 합니다:

      scripts/olm_bundle.sh initialize_kind install_olm create_namespace
      
    3. 이 시점에서 ${BUNDLE_REGISTRY}:${BUNDLE_IMAGE_TAG}에 “테스트” 버전의 번들이 게시되어 있어야 합니다 (게시되지 않았다면 “로컬 KinD 클러스터에서 Operator 번들 테스트”를 따르십시오). 이전 릴리스가 0.3.1이라고 가정하면, 테스트를 위한 카탈로그를 생성할 것입니다 (카탈로그 태그 beta1u가 이전에 게시된 카탈로그 태그 beta1과 다릅니다):

      export CATALOG_IMAGE_TAG="beta1u"
      PREVIOUS_BUNDLE_VERSION="0.3.1"
      
      opm index add -p docker \
         --bundles registry.gitlab.com/gitlab-org/cloud-native/gitlab-operator/bundle:${PREVIOUS_BUNDLE_VERSION},${BUNDLE_REGISTRY}:${BUNDLE_IMAGE_TAG} \
         --mode semver \
         --tag ${BUNDLE_REGISTRY}/gitlab-operator-catalog:${CATALOG_IMAGE_TAG}
      
      podman push ${BUNDLE_REGISTRY}/gitlab-operator-catalog:${CATALOG_IMAGE_TAG}
      
    4. Operator 배포 준비를 위해 CatalogSourceOperatorGroup를 배포합니다:

      
      OSDK_BASE_DIR=".build/operatortest1" scripts/olm_bundle.sh deploy_catalogsource
      
      OSDK_BASE_DIR=".build/operatortest1" scripts/olm_bundle.sh deploy_operatorgroup 
      
    5. PackageManifest를 기다립니다:

      kubectl get packagemanifests | grep -F gitlab | grep -vF "Community Operators"
      
    6. Subscription을 배포합니다:

      # 이전 릴리스를 배포합니다
      OSDK_BASE_DIR=".build/operatortest1" OLM_PACKAGE_VERSION=${PREVIOUS_BUNDLE_VERSION} scripts/olm_bundle.sh deploy_subscription 
      
    7. InstallPlan을 찾습니다:

      $ kubectl get installplans -A
      NAMESPACE       NAME            CSV                                 APPROVAL   APPROVED
      gitlab-system   install-jfqrb   gitlab-operator-kubernetes.v0.3.1   Manual     false
      
    8. InstallPlan을 승인합니다:

      kubectl -n gitlab-system patch installplan install-jfqrb -p '{"spec":{"approved":true}}' --type merge
      

      이렇게 하면 현재 버전(0.6.1)에 대한 새로운 설치 계획이 자동으로 생성됩니다:

      $ kubectl get installplans -A
      NAMESPACE       NAME            CSV                                 APPROVAL   APPROVED
      gitlab-system   install-4dvgh   gitlab-operator-kubernetes.v0.6.1   Manual     false
      gitlab-system   install-jfqrb   gitlab-operator-kubernetes.v0.3.1   Manual     true
      
      
    9. 업그레이드를 승인합니다:

      kubectl -n gitlab-system patch installplan install-4dvgh -p '{"spec":{"approved":true}}' --type merge
      
    10. KinD 클러스터를 삭제합니다:

      kind delete cluster --name=${KIND_CLUSTER_NAME}
      
  8. Operator 번들을 생성합니다.

    # 번들 조립
    scripts/olm_bundle.sh build_manifests generate_bundle patch_bundle
    # 번들 검증
    scripts/olm_bundle.sh validate_bundle
    
  9. 번들 파일을 올바른 위치로 복사합니다:

    mkdir -p ${OPERATORHUB_DIR}/operators/${OPERATORHUB_NAME}/${OLM_PACKAGE_VERSION}
    cp -r ${OSDK_BASE_DIR}/bundle/* ${OPERATORHUB_DIR}/operators/${OPERATORHUB_NAME}/${OLM_PACKAGE_VERSION}
    
  10. 변경 사항을 추가하고(서명 포함) 커밉니다:

    cd ${OPERATORHUB_DIR}
    git add operators/${OPERATOR_HUB_NAME}/${OLM_PACKAGE_VERSION}
    git commit -s
    
  11. 포크한 브랜치를 푸시하고 상류에 대한 풀 요청을 생성합니다.

    병합이 완료되기 전에 GitLab 팀원 및/또는 OperatorHub 검토자의 승인을 기다립니다.