Docker 与 Kubernetes 协同工作



Kubernetes 和 Docker 协同工作,简化了应用程序的部署和管理。Docker 将应用程序及其依赖项打包到一个可移植的容器中,确保在开发、暂存、测试和生产环境中保持一致的环境。接下来,Kubernetes 通过自动化来编排所有这些 Docker 容器 - 例如扩展、负载均衡、自我修复等任务。

Kubernetes 集群包含运行 Docker 容器的工作节点和管理集群状态的主节点。通过在 YAML 文件中定义应用程序的期望状态,Kubernetes 持续监控部署并遵循规范,从而提供高可用性和高效的资源利用率。

在本章中,让我们来看一个 Docker 容器和 Kubernetes 如何协同工作,使集群的部署和管理更加轻松的实际示例。

准备 Java Spring Boot 应用程序包

  • 访问 Spring Initializr - 打开您最喜欢的 Web 浏览器并导航到 https://start.spring.io/
  • 选择依赖项 - 在这里,选择应用程序的依赖项。对于构建简单的 REST API,您可以选择 Spring Web。
  • 创建项目 - 选择“生成”,然后“下载 ZIP 文件”。
  • 导入项目 - 将项目导入您最喜欢的 IDE,例如 IntelliJ IDEA 或 Eclipse。

使用 RESTController 创建 REST 端点

现在让我们创建一个普通的 REST 控制器 -

package com.example.demo;

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

@RestController
public class HelloController {

   @GetMapping("/")
   public String hello() {
      return "Hello from Spring Boot!";
   }
}
Docker Working of Kubernetes 1

构建应用程序

要将应用程序打包成 JAR,请运行以下 Maven 命令 -

$ mvn clean package

生成的 JAR 文件将放置在 target 目录中。

其他注意事项

  • 依赖项管理 - 使用 Maven 或 Gradle 进行正确的依赖项管理,以避免在其他地方发生冲突。
  • 配置 - 使配置外部化,通过考虑将配置保存在应用程序外部的属性文件甚至环境变量中。
  • 测试 - 编写单元测试和集成测试以确保代码质量。

Spring Boot 应用程序打包完成后,我们就可以创建 Docker 镜像了。

构建 Docker 镜像

让我们创建一个 Dockerfile 来定义 Spring Boot 应用程序构建 Docker 镜像的指令。

编写 Dockerfile

在 Spring Boot 项目的根目录中创建一个名为 Dockerfile 的文件。

FROM openjdk:17-jdk-alpine

WORKDIR /app

COPY target/*.jar app.jar

ENTRYPOINT ["java", "-jar", "app.jar"]
  • FROM openjdk:17-jdk-alpine - 这提供了基础镜像。
  • WORKDIR /app - 设置容器内的工作目录。
  • COPY target/*.jar app.jar - 它会将 target 文件夹中创建的 jar 文件复制到容器中的 /app 目录。
  • ENTRYPOINT ["java", "-jar", "app.jar"] - 设置入口点命令,在执行此命令启动容器时执行;在本例中,为 Java JAR。

您可以使用以下命令构建 Docker 镜像 -

$ docker build -t my-spring-boot-app .
  • -t my-spring-boot-app - 将您的镜像标记为 my-spring-boot-app。
  • . (点) - 将当前目录指示为构建上下文。
Docker Working of Kubernetes 2

运行以下命令以验证镜像是否已成功创建 -

$ docker images
Docker Working of Kubernetes 3

新创建的镜像应该在输出中。

其他注意事项

  • 基础镜像 - 选择满足您的应用程序需求和性能的基础镜像。
  • 多阶段构建 - 在优化镜像大小和分离构建和运行时环境时,考虑使用多阶段构建。
  • Dockerfile 最佳实践 - 使用 Dockerfile 编写最佳实践来减小镜像大小。

现在我们有了 Docker 镜像,就可以将其部署到 Kubernetes 集群中了。

Kubernetes 安装和设置

要部署我们的 Spring Boot 应用程序,我们需要一个 Kubernetes 集群。我们将了解如何使用 Minikube 设置本地 Kubernetes 环境。

设置 Minikube

Minikube 是一种允许您设置单节点 Kubernetes 的工具。

先决条件

  • 启用虚拟化(例如,VirtualBox、Hyper-V)

安装

1. 下载 Minikube 二进制文件 -

curl -L https://github.com/minikube/minikube/releases/latest/download/minikube-linux-amd64 > minikube
chmod +x minikube
sudo mv minikube /usr/local/bin/
Docker Working of Kubernetes 4

将 minikube-linux-amd64 替换为您操作系统的相应二进制文件。

2. 启动 Minikube 集群 -

$ minikube start
Docker Working of Kubernetes 5

安装 kubectl

Kubectl 是一个用于控制 Kubernetes 的命令行工具。

安装

1. 下载 Kubectl 二进制文件 -

curl -LO https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

将 linux/amd64 替换为您操作系统的相应二进制文件。

2. 配置 kubectl 以使用 Minikube -

minikube config set context minikube

验证安装

要验证本地 `minikube` 和使用 `kubectl` 设置的集群,请运行 -

minikube status
kubectl cluster-info
Docker Working of Kubernetes 6

Docker Working of Kubernetes 7

这将获取 Minikube 集群的详细信息以及您环境中运行的资源。

其他注意事项

  • Kubernetes 发行版 - 建议检查其他 Kubernetes 发行版,例如 K3s 或 MicroK8s,以满足不同的用例。
  • 云提供商 - 对于生产环境,云提供商提供托管的 Kubernetes 服务,例如 Google Kubernetes Engine、Amazon EKS 和 Azure Kubernetes Service。
  • 集群配置 - 根据您的资源限制和需求自定义 Minikube 配置。

最后,安装了 Minikube 和 kubectl 后,我们就可以开始编写必要的 YAML 配置来部署应用程序了。

设置 Kubernetes 集群

以下是关键 Kubernetes 组件 -

  • 主节点 - 控制集群并管理工作节点。
  • 工作节点 - 运行容器化应用程序。
  • Pod - Kubernetes 中最小的可部署单元,包含一个或多个容器。
  • Deployment - 管理 Pod 副本的期望状态。
  • Service - 将 Pod 上运行的应用程序公开为网络服务。

检查集群状态

您可以使用以下命令来验证 Minikube 集群是否正在正确运行 -

$ kubectl cluster-info

上述命令的结果将显示有关集群的信息,其中包含 Kubernetes 版本和主节点地址。

检查节点状态

要查看集群中的节点,您可以使用以下命令 -

$ kubectl get nodes
Docker Working of Kubernetes 8

您将看到列出的单个节点,即 Minikube 节点。

其他注意事项

  • 集群大小 - 对于生产环境,请根据工作负载确定最佳节点数量。
  • 节点资源 - 您应该配置节点资源(CPU、内存)以匹配应用程序的需求。
  • 网络配置 - 请确保节点与外部环境之间具有正确的网络连接。

现在我们准备为应用程序创建 YAML 配置了。

编写 YAML 配置

您需要一个 YAML 配置文件才能在 Kubernetes 上部署 Spring Boot 应用程序。您可以在此文件中定义应用程序所需的资源,例如部署和服务。

部署配置

Kubernetes 中的 Deployment 管理一组相同的 Pod。以下是一个 YAML 文件示例,用于定义应用程序的 Deployment -

apiVersion: apps/v1
kind: Deployment
metadata:
   name: my-spring-boot-app
spec:
   replicas: 3
   selector:
      matchLabels:
         app: my-spring-boot-app
   template:
      metadata:
         labels:
            app: my-spring-boot-app
      spec:
         containers:
         - name: my-spring-boot-app
            image: my-spring-boot-app:latest
            ports:
            - containerPort: 8080
  • replicas - 指定 Pod 实例的数量。
  • matchLabels - 确保 Deployment 管理正确的 Pod。
  • image - 指向我们之前构建的 Docker 镜像。
  • containerPort - 定义应用程序在容器内侦听的端口。

服务配置

Service 将您的应用程序公开到网络。以下是一个 Service YAML 文件示例 -

apiVersion: v1
kind: Service
metadata:
   name: my-spring-boot-app-service
spec:
   type: NodePort
   selector:
      app: my-spring-boot-app
   ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
  • type - NodePort 在每个节点的 IP 上的静态端口上公开服务。
  • port - 服务公开的端口。
  • targetPort - Service 将转发流量到的 Pod 上的端口。

应用配置

要部署应用程序,您可以使用 kubectl 应用这些配置 -

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

验证部署

要检查 Pod 和服务的状况,您可以使用以下命令 -

kubectl get pods
kubectl get services

您将看到您的应用程序正在运行,并且服务将其公开。

访问应用程序

要访问您的应用程序,您可以使用 Minikube IP 和分配给服务的 NodePort -

$ minikube service my-spring-boot-app-service

运行此命令将打开浏览器并访问服务 URL。

其他注意事项

  • 扩展 − 应始终根据流量调整 Deployment YAML 文件中副本的数量以处理更多负载。
  • 安全 − 考虑添加安全上下文和网络策略。
  • 监控 − 在生产应用中,应实施 Prometheus 和 Grafana 等监控解决方案以实现可观测性。

通过这些配置,您已成功在 Kubernetes 集群上部署了 Spring Boot 应用程序。

结论

换句话说,将 Docker 集成到 Kubernetes 中提供了一种有效的方式来部署和管理应用程序。Docker 容器确保了所有开发阶段的环境一致性,而 Kubernetes 自动编排这些容器以实现可扩展性、高可用性和最佳资源利用率。使用 YAML 配置本地化 Minikube 环境,将使开发人员的工作流程变得简单,并轻松部署和维护强大的应用程序。

Docker 与 Kubernetes 协作的常见问题

1. Docker 和 Kubernetes 之间有什么区别?

Docker 是一种用于构建、执行和管理容器的软件。它主要用于将应用程序及其依赖项安装到称为容器的标准包中。另一方面,Kubernetes 也是一个编排平台,负责处理在多个主机上运行的应用程序的自动部署或扩展等操作。由于 Docker 围绕单个容器运行,而 Kubernetes 则处理静态容器集的实现、扩展和管理。

2. Kubernetes 如何编排容器?

Kubernetes 通过包含 Pod、Deployment、Service 等资源范围来编排容器。Pod 被归类为共享资源的容器组。Deployment 负责管理 Pod 副本的期望状态,而 Service 则为一组 Pod 维持稳定的网络端点。Kubernetes 会根据配置自动处理容器生命周期、负载均衡或扩展。

广告

© . All rights reserved.