KEMBAR78
Разработка cloud-native Java-приложений для Kubernetes, Егор Волков,Senior Java Developer | PDF
Containers, Java and You
Building cloud-native Java applications with
Docker and Kubernetes
DISCLAIMER
Hello, ${username}!
● Senior Java developer @ DataArt
● Working with Java since early 2014
● Background in networking and game
development, mostly C/C++
● Wrote first program in 2004, first network
protocol in 2007
● Interested in everything DevOps related
since started working with Java
import all.the.tools.*;
1. Get Java https://jdk.java.net/10/
2. Get Docker https://www.docker.com/get-started (18.06 CE +)
3. Get Kompose https://kompose.io/
4. Get ready!
BONUS STAGE:
5. Get the code: https://github.com/wollfxp/project1/tree/master-february
6. Get ready for real!
Evolution of Environments
Evolution of Environments
Bare metal
Virtualization (HW)
Virtualization (SW)
OS
Container Engine
JVM
Your app
1. Bare metal, VM software-based, VM hardware-based
2. IaaS, PaaS, SaaS
3. Amazon Services, Amazon ECS ,Amazon EC2
4. Google Services, Google App Engine, Google
Kubernetes Engine
5. CloudFoundry, Heroku, etc.
Evolution of Environments
my-project-0.0.1-SNAPSHOT.jar app-build-2541.war
./exploded jar/
./exploded war/
Java developers only care about these!
Evolution of Environments
… sometimes about these also ...
java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)
openjdk version "9-internal"
OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src)
OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)
1. As long as the JRE is the same, that we develop against - everything should
be fine
2. As long as the Servlet container version is the same, that we develop
against - everything should be fine
3. As long as the RDBMS version is the same, that we develop against -
everything should be fine
4. …
Evolution of Environments
Evolution of Environments
1. We need to solidify versions of everything (JVM, JDK/JRE, servers, servlet
containers, databases, etc)
2. There’s no good way to limit Ops people from screwing everything up
3. This should be done by software, not people
4. We already have solutions for similar problems in Java world - dependency
managers!
Dockerization: starting small
1. Docker to the rescue!
2. Make a snapshot of your environment
3. Redistribute and run anywhere ©
4. Bake internal custom service versions and builds
Dockerization: starting small
Dockerization: starting small
Demo
Dockerfile for “Spaceships”
https://github.com/wollfxp/project1/blob/master/Dockerfile
Dockerization: starting small
FROM openjdk:10-jre
VOLUME /tmp
COPY target/project1-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java",
"-Djava.security.egd=file:/dev/./urandom",
"-jar",
"/app.jar"]
Run with:
gradlew clean build && docker build -t starships .
docker run -p 8443:8443 --name starships --network space-net starships:latest
Dockerfile:
Dockerization: starting small
Caused by: java.net.ConnectException: Connection refused: connect
at java.base/java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:na]
at java.base/java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:na]
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:400) ~[na:na]
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:243) ~[na:na]
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:225) ~[na:na]
at java.base/java.net.PlainSocketImpl.connect(PlainSocketImpl.java:148) ~[na:na]
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:402) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:591) ~[na:na]
at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:173) ~[mysql-connector-java-8.0.11.jar:8.0.11]
at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:66)
~[mysql-connector-java-8.0.11.jar:8.0.11]
... 58 common frames omitted
WARN 2196 --- [ restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata :
Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Dockerization: starting small
This time we remember about the database!
Re-Run with:
gradlew clean build && docker build -t starships .
docker run -p 3306:3306 -v C:/dev/docker/mysql-project1:/var/lib/mysql --env
MYSQL_ROOT_PASSWORD=s3cur1ty@maks --env MYSQL_DATABASE=space --name mysql-project1
--network space-net mysql:5.6
docker run -p 8443:8443 --name starships --network space-net starships:latest
Dockerization: starting small
Dockerization: starting small
Dockerization: starting small
Dockerization: next steps
Demo
docker-compose file for “Spaceships”
https://github.com/wollfxp/project1/blob/master/docker-compose.yml
Dockerization: next steps
Run with:
gradlew clean build && docker build -t starships .
docker-compose up
Dockerization: next steps
Dockerization: next steps
Hello, world with Kubernetes!
Kubernetes from scratch
1. Enabling Kubernetes in Docker for Windows/Docker for Mac
Kubernetes from scratch
Kubernetes from scratch
1. Enabling Kubernetes in Docker for Windows/Docker for Mac
2. Checking that everything works
Kubernetes from scratch
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.11",
GitCommit:"637c7e288581ee40ab4ca210618a89a555b6e7e9", GitTreeState:"clean",
BuildDate:"2018-11-26T14:38:32Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"windows/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.11",
GitCommit:"637c7e288581ee40ab4ca210618a89a555b6e7e9", GitTreeState:"clean",
BuildDate:"2018-11-26T14:25:46Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
$ kubectl get all
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 443/TCP 4d
Kubernetes from scratch
1. Enabling Kubernetes in Docker for Windows/Docker for Mac
2. Checking that everything works
3. Running Kompose
4. Deploy to Kubernetes
Kubernetes and Kompose demo
Let’s try it!
https://github.com/wollfxp/project1/tree/master-february
Kubernetes from scratch
Kubernetes from scratch … ?
Problem: we cannot reach our service!
Solution: Ingress! Deploy NGINX!
Kubernetes from scratch … ?
https://kubernetes.github.io/ingress-nginx/user-guide/tls/#ssl-passthrough
Kubernetes from scratch … ?
Problem: we cannot reach our service! And NGINX won’t help!
Solution: NodePort! Expose our service!
Kubernetes from scratch … ?
Kubernetes: next steps
1. Get rid of HTTPS in the application and use NGINX for that
2. Proper load balancing via Ingress
3. Deploy multiple types of the same instances (/app,/api,/admin)
4. Utilize namespaces to limit visibility of environments
5. Start using K8S metric API to get more info about your cluster
6. Deploy anywhere* with the same** configuration
7. Log aggregation (maybe?)
Questions and Answers
Thank you!

Разработка cloud-native Java-приложений для Kubernetes, Егор Волков,Senior Java Developer

  • 2.
    Containers, Java andYou Building cloud-native Java applications with Docker and Kubernetes
  • 3.
  • 4.
    Hello, ${username}! ● SeniorJava developer @ DataArt ● Working with Java since early 2014 ● Background in networking and game development, mostly C/C++ ● Wrote first program in 2004, first network protocol in 2007 ● Interested in everything DevOps related since started working with Java
  • 5.
    import all.the.tools.*; 1. GetJava https://jdk.java.net/10/ 2. Get Docker https://www.docker.com/get-started (18.06 CE +) 3. Get Kompose https://kompose.io/ 4. Get ready! BONUS STAGE: 5. Get the code: https://github.com/wollfxp/project1/tree/master-february 6. Get ready for real!
  • 6.
  • 7.
    Evolution of Environments Baremetal Virtualization (HW) Virtualization (SW) OS Container Engine JVM Your app 1. Bare metal, VM software-based, VM hardware-based 2. IaaS, PaaS, SaaS 3. Amazon Services, Amazon ECS ,Amazon EC2 4. Google Services, Google App Engine, Google Kubernetes Engine 5. CloudFoundry, Heroku, etc.
  • 8.
    Evolution of Environments my-project-0.0.1-SNAPSHOT.jarapp-build-2541.war ./exploded jar/ ./exploded war/ Java developers only care about these!
  • 9.
    Evolution of Environments …sometimes about these also ... java version "10.0.2" 2018-07-17 Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13) Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode) openjdk version "9-internal" OpenJDK Runtime Environment (build 9-internal+0-2016-04-14-195246.buildd.src) OpenJDK 64-Bit Server VM (build 9-internal+0-2016-04-14-195246.buildd.src, mixed mode)
  • 10.
    1. As longas the JRE is the same, that we develop against - everything should be fine 2. As long as the Servlet container version is the same, that we develop against - everything should be fine 3. As long as the RDBMS version is the same, that we develop against - everything should be fine 4. … Evolution of Environments
  • 11.
    Evolution of Environments 1.We need to solidify versions of everything (JVM, JDK/JRE, servers, servlet containers, databases, etc) 2. There’s no good way to limit Ops people from screwing everything up 3. This should be done by software, not people 4. We already have solutions for similar problems in Java world - dependency managers!
  • 12.
    Dockerization: starting small 1.Docker to the rescue! 2. Make a snapshot of your environment 3. Redistribute and run anywhere © 4. Bake internal custom service versions and builds
  • 13.
  • 14.
    Dockerization: starting small Demo Dockerfilefor “Spaceships” https://github.com/wollfxp/project1/blob/master/Dockerfile
  • 15.
    Dockerization: starting small FROMopenjdk:10-jre VOLUME /tmp COPY target/project1-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"] Run with: gradlew clean build && docker build -t starships . docker run -p 8443:8443 --name starships --network space-net starships:latest Dockerfile:
  • 16.
    Dockerization: starting small Causedby: java.net.ConnectException: Connection refused: connect at java.base/java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:na] at java.base/java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) ~[na:na] at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:400) ~[na:na] at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:243) ~[na:na] at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:225) ~[na:na] at java.base/java.net.PlainSocketImpl.connect(PlainSocketImpl.java:148) ~[na:na] at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:402) ~[na:na] at java.base/java.net.Socket.connect(Socket.java:591) ~[na:na] at com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:173) ~[mysql-connector-java-8.0.11.jar:8.0.11] at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:66) ~[mysql-connector-java-8.0.11.jar:8.0.11] ... 58 common frames omitted WARN 2196 --- [ restartedMain] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata : Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
  • 17.
    Dockerization: starting small Thistime we remember about the database! Re-Run with: gradlew clean build && docker build -t starships . docker run -p 3306:3306 -v C:/dev/docker/mysql-project1:/var/lib/mysql --env MYSQL_ROOT_PASSWORD=s3cur1ty@maks --env MYSQL_DATABASE=space --name mysql-project1 --network space-net mysql:5.6 docker run -p 8443:8443 --name starships --network space-net starships:latest
  • 18.
  • 19.
  • 20.
  • 21.
    Dockerization: next steps Demo docker-composefile for “Spaceships” https://github.com/wollfxp/project1/blob/master/docker-compose.yml
  • 22.
    Dockerization: next steps Runwith: gradlew clean build && docker build -t starships . docker-compose up
  • 23.
  • 24.
    Dockerization: next steps Hello,world with Kubernetes!
  • 25.
    Kubernetes from scratch 1.Enabling Kubernetes in Docker for Windows/Docker for Mac
  • 26.
  • 27.
    Kubernetes from scratch 1.Enabling Kubernetes in Docker for Windows/Docker for Mac 2. Checking that everything works
  • 28.
    Kubernetes from scratch $kubectl version Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.11", GitCommit:"637c7e288581ee40ab4ca210618a89a555b6e7e9", GitTreeState:"clean", BuildDate:"2018-11-26T14:38:32Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"windows/amd64"} Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.11", GitCommit:"637c7e288581ee40ab4ca210618a89a555b6e7e9", GitTreeState:"clean", BuildDate:"2018-11-26T14:25:46Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"} $ kubectl get all NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 443/TCP 4d
  • 29.
    Kubernetes from scratch 1.Enabling Kubernetes in Docker for Windows/Docker for Mac 2. Checking that everything works 3. Running Kompose 4. Deploy to Kubernetes
  • 30.
    Kubernetes and Komposedemo Let’s try it! https://github.com/wollfxp/project1/tree/master-february
  • 31.
  • 32.
    Kubernetes from scratch… ? Problem: we cannot reach our service! Solution: Ingress! Deploy NGINX!
  • 33.
    Kubernetes from scratch… ? https://kubernetes.github.io/ingress-nginx/user-guide/tls/#ssl-passthrough
  • 34.
    Kubernetes from scratch… ? Problem: we cannot reach our service! And NGINX won’t help! Solution: NodePort! Expose our service!
  • 35.
  • 36.
    Kubernetes: next steps 1.Get rid of HTTPS in the application and use NGINX for that 2. Proper load balancing via Ingress 3. Deploy multiple types of the same instances (/app,/api,/admin) 4. Utilize namespaces to limit visibility of environments 5. Start using K8S metric API to get more info about your cluster 6. Deploy anywhere* with the same** configuration 7. Log aggregation (maybe?)
  • 37.
  • 38.