- Docker 教程
- Docker - 首页
- Docker - 概述
- Docker - 在 Linux 上安装
- Docker - 安装
- Docker - Hub
- Docker - 镜像
- Docker - 容器
- Docker - 注册表
- Docker - Compose
- Docker - 操作容器
- Docker - 架构
- Docker - 层
- Docker - 容器与主机
- Docker - 配置
- Docker - 容器与 Shell
- Docker - Dockerfile
- Docker - 构建文件
- Docker - 公共仓库
- Docker - 管理端口
- Docker - Web 服务器
- Docker - 命令
- Docker - 容器链接
- Docker - 数据存储
- Docker - 卷
- Docker - 网络
- Docker - 安全
- Docker - 工具箱
- Docker - 云
- Docker - 构建云
- Docker - 日志
- Docker - 持续集成
- Docker - Kubernetes 架构
- Docker - Kubernetes 的工作原理
- Docker - 生成式 AI
- Docker - 托管
- Docker - 最佳实践
- Docker 设置服务
- Docker - 设置 Node.js
- Docker - 设置 MongoDB
- Docker - 设置 NGINX
- Docker - 设置 ASP.Net
- Docker - 设置 MySQL
- Docker - 设置 Go
- Docker - 设置 Rust
- Docker - 设置 Apache
- Docker - 设置 MariaDB
- Docker - 设置 Jupyter
- Docker - 设置 Portainer
- Docker - 设置 Rstudio
- Docker - 设置 Plex
- Docker 设置 - Flame
- Docker 设置 - PostgreSql
- Docker 设置 - Mosquitto
- Docker 设置 - Grafana
- Docker 设置 - Nextcloud
- Docker 设置 - Pawns
- Docker 设置 - Ubuntu
- Docker 设置 - RabbitMQ
- Docker - 设置 Python
- Docker - 设置 Java
- Docker - 设置 Redis
- Docker - 设置 Alpine
- Docker - 设置 BusyBox
- Docker 设置 - Traefik
- Docker 设置 - WordPress
- Docker 有用资源
- Docker - 快速指南
- Docker - 有用资源
- Docker - 讨论
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!";
}
}
构建应用程序
要将应用程序打包成 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 images
新创建的镜像应该在输出中。
其他注意事项
- 基础镜像 - 选择满足您的应用程序需求和性能的基础镜像。
- 多阶段构建 - 在优化镜像大小和分离构建和运行时环境时,考虑使用多阶段构建。
- 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/
将 minikube-linux-amd64 替换为您操作系统的相应二进制文件。
2. 启动 Minikube 集群 -
$ minikube start
安装 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
这将获取 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
您将看到列出的单个节点,即 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 会根据配置自动处理容器生命周期、负载均衡或扩展。