OperatorHub.io로 발행하는 방법

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

note
다음 프로세스는 scripts/tools/publish.sh에서 일부 자동화되어 있습니다. 이 프로세스를 실행하려면 publish.sh ${VERSION} operatorhub을 사용할 수 있습니다. 자세한 내용은 스크립트 설명서를 참조하세요.

OperatorHub에 GitLab Operator를 발행하려면:

  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을 편집하여 이 Operator 버전이 함께 제공하는 유효한 차트 버전을 나타내는 metadata.annotations.alm-examples를 수정합니다.

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

    1. BUNDLE_REGISTRY는 유효한 공개 레지스트리를 가리켜야 합니다(그 목적으로 자체 프로젝트/레지스트리를 생성합니다):

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

    이전에 설정된 값을 임시로 덮어쓰기하여 KinD 특정 번들 등을 보유합니다.

    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.22.4" scripts/olm_bundle.sh step1 step2
    
    1. gitlab-operator-kubernetes에 대한 packagemanifest가 사용 가능해질 때까지 기다립니다 (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.22.4"
      
    2. 새로운 KinD 클러스터를 생성합니다.

      scripts/olm_bundle.sh initialize_kind install_olm create_namespace
      
    3. 여기까지 진행하면 “test” 버전 번들이 ${BUNDLE_REGISTRY}:${BUNDLE_IMAGE_TAG}에 발행됩니다. (이전 릴리스가 0.3.1인 경우 - 이전에 발행된 카달로그 태그 beta1과 다른 카달로그 태그 beta1u가 있어야 합니다):

      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 리뷰어의 승인을 기다렸다가 Merge이 완료되기를 기다립니다.