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 Resource Definition
Définitions de ressources personnalisées (CRD) dans la version 1.7
CRDs
kubectl get crds --all-namespaces
kubectl api-resourcesExemple 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:
- pzAjoutez des Pizzas
mkdir -p apps/pizzas/
vim pizza-crd.yamlpizza-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:
- pzkubectl create namespace pizzahat
kubectl config set-context --current --namespace=pizzahat
kubectl apply -f apps/pizzas/pizza-crd.yamlFait maintenant partie de l’API
kubectl get crds | grep pizzaRésultat
NAME CREATED AT
pizzas.mykubernetes.acme.org 2022-01-23T16:26:11Zkubectl api-resources | grep pizzasRésultat
pizzas pz mykubernetes.acme.org true PizzaDéploiement de l’opérateur
vim apps/pizzas/pizza-deployment.yamlpizza-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: IfNotPresentkubectl apply -f apps/pizzas/pizza-deployment.yaml
kubectl get podsNAME READY STATUS RESTARTS AGE
quarkus-operator-example-5f5bf777bc-glfg9 1/1 Running 0 58sFaire des pizzas
vim apps/pizzas/cheese-pizza.yamlcheese-pizza.yaml
apiVersion: mykubernetes.acme.org/v1
kind: Pizza
metadata:
name: cheesep
spec:
toppings:
- mozzarella
sauce: regularkubectl apply -f apps/pizzas/cheese-pizza.yaml
kubectl get pizzasNAME AGE
cheesep 4skubectl describe pizza cheesepName: 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 podsNAME READY STATUS RESTARTS AGE
cheesep-pod 0/1 Completed 0 3s
quarkus-operator-example-5f5bf777bc-glfg9 1/1 Running 0 44mEt 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.000sFaire plus de pizzas
vim apps/pizzas/meat-lovers.yamlmeat-lovers.yaml
apiVersion: mykubernetes.acme.org/v1
kind: Pizza
metadata:
name: meatsp
spec:
toppings:
- mozzarella
- pepperoni
- sausage
- bacon
sauce: extravim apps/pizzas/veggie-lovers.yamlapiVersion: mykubernetes.acme.org/v1
kind: Pizza
metadata:
name: veggiep
spec:
toppings:
- mozzarella
- black olives
sauce: extrakubectl apply -f apps/pizzas/meat-lovers.yaml
kubectl apply -f apps/pizzas/veggie-lovers.yaml
kubectl get pizzas --all-namespacesManger toutes les pizzas
kubectl delete pizzas --allSupprimer les ressources
kubectl delete all --allCré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=franzDé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.0kubectl create -f https://operatorhub.io/install/strimzi-kafka-operator.yamlkubectl get csvAttendez un peu jusqu’à l’état succès :
watch kubectl get csvNAME DISPLAY VERSION REPLACES PHASE
strimzi-cluster-operator.v0.27.1 Strimzi 0.27.1 strimzi-cluster-operator.v0.27.0 SucceededDémarrer une veille dans un autre terminal :
watch kubectl get podsEnsuite, déployez la ressource en demandant un cluster Kafka :
vim apps/kubefiles/mykafka.ymlmykafka.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.ymlRé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 92skubectl get kafkasNAME DESIRED KAFKA REPLICAS DESIRED ZK REPLICAS READY WARNINGS
my-cluster 3 3 True TrueSupprimer les ressources
kubectl delete namespace pizzahat
kubectl delete -f apps/pizzas/pizza-crd.yaml
kubectl delete kafka my-cluster
kubectl delete namespace franzA 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 :