Operator

Prérequis

Les ressources personnalisées étendent l’API

Les contrôleurs personnalisés fournissent la fonctionnalité - qui maintient continuellement l’état souhaité - pour surveiller son état et rapprocher la ressource de la configuration.

Docs Custom Resources

Docs Custom Resource Definition

Définitions de ressources personnalisées (CRD) dans la version 1.7

CRDs

kubectl get crds --all-namespaces
kubectl api-resources

Exemple CRD

apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
  name: pizzas.mykubernetes.acme.org
  labels:
    app: pizzamaker
    mylabel: stuff
spec:
  group: mykubernetes.acme.org
  scope: Namespaced
  version: v1beta2
  names:
    kind: Pizza
    listKind: PizzaList
    plural: pizzas
    singular: pizza
    shortNames:
    - pz

Ajoutez des Pizzas

mkdir -p apps/pizzas/
vim pizza-crd.yaml

pizza-crd.yaml

apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: pizzas.mykubernetes.acme.org
  labels:
    app: pizzamaker
    mylabel: stuff
spec:
  group: mykubernetes.acme.org
  scope: Namespaced
  versions:
  - name: v1
    served: true
    storage: true
    schema:
      openAPIV3Schema:
        description: "A custom resource for making yummy pizzas" #<.>
        type: object
        properties:
          spec:
            type: object
            description: "Information about our pizza"
            properties:
              toppings: #<.>
                type: array
                items:
                  type: string
                description: "List of toppings for our pizza"
              sauce: #<.>
                type: string
                description: "The name of the sauce to use on our pizza"
  names:
    kind: Pizza #<.>
    listKind: PizzaList
    plural: pizzas
    singular: pizza
    shortNames:
    - pz
kubectl create namespace pizzahat
kubectl config set-context --current --namespace=pizzahat

kubectl apply -f apps/pizzas/pizza-crd.yaml

Fait maintenant partie de l’API

kubectl get crds | grep pizza

Résultat

NAME                           CREATED AT
pizzas.mykubernetes.acme.org   2022-01-23T16:26:11Z
kubectl api-resources | grep pizzas

Résultat

pizzas                            pz           mykubernetes.acme.org          true         Pizza

Déploiement de l’opérateur

vim apps/pizzas/pizza-deployment.yaml

pizza-deployment.yaml

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: quarkus-operator-example
rules:
- apiGroups:
  - ''
  resources:
  - pods
  verbs:
  - get
  - list
  - watch
  - create
  - update
  - delete
  - patch
- apiGroups:
  - apiextensions.k8s.io
  resources:
  - customresourcedefinitions
  verbs:
  - list
- apiGroups:
  - mykubernetes.acme.org
  resources:
  - pizzas
  verbs:
  - list
  - watch
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: quarkus-operator-example
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: quarkus-operator-example
subjects:
- kind: ServiceAccount
  name: quarkus-operator-example
  namespace: pizzahat
roleRef:
  kind: ClusterRole
  name: quarkus-operator-example
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: quarkus-operator-example
spec:
  selector:
    matchLabels:
      app: quarkus-operator-example
  replicas: 1
  template:
    metadata:
      labels:
        app: quarkus-operator-example
    spec:
      serviceAccountName: quarkus-operator-example
      containers:
      - image: quay.io/rhdevelopers/pizza-operator:1.0.1
        name: quarkus-operator-example
        imagePullPolicy: IfNotPresent
kubectl apply -f apps/pizzas/pizza-deployment.yaml

kubectl get pods
NAME                                        READY   STATUS    RESTARTS   AGE
quarkus-operator-example-5f5bf777bc-glfg9   1/1     Running   0          58s

Faire des pizzas

vim apps/pizzas/cheese-pizza.yaml

cheese-pizza.yaml

apiVersion: mykubernetes.acme.org/v1
kind: Pizza
metadata:
  name: cheesep
spec:
  toppings:
  - mozzarella
  sauce: regular
kubectl apply -f apps/pizzas/cheese-pizza.yaml
kubectl get pizzas
NAME      AGE
cheesep   4s
kubectl describe pizza cheesep
Name:         cheesep
Namespace:    pizzahat
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"mykubernetes.acme.org/v1beta2","kind":"Pizza","metadata":{"annotations":{},"name":"cheesep","namespace":"pizzahat"},"spec":...
API Version:  mykubernetes.acme.org/v1beta2
Kind:         Pizza
...
kubectl get pods
NAME                                        READY   STATUS      RESTARTS   AGE
cheesep-pod                                 0/1     Completed   0          3s
quarkus-operator-example-5f5bf777bc-glfg9   1/1     Running     0          44m

Et vérifiez les logs du Pod de fromage :

kubectl logs cheesep-pod
__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
2022-07-23 09:03:11,537 INFO  [io.quarkus] (main) pizza-maker 1.0-SNAPSHOT (powered by Quarkus 1.4.0.CR1) started in 0.006s.
2022-07-23 09:03:11,537 INFO  [io.quarkus] (main) Profile prod activated.
2022-07-23 09:03:11,537 INFO  [io.quarkus] (main) Installed features: [cdi]
Doing The Base
Adding Sauce regular
Adding Toppings [mozzarella]
Baking
Baked
Ready For Delivery
2022-01-23 09:03:12,038 INFO  [io.quarkus] (main) pizza-maker stopped in 0.000s

Faire plus de pizzas

vim apps/pizzas/meat-lovers.yaml

meat-lovers.yaml

apiVersion: mykubernetes.acme.org/v1
kind: Pizza
metadata:
  name: meatsp
spec:
  toppings:
  - mozzarella
  - pepperoni
  - sausage
  - bacon
  sauce: extra
vim apps/pizzas/veggie-lovers.yaml
apiVersion: mykubernetes.acme.org/v1
kind: Pizza
metadata:
  name: veggiep
spec:
  toppings:
  - mozzarella
  - black olives
  sauce: extra
kubectl apply -f apps/pizzas/meat-lovers.yaml
kubectl apply -f apps/pizzas/veggie-lovers.yaml
kubectl get pizzas --all-namespaces

Manger toutes les pizzas

kubectl delete pizzas --all

Supprimer les ressources

kubectl delete all --all

Créer un peu de Kafka

Kafka pour Minikube Créez un nouvel espace de nom pour cette expérience :

kubectl create namespace franz
kubectl config set-context --current --namespace=franz

Déployer l’opérateur Kafka :

curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.20.0/install.sh | bash -s v0.20.0
kubectl create -f https://operatorhub.io/install/strimzi-kafka-operator.yaml
kubectl get csv

Attendez un peu jusqu’à l’état succès :

watch kubectl get csv
NAME                               DISPLAY   VERSION   REPLACES                           PHASE
strimzi-cluster-operator.v0.27.1   Strimzi   0.27.1    strimzi-cluster-operator.v0.27.0   Succeeded

Démarrer une veille dans un autre terminal :

watch kubectl get pods

Ensuite, déployez la ressource en demandant un cluster Kafka :

vim apps/kubefiles/mykafka.yml

mykafka.yml

apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    version: 3.0.0
    replicas: 3
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
    config:
      offsets.topic.replication.factor: 3
      transaction.state.log.replication.factor: 3
      transaction.state.log.min.isr: 2
      log.message.format.version: '3.0'
      inter.broker.protocol.version: '3.0'
    storage:
      type: ephemeral
  zookeeper:
    replicas: 3
    storage:
      type: ephemeral
  entityOperator:
    topicOperator: {}
    userOperator: {}
kubectl apply -f apps/kubefiles/mykafka.yml

Résultat :

NAME                                          READY   STATUS    RESTARTS   AGE
my-cluster-entity-operator-66676cb9fb-fzckz   2/2     Running   0          29s
my-cluster-kafka-0                            2/2     Running   0          60s
my-cluster-kafka-1                            2/2     Running   0          60s
my-cluster-kafka-2                            2/2     Running   0          60s
my-cluster-zookeeper-0                        2/2     Running   0          92s
my-cluster-zookeeper-1                        2/2     Running   0          92s
my-cluster-zookeeper-2                        2/2     Running   0          92s
kubectl get kafkas
NAME         DESIRED KAFKA REPLICAS   DESIRED ZK REPLICAS   READY   WARNINGS
my-cluster   3                        3                     True    True

Supprimer les ressources

kubectl delete namespace pizzahat
kubectl delete -f apps/pizzas/pizza-crd.yaml
kubectl delete kafka my-cluster
kubectl delete namespace franz

A vous de jouez

  • Définir un nouveau type de ressource personnalisé dans Kubernetes (Custom Resource Definition – CRD).

  • Créer une instance de cette ressource.

Créer un fichier YAML crd.yaml qui définit une ressource personnalisée CronTab.

La ressource doit être dans le groupe stable.example.com.

Le nom complet de la CRD doit être crontabs.stable.example.com.

Elle doit être versionnée en v1.

Elle doit accepter les champs suivants :

spec.cronSpec (string)

spec.image (string)

spec.replicas (integer)

Appliquer cette définition de CRD dans Kubernetes afin qu’elle soit enregistrée comme un nouveau type de ressource.

Vérifier que la ressource est bien disponible via la commande :