java day kharkiv - next-gen engineering with docker and kubernetes
TRANSCRIPT
Next-gen engineering with Docker and Kubernetes
:~ whoami:
Antons Kranga
Cloud architect and full-stack developer with ~15 years in Java technology
Docker and Java
Motivation
dev Chuck Norris app ops
deploy
Docker
Guest OSVM
Guest OS
Container engine
Container engine
Hypervisor
VM
Applications isolated inside containersRapid deployment
Focuses on service is inside container
dev ops
Focuses on env outside container
Dockerfileis a contract
DockerfileDockerfile
FROM java:jdk
COPY chnorr.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
WorkflowDockerfile
FROM java:jdk
COPY chnorr.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
dev
Java code &Dockerfile
Compile &Unit test
chnorr.jar build registry(private or public)
push ops
pull
Container engine
docker run
Things to rememberContainers have ephemeral. Persistent volumes should be managed separatelyApp logs > /dev/stdout. Logs will be streamed to log collector service
Use environment variables to inject configuration parameters inside container Do not use ENV vars for secrets
Use private registry to distribute containers
Containers != VM (!!!)
Rugged Docker
KubernetesCluster manager for your containers
Docker needs Platform
Guest OSVM
Guest OS
Container engine
Container engine
Hypervisor
VM
Docker is just a container engine many things are not there
• Networking• Storage• Service discovery• Container scheduling• Placement and load
balancing• Routing• Self healing ...
Kubernetes Architecutre
Logical view
Serviceports80,443
10.0.1.10
container
container
10.0.1.11
container
container
load balancer services pods rc
labels labels
labels labels
Chuck Norris pod exampleService
apiVersion: v1kind: Servicemetadata: name: chuck-norris labels: name: chuck-norris-servselector: chuck: norris spec: type: LoadBalancer clusterIP: 10.0.1.10 ports: - name: http port: 80
Replication ControllerapiVersion: v1kind: ReplicationControllermetadata: name: chuck-norris labels: chuck: norris spec: replicas: 3 selector: name: chuck-norristemplate: metadata: labels: name: chuck-norrisspec: containers: - name: chuck image: akranga/chnorr:1.0.0 ports: - name: http containerPort: 8080
port exposed in Dockerfile
Things to rememberDIND makes you naked needs privileged mode
Do not abuse etcd of kubernetesyou can brake the platform
JenkinsBetter continuous delivery model
CI with Kubernetesdev push
push
ops
pullgitmaster
Compile &Unit test app.jar build
private registry Create pod
Chuck Norris app
pull
Putting all togetherjenkins
ports80 jenkins_master
load balancer services pods storage
jenkins_java_slave
jenkins_kube_slave
jenkins_docker_slave
jenkinsports80 private_registry
chnorrgreen
ports80 chucknorris:b24
chucknorris:b25chnorrlatest
ports80
cloudstorage
cloudstorage
Things to remember
Workflows can be part of app-baselineShare workspace between slaves
Don’t forget private docker registry
DIND is evil but unavoidable
Grab hands-on practice labs here:https://github.com/akranga/kube-workshop
Questions?