应用程序部署至 Kubernetes 指南
1. 前置环境准备
要运行 Quarkus 测试、使用 Docker 守护进程构建和推送容器镜像,你需要一个可用的 Docker 环境。不过,我们也会探讨无需 Docker 守护进程的替代方案。大多数 Linux 发行版都有可用的 Docker 软件包,如果你使用的是 Windows 或 macOS 系统,可以安装 Docker Desktop。
2. 认识 Kubernetes
Kubernetes 是一个用于容器编排的开源解决方案,由谷歌在 2014 年首次发布,后来移交给云原生计算基金会(CNCF)。它允许你以自动化、声明式的方式部署、扩展和管理基于容器的应用程序。
Kubernetes 的主要特点之一是它抽象了底层硬件基础设施,提供了一个声明式接口来进行配置。这使得你可以定义应用程序的部署要求,而 Kubernetes 会负责为你设置和配置硬件基础设施。通过这种方式,开发人员可以自行部署应用程序,只需为其工作负载提供声明式配置,而无需运维团队或系统管理员的协助。
3. 容器化应用程序及其优势
开发人员面临的最大问题之一是应用程序运行环境的差异。“在我的机器上能运行”这句话大家肯定都很熟悉。当我们遇到应用程序或其组件在开发环境中运行正常,但在生产环境中却无法运行的情况时,可能自己也说过这句话。这也是 Docker 在 2013 年首次发布 Docker 容器解决方案后如此受欢迎的原因之一。
容器镜像是一种将应用程序及其所有依赖项以隔离、统一、标准、轻量级、可重现和可靠的方式进行打包和分发的方法。多年来,系统管理员和运维人员不得不配置生产机器或虚拟机(VM),以满足应用程序的部署要求。然而,容器和容器镜像的引入使系统管理员能够将应用程序视为标准单元,以统一和一致的方式进行管理。系统管理员不再需要了解特定应用程序的具体细节和要求,因为容器镜像封装了所有这些细节,并允许应用程序在任何环境中以相同的条件进行部署。
容器化应用程序具有以下优点:
- 应用程序各阶段(开发、测试和生产)的环境一致性
- 轻量级运行时
- 更高效的硬件和资源使用
- 持续开发和持续集成
4. 使用 Minikube 设置本地集群
访问生产级 Kubernetes 集群可能困难或成本高昂。大多数云提供商,如微软(AKS)、亚马逊(EKS)、谷歌(GKE)等,都提供免费试用,但大多需要信用卡或初始付款。幸运的是,有很多方法可以为开发目的运行本地 Kubernetes 集群。下面我们将介绍如何设置 Minikube,它是最受欢迎的替代方案之一,并且与大多数操作系统兼容。
设置步骤如下:
1. 下载 Minikube 并将其添加到系统路径。你可以在 https://minikube.sigs.k8s.io/docs/start/ 找到主流操作系统的详细说明。
2. 若按照官方 Minikube 文档的步骤操作,Minikube 二进制文件应已添加到系统路径。在控制台或终端中运行以下命令启动集群:
minikube start
- 启动成功后,还需要启用 Minikube 的 Ingress 插件,以完成后续任务。执行以下命令启用该插件:
minikube addons enable ingress
5. 创建容器镜像
无论应用程序采用何种架构,为了利用任何可用的云提供商,很可能需要将应用程序作为容器镜像进行分发,因为容器镜像现在是标准的分发单元。在 Kubernetes 环境中,容器和容器镜像是运行应用程序的方式。这意味着能够部署应用程序的主要要求之一是将其打包成一个或多个容器镜像,并将这些镜像推送到 Kubernetes 集群可访问的外部注册表。部署时,Kubernetes 将从注册表下载容器镜像,并在 Pod 内的容器中运行它。
Kubernetes Pod 是 Kubernetes 中最小的可部署计算单元,是 Kubernetes 的基本构建块。它包含一组一个或多个应用程序容器,这些容器共享网络和存储资源。无论你使用何种工作负载资源对象(如 Deployment、StatefulSet、Job 等)来定义应用程序容器,最终都会在 Pod 中运行。
为了构建和部署应用程序,我们将使用 Eclipse JKube 及其 Kubernetes Maven 插件,原因如下:
- 支持多种框架和库 :Eclipse JKube 适用于 Quarkus,也与其他框架和库(如 Spring Boot、Open Liberty、WildFly 等)兼容。能够为不同用例重用相同的知识非常有用,特别是在处理使用不同技术实现的微服务时。
- 无需处理 Dockerfile :定义容器镜像最常见的方法是通过 Dockerfile。Dockerfile 就像一个包含组装容器镜像所需所有命令的配方或脚本。Quarkus 提供了自己的 Dockerfile,可在 src/main/docker 目录中找到。这些文件有特殊的语法,需要理解并进行定期维护。而使用 Eclipse JKube,无需使用 Dockerfile,因为它可以通过分析项目自动为你的应用程序生成容器镜像。
- 单一依赖适用于所有任务和环境 :Quarkus 提供了多个扩展,用于生成容器镜像以及生成和部署集群配置清单到 Kubernetes。然而,你需要混合使用多个扩展才能达到与 Eclipse JKube 相同的效果。当需要处理多个目标环境(如 Minikube、OpenShift 等)时,这会变得更加困难。而使用 Eclipse JKube,你只需要在项目的插件部分添加 Kubernetes Maven 插件。
- 额外的开发工具 :Eclipse JKube 可以为你的应用程序生成容器镜像,将其推送到外部注册表,生成集群配置清单,生成和推送 Helm 图表等。它还包括一些特定于开发人员的工具,以改善 Kubernetes 体验,如检索集群中运行的应用程序的日志、打开调试会话、部署和取消部署配置清单等。
6. 在 Docker Hub 创建镜像仓库
如果你没有 Docker Hub 账户,需要先访问 https://hub.docker.com/ 注册一个新账户。有一个免费的个人计划适合我们的需求,只需一个电子邮件账户即可。
登录 Docker Hub 后,创建镜像仓库的步骤如下:
1. 进入仓库部分(也可通过 https://hub.docker.com/repositories 访问),点击“Create Repository”按钮。
2. 将镜像名称设置为 task-manager ,你也可以填写描述信息。
3. 点击“Create”按钮,仓库即创建完成。
7. 使用 Eclipse JKube 构建容器镜像
使用 Eclipse JKube 构建容器镜像很简单,只需将 Kubernetes Maven 插件添加到项目中并提供一些配置标志。具体步骤如下:
1. 打开 pom.xml 文件,在 <build><plugins> 部分添加以下插件:
<plugin>
<groupId>org.eclipse.jkube</groupId>
<artifactId>kubernetes-maven-plugin</artifactId>
<version>${jkube.version}</version>
</plugin>
- 为了将镜像推送到 Docker Hub 仓库,需要更改生成的镜像名称,并将
jkube.version属性设置为最新可用版本。在pom.xml文件的<properties>部分添加以下属性:
<jkube.version>1.8.0</jkube.version>
<jkube.generator.name>marcnuri/task-manager:latest</jkube.generator.name>
请将 marcnuri 替换为你自己的 Docker Hub 用户名。
- 确保应用程序已构建和打包,在终端中运行以下命令:
./mvnw clean package -Pfrontend
- 构建成功后,执行以下命令创建容器镜像:
./mvnw k8s:build
8. 将容器镜像推送到 Docker Hub
使用 Eclipse JKube 的 Kubernetes Maven 插件将镜像推送到 Docker Hub 与构建镜像一样简单。由于 Docker Hub 是公共注册表,推送到仓库需要密码保护,以防止他人将镜像推送到你的仓库。Eclipse JKube 有多种方法来获取推送所需的凭据,最简单的方法是重用本地 Docker 配置中存储的凭据。如果你还没有这样做,需要在命令行中运行以下命令登录 Docker Hub:
docker login
输入 Docker Hub 的用户名和密码,登录成功后,执行以下命令将镜像推送到 Docker Hub:
./mvnw k8s:push
9. 使用 Jib 在无 Docker 环境下构建和推送容器镜像
Jib 是谷歌维护的一个开源工具,用于在不使用 Docker 守护进程的情况下为 Java 应用程序构建优化的容器镜像。Eclipse JKube 的一个优势是,你只需提供一个配置标志,就可以切换镜像构建策略。
要使用 Jib 代替 Docker 重复构建和推送过程,请运行以下 Maven 命令,并添加相应的配置标志:
./mvnw clean package k8s:build k8s:push -DskipTests -Djkube.build.strategy=jib -Djkube.docker.push.username=marcnuri -Djkube.docker.push.password=$password
这些属性的作用如下:
- -DskipTests :这是一个 Maven 设置,用于跳过运行测试。由于我们的测试使用了需要 Docker 守护进程的 Quarkus Dev Services,而该守护进程可能不可用,因此指定此标志以跳过测试的调用和可能的失败。
- -Djkube.build.strategy=jib :此属性指示 Eclipse JKube 使用 Jib 而不是默认的 Docker 策略。Eclipse JKube 还提供了其他构建策略,但大多适用于其他 Kubernetes 集群类型(如 OpenShift)。
- -Djkube.docker.push.username=marcnuri :由于没有可用的 Docker 守护进程,Eclipse JKube 可能无法从本地 Docker 配置中推断出凭据。此属性用于提供 Docker Hub 用户名。
- -Djkube.docker.push.password=$password :与用户名属性相同,此属性用于配置 Docker Hub 凭据的密码。在这种情况下,我们使用存储在 $password 环境变量中的密码。
通过以上步骤,即使没有 Docker 环境,我们也能够将应用程序的容器镜像构建并推送到外部容器镜像注册表。接下来,我们将学习如何生成将应用程序部署到 Kubernetes 所需的配置文件。
应用程序部署至 Kubernetes 指南
10. 生成部署到 Kubernetes 的配置文件
在将容器镜像推送到 Docker Hub 之后,我们需要生成用于将应用程序部署到 Kubernetes 的配置文件。Eclipse JKube 可以帮助我们自动生成这些配置文件。
10.1 生成配置文件
在 pom.xml 文件已经配置好 Eclipse JKube 的 Kubernetes Maven 插件的基础上,执行以下命令来生成 Kubernetes 配置文件:
./mvnw k8s:resource
这个命令会根据项目的配置和依赖,自动生成 Kubernetes 部署所需的配置清单文件,如 Deployment、Service 等。生成的文件通常位于 target/classes/META-INF/jkube 目录下。
10.2 配置文件示例
以下是一个简单的 Deployment 配置文件示例( target/classes/META-INF/jkube/deployment.yml ):
apiVersion: apps/v1
kind: Deployment
metadata:
name: task-manager-deployment
spec:
replicas: 1
selector:
matchLabels:
app: task-manager
template:
metadata:
labels:
app: task-manager
spec:
containers:
- name: task-manager
image: marcnuri/task-manager:latest
ports:
- containerPort: 8080
这个配置文件定义了一个名为 task-manager-deployment 的 Deployment,指定了使用的容器镜像为 marcnuri/task-manager:latest ,并暴露了容器的 8080 端口。
11. 部署应用程序到 Kubernetes
有了生成的配置文件,我们就可以将应用程序部署到本地的 Minikube 集群中。
11.1 部署配置文件
执行以下命令将生成的配置文件部署到 Kubernetes 集群:
./mvnw k8s:deploy
这个命令会将之前生成的所有 Kubernetes 配置文件(如 Deployment、Service 等)应用到集群中。部署成功后,Kubernetes 会根据配置文件创建相应的资源对象。
11.2 验证部署
可以使用以下命令验证应用程序是否成功部署:
kubectl get pods
如果看到名为 task-manager-deployment-xxxxxx 的 Pod 处于 Running 状态,说明应用程序已经成功部署。还可以使用以下命令查看 Deployment 和 Service 的状态:
kubectl get deployments
kubectl get services
12. 访问应用程序
部署成功后,我们需要通过 Minikube 的 Ingress 来访问应用程序。
12.1 配置 Ingress
确保之前已经启用了 Minikube 的 Ingress 插件( minikube addons enable ingress )。然后,创建一个 Ingress 配置文件(如 ingress.yml ):
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: task-manager-ingress
spec:
rules:
- host: task-manager.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: task-manager-service
port:
number: 8080
这个配置文件定义了一个名为 task-manager-ingress 的 Ingress,将 task-manager.local 域名的请求转发到名为 task-manager-service 的 Service 的 8080 端口。
12.2 应用 Ingress 配置
执行以下命令将 Ingress 配置应用到集群:
kubectl apply -f ingress.yml
12.3 配置本地域名解析
为了能够通过 task-manager.local 访问应用程序,需要在本地的 hosts 文件中添加以下配置:
<minikube-ip> task-manager.local
可以使用 minikube ip 命令获取 Minikube 的 IP 地址。
12.4 访问应用程序
在浏览器中访问 http://task-manager.local ,如果一切配置正确,应该能够看到应用程序的界面。
13. 总结与注意事项
通过以上步骤,我们完成了将应用程序打包成容器镜像、推送到 Docker Hub、生成 Kubernetes 配置文件并部署到本地 Minikube 集群的整个过程。以下是一些总结和注意事项:
13.1 总结
- 容器化 :使用 Docker 容器将应用程序及其依赖打包,确保在不同环境中的一致性。
- 镜像管理 :使用 Docker Hub 作为镜像仓库,方便存储和共享容器镜像。
- Kubernetes 部署 :借助 Eclipse JKube 简化了 Kubernetes 配置文件的生成和部署过程。
- Ingress 配置 :通过 Minikube 的 Ingress 插件实现了对应用程序的外部访问。
13.2 注意事项
- 镜像名称 :在配置
jkube.generator.name属性时,要确保使用正确的 Docker Hub 用户名和镜像名称。 - 环境变量 :使用 Jib 构建和推送镜像时,要确保
$password环境变量中存储了正确的 Docker Hub 密码。 - 配置文件更新 :如果应用程序的配置或依赖发生变化,需要重新生成和部署 Kubernetes 配置文件。
通过掌握这些步骤和技巧,我们可以更加高效地将应用程序部署到 Kubernetes 平台,实现应用的自动化部署和管理。
以下是整个部署过程的流程图:
graph TD;
A[准备 Docker 环境] --> B[设置 Minikube 本地集群];
B --> C[创建 Docker Hub 镜像仓库];
C --> D[使用 Eclipse JKube 构建容器镜像];
D --> E[将容器镜像推送到 Docker Hub];
E --> F[使用 Jib 无 Docker 环境构建和推送镜像];
F --> G[生成 Kubernetes 配置文件];
G --> H[部署应用程序到 Kubernetes];
H --> I[配置 Ingress 访问应用程序];
通过这个流程图,我们可以清晰地看到从环境准备到应用程序最终部署和访问的整个过程。希望这些内容能够帮助你顺利将应用程序部署到 Kubernetes 平台。
超级会员免费看
736

被折叠的 条评论
为什么被折叠?



