Рубрики
Uncategorized

Расширить свои API Kubernetes с CRD

После предоставления разработчикам с платформой для автоматизации развертывания, масштабирования и операций приложения … Теги с DEVOPS, учебником, производительностью, Литмусчаосом.

После предоставления разработчикам платформы для автоматизации развертывания, масштабирования и операций прикладных контейнеров через кластер хоста Кубернаны действительно был цементировал свой путь, чтобы стать де-факто стандарт Когда дело доходит до Контейнер-оркестровка Отказ

С Kubernetes вы получаете гибкость, чтобы более эффективно развернуть обновления, в зависимости от времени и отвлекать трафик на новую версию, если это необходимо. Он предоставляет вам варианты масштабирования вашего приложения вверх и вниз на основе вашего требования, вы можете выбрать, как ваше приложение взаимодействует с другими приложениями или реальным миром.

В этой статье мы посмотрим на:

  • Что такое CRD
  • Как они работают
  • Как вы можете создать один!
  • Как удалить карты
  • Примеры реальной жизни CRD в использовании внутри Литмус

К концу этой статьи у вас будет тщательное понимание того, что такое CRS, как работают CRD и как Литм также реализует их для своего ежедневного использования.

Ресурс и пользовательский ресурс

Kubernetes позволяет предоставить множество таких функций, как это, используя то, что известно как Ресурс Отказ А Ресурс Это конечная точка в API K8S, который позволяет хранить объект API любого рода. Но что, если разработчики нуждаются в пользовательском объекте или ресурсе, основанном на их конкретных требованиях? Это где Пользовательский ресурс входит в картину.

В рамках выпуска Kubernetes 1.7 они представили концепцию пользовательских ресурсов для расширения возможностей путем добавления любого объекта API, полезным для вашего приложения. Пользовательское определение ресурсов (CRD) это то, что вы используете для определения пользовательского ресурса. Это мощный способ расширить возможности Kubernetes за пределами установки по умолчанию.

Как работает пользовательские ресурсы?

Как уже упоминалось выше, в значительной степени все, что мы создаем в Кубернане, это ресурс. POD, сервис, развертывание или секрет, это все в самой основной форме ресурса. Эти ресурсы часто контролируются Контроллеры которые несут ответственность за использование информации на ресурсе и превращать ее в нечто полезное.

Давайте возьмем пример того, что происходит, когда вы создаете ресурс POD. Всякий раз, когда вы модифицируете ресурс POD I.E, вы добавляете, измените или обновите ресурс, есть контроллер Это получает уведомление о перемен. Всякий раз, когда контроллер видит или обновляется или обновляемый ресурс POD, он смотрит на информацию в ресурсе, а затем принимает решение о том, что делать дальше. В случае нового POD он выясняется, какой узел отвечает за выполнение рабочей нагрузки и назначить его этому узлу. Это задание затем поднимается другим контроллером на этом узле, который, в свою очередь, гарантирует, что включает необходимые контейнеры.

Пользовательские ресурсы определяются с использованием пользовательского определения ресурса, и поэтому аббревиатура CRD и не CR. Как только CRD создан, сервер API Kubernetes создает спокойный путь к каждой версии, указанной в CRD. На основании охвата, определенной в файле CRD, путь может быть доступным в глобальном масштабе всей кластером или только для конкретного проекта. CR, однажды определяемый CRD, затем хранится в etcd кластер. Сервер Kubernetes API заботится о жизненном цикле ресурса и репликации. Он действует аналогично нативным ресурсам, и когда проект удаляется, все пользовательские ресурсы и собственные ресурсы также удаляются.

Создание CRD

В качестве предварительной необходимости вам понадобятся Kubernetes 1.7 или выше, и инструмент Kubectl установлен для создания CRD. Как и многие другие файлы в мире CUBERNETES CRD CRD также могут быть созданы с помощью файлов YAML. Файл CRD YAML состоит из нескольких полей, Некоторые из важных однажды перечислены вниз:

  • metadata.name : Имя CRD что вы создаете
  • SPEC.Group : Имя группы CRD объект принадлежит.
  • spec.versions : Он содержит разные версии пользовательских ресурсов, которые будут созданы.
  • spec.names : Используется для определения того, как описать ваш пользовательский ресурс. Вы можете добавить множественное число, единственное и короткие имена вашего CR здесь, который позже может быть удобным, управляя его через Kubectl.
  • spec.names.hind : Определяет тип CR, который может быть создан с использованием CRD. Как Развертывание , Cronjob. , Crontab Отказ
  • Спец .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

Мы можем создать вышеупомянутый CRD, просто используя

kubectl create -f ourcrd.yaml

После создания CRD через KubectL URL EndPoint генерируется, который может использоваться для создания и управления пользовательскими объектами. Эта конечная точка может занять пару секунд, чтобы создать.

У вас может быть этот вопрос: «Хорошо! Что круто, но как/где я бы использовал это? », Ну, вот пример того, как вы можете использовать его.

Давайте создадим проявление, используя вид, которые мы создали с CRD. Например, у нас есть My-ard.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, мы затем определяем поля, которые мы хотим иметь наш добрый объект. Как и в этом примере, мы дали поля значения значения1 и значением2 (как указано в CRD) для нашего приложения. В реальных примерах эти поля были бы чем-то вроде изображение , URI , и т.д.

Теперь, если мы запустим Kubectl Создать -F My-ard.yaml Наше приложение может потреблять данные, которые мы создали с помощью проявления выше. Чтобы увидеть, что происходит, мы можем запустить Kubectl Get. CN -O YAML. Мы можем увидеть подробную информацию о том, что мы только что создали.

CN — это короткое имя, которое мы дали нашему CRD выше

Удаление CRD

Чтобы удалить CRD и ресурсы, которые мы создали, просто запустите Kubectl Delete, как и с любыми другими ресурсами. Когда вы удаляете CRD, сервер удаляет спокойную конечную точку, которая была создана с CRD. С удалением CRD все пользовательские ресурсы, созданные его, также удаляются и не могут быть получены.

Реальный образ жизни CRD

В последнем разделе нашего путешествия давайте на самом деле посмотрим на то, как реальные проекты используют эти концепции, чтобы расширить их требования и фактически их реализовать.

Я собираюсь взять на себя пример Литмуса как проект, чьи CRD, мы собираемся посмотреть.

Litmus — это каркас для практикующей инженерии Chaos в Облако-родные среды Отказ Litmus предоставляет оператор хаоса, большой набор экспериментов хаоса на его Хаб Подробно Документация и дружелюбный сообщество Отказ Litmus очень прост в использовании; Вы также можете настроить очень Быстрая демократическая среда Установить и запустить эксперименты Litmus.

Немногие из важных CRD в Litmus следующие:

  • Chaosengine.
  • Эксперимент Хаоса
  • Chaosresult.

Chaosengine : Chaosengine CR создан для данного приложения и помечен Appleabel. Это Cr связывает один или несколько хаосессеперментов к приложению.

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

Chaosexperiment : Chaosexperiment 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 создается оператором после прогона эксперимента. Один Chaosresult CR поддерживается на хаосингин. CHAOSRESULT CR полезен в том, чтобы иметь смысл данного хаосессепермента. Этот 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

Взять более широкий взгляд на CRS Визит здесь Отказ Вы бы найдете CRD на кластерных рабочих процессов, CRON WorksPlows и т. Д.

Вывод

Вуаля, вы успешно узнали о концепции CRD и как их создавать. Вы можете, конечно, расширить эти и играть, чтобы создать что-то свое собственное. Мы приветствуем всех комментарий и дайте нам знать о том, что/как мы можем улучшить эти конфигурации для достижения большего количества! Каждое предложение ценится.

Пользовательское определение ресурсов добавляет к невероятным функциям Kubernetes уже предлагает своим пользователям. CRD помогает расширить функции Kubernetes помогает сделать его еще более универсальным инструментом для оркестрации контейнера. Вы можете использовать пользовательские ресурсы, чтобы добавить свои собственные ресурсы, которые помогут вам конкретные требования. И, вы можете использовать эти ресурсы, такие как любые собственные службы Kubernetes и используют все функции Kubernetes, чтобы предложить как безопасность, RBAC, API и CLI. Вы также можете использовать динамическую регистрацию, чтобы отображаться и исчезнуть пользовательские ресурсы, в то время как кластер работает.

Вы СРЕ или Кубернаны энтузиаст? Делает Хаос Инжиниринг возбудить тебя? Присоединяйтесь к нашему сообществу о SLOCK для подробных обсуждений, обратной связи и регулярных обновлений на Chaos Engineering для Kubernetes: https://kubernetes.slack.com/messages/cnxnb0ztn (#litmus канал на рабочем пространстве Kubernetes)

Проверьте Litmus Chaos Github Repo И поделитесь своим отзывом: https://github.com/litmuschaos/litmus Отправить потянуть запрос Если вы определите любые необходимые изменения.

Не забудьте поделиться этими ресурсами с кем-то, кто, по вашему мнению, может извлечь выгоду из них. Мир. ✌🏼.

Оригинал: «https://dev.to/litmus-chaos/extend-your-kubernetes-apis-with-crds-4iml»