Рубрики
Без рубрики

Привет, Весенний ботинок K8s!

Давайте попробуем создать простейшее приложение Java Spring, которое работает как модуль в кластере Kubernetes…. Помеченный java, kubernetes.

Давайте попробуем создать простейшее приложение Java Spring, которое работает как модуль в кластере Kubernetes.

Полный текст проекта можно найти на моем GitHub .

Структура проекта:

├── Dockerfile
├── README.md
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── k8s
│   └── depl.yaml
├── settings.gradle
└── src
    └── main
        └── java
            └── hello
                ├── App.java
                └── HelloWorldCtrl.java

App.java является нашей точкой входа:

package hello;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class App {

    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

}

и наш контроллер просто возвращает “hello world” по корневому пути:

package hello;

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;

@RestController
public class HelloWorldCtrl {

    @RequestMapping("/")
    public String index() {
        return "Greetings from Spring Boot!";
    }

}

Теперь давайте напишем Dockerfile:

FROM gradle:jdk10 as builder

COPY --chown=gradle:gradle . /app
WORKDIR /app
RUN gradle build

EXPOSE 8080
WORKDIR /app

CMD java -jar build/libs/gs-spring-boot-0.1.0.jar

Он использует Gradle для сборки приложения, а инструкция CMD запускает файл JAR.

Развертывание K8s простое. Он состоит из развертывания и службы :

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: hello-world
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: hello-world
        visualize: "true"
    spec:
      containers:
      - name: hello-world-pod
        image: marounbassam/hello-spring
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  labels:
    visualize: "true"
  name: hello-world-service
spec:
  selector:
    app: hello-world
  ports:
  - name: http
    protocol: TCP
    port: 8080
    targetPort: 8080
  type: ClusterIP

Развертывание определяет две копии модуля, на которых будет выполняться контейнер, созданный из образа, указанного в атрибуте image.

Служба имеет тип ClusterIP (служба Kubernetes по умолчанию). Это дает нам сервис внутри нашего кластера, к которому могут получить доступ другие приложения.

Создание ресурсов в вашем кластере:

kubectl create -f 

Ресурсы могут быть визуализированы следующим образом:

+---------------------+
| hello-world-service |
|                     |
|    10.15.242.210    |
+---------O-----------+
          |
          +-------------O--------------------------O
                        |                          |
              +---------O-----------+    +---------O-----------+
              |        pod 1        |    |        pod 2        |
              |                     |    |                     |
              |     hello-world     |    |     hello-world     |
              +---------------------+    +---------------------+

Внутри Кластера

Если вы используете minicube для локального запуска кластера, у вас могут возникнуть проблемы (я действительно не знаю почему). Но если вы работаете с облачным провайдером или чем-то более “серьезным”, чем minicube, вы должны быть в состоянии выполнить следующее:

$ kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-world-5bb87c95-6h4kh   1/1       Running   0          7h
hello-world-5bb87c95-bz64v   1/1       Running   0          7h
$ kubectl get svc
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
hello-world-service   ClusterIP   10.15.242.210           8080/TCP   5s
kubernetes            ClusterIP   10.15.240.1             443/TCP    7h
$ kubectl exec -it hello-world-5bb87c95-6h4kh bash
$ (inside the pod) curl 10.15.242.210:8080
$ (inside the pod) Greetings from Spring Boot!

Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий.

Оригинал: “https://dev.to/marounmaroun/hello-k8s-spring-boot-17ah”