21、应用程序部署至 Kubernetes 指南

应用程序部署至 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
  1. 启动成功后,还需要启用 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>
  1. 为了将镜像推送到 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 用户名。

  1. 确保应用程序已构建和打包,在终端中运行以下命令:
./mvnw clean package -Pfrontend
  1. 构建成功后,执行以下命令创建容器镜像:
./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 平台。

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值