Давайте попробуем создать простейшее приложение 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.2108080/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”