Skip to content

Latest commit

 

History

History
304 lines (214 loc) · 10.5 KB

README.md

File metadata and controls

304 lines (214 loc) · 10.5 KB

Kubernetes Operator for Armada and Helm

Introduction

This README is mainly used a log / wiki of results and challenges encounted during the POC

operator-sdk vs kubebuilder.

Things to clean up: Did not had time to sort how to completly migrate from operator-sdh to kubebuilder. Most of the scaffolding is done using the operator-sdk but once the default files are created, the build process mainly relies on kubebuilder

armada-operator code directory structure

cmd

Contains the main.go for the armada operator

pkg/apis/

Contains the golang definition of the CRDs. make generate will recreate the yaml definitions of the CRDs that have to be provided to kubectl in order to deploy the new CRDs. This current version of the operator uses "act" for shortname of ArmadaChart, "acg" as shortname for ArmadaChartGroup and "amf" as shortname for ArmadaManifest.

The first version of the golang code has generated using tool such as "schema-generate" from the schema definition provided with airship-armada project.

pkg/services

Contains the bulk of the interfaces used by the armada controller.

pkg/helm, pkg/helmv2 and pkg/helmv3

To get the process doing, some of the code for ArmadaChart handling is coming from the operator-sdk helm-operator. That code is relying on tiller component which is gone for Helm3. Hence the three directory helm (Interface and Common code), helmv2 (tiller) and helmv3.

The golang package structure is different between helmv2 and helmv3. The Armada Operator will most likely ultimatly have support two branches. In order to delay that milestone, the golang code has been instrumentated with "v2" and "v3" tags which allows to compile either the helm v3 version of the operator or the helm v3 version.

pkg/armada directory

Mainly contain the code for ArmadaChartGroup, ArmadaManifest as will ArmadaBackupLocation handling

pkg/controller directory

Contains the controller and the "Reconcile" functions for ArmadaChart, ArmadaChartGroup and ArmadaManifest. There are currently three controllers (act-controller, acg-controller and amf-controller).

Code changes.

Adjusting the ArmadaOperator CRDs

Upon change of the CRD golang definition, the yaml files have to be regenerated

Note 1: Don't understand yet how to build using operator-sdk operator with the same level of detailes than controller-gen. Big hack that have to be included in Makefile.

Note 2: The generation tool seems to comply with some of OpenAPI specs. The "validation" schema added to in the CRD yaml definition does not contain fields using underscore. Most of those fields containing underscore where defined such a way in the original airship-armada.

make generate

Compiling the armada-operator

To keep the directory tree ligthweight, the vendor directory is not checked in in the current repo. TODO: Since the operator is only using one git branch, the developer has to comment out the helmv2 and add the helmv3 in Gopkg.toml if he wants to build the helmv3 version of the operator. This is still WIP.

dep ensure

To build the v2 version

make docker-build-v2

To build the v3 version

make docker-build-v3

Run unit test and preintegration tests.

If you installed kubebuilder on your system, you will have access to a standalone apiserver, etcd server and kubectl.

Because of a lack of time, the current makefile test statement, will attempt to stop your kubelet and associated container in your local kubernetes cluster, before starting apiserver, etcdserver. TODO: We still need to figure out if it necessary

In order to run the unit tests and the e2e integration tests:

make unittest

Deploying the operator.

Note the current deployment of the operator relies itself on helm.

To install the helm v2 version

make install-v2

To install the helm v3 version

make install-v3

Testing the armada-controller

helm-charts/testchart directory

For testing purpose the current Docker file includes a dummy chart deliverd under armada-charts. This removes the needs to access external chart repository which is also an aspect of helm changing from 2 to 3.

examples/armada

In that directory, the ArmadaChart are enabled by default and the charts are installed as soon as the ArmadaChart CRD are created.

Deployment

Upon creation of the custom resource, the controller will

  • Deploy the Armada Manifest described in the CRD
  • Update status of the custom resources.
  • Add events to the custom resources.
kubectl create -f examples/armada
kubectl describe amf/simple-armada
kubectl get amf
kubectl get acg
kubectl get act

Test controller reconcilation logic (for depending resources)

Upon deletion of its depending resources, the controller will recreate it,

kubectl delete deployment.apps/blog-2-testchart
kubectl get all
kubectl describe act blog-2

Test controller reconcilation logic (for CRD)

When deleting the CRD, the corresponding Armada Manifest should be uninstalled.

kubectl delete -f simple/armada

examples/stepbystep

This directory contains invidual act,acg and amf files which allow the "step" by "step" testing of the deployment.

examples/argo

In that directory, the ArmadaChart (act) are disabled by default and the charts not installed automatically when the act CR are created. This example assumes that the argo controller has been installed. When the "argo worflow" CR is created, the "argo controller" is waked up and it orchestrates the enablement of the ArmadaChart according to the worflow.

Note: You need to have argo installed in your cluster.

kubectl apply -f example/argo

armadachart.armada.airshipit.org/blog-1 created
armadachart.armada.airshipit.org/blog-2 created
workflow.argoproj.io/wf-blog-group created

The first ArmadaChart is installed:

kubectl get all

pod/armada-operator-cbbc7d7f7-zxj5n     1/1     Running             0          60s
pod/blog-1-testchart-5dd8c474f4-26574   0/1     ContainerCreating   0          6s
pod/wf-blog-group-1193326311            0/1     Completed           0          8s
pod/wf-blog-group-2026876860            0/1     ContainerCreating   0          1s
pod/wf-blog-group-2432013970            0/1     Completed           0          4s

NAME                       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/armada-operator    ClusterIP   10.98.2.253    <none>        8383/TCP   57s
service/blog-1-testchart   ClusterIP   10.104.240.7   <none>        80/TCP     6s
service/kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP    7m43s

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/armada-operator    1/1     1            1           60s
deployment.apps/blog-1-testchart   0/1     1            0           6s

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/armada-operator-cbbc7d7f7     1         1         1       60s
replicaset.apps/blog-1-testchart-5dd8c474f4   1         1         0       6s

Later both charts have been installed

NAME                                    READY   STATUS      RESTARTS   AGE
pod/armada-operator-cbbc7d7f7-zxj5n     1/1     Running     0          44m
pod/blog-1-testchart-5dd8c474f4-26574   1/1     Running     0          43m
pod/blog-2-testchart-57f86dd9c5-xmhd7   1/1     Running     0          43m
pod/wf-blog-group-1193326311            0/1     Completed   0          43m
pod/wf-blog-group-2026876860            0/1     Completed   0          43m
pod/wf-blog-group-2234690393            0/1     Completed   0          43m
pod/wf-blog-group-2432013970            0/1     Completed   0          43m

NAME                       TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/armada-operator    ClusterIP   10.98.2.253      <none>        8383/TCP   44m
service/blog-1-testchart   ClusterIP   10.104.240.7     <none>        80/TCP     43m
service/blog-2-testchart   ClusterIP   10.110.160.242   <none>        80/TCP     43m
service/kubernetes         ClusterIP   10.96.0.1        <none>        443/TCP    51m

NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/armada-operator    1/1     1            1           44m
deployment.apps/blog-1-testchart   1/1     1            1           43m
deployment.apps/blog-2-testchart   1/1     1            1           43m

NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/armada-operator-cbbc7d7f7     1         1         1       44m
replicaset.apps/blog-1-testchart-5dd8c474f4   1         1         1       43m
replicaset.apps/blog-2-testchart-57f86dd9c5   1         1         1       43m

argo is tracing the steps take to sequence the deployment of the charts:

argo get wf-blog-group

Name:                wf-blog-group
Namespace:           default
ServiceAccount:      armada-argo-sa
Status:              Succeeded
Created:             Fri Mar 22 10:27:28 -0500 (26 seconds ago)
Started:             Fri Mar 22 10:27:28 -0500 (26 seconds ago)
Finished:            Fri Mar 22 10:27:42 -0500 (12 seconds ago)
Duration:            14 seconds

STEP                  PODNAME                   DURATION  MESSAGE
 ✔ wf-blog-group
 ├---✔ enable-blog-1  wf-blog-group-1193326311  2s
 ├---✔ blog-1-ready   wf-blog-group-2432013970  3s
 ├---✔ enable-blog-2  wf-blog-group-2026876860  3s
 └---✔ blog-2-ready   wf-blog-group-2234690393  3s

We can check the state of the ArmadaChart

kubectl get act

NAME     STATE      TARGET STATE   SATISFIED
blog-1   deployed   deployed       true
blog-2   deployed   deployed       true

Run the cleanup

kubectl delete -f examples/argo

examples/sequenced

In that directory, the ArmadaChart (act) are disabled by default and the charts not installed automatically when the act CR are created. When the "ArmadaChartGroup" CR is created, the "chartgroup controller" receives an event and it orchestrate the order of deployment/enablement of the ArmadaChart. The ArmadaChartGroup also becomes owner of the ArmadaChart.

This is basically the same sequencing that above except that it is implemented using an ArmadaChartGroup and an ArmadaManifest

examples/backup

This directory contains the CR definitions involved during an ArmadaBackup procedure.

  • WIP

examples/restore

This directory contains the CR definitions involved during an ArmadaRestore procedure.

  • WIP

Appendix

POCs contains additional notes regarding successful and failed attempts.