Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Comment étendre Kubernetes ?

Comment étendre Kubernetes ?

Presque 5 ans après sa création, le succès de Kubernetes (k8s) et son adoption ne sont plus à démontrer.
Une des raisons de ce succès est l’extensibilité de k8s.
Vous pouvez définir vos propres ressources personnalisées et y adosser des contrôleurs qui agiront au côté des composants existants de k8s afin de faire en sorte que votre service soit toujours accessible. Malheureusement, la mise en place de ces briques peut s’avérer complexe.

Lors de cette conférence, nous vous présenterons comment étendre l’API de k8s en créant des Custom Resource Definition (CRD) et comment l’Operator Framework est utilisé pour simplifier l’exploitation de ces ressources.

Pierre-Yves Aillet

March 12, 2019
Tweet

More Decks by Pierre-Yves Aillet

Other Decks in Technology

Transcript

  1. Eric Briand Dev’ touche à tout à Zenika Nantes Organisateur

    du CNCF Meetup Nantes @eric_briand @ebriand Pierre-Yves Aillet Consultant formateur à Zenika Nantes @pyaillet @pyaillet
  2. Controllers - Deployment controller - Replica set - Service controller

    - CronJob controller - Daemon controller - ... Full list here for { desired := getDesiredState() current := getCurrentState() makeChanges(desired, current) }
  3. Pourquoi ajouter des controllers à Kubernetes ? Déclaration d’un état

    désiré non-couvert par les ressources standards ◦ Infra/Réseau (ex: Ingress, canary release) ◦ Applicatif (ex: base de données, stack) ◦ Intégration continue (ex: tekton)
  4. Annotations : exemple avec prometheus apiVersion: v1 kind: Pod metadata:

    name: myapp labels: name: myapp annotations: prometheus.io/scrape: 'true' prometheus.io/port: '9102' spec: containers: - name: myapp image: myimage
  5. Nginx Ingress Controller extension apiVersion: extensions/v1beta1 kind: Ingress metadata: name:

    cafe-ingress annotations: kubernetes.io/ingress.class: "nginx" custom.nginx.org/rate-limiting: "on" custom.nginx.org/rate-limiting-rate: "5r/s" custom.nginx.org/rate-limiting-burst: "1" spec: rules: - host: "cafe.example.com" http: paths: ...
  6. Exemple des annotations nginx... app-root, affinity, auth-realm, auth-secret, auth-type, auth-tls-secret,

    auth-tls-verify-depth, auth-tls-verify-client, auth-tls-error-page, auth-tls-pass-certificate-to-upstream, auth-url, auth-snippet, backend-protocol, canary, canary-by-header, canary-by-header-value, canary-by-cookie, canary-weight, client-body-buffer-size, configuration-snippet, custom-http-errors, default-backend, enable-cors, cors-allow-origin, cors-allow-methods, cors-allow-headers, cors-allow-credentials, cors-max-age, force-ssl-redirect, from-to-www-redirect, http2-push-preload, limit-connections, limit-rps, permanent-redirect, permanent-redirect-code, temporal-redirect, proxy-body-size, proxy-cookie-domain, proxy-cookie-path, proxy-connect-timeout, proxy-send-timeout, proxy-read-timeout, proxy-next-upstream, proxy-next-upstream-tries, proxy-request-buffering, proxy-redirect-from, proxy-redirect-to, enable-rewrite-log, rewrite-target, satisfy, secure-verify-ca-secret, server-alias, server-snippet, service-upstream, session-cookie-name, session-cookie-path, ssl-redirect, ssl-passthrough, upstream-hash-by, x-forwarded-prefix, load-balance, upstream-vhost, whitelist-source-range, proxy-buffering, proxy-buffers-number, proxy-buffer-size, ssl-ciphers, connection-proxy-header, enable-access-log, lua-resty-waf, lua-resty-waf-debug, lua-resty-waf-ignore-rulesets, lua-resty-waf-extra-rules, lua-resty-waf-allow-unknown-content-types, lua-resty-waf-score-threshold, lua-resty-waf-process-multipart-body, enable-influxdb, influxdb-measurement, influxdb-port, influxdb-host, influxdb-server-name, use-regex, enable-modsecurity, enable-owasp-core-rules, modsecurity-transaction-id, modsecurity-snippet
  7. Custom Resource Definition • Ajouté en kubernetes 1.7 • Nouvelle

    ressource kubernetes ◦ Nouvel endpoint dans l’api ◦ Stockage dans etcd • Complètement personnalisable (validation, display, ordre de création des ressources, etc.) • Nécessite un contrôleur custom
  8. Création CRD apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: mongodbstandalones.mongodb.com spec:

    group: mongodb.com version: v1 scope: Namespaced names: kind: MongoDbStandalone plural: mongodbstandalones shortNames: - mst singular: mongodbstandalone validation: [...] kubectl apply -f mongo-crd.yaml -- Source : https://github.com/mongodb/mongodb-enterprise-kubernetes
  9. Utilisation CRD apiVersion: mongodb.com/v1 kind: MongoDbStandalone metadata: name: my-standalone namespace:

    mongodb spec: version: 4.0.0 project: my-project credentials: my-credentials persistent: false kubectl apply -f mongo-instance.yaml -- Source : https://github.com/mongodb/mongodb-enterprise-kubernetes
  10. Création d’un contrôleur custom from scratch • Définir la structure

    des objets • Interagir l’API kubernetes en go : ◦ authentification ◦ récupération des événements du cluster • Gérer la validation, les montées de version • Gérer la boucle de réconciliation • Créer les ressources dans le cluster • euh...
  11. Operator • CRD + Controller spécifique à une application •

    Automatiser les actions d’un ops ◦ Mise à jour d’une version à l’autre ◦ Reprise sur erreur complexe ◦ Mise à l’échelle particulière d’une application stateful -- Source: https://www.youtube.com/watch?v=8k_ayO1VRXE
  12. Operator Framework SDK - CLI écrit en Go pour générer,

    tester, valider son operator - Publié par CoreOS en mai 2018 - Open source sur Github - Actuellement v0.5.0 - 15 releases - ~70 contributeurs - 1400+ stars
  13. Operator Framework SDK - First steps # Create a new

    app-operator project $ operator-sdk new app-operator # Add a new API for the custom resource AppService $ operator-sdk add api --api-version=app.example.com/v1alpha1 --kind=AppService # Add a new controller that watches for AppService $ operator-sdk add controller --api-version=app.example.com/v1alpha1 --kind=AppService -- Source : https://github.com/operator-framework/operator-sdk/
  14. Comment choisir ? -- Source : https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/ • CRDs ◦

    Petits objets ◦ MAJ non fréquente ◦ Organisation API à la k8s • Aggregation Layer ◦ Gros objets ou/et très nombreux ◦ MAJ très fréquentes (ex : métriques) ◦ API organisée plus librement
  15. Résumé - Correspondance avec une Custom Resource - Utilisation de

    l’Operator SDK - Bootstrap du projet - Création/exposition de l’API - Bootstrap de la boucle de réconciliation Operator = controller pattern + API extension + single-app focus
  16. Démos - https://github.com/pyaillet/etendre-k8s/ Références - A Deep Dive Into Kubernetes

    Controllers - Operator SDK Github - OperatorHub.io - Awesome operators - Developing Kubernetes Operator is now easy with Operator Framework - Kubedex - Op@erators - Under the hood kubebuilder - Under the hood operator sdk - Writing custom kubernetes controllers - Go Experience Report: Generics in Kubernetes