在本教程中,我们将学习如何使用 Minikube 和 JKube Maven 插件在 Kubernetes 上安装 Spring Boot 应用程序。
Kubernetes 是一个开源系统,用于跨多个主机管理容器化应用程序。它为应用程序的部署、维护和扩展提供了基本机制。开始使用 Kubernetes 的最简单方法是安装 Minikube。
Minikube 是一个轻量级的 Kubernetes 实现,它在您的本地机器上创建一个 VM,并部署一个包含单个节点的简单集群,并附带一个 CLI,该 CLI 提供用于使用集群的基本引导操作,包括启动、停止、状态、并删除
安装 Minikube 的详细过程在:https://minikube.sigs.k8s.io/docs/start/
要安装二进制发行版,您只需下载它并在其上运行“安装”命令:
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 $ sudo install minikube-linux-amd64 /usr/local/bin/minikube
完成后,启动“minikube start”命令,该命令将为您的环境选择驱动程序并下载运行 Kubernetes 组件所需的虚拟机:
minikube start
😄 minikube v1.15.1 on Fedora 29
▪ KUBECONFIG=/home/francesco/taskforce/install/auth/kubeconfig
✨ Using the kvm2 driver based on existing profile
👍 Starting control plane node minikube in cluster minikube
🎉 minikube 1.24.0 is available! Download it: https://github.com/kubernetes/minikube/releases/tag/v1.24.0
💡 To disable this notice, run: 'minikube config set WantUpdateNotification false'
🔄 Restarting existing kvm2 VM for "minikube" ...
🐳 Preparing Kubernetes v1.19.4 on Docker 19.03.13 ...
🔎 Verifying Kubernetes components...
🔎 Verifying registry addon...
🌟 Enabled addons: default-storageclass, storage-provisioner, registry, dashboard
❗ /usr/local/bin/kubectl is version 1.15.3, which may have incompatibilites with Kubernetes 1.19.4.
▪ Want kubectl v1.19.4? Try 'minikube kubectl -- get pods -A'
🏄 Done! kubectl is now configured to use "minikube" cluster and "default" namespace by default
接下来,验证 default 和 kube-system 服务是否可用:
minikube service list
|----------------------|-----------------------------|--------------|-----|
| NAMESPACE | NAME | TARGET PORT | URL |
|----------------------|-----------------------------|--------------|-----|
| default | kubernetes | No node port |
| kube-system | kube-dns | No node port |
| kube-system | registry | No node port |
| kubernetes-dashboard | dashboard-metrics-scraper | No node port |
| kubernetes-dashboard | kubernetes-dashboard | No node port |
|----------------------|-----------------------------|--------------|-----|
太好了,您的 Kubernetes 集群现已启动并运行。
然后,为了使用 Minikube 的 Docker 实例构建 Docker 镜像,执行:
$ eval $(minikube docker-env)
命令 minikube docker-env 返回一组 Bash 环境变量导出,以配置您的本地环境以重用 Minikube 实例内的 Docker 守护程序。
如果您未能配置您的 Minikube 环境,您将在部署资源时看到错误:“Connection reset by peer”
我们将在 Minikube 上部署一个最小的 Spring Boot 应用程序,其中只有一个 Hello World 控制器:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/")
public String index() {
return "Greetings from Spring Boot!!";
}
}
为了在 Kubernetes 上部署这个 Spring Boot 应用程序,我们将使用 JKube。
Eclipse JKube 是一组插件和库,用于使用 Docker、JIB 或 S2I 构建策略构建容器镜像。 Eclipse JKube 也在编译时生成和部署 Kubernetes/OpenShift 清单。
要使用 JKube,只需将其作为 Maven 插件添加到您的项目中:
<?xml version="1.0" encoding="UTF-8"?><profile>
<id>kubernetes</id>
<build>
<plugins>
<plugin>
<groupId>org.eclipse.jkube</groupId>
<artifactId>kubernetes-maven-plugin</artifactId>
<version>${jkube.version}</version>
<configuration>
<resources>
<labels>
<all>
<testProject>spring-boot-sample</testProject>
</all>
</labels>
</resources>
<generator>
<includes>
<include>spring-boot</include>
</includes>
<config>
<spring-boot>
<color>always</color>
</spring-boot>
</config>
</generator>
<enricher>
<excludes>
<exclude>jkube-expose</exclude>
</excludes>
<config>
<jkube-service>
<type>NodePort</type>
</jkube-service>
</config>
</enricher>
</configuration>
<executions>
<execution>
<goals>
<goal>resource</goal>
<goal>build</goal>
<goal>helm</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
在 Kubernetes 上部署应用程序,只需要 3 个简单的步骤:
mvn clean k8s:resource -Pkubernetes
然后通过达到构建目标来启动 docker build。
mvn package k8s:build -Pkubernetes
最后,在 Kubernetes 集群上部署您的应用程序:
mvn k8s:deploy -Pkubernetes
部署后,您可以看到 Kubernetes 集群内运行的 pod:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
spring-boot--5b7d6dfb6f-2nsnm 1/1 Running 0 23s
您可以尝试使用 minikube 服务命令访问您的应用程序,如下所示:
$ minikube service spring-boot
|-----------|-------------|-------------|----------------------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|-------------|-------------|----------------------------|
| default | spring-boot | http | http://192.168.39.76:32429 |
|-----------|-------------|-------------|----------------------------|
Opening service default/spring-boot in default browser...
请注意,有一个影响某些 JDK 的已知问题:https://bugs.openjdk.java.net/browse/JDK-8236039
发生这种情况时,客户端会抛出异常:
“javax.net.ssl.SSLHandshakeException:扩展名 (5) 不应出现在证书请求中”
发生这种情况是因为 JDK 11 及更高版本支持可能导致上述错误的 TLS 1.3。
您可以通过将属性 -Djdk.tls.client.protocols=TLSv1.2 设置为 JVM 参数以使其使用 1.2 来解决此问题。作为替代方案,更新到最新版本 od JDK(在 JDK 15 中已完全解决)。
在 Kubernetes 上享受 Spring Boot!
您可以在以下位置找到此 Maven 项目的源代码:https://github.com/eclipse/jkube/tree/master/quickstarts/maven/spring-boot
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
内容来源于网络,如有侵权,请联系作者删除!