如何在 Kubernetes 上部署 Web 应用程序

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将概述领先的开源容器编排平台 Kubernetes,并指导你在 Kubernetes 集群上部署一个简单的 Web 应用程序的过程。你将了解 Kubernetes 的基本组件,以及如何配置和扩展你的应用程序以满足你的需求。

Kubernetes 基础

Kubernetes 是一个强大的开源容器编排平台,已成为云原生生态系统中管理和扩展容器化应用程序的事实上的标准。本节将概述 Kubernetes 的基本概念和组件,以及如何在 Kubernetes 集群上部署一个简单的 Web 应用程序。

理解 Kubernetes

Kubernetes 是一个用于自动化容器化应用程序的部署、扩展和管理的系统。它最初由谷歌设计,现在由云原生计算基金会(CNCF)维护。Kubernetes 提供了一种声明式的方式来定义应用程序的期望状态,并且系统会努力确保实际状态与期望状态相匹配。

Kubernetes 的核心包含以下关键组件:

  • Pod:Kubernetes 中最小的可部署单元,代表一个或多个一起运行的容器。
  • 节点(Node):组成 Kubernetes 集群并运行容器化应用程序的物理或虚拟机。
  • 部署(Deployment):声明式配置,定义应用程序的期望状态,包括副本数量、容器镜像和其他设置。
  • 服务(Service):抽象概念,定义一组逻辑上的 Pod 以及访问它们的策略。
  • 卷(Volume):可附加到 Pod 的持久存储,允许数据在单个容器的生命周期之外持久存在。

在 Kubernetes 上部署 Web 应用程序

为了演示 Kubernetes 的基础知识,让我们在 Kubernetes 集群上部署一个简单的 Web 应用程序。对于这个示例,我们将使用一个基本的 Nginx Web 服务器。

首先,创建一个具有以下内容的部署清单文件(例如,nginx-deployment.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

此部署清单定义了 Nginx Web 服务器容器的三个副本的部署。

要创建该部署,请运行以下命令:

kubectl create -f nginx-deployment.yaml

Kubernetes 现在将开始创建 Pod 并管理 Nginx Web 应用程序的部署。

接下来,让我们创建一个服务,将 Nginx Web 应用程序暴露给外部:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx

此服务清单定义了一个负载均衡器类型的服务,它将在端口 80 上暴露 Nginx Web 应用程序。

要创建该服务,请运行以下命令:

kubectl create -f nginx-service.yaml

Kubernetes 现在将创建一个负载均衡器,并将 Nginx Web 应用程序暴露到互联网。

现在,你可以通过访问负载均衡器服务的外部 IP 地址来访问 Nginx Web 应用程序。

在 Kubernetes 上部署 Web 应用程序

既然我们对 Kubernetes 有了基本的了解,那就深入学习如何在 Kubernetes 集群上部署一个更复杂的 Web 应用程序。在本节中,我们将介绍部署和管理 Web 应用程序所需的关键 Kubernetes 概念和资源,包括 Pod、服务(Service)和卷(Volume)。

Pod 和容器

在 Kubernetes 中,部署的基本单元是 Pod,它代表一个或多个一起运行的容器。Pod 中的容器共享相同的网络命名空间,并且可以使用 localhost 相互通信。这使得创建多容器应用程序变得容易,其中每个容器专门负责一项特定任务,例如 Web 服务器、数据库或消息队列。

以下是一个运行 Web 服务器和数据库容器的 Pod 清单示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-web-app
spec:
  containers:
    - name: web-server
      image: nginx:latest
      ports:
        - containerPort: 80
    - name: database
      image: mysql:5.7
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: mypassword

服务(Service)和负载均衡

虽然 Pod 为你的应用程序提供了基本构建块,但你通常希望使用 Kubernetes 服务(Service)将 Web 应用程序暴露给外部。服务(Service)是一种抽象概念,它定义了一组逻辑上的 Pod 以及访问它们的策略。

以下是一个暴露上例中 Web 服务器 Pod 的服务(Service)清单示例:

apiVersion: v1
kind: Service
metadata:
  name: my-web-app-service
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: my-web-app

此服务(Service)清单创建了一个负载均衡器类型的服务(Service),它将在端口 80 上暴露 Web 服务器 Pod。selector 字段匹配带有 app=my-web-app 标签的 Pod。

卷(Volume)和持久存储

除了 Web 应用程序本身,你通常还需要持久化数据,例如用户上传的数据、配置文件或数据库数据。Kubernetes 提供了一个名为卷(Volume)的强大抽象概念,它允许你将存储附加到 Pod。

以下是一个使用卷(Volume)存储数据库数据的 Pod 清单示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-database
spec:
  containers:
    - name: database
      image: mysql:5.7
      env:
        - name: MYSQL_ROOT_PASSWORD
          value: mypassword
      volumeMounts:
        - name: data
          mountPath: /var/lib/mysql
  volumes:
    - name: data
      emptyDir: {}

在这个示例中,emptyDir 卷(Volume)类型用于创建一个临时存储卷,它在 Pod 的生命周期内持续存在。你也可以使用其他卷(Volume)类型,例如 hostPathpersistentVolumeClaim,来提供更持久的存储解决方案。

配置和扩展 Kubernetes 应用程序

既然我们已经介绍了在 Kubernetes 上部署 Web 应用程序的基础知识,现在来探讨如何配置和扩展该应用程序,以满足不断变化的需求并确保高可用性。

配置应用程序

Kubernetes 提供了多种配置应用程序的机制,包括:

  1. 环境变量:你可以在 Pod 或部署清单中定义环境变量,以便将配置数据传递给容器。
  2. 配置映射(ConfigMap):配置映射允许你将配置数据与容器镜像解耦,从而更轻松地进行管理和更新。
  3. 密钥(Secret):密钥是一种以安全方式存储和管理敏感信息(如密码或 API 密钥)的方法。

以下是一个使用配置映射(ConfigMap)和密钥(Secret)的部署示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-web-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-web-app
  template:
    metadata:
      labels:
        app: my-web-app
    spec:
      containers:
      - name: web-server
        image: nginx:latest
        envFrom:
        - configMapRef:
            name: my-config
        envFrom:
        - secretRef:
            name: my-secret

扩展应用程序

Kubernetes 的主要优势之一是能够根据需求自动扩展应用程序的规模。Kubernetes 提供了多种扩展机制,包括:

  1. 水平 Pod 自动扩缩(Horizontal Pod Autoscaling, HPA):HPA 根据 CPU 利用率或其他自定义指标自动调整部署中的 Pod 数量。
  2. 集群自动扩缩:集群自动扩缩根据 Pod 的资源需求自动向 Kubernetes 集群中添加或移除节点。

以下是一个基于 CPU 利用率扩展 Web 应用程序的 HPA 清单示例:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: my-web-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-web-app
  minReplicas: 3
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50

此 HPA 清单将根据 Pod 之间的平均 CPU 利用率,自动将 my-web-app 部署中的 Pod 数量在 3 到 10 个副本之间进行扩展。

高可用性和可移植性

Kubernetes 还提供了一些功能来确保应用程序的高可用性和可移植性。这些功能包括:

  • 就绪和存活探测:探测允许 Kubernetes 确定容器的健康状态,并自动重启或替换不健康的 Pod。
  • 命名空间:命名空间提供了一种隔离和组织 Kubernetes 资源的方式,使管理和扩展应用程序更加容易。
  • 入口(Ingress):入口提供了一种在单个外部 IP 地址下暴露多个服务的方法,简化了应用程序外部访问的管理。

通过利用这些 Kubernetes 功能,你可以构建高可用、可扩展且可移植的应用程序,这些应用程序能够适应不断变化的需求,并在不同环境中持续运行。

总结

在本教程中,你已经学习了 Kubernetes 的基本概念,包括 Pod、节点(Node)、部署(Deployment)和服务(Service)。你还了解了如何在 Kubernetes 集群上部署一个简单的 Nginx Web 应用程序,以及如何配置和扩展该应用程序以满足你的需求。通过理解这些 Kubernetes 基础知识,你将更有能力在云原生环境中管理和扩展自己的容器化应用程序。