기본 콘텐츠로 건너뛰기

[Kubernetes - Operator] KUDO 설치 및 간단한 사용법 검증

How to use KUDO

당연한 것이지만 KUDO를 테스트하기 위해서는 Kubernetes Cluster가 존재해야 한다. KindMinikube를 사용할 수 있다.

참고

  • Minikube
    Minikue를 통해 KUDO를 로컬에서 개발하고 테스트하기 위해서는 적절한 양의 메모리가 필요한데 Minikube는 2G 메모리를 기준으로 하는데 Kafka의 경우는 최소 10GB를 권장하므로 로컬에서 메모리를 구성하기는 좀 힘들다. 그러나 가능한 리소스가 존재한다면 아래와 같이 기본적인 설정을 바꿔 실행이 가능하다.
    $ minikube start --cpus=4 --memory=10240 --disk-size=40g
  • Kind
    KIND를 storage operator와 같이 사용하기 위해서는 KIND v0.7.0 이상을 사용해야 한다.
  • Cert-Manager
    cert-manager 의존성을 테스트 환경에서 제외할 경우는 KUDO를 보안이 되지 않는 상황으로 자체 서명된 CA 번들을 사용하도록 초기화할 수 있다.
    $ kubectl kudo init --unsafe-self-signed-webhook-ca
    이와 관련된 개발을 위해서 Blog post를 참고하는 것이 좋다.

Install KUDO CLI

KUDO CLI는 kubectl에 KUDO 기능을 제공하는 플러그인이다.

CLI 바이너리를 Release Page에서 다운로드해서 설치가 가능하다. 맥인 경우는 brew를 통해서 설치가 가능하다.

$ brew tap kudobuilder/tap
$ brew instll kudo-cli

참고

맥 OSX에서는 명령 사용을 명시적으로 허가해야 할 수도 있으므로 Apple support site를 참고하도록 한다.

다른 방식은 kubectl 플러그인들을 위한 패키지 매니저인 krew를 이용하는 것이다. KREW란 무엇일까? 문서를 참고한다.

$ kubectl krew install kudo

그외는 최신 릴리즈에서 플랫폼과 OS에 따라서 바이너리를 다운로드하고 실행가능한 상태로 전환하고 Path에 추가하면 된다.

$ VERSION=x.y.z # look up the current stable release at https://github.com/kudobuilder/kudo/releases/latest
$ OS=$(uname | tr '[:upper:]' '[:lower:]')
$ ARCH=$(uname -m)
$ wget -O kubectl-kudo https://github.com/kudobuilder/kudo/releases/download/v${VERSION}/kubectl-kudo_${VERSION}_${OS}_${ARCH}
$ chmod +x kubectl-kudo
# add to your path
$ sudo mv kubectl-kudo /usr/local/bin/kubectl-kudo

Manage KUDO on Cluster

KUDO는 Cluster 내부에 설치되는 컴포넌트이기 떄문에 KUDO CLI를 통해서 초기화(설치) 및 관리 (Upgrade/Delete)를 할 수 있다.

Requirement

Install KUDO into Cluster

$ kubectl kudo init

# 자체 인증서와 시간 설정 추가
$ kubectl kudo init --unsafe-self-signed-webhook-ca --wait

$KUDO_HOME has been configured at /home/centos/.kudo
Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
✅ installed crds
✅ installed namespace
✅ installed service account
Warning: admissionregistration.k8s.io/v1beta1 MutatingWebhookConfiguration is deprecated in v1.16+, unavailable in v1.22+; use admissionregistration.k8s.io/v1 MutatingWebhookConfiguration
✅ installed webhook
✅ installed kudo controller
⌛Waiting for KUDO controller to be ready in your cluster...
✅ KUDO is ready!

이 명령은 KUDO가 동작하는데 필요한 Controller 배포, Webhook 및 기타 모든 컴포넌트들을 설치한다. 만일 기존에 설치된 KUDO가 존재하는 경우는 우발적인 업그레이드가 발생하지 않도록 중단된다. KUDO 초기화에 필요한 명령의 자세한 옵션들은 init command를 참고한다.

참고

수동 설치 또는 다른 설정등의 작업을 해서 처리할 경우는 아래와 같이 처리도 가능하다.

$ kubectl kudo init --dry-run -o=yaml > kudo.yaml
$ kubectl apply -f kudo.yaml

KUDO init 명령은 Kubernetes에 처리할 명령을 전달하고 종료되기 때문에 실제 클러스터 내부에 필요한 리소스들이 성공적으로 실행되고 있는지를 확인하지 않는다. 따라서 --wait-timeout 옵션으로 300초 정도 지연을 걸어서 KUDO 관련 리소스들이 구성될 시간을 주는 것이 좋다.

KUDO가 정상적으로 동작하고 있는지는 kudo-controller-manager-0 파드가 정상적으로 실행되고 있는지를 확인하면 된다.

$ kubectl get -n kudo-system pod

NAME                        READY   STATUS    RESTARTS   AGE
kudo-controller-manager-0   1/1     Running   0          11m

KUDO 관련 리소스들은 아래와 같이 확인할 수 있다.

$ kubectl api-resources --api-group kudo.dev

NAME               SHORTNAMES   APIGROUP   NAMESPACED   KIND
instances                       kudo.dev   true         Instance
operators                       kudo.dev   true         Operator
operatorversions                kudo.dev   true         OperatorVersion

KUDO Upgrades

KUDO 업그레이드는 KUDO 초기화 명령을 그대로 사용하며, --upgrade 옵션을 추가하는 것이다. 기존 초기화에 사용했던 옵션들을 똑같이 지정해 줘야 한다. 그렇지 않으면 KUDO의 기존 초기화 정보를 올바르게 감지하지 못하고 업그레이드가 중단된다.

예를 들어 아래와 같이 설치를 했다면

$ kubectl kudo init --namespace kudo-custom --service-account my-kudo-sa

업그레이드는 위의 명령에 --upgrade 옵션만 추가하는 형식이 되어야 한다.

$ kubectl kudo init --upgrade --namespace kudo-custom --service-account my-kudo-sa

주된 옵션들은 다음과 같다.

  • --namespace
  • --service-account
  • --unsafe-self-signed-ca

KUDO Uninstall

현재 Uninstall은 명령이 통합되어 있지 않기 때문에 아래와 같이 처리해야 한다.

$ kubectl kudo init --unsafe-self-signed-webhook-ca --upgrade --dry-run --output yaml | kubectl delete -f -

위 명령을 통해서 설치된 모든 KUDO CRDs 와 Deployments 등의 리소스들이 클러스터에서 삭제된다.

주의

  • init --upgrade 명령을 사용하는 것이기 때문에 init 명령에 지정한 옵션을 동일하게 지정해야 한다.
  • 이 명령은 설치된 모든 Operator들을 삭제한다. 따라서 실행 이전에 검토를 해야 한다.

How to Debug KUDO

현재 별도로 제공하는 Debugging은 없고 log 파일을 확인하는 것이 어떤 일이 발생했는지를 파악하는 가장 좋은 방법이다.

kubectl logs -n kudo-system kudo-controller-master-0

How to Create an Operator from Scratch

KUDO CLI를 이용해서 KUDO Operator 구조를 생성하고 Operator를 생성하는 단계별 내용을 확인한다.

  1. Create the Core Operator Structure

    # create operator folder
    $ mkdir first-operator
    $ cd first-operator
    
    $ kubectl kudo package new first-operator -i -w -v 100 --validate-install
    
    Operator Name: first-operator
    Operator directory: operator
    Operator Version: 0.1.0
    m: 0.1.0
    Application Version: 0.1.0
    Required KUDO Version: 0.17.2
    Required Kubernetes Version: 0.16.0
    Project URL: 
    Maintainer Name: ccambo
    Maintainer Email: ccambo@gmail.com

    생성된 Operator 패키지 구조는 tree . 명령으로 확인할 수 있다.

    $ tree .
    
    .
    └── operator
        ├── operator.yaml
        └── params.yaml
    
    1 directory, 2 files

    참고

    • -i : 사용자가 직접 입력할 수 있도록 프롬프트를 나타내는 옵션
    • -w : 이미 존재하는 디렉터리와 파일을 overwrite 하는 옵션
    • -v 100 : verbose log로 100줄 출력 옵션
    • --validate-install : 설치할 때를 가정해서 검증하는 옵션

    생성된 기본 Operator.yaml의 내용은 아래와 같다.

    apiVersion: kudo.dev/v1beta1
    appVersion: 0.1.0
    kubernetesVersion: 0.16.0
    kudoVersion: 0.17.2
    maintainers:
    - email: ccambo@gmail.com
      name: ccambo
    name: first-operator
    operatorVersion: 0.1.0
    plans:
      deploy:
        phases:
        - name: deploy
          steps:
          - name: deploy
            tasks:
            - deploy
          strategy: serial
        strategy: serial
    tasks:
    - kind: Apply
      name: deploy
      spec: {}

참고

기본적으로 deploy planApply 형식의 deploy task 가 기본 생성되어 있다. 이 부분이 아래의 내용을 처리하면서 기존에 존재하는 것을 갱신하는 명령이 없기 때문에 충돌 문제를 발생시키므로 처음에 삭제를 하고 시작하는 것이 좋다. (현재 CLI 버전과 문서의 내용이 일치하지 않는다)
따라서 아래와 같이 operator/operator.yaml 파일의 내용을 다음과 같이 처리하도록 한다.

apiVersion: kudo.dev/v1beta1
appVersion: 0.1.0
kubernetesVersion: 0.16.0
kudoVersion: 0.17.2
maintainers:
- email: ccambo@gmail.com
  name: ccambo
name: first-operator
operatorVersion: 0.1.0
plans:{}
tasks:[]
  1. Add a Maintainer

    위 단계에서 -i 옵션으로 지정했으면 처리할 필요가 없지만, 여러 사람들을 등록할 경우라면 추가할 수 있다.

    $ kubectl kudo package add maintainer "<your name>" "<mail address>"
  2. Add a Task

    이 명령은 Operator의 실제 작업 단위인 Task를 추가하는 것이다.

    kubectl kudo package add task -i -v 100 --validate-install
    folder walking through directory operator
    folder walking through directory templates
    Task Name: app
    ✔ Apply
    Task Resource: deployment
    ✗ Add another Resource: 
    folder walking through directory operator
    folder walking through directory templates
  3. Add a Plan

    이 명령은 Operator가 처리될 떄 작업할 Plan을 추가하는 것이다.

    $ kubectl kudo package add plan -i -v 100 --validate-install
    folder walking through directory operator
    folder walking through directory templates
    folder walking through directory operator
    folder walking through directory templates
    Plan Name: deploy
    ✔ serial
    Phase 1 name: main
    ✔ parallel
    Step 1 name: everything
    ✔ app
    ✗ Add another Task: 
    ✗ Add another Step: 
    ✗ Add another Phase: 
    folder walking through directory operator
    folder walking through directory templates

    Plan > Phase > Step > Task 순으로 지정되며, Task, Step, Phase는 여러 개를 지정할 수 있고, Plan, Phase는 순차처리 (Serial) 또는 병행처리 (Parallel) 를 선택해서 지정할 수 있다.
    여기서는 app Task를 deploy plan > main phase > everyting step 에 설정하는 단순한 샘플로 처리한 것이다.

    여기까지 구성된 전체 Operator.yaml의 내용은 다음과 같다.

    apiVersion: kudo.dev/v1beta1
    appVersion: 0.1.0
    kubernetesVersion: 0.16.0
    kudoVersion: 0.17.2
    maintainers:
    - email: ccambo@gmail.com
      name: ccambo
    name: first-operator
    operatorVersion: 0.1.0
    plans:
      deploy:
        phases:
        - name: main
          steps:
          - name: everything
            tasks:
            - app
          strategy: parallel
        strategy: serial
    tasks:
    - kind: Apply
      name: app
      spec:
        resources:
        - deployment.yaml
  4. Add a Parameter

    이 명령은 Operator가 동작할 때 제공할 Parameter 정보를 지정하는 것으로 정의는 operator/params.yaml 로 저장되고, 이 파라미터를 사용하는 곳은 operator/tempates/ 디렉터리 밑에 추가할 리소스 파일에서 사용하는 방식이다.

    $ kubectl kudo package add parameter -i -v 100 --validate-install
    folder walking through directory operator
    folder walking through directory templates
    folder walking through directory operator
    folder walking through directory templates
    Parameter Name: replicas
    Default Value: 2
    Display Name: Replicas
    ✔ Display Name: Replicas
    ✔ Description: Number of replicas that should be run as part of the deployment
    ✔ false
    ✗ Add Trigger Plan (defaults to deploy): 
    folder walking through directory operator
    folder walking through directory templates

    Add Trigger Plan (defaults to deploy)는 파라미터가 변경되었을 때 호출된 plan을 지정하는 것으로 설정하지 않아도 기본적으로 deploy plan이 동작한다는 의미이며, 다른 plan을 지정할 경우는 plan 이름을 명기하면 된다.

    실제 파라미터 정보는 아래와 같이 operator/params.yaml 파일에 추가된다.

    apiVersion: kudo.dev/v1beta1
    parameters:
    - default: "2"
      description: Number of replicas that should be run as part of the deployment
      displayName: Replicas
      name: replicas
  5. Add Resource Templates

    지금까지의 작업을 통해서 첫 번째 Operator를 생성했다. 하지만 실제 사용할 Deploy Task에 지정된 deployment 리소스를 구성해야 하는 작업이 남았다. templates/deployment.yaml 파일을 생성하고 아래와 같이 실제 작업을 지정해 줘야 한다.

    cat << EOF > operator/templates/deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      selector:
        matchLabels:
          app: nginx
      replicas: {{ .Params.replicas }}
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx:1.7.9
              ports:
                - containerPort: 80
    EOF

    위의 내용에서 보이는 {{ .Params.replicas }}.Params 는 실제 operator/params.yaml 파일의 내용을 의미하고, .replicas는 정의된 파라미터를 의미하는 것이다.

지금까지의 작업으로 완전히 동작할 수 있는 아주 간단한 첫 번쨰 Operator를 구성했다.

How to Package a KUDO Operator

KUDO를 통해서 (정확히는 KUDO Operator) Operator 패키지를 배포하기 위해서는 tarball로 패키징을 해야 한다. KUDO CLI는 패키지 구성에 대한 검증을 포함해서 패키지를 만들 수 있다.

  1. Packing operator

    이 작업은 구성한 Operator를 실제 KUDO에 설치하기 위한 Package로 생성하는 부분으로 Local Repository Directory를 구성하고 Tarball을 생성하는 작업이다.

    $ rm -rf ~/kudo_sample/repo
    $ mkdir -p ~/kudo_sample/repo
    
    # 상대적인 경로를 사용한다. 이 명령은 first-operator 디렉터리에서 실행한 것이다.
    $ kubectl kudo package create ~/kudo_sample/first-operator/operator/ --destination=~/kudo_sample/repo -w -v 100 --validate-install
    folder walking through directory operator
    folder walking through directory templates
    package is valid
    folder walking through directory operator
    folder walking through directory templates
    Package created: /home/centos/kudo_sample/repo/first-operator-0.1.0_0.1.0.tgz

    주의

    실제 Packaging 되는 대상은 operator 디렉토리에 있는 operator.yaml, params.yaml, templates/* 만 등록되어야 한다. 따라서 Operator 대상 폴더를 잘 지정해 줘야 한다.
    현재 경로를 기준으로 ./operator/ 로 지정하면 이상하게 operator/operator.yaml, operator/params.yaml, operator/templates/* 로 처리되어 Package에 대한 index를 생성할 때 Invalid 오류가 발생하게 된다.
    생성된 후에 vim을 이용해서 tarball 이 제대로 생성되었는지 확인이 필요하다.

  2. Check the builted package

    로컬 repo 디렉터리인 ~/kudo_sample/repo를 확인하면 생성된 패키지를 볼 수 있다.

    $ ls ~/kudo_sample/repo
    first-operator-0.1.0_0.1.0.tgz

How to Add an Operator to a Repository

리포지토리에 Operator를 추가하는 아주 간단한 방법을 살펴본다. 예제로는 Community라는 리포지토리를 사용하며 관리 권한이 있어야 한다.

  • 리포지토리를 서비스할 수 있는 read/write 권한을 가지는 웹 기반 서버가 필요하다.
  • 위에서 만든 first-operator가 존재하는 로컬 ~/kudo_sample/repo 경로를 사용한다.
  1. Check repository

    설치된 KUDO가 기본적으로 바라보고 있는 리포지토리를 확인한다.

    $ kubectl kudo repo list
    
    NAME            URL                                              
    *community      https://kudo-repository.storage.googleapis.com/v1

    NAME 앞에 * 표시는 기본 리포지토리임을 나타낸다.

  2. Build an index file

    $ kubectl kudo repo index --merge-repo community --url-repo community -w -v 100 --validate-install ~/kudo_sample/repo 
    repo configs: { name:community, url:https://kudo-repository.storage.googleapis.com/v1 }
    
    WARNING: operator: /home/centos/kudo_sample/repo/first-operator-0.1.0_0.1.0.tgz is invalid     ### 이 경우가 제대로 폴더구조가 생성되지 않았을 떄 발생하는 오류 indexing 처리되지 않는다.
    repo configs: { name:community, url:https://kudo-repository.storage.googleapis.com/v1 }
    
    index /home/centos/kudo_sample/repo/index.yaml created.

    참고

    Operator Invalid 상태가 되면 대 부분 tarball의 내용이 잘 못되어 있기 때문에 Package를 create될 때는 처리 상의 문제가 없으면 valid 상태로 나타난다. 생성된 index.yaml을 열어 보면 누락된 것을 확인할 수 잆다.

위의 작업은 KUDO 가 바라보고 있는 Community 리포지토리에서 index.yaml 파일을 다운로드해서 ~/kudo_sample/repo 폴더에 존재하는 Operator들을 Index.yaml 파일에 추가(머지)하는 것이다. 이때 사용할 URL은 Community URL을 그대로 사용하고 있는 것을 확인할 수 있다.

이제 ~/kudo_sample/repo의 모든 내용을 Community 리포지토리에 upload 하면 된다. 그러나 Community URL에 우리가 작성한 Operator를 등록할 수는 없으니 다음 내용과 같이 웹 서버로 구성된 곳의 URL을 사용하는 것으로 처리하면 된다.

How to host an Operator in a Local Repository

참고

이 글은 테스트용으로 정리된 것이기 때문에 실제 호스팅 가능한 웹 서버를 구축한 것이 아니고, 단순히 ~/kudo_sample/repo 디렉터리를 올려서 테스트하기 위한 용도로 python3의 http server 기능을 사용한다.

  1. local repository 폴더에 index 파일 생성

    이 작업은 작성한 Operator에 대한 index.yaml 파일을 생성해서 설치할 때 Operator를 식별하는 인덱스처럼 활용하기 위한 것이다.

    현재 작업은 http://localhost:8090으로 할 것이기 때문에 이 옵션을 줘야 한다. (생략하면 http://localhost:80 인 것으로 설정된다.)

    $ kubectl kudo repo index -w -v 100 --validate-install --url http://localhost:8090 ~/kudo_sample/repo 
    WARNING: operator: /home/centos/kudo_sample/repo/first-operator-0.1.0_0.1.0.tgz is invalid   ### 이 경우가 제대로 폴더구조가 생성되지 않았을 떄 발생하는 오류 indexing 처리되지 않는다.
    index /home/centos/kudo_sample/repo/index.yaml created.

    주의

    Opeartor Invalid 오류가 발생하면 Packaging 처리부터 경로를 잘 지정하고 다시 작업해야 한다.

    index.yaml 파일에 생성된 결과는 다음과 같다.

    apiVersion: v1
    entries:
      first-operator:
      - appVersion: 0.1.0
        digest: 3360ca9dd47d885982aac2972b170e576eeb54aa82f46302c1b409602475fa50
        maintainers:
        - email: ccambo@gmail.com
          name: ccambo
        name: first-operator
        operatorVersion: 0.1.0
        urls:
        - http://localhost/first-operator-0.1.0_0.1.0.tgz
  2. HTTP Server 실행

    $ cd ~/kudo_sample/repo
    
    $ python3 -m http.server 8090   
    Serving HTTP on 0.0.0.0 port 8090 (http://0.0.0.0:8090/) ...
  3. local repository를 kudo client에 등록

    이 작업은 내부에서 운영 중인 (이 문서에서는 로컬 머신에서 운영되는) http server를 KUDO Client에 등록해서 인식시키는 작업이다.

    $ kubectl kudo repo add -v 10 --validate-install local http://localhost:8090
    repo configs: { name:community, url:https://kudo-repository.storage.googleapis.com/v1 }
    
    "local" has been added to your repositories

    설치가 제대로 되었는지는 아래의 명령으로 확인 가능하다.

    $ kubectl kudo repo list
    NAME            URL                                              
    *community      https://kudo-repository.storage.googleapis.com/v1
    local           http://localhost:8090

    참고

    이미 생성된 Repository를 갱신하는 기능은 없다. 따라서 kubectl kudo repo remove -v 10 --validate-install local 명령으로 삭제하고 다시 생성해야 한다.

  4. local repository를 kudo context의 기본 repository로 설정

    $ kubectl kudo repo context local
    
    $ kubectl kudo repo list
    NAME            URL                                              
    community       https://kudo-repository.storage.googleapis.com/v1
    *local          http://localhost:8090
  5. local repository를 기준으로 설치 검증

    상세 출력을 해주는 -v 옵션을 사용하면 Operator가 설치되는 위치에서 추적이 가능해 진다.

    $ kubectl kudo install --wait -v 50 --validate-install first-operator
    repo configs: { name:community, url:https://kudo-repository.storage.googleapis.com/v1 },{ name:local, url:http://localhost:8090 }
    
    repository used { name:local, url:http://localhost:8090 }
    Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
    acquiring kudo client
    getting operator package
    no local operator discovered, looking for http
    no http discovered, looking for repository
    getting package reader for first-operator, _
    repository using: { name:local, url:http://localhost:8090 }
    attempt to retrieve package from url: http://localhost:8090/first-operator-0.1.0_0.1.0.tgz
    first-operator is a repository package from { name:local, url:http://localhost:8090 }
    Preparing default/first-operator:0.1.0 for installation
    parameters in use: map[]
    operator.kudo.dev default/first-operator does not exist
    
    operator default/first-operator created
    operatorversion default/first-operator-0.1.0-0.1.0 created
    instance first-operator-instance created in namespace default
    instance default/first-operator-instance created
    plan status for instance "first-operator-instance" is not available
    
    instance plan "deploy" is not not finished running: true, term: false, finished: false
    ...
    instance plan "deploy" is not not finished running: true, term: false, finished: false
    plan status for "first-operator-instance" is finished
    
    instance default/first-operator-instance ready

    참고

    Operator install 에는 상당히 많은 옵션들이 존재한다. kubectl kudo install --help를 통해서 옵션들을 확인하고 적절하게 사용하면 된다.

    위와 같이 명령어의 출력을 통해서 설치를 확인할 수도 있으며, 실행되고 있는 로컬 웹 서버의 출력을 통해서도 확인이 가능하다.

    $ python3 -m http.server 8090   
    Serving HTTP on 0.0.0.0 port 8090 (http://0.0.0.0:8090/) ...
    127.0.0.1 - - [17/Dec/2020 08:14:06] "GET /index.yaml HTTP/1.1" 200 -
    127.0.0.1 - - [17/Dec/2020 08:14:06] "GET /first-operator-0.1.0_0.1.0.tgz HTTP/1.1" 200 -

    이제 설치된 정보들을 확인해 봐야 한다.

    # deploy plan으로 생성된 Pod 확인 (replicas 파라미터의 기본 값 2 적용)
    $ kubectl get pod
    NAME                                READY   STATUS    RESTARTS   AGE
    nginx-deployment-77cfbb848f-4tgss   1/1     Running   0          3m17s
    nginx-deployment-77cfbb848f-dngpl   1/1     Running   0          3m17s
    
    # parameter를 변경해서 적용되는지 검증 (replicas 파라미터를 4로 변경 검증)
    $ kubectl kudo update --wait -v 10 --validate-install --parameter replicas=4 --instance first-operator-instance
    Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
    instance plan "deploy" is not not finished running: true, term: false, finished: false
    instance plan "deploy" is not not finished running: true, term: false, finished: false
    instance plan "deploy" is not not finished running: true, term: false, finished: false
    plan status for "first-operator-instance" is finished
    
    Instance first-operator-instance was updated.
    
    # 변경된 내용 검증
    $ kubectl get pod
    NAME                                READY   STATUS    RESTARTS   AGE
    nginx-deployment-77cfbb848f-2bgjg   1/1     Running   0          50s
    nginx-deployment-77cfbb848f-4tgss   1/1     Running   0          19m
    nginx-deployment-77cfbb848f-dngpl   1/1     Running   0          19m
    nginx-deployment-77cfbb848f-kqh5f   1/1     Running   0          50s
    
    # 설치된 Custom Opserator 정보 확인
    $ kubectl kudo get all
    Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
    List of current installed operators including versions and instances in namespace "default":
    .
    └── first-operator                     # Opserator
        └── first-operator-0.1.0-0.1.0     # OperatorVersion
            └── first-operator-instance    # OpseratorInstance
    
    # OperatorInstance 의 Plan 상태 확인
    $ kubectl kudo plan status --instance=first-operator-instance
    Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
    Plan(s) for "first-operator-instance" in namespace "default":
    .
    └── first-operator-instance (Operator-Version: "first-operator-0.1.0-0.1.0" Active-Plan: "deploy")
        └── Plan deploy (serial strategy) [COMPLETE], last updated 2020-12-17 08:54:59
            └── Phase main (parallel strategy) [COMPLETE]
                └── Step everything [COMPLETE]
    
    # 진단
    $ kubectl kudo diagnostics collect --instance=first-operator-instance
    Collect ResourceGroup for 3 collectors
    Collect Logs for 4 pods
    Collect Logs for 1 pods
    
    위의 명령은 수집된 데이터를 현재 경로의 diag 폴더에 생성한다. KUDO와 설치된 Operator에 대한 각종 리소스들과 로그들을 확인할 수 있다.
    
    # Operator 삭제
    $ kubectl kudo uninstall --instance=first-operator-instance
    Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
    instance.kudo.dev/v1beta1/first-operator-instance deleted
    
    이 명령은 실제 구동되는 대상인 OperatorInstance와 연계된 리소스들 (Deployments, Pods, ...)을 제거하지만, Operator와 OperatorVersion은 삭제하지 않는다.

참고 자료

댓글