CRD를 사용하여 Kubernetes API 확장

Kubernetes는 개발자에게 플랫폼을 제공하여 전체 호스트 그룹에서 응용 프로그램 용기의 배치, 확장과 조작을 자동화할 수 있다. 용기의 배열에 있어 Kubernetes는 자신의 방식을 진정으로 공고히 하여 사실상의 표준이 되었다.
Kubernetes가 있으면 언제든지 필요할 때 데이터를 새 버전으로 옮길 수 있고, 더욱 효율적으로 업데이트를 발표할 수 있습니다.이것은 사용자가 필요에 따라 위아래로 응용 프로그램을 확장할 수 있는 옵션을 제공합니다. 응용 프로그램과 다른 응용 프로그램이나 현실 세계의 상호작용 방식을 선택할 수 있습니다.
이 문서에서는 다음을 다룹니다.
  • CRD
  • 소개
  • 어떻게 작동하는지
  • 어떻게 만듭니까!
  • CRD
  • 삭제 방법
  • 리트머스에 사용된 실제 CRD 예
  • 본고가 끝날 때, 당신은 CRs가 무엇인지, CRD가 어떻게 작동하는지, 그리고 Litmus가 어떻게 일상적인 용례에서 그것들을 실현하는지 철저히 이해할 것입니다.

    리소스 및 사용자 지정 리소스


    Kubernetes는 이른바 자원을 이용함으로써 이런 기능을 대량으로 제공할 수 있다.리소스는 모든 유형의 API 객체를 저장할 수 있는 k8s API의 끝점입니다.그러나 개발자가 특정한 수요에 기반한 사용자 정의 대상이나 자원을 필요로 한다면 어떻게 해야 합니까?이것이 바로 맞춤형 자원의 원천이다.
    Kubernetes 1.7 버전의 일부로서, 그들은 사용자 정의 자원 개념을 도입하여, 응용 프로그램에 유용한 모든 종류의 API 대상을 추가함으로써 기능을 확장했다.사용자 정의 리소스 정의(CRD)는 사용자 정의 리소스를 정의하는 데 사용됩니다.이것은 Kubernetes 기능을 기본 설치 이외로 확장하는 강력한 방법입니다.

    사용자 정의 자원은 어떻게 작동합니까?


    위에서 말한 바와 같이, 우리가 Kubernetes에서 만든 거의 모든 것은 하나의 자원이다.하나의 크레인, 하나의 서비스, 하나의 배치, 또는 하나의 비밀은 모두 그 가장 기본적인 형식인 자원 중 하나이다.이 자원들은 보통 자원 중의 정보를 얻고 이를 유용한 정보로 바꾸는 컨트롤러 모니터링을 담당한다.
    Pod 자원을 만들 때 발생하는 상황을 예로 들겠습니다.리소스를 추가, 변경 또는 업데이트하는 Pod 리소스를 수정할 때마다 변경 사항에 대한 알림을 받는 컨트롤러가 있습니다.컨트롤러가 Pod 자원이 추가되거나 업데이트되는 것을 볼 때마다, 컨트롤러는 자원에서 정보를 찾고 다음 단계에 무엇을 할지 결정합니다.새 Pod의 경우 워크로드를 실행할 노드를 결정하고 해당 노드에 할당합니다.그리고 이 노드의 다른 컨트롤러가 이 작업을 받아들여 회전에 필요한 용기를 확보합니다.
    사용자 정의 자원은 사용자 정의 자원 정의를 사용합니다. 이것이 바로 CRD가 아니라 CRD로 줄인 이유입니다. CRD를 만들면 Kubernetes API 서버는 CRD에서 지정한 버전마다 RESTful 경로를 만듭니다.CRD 파일에 정의된 범위에 따라 경로는 전체 클러스터에서 전역적으로 액세스하거나 특정 프로젝트에서만 액세스할 수 있습니다.CR이 CRD로 정의되면 etcd 클러스터에 저장됩니다.Kubernetes API 서버는 리소스 라이프 사이클 및 복제를 담당합니다.이 동작은 본체 자원과 유사하며, 항목을 삭제할 때 모든 사용자 정의 자원과 본체 자원도 삭제됩니다.

    CRD 작성


    CRD를 만들려면 먼저 Kubernetes 1.7 이상의 버전 및 kubectl 도구를 설치해야 합니다.Kubernetes 세계의 많은 다른 파일들처럼 CRD도 YAML 파일의 도움으로 만들 수 있습니다.CRD YAML 파일은 다음과 같은 몇 개의 필드로 구성되어 있습니다.

  • 메타데이터이름: 생성 중인 CRD의 이름

  • spec.group: CRD 객체가 속한 그룹의 이름입니다.

  • spec.versions: 만들 사용자 정의 자원의 다른 버전을 저장합니다.

  • 규격명칭: 사용자 정의 자원을 어떻게 설명하는지 정의하는 데 사용됩니다.이 곳에서 CR의 복수, 단수, 짧은 이름을 추가할 수 있습니다. 이것은 이후kubectl을 통해 관리할 때 매우 편리합니다.

  • 규격명.종류: CRD를 사용하여 작성할 수 있는 CR의 종류를 정의합니다.예를 들어 배포, CronJob, CronTab 등이 있습니다.

  • spec.scope: CR의 범위를 정의합니다. '집단' 이나 '명칭 공간' 으로 설정할 수 있습니다.기본적으로 이름 공간으로 설정됩니다.
  • 다음 목록에는 CRD ourcrd.yaml의 예가 나와 있습니다.
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: crdname.demo.example.com
    spec:
      scope: Namespaced
      group: demos.example.com
      names:
        kind: Foo
        singular: crdname
        plural: crdnames
        shortNames:
        - cn
      versions:
        - name: v1
          served: true
          storage: true
          schema:
            openAPIV3Schema:
              type: object
              description: "A foo object"
              properties:
                spec:
                  type: object
                  properties:
                    value1:
                      type: string
                      default: "Default value"
                    value2:
                      type: integer
    
    우리는 단지 사용만 하면 된다
    kubectl create -f ourcrd.yaml
    
    kubectl에서 CRD를 만들면 사용자 정의 객체를 만들고 관리할 수 있는 끝점 URL이 생성됩니다.이 끝점을 만드는 데 몇 초가 걸릴 수 있습니다.
    "그래! 너무 멋있어. 그런데 어떻게/어디서 사용해야 하지?"라고 물어볼 수도 있어.이것은 네가 그것을 사용할 수 있는 예이다.
    CRD가 만든 목록을 사용해서 목록을 만듭니다.예: my-kind.yaml
    apiVersion: "demo.example.com/v1"
    kind: Foo [The same kind we declared in the CRD]
    metadata:
      name: demo-app
    spec:
      value1: "Hello Developers"
      value2: 92
    
    여기서 우리는 CRD에서 정의한 같은 종류를 사용하고, 우리가 원하는 종류의 대상이 가지고 있는 필드를 정의합니다.이 예에서, Google은 프로그램에value1과value2 필드를 제공합니다. (예를 들어 CRD에서 제공한 것)실제 예에서 이러한 필드는 이미지, URI 등일 수 있습니다.
    현재, 만약 우리가 kubectl create -f my-kind.yaml을 실행한다면, 우리의 응용 프로그램은 위의 목록으로 만든 데이터를 사용할 수 있습니다.현재 발생하고 있는 일을 보려면 kubectl get cn -o yaml을 실행하고, 우리가 방금 만든 내용에 대한 상세한 정보를 볼 수 있습니다.

    cn is the short name we gave to our CRD above


    CRD 삭제


    우리가 만든 CRD와 자원을 삭제하려면 다른 자원을 실행하는 것처럼kubectl delete를 실행하십시오.CRD를 삭제하면 서버에서 CRD로 만든 RESTful 끝점을 제거합니다.CRD를 삭제하면 해당 CRD를 사용하여 만든 모든 사용자 지정 리소스도 삭제되어 검색할 수 없습니다.

    CRD의 실제 예


    우리의 여정의 마지막 부분에서 진정한 프로젝트가 이러한 개념을 어떻게 활용하여 그들의 수요를 확장하고 실제적으로 실현하는지 살펴보자.
    리트머스를 예로 들어 CRD를 연구할 프로젝트로 삼겠습니다.

    Litmus는 혼돈 프로젝트를 실천하는 틀이다.Litmus는 혼돈의 산수를 제공하여 hub, documentation과 우호적인 community에서 대량의 혼돈 실험을 진행하였다.리트머스는 사용하기 쉽다.리트머스 실험을 아주 잘 설치하고 실행할 수 있는 프로그램도 설정할 수 있습니다.
    리트머스의 몇 가지 중요한 CRD는 다음과 같습니다.
  • 조센 엔진
  • 조주시험
  • 결과
  • ChaosEngine: ChaosEngine CR은 지정된 응용 프로그램에 대해 만들어지고 appLabel로 표시됩니다.이 CR은 하나 이상의 ChaosExperiments를 응용 프로그램에 바인딩합니다.
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: chaosengines.litmuschaos.io
    spec:
      group: litmuschaos.io
      names:
        kind: ChaosEngine
        listKind: ChaosEngineList
        plural: chaosengines
        singular: chaosengine
      scope: Namespaced
      validation:
        openAPIV3Schema:
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this representation
                of an object. Servers should convert recognized schemas to the latest
                internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this
                object represents. Servers may infer this from the endpoint the client
                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            spec:
              type: object
              properties:
                monitoring:
                  type: boolean
                jobCleanUpPolicy:
                  type: string
                  pattern: ^(delete|retain)$
                  # alternate ways to do this in case of complex pattern matches
                  #oneOf:
                  #  - pattern: '^delete$'
                  #  - pattern: '^retain$'
                annotationCheck:
                  type: string
                  pattern: ^(true|false)$
                appinfo:
                  type: object
                  properties:
                    appkind:
                      type: string
                      pattern: ^(^$|deployment|statefulset|daemonset|deploymentconfig|rollout)$
                    applabel:
                      type: string
                    appns:
                      type: string
                auxiliaryAppInfo:
                  type: string
                engineState:
                  type: string
                  pattern: ^(active|stop)$
                chaosServiceAccount:
                  type: string
                components:
                  ...
                experiments:
                  type: array
                  items:
                     ...
            status:
              type: object
      version: v1alpha1
      versions:
        - name: v1alpha1
          served: true
          storage: true
    
    ChaosPerient: ChaosPerient CR을 만드는 것은 응용 프로그램의 실제 혼란스러운 세부 사항을 저장하고 조작하기 위해서입니다.그것은 실험 유형과 실험의 관건적인 파라미터를 정의했다.
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: chaosexperiments.litmuschaos.io
    spec:
      group: litmuschaos.io
      names:
        kind: ChaosExperiment
        listKind: ChaosExperimentList
        plural: chaosexperiments
        singular: chaosexperiment
      scope: Namespaced
      subresources:
        status: {}
      validation:
        openAPIV3Schema:
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this representation
                of an object. Servers should convert recognized schemas to the latest
                internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this
                object represents. Servers may infer this from the endpoint the client
                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            spec:
              type: object
              properties:
                ...
            status:
              type: object
      version: v1alpha1
      versions:
        - name: v1alpha1
          served: true
          storage: true
    
    ChaosResult: ChaosResult CR은 실험이 실행된 후에 운영자가 작성합니다.각 ChaosEngine 은 ChaosResult CR 을 유지 관리합니다.ChaosResult CR은 지정된 ChaosExperiment를 이해하는 데 도움이 됩니다.이 CR은 매우 유용한 혼돈 분석을 생성하는 데 사용된다. 예를 들어 일부 구성 요소가 혼돈 실험 사이에서 업그레이드될 때 결과는 비교하기 쉽다
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: chaosresults.litmuschaos.io
    spec:
      group: litmuschaos.io
      names:
        kind: ChaosResult
        listKind: ChaosResultList
        plural: chaosresults
        singular: chaosresult
      scope: Namespaced
      validation:
        openAPIV3Schema:
          properties:
            apiVersion:
              description: 'APIVersion defines the versioned schema of this representation
                of an object. Servers should convert recognized schemas to the latest
                internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'
              type: string
            kind:
              description: 'Kind is a string value representing the REST resource this
                object represents. Servers may infer this from the endpoint the client
                submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'
              type: string
            metadata:
              type: object
            spec:
              type: object
            status:
              type: object
      version: v1alpha1
      versions:
        - name: v1alpha1
          served: true
          storage: true
    

    To take a wider look at the CRs visit here. You'd find the CRDs of Cluster Workflows, Cron Workflows, etc


    결론


    봐라, 너는 CRD의 개념과 그것을 어떻게 만드는지 성공적으로 이해했다.물론, 너는 이러한 기능을 확장하고, 그것들을 이용하여 자신의 것을 창조할 수 있다.우리는 모두가 평론을 발표하여 우리가 이러한 설정을 개선하여 더욱 많은 기능을 실현할 수 있음을 알게 하는 것을 환영한다.당신의 모든 건의에 감사 드립니다.
    사용자 정의 자원은 Kubernetes가 사용자에게 제공하는 믿을 수 없는 기능에 새로운 기능을 추가한 것으로 정의됩니다.CRD는 Kubernetes의 기능을 확장하여 더욱 일반적인 용기 배열 도구로 만드는 데 도움이 된다.사용자 정의 자원을 사용하여 자신의 자원을 추가하여 특정한 수요를 충족시킬 수 있습니다.또한 로컬 Kubernetes 서비스를 사용하는 것과 같이 이 자원을 사용할 수 있으며, 보안, RBAC, API 서비스, CLI 등 Kubernetes가 제공하는 모든 기능을 이용할 수 있습니다.동적 등록을 사용하여 그룹이 실행될 때 사용자 정의 자원을 표시하고 사라질 수 있습니다.

    당신은 SRE입니까 아니면 Kubernetes 애호가입니까?Chaos Engineering이 당신을 흥분시켰습니까?
    저희 Slack 커뮤니티에 가입하여 Kubernetes의 혼돈 프로젝트에 대해 상세한 토론, 피드백과 정기적인 업데이트를 진행합니다. https://kubernetes.slack.com/messages/CNXNB0ZTN
    (#Kubernetes 작업공간의 리트머스 채널)

    Litmus Chaos GitHub repo 보기 및 피드백 공유: https://github.com/litmuschaos/litmus
    필요한 변경 사항이 발견되면 pull request을 제출하십시오.
    이익을 얻을 수 있다고 생각하는 사람들과 이 자원을 공유하는 것을 잊지 마라.잠잠해지다.✌🏼

    좋은 웹페이지 즐겨찾기