The document discusses using Java and GraalVM to build efficient DevOps tooling. It describes how GraalVM can eliminate extraneous cognitive load through polyglot programming and ahead-of-time compilation. It provides examples of using Picocli and GraalVM to build command line interfaces for operations tasks like container orchestration and managing Kubernetes deployments through operators.
3. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
How do you organise and enable
DevOps teams for
fast flow and high productivity?
3
4. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
Too much cognitive load will become a bottleneck
for fast flow and high productivity.
• Instrinsic Cognitive Load - relates to fundamental aspects
and knowledge in the problem space (e.g. used languages,
APIs, frameworks)
• Extraneous Cognitive Load - relates to the environment
(e.g. deployment, configuration, console commands)
• Germane Cognitive Load - relates to specific aspects of the
business domain (aka. „value added“ thinking)
4
https://teamtopologies.com
6. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON20206
7. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
Use the right language for the job!?
7
Getty Images Liliboas
Ansible Shell ScriptsRuby Python
8. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON20208
9. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
GraalVM to the Rescue!
9
10. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
GraalVM in a Nutshell
• Polyglot Runtime: runs all JVM languages, R, JavaScript, NodeJS,
Ruby, Python, C/C++ via LLVM with full interop
• Ahead-of-time (AOT) Compilation: memory management, thread
scheduling via SubstrateVM
• GraalVM as a Platform: embed and extend GraalVM with Truffle,
implement your own language and tools
10
11. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
Polyglot Mayhem
• The Graal Polyglot API allows you to embed and use different
languages with full bidirectional interop.
• This is not the same as with the Java Scripting API (JSR 223)!
11
private static void helloPython(PolyglotMessage message) {
try (Context context = Context.newBuilder().allowAllAccess(true).build()) {
context.getPolyglotBindings().putMember("message", message);
context.eval("python",
"import polyglotn" +
"message = polyglot.import_value('message')n" +
"message['invocations'] += 1n" +
"print(message['text'])");
}
}
12. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
The Swiss Army Knife of Operations.
12
CLIs - The Swiss Army Knife of Operations
13. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
The basics of 12-factor CLI apps
• Great help is essential. What version am I on?
• Prefer flags to positional arguments.
• Mind the streams. stdout is for output, stderr is for messaging.
• Handle things going wrong: error code, title, how to fix, URL, …
• Be fancy: use colours, have shell completion.
• Prompt if you can.
• Be speedy. CLIs need to start fast.
• Be clear about subcommands.
13
For complete list and info, read https://medium.com/@jdxcode/12-factor-cli-apps-dd3c227a0e46
14. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
Build CLIs with Picocli and GraalVM
• Native DevOps tools, CLIs or sidecar containers can now also be
build using Java! Golang is still cool.
• Picoli is a small framework to easily build JVM command line apps.
• Support for ANSI colors, tab completion, sub commands and other
12-factor CLI app principles
• In-built support for GraalVM AOT compilation to native images via the
ReflectionConfigGenerator utility.
14
17. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON202017
Operator.
- Do stuff to my Kubernetes.
18. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
What are operators?
• Operators are codified Ops procedures!
• Operators are the path towards Zero-Ops. They enable auto-updating,
self-monitoring and self-healing infrastructure and applications.
• The concept was coined in the Kubernetes world. It’s now been
adopted and used widespread in the cloud native world.
• Examples: OKD, Sealed Secrets, Kube Monkey, Weave Flux
18
19. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
Kubernetes Operators in a Nutshell
19
20. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
The Kill Pod Operator
20
• Super simple Chaos monkey style operator inspired by Kubemonkey
• Regularly kills pods of deployments that are killpod/enabled
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-killpod-enabled
labels:
killpod/enabled: "true"
killpod/application: nginx-killpod-enabled
killpod/delay: "30"
killpod/amount: "2"
spec:
...
21. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
The Super Secret Operator
21
• Apply asymmetrical encrypted secrets, the operator will decrypt and manage ordinary
K8s secrets under the hood
• Inspired by Sealed Secrets from Bitnami https://github.com/bitnami-labs/sealed-secrets
apiVersion: operators.on.hands/v1alpha1
kind: SuperSecret
metadata:
name: supersecret-test
spec:
secretData:
password: eV7YoQXyZlY+y51RWXEqyu0U44EPEPwEz+fZvGo+7McOTA4wQYCdxXMANtab3aW8
...
ywqpkHYtSLvrPgFnbcuSvD2UzuUNeE2qkh6SAM1z9Lpfwi+IUZjaY34Z+RjEL5OZFPYkQ==
22. // JCON 2020 // Efficient DevOps Tooling with Java and GraalVM // @LeanderReimer #cloudnativenerd #qaware #JCON2020
The Microservice Operator
22
apiVersion: operators.on.hands/v1alpha1
kind: Microservice
metadata:
name: microservice-test
labels:
app: nginx
spec:
replicas: 2
image: nginx:1.17.6
ports:
- containerPort: 80
serviceType: LoadBalancer
• Abstracting the usual Deployment, Service and ConfigMap definitions
using a simple and unified Microservice CRD