17、部署 EmojiJournalServer 至生产环境

部署 EmojiJournalServer 至生产环境

1. 引言

此前,EmojiJournal 项目一直运行在开发环境中,无论是在 macOS 本地运行,还是在本地 macOS 机器的基于 Linux 的 Docker 容器中运行。现在,我们将学习如何将 EmojiJournalServer 部署到生产环境,使其具备高可用性、高可扩展性和高可观测性,以应对大量客户端请求。

2. 使用 Kubernetes 部署 Docker

Kubernetes(https://kubernetes.io)是云原生计算基金会(https://www.cncf.io)的核心项目之一,它是一个用于自动化部署、扩展和管理容器化应用程序的开源系统。它为部署和管理像 EmojiJournalServer 这样构建为 Docker 镜像并能在 Docker 容器中运行的应用程序提供了平台。

Kubernetes 的优势如下:
- 可扩展性 :可以部署多个实例(副本),并通过水平 Pod 自动缩放根据监控数据自动添加或删除副本。
- 自动重启 :基于存活或健康检查,自动重启失败的副本,Kitura 项目默认包含 /health 端点,方便确保应用始终可用。
- 云支持广泛 :得到公共云的广泛支持,可以与首选的云供应商一起使用,也可在不同云供应商之间迁移。
- 本地运行 :可以在 macOS 机器上本地运行,并且直接集成在 Docker Desktop 中,易于安装和使用。

3. 在 Docker Desktop 中安装 Kubernetes

在 Docker Desktop 中安装和启用 Kubernetes 支持的步骤如下:
1. 从启动台选择 Docker 应用程序,确保 Docker 正在运行,此时 Docker 图标会添加到菜单栏。
2. 选择菜单栏中的 Docker 图标,点击“Preferences”。
3. 在偏好设置窗口中,选择“Kubernetes”选项卡,选中“Enable Kubernetes”复选框,然后点击“Apply”。
4. 在询问“Install the Kubernetes Cluster now?”的对话框中点击“Install”开始安装。
5. 安装过程需要几分钟,完成后右下角的指示灯会变为绿色。

安装 Kubernetes 的同时,也安装了用于与 Kubernetes 交互的 kubectl 命令行工具。在使用 kubectl 之前,我们需要先安装 Helm。

4. Helm 介绍与安装

Helm 可以帮助我们定义、安装和升级复杂的 Kubernetes 应用程序。它能将应用程序及其配置文件打包成 Chart,描述应用程序的部署和运行方式,包括副本数量、水平 Pod 自动缩放配置等,还为应用程序提供版本控制。

安装 Helm 的步骤如下:
1. 检查是否安装了 Homebrew:打开终端应用程序,运行 brew 命令。如果已安装,会显示使用信息;如果显示错误信息,按照 http://brew.sh 的说明安装 Homebrew。
2. 在终端中输入以下命令安装 Helm CLI:

brew install kubernetes-helm
  1. 使用 Helm CLI 初始化 Helm:
helm init

这会配置本地 Helm 客户端,并在 Kubernetes 集群中安装一个名为 Tiller 的 Helm 服务器组件。Tiller 会根据 Helm Chart 与 Kubernetes 交互,进行安装、升级、回滚、查询和删除 Kubernetes 资源等操作。

5. 部署 Helm Chart
5.1 部署 PostgreSQL 数据库的 Helm Chart

此前我们使用本地安装的 PostgreSQL 数据库,迁移到基于云的部署后,需要在 Kubernetes 集群中运行自己的实例。幸运的是,稳定的 Helm Chart 仓库(https://github.com/helm/charts)中已经有 PostgreSQL 的 Helm Chart。

部署步骤如下:
1. 检查 Helm 客户端是否配置了“stable”仓库:

helm repo list

如果“stable”条目不存在,可以使用以下命令添加:

helm repo add stable \
  https://kubernetes-charts.storage.googleapis.com
  1. 部署 PostgreSQL 实例:
helm install --name postgresql-database \
  --set postgresDatabase=emojijournal stable/postgresql \
  --version 0.17.0

这会请求 Helm 安装 stable/postgresql 图表作为名为 postgresql-database 的版本,并传递 postgresDatabase=emojijournal 配置,创建一个名为 emojijournal 的数据库。默认情况下,图表会创建并使用 postgres 用户,并自动生成密码。

  1. 查看部署状态:
helm status postgresql-database

也可以使用 kubectl 命令查询所有部署的应用实例(Pod)的状态:

kubectl get pods
5.2 EmojiJournalServer 的 Helm Chart

由于已经有 PostgreSQL 的 Helm Chart,我们只需安装即可。而要以同样的方式部署 EmojiJournalServer,需要自己的 Helm Chart。

EmojiJournalServer 的 Helm Chart 由多个配置文件组成,存储在项目的 chart/emojijournalserver 目录中。

  • Chart.yaml 文件 :包含应用程序的描述和版本信息。
apiVersion: v1
description: A Helm chart for Kubernetes
name: emojijournalserver
version: 1.0.0
  • values.yaml 文件 :包含大部分配置信息,如副本数量、镜像仓库、资源请求等。
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
revisionHistoryLimit: 1
image:
  repository: registry.ng.bluemix.net/replace-me-namespace/emojijournalserver
  tag: v1.0.0
  pullPolicy: Always
  resources:
    requests:
      cpu: 200m
      memory: 300Mi
livenessProbe:
  initialDelaySeconds: 3000
  periodSeconds: 1000
service:
  name: swift
  type: NodePort
  servicePort: 8080
hpa:
  enabled: false
  minReplicas: 1
  maxReplicas: 2
  metrics:
    cpu:
      targetAverageUtilization: 70
    memory:
      targetAverageUtilization: 70
base:
  enabled: false
  replicaCount: 1
  image:
    tag : v0.9.9
  weight: 100
istio:
  enabled: false
  weight: 100
generatedBindings:
  enabled: true

我们需要更新 values.yaml 文件中的 image 部分:

image:
  repository: emojijournalserver-swift-run
  tag: latest
  pullPolicy: IfNotPresent
  resources:
    requests:
      cpu: 200m
      memory: 300Mi

这样更新后,Kubernetes 集群中的 Tiller 服务器会尝试从 Docker Hub 拉取镜像,但如果本地有版本,会优先使用本地版本。将 tag 字段更新为 latest 意味着每次重新部署 Helm Chart 时都会拉取最新构建的 Docker 镜像,这在开发过程中很有用,生产环境中应使用固定版本。

此外,还需要配置应用程序访问 PostgreSQL 数据库实例的位置和凭据。打开 chart/emojijournalserver/bindings.yaml 文件,添加以下内容:

- name: DBHOST
  value: postgresql-database
- name: DBPASSWORD
  valueFrom:
    secretKeyRef:
      name: postgresql-database
      key: postgres-password

这会将 DBHOST 环境变量设置为部署 PostgreSQL 实例时使用的名称,将 DBPASSWORD 环境变量设置为从 postgresql-database 配置中获取的 postgres-password 密钥。

以下是部署流程的 mermaid 流程图:

graph LR
    A[开始] --> B[安装 Kubernetes]
    B --> C[安装 Helm]
    C --> D[部署 PostgreSQL Helm Chart]
    D --> E[更新 EmojiJournalServer Helm Chart 配置]
    E --> F[部署 EmojiJournalServer Helm Chart]
    F --> G[测试应用程序]
    G --> H[添加副本]
    H --> I[结束]
6. 部署 EmojiJournalServer Helm Chart

部署 EmojiJournalServer Helm Chart 的步骤如下:
1. 确保 EmojiJournalServer 能够编译:在项目根文件夹的终端中运行以下命令。

swift build
  1. 构建新的运行镜像:使用以下两个 Kitura CLI 命令。
kitura build
kitura run

这会为服务器构建一个优化的 Docker 镜像,并在 Docker 容器中运行以确保构建成功。使用 Control - C 停止进程,然后检查新镜像是否存在于本地机器的 Docker 镜像列表中。

docker images

应该会看到一个标签为 latest 的新创建的 emojijournalserver - swift - run 镜像,与 chart/emojijournalserver/values.yaml 文件中的配置匹配。

  1. 安装 Helm Chart:
helm install --name emojijournalserver chart/emojijournalserver

此时部署的 DESIRED 计数为 1 个实例,但 CURRENT 值为 0,因为应用程序仍在启动中。

  1. 查看部署状态:在终端窗口中运行以下命令。
helm status emojijournalserver

很快会显示 CURRENT 计数变为 1。

7. 测试应用程序

为了测试应用程序是否成功运行,我们可以使用 Kitura OpenAPI UI。由于 Kubernetes 在自己的网络上运行,需要将实例的端口映射到本地主机网络。

  1. 映射端口:在终端窗口中运行以下命令,注意将 emojijournalserver - deployment - 6f66c5db66 - 95xw8 替换为自己实例的名称。
kubectl port-forward \
  emojijournalserver-deployment-6f66c5db66-95xw8 8080:8080
  1. 打开 Kitura OpenAPI UI:在浏览器中打开 https://localhost:8080/openapi/ui。
  2. 创建新用户:在 /user 上进行 POST 请求,用户 ID 为 John,密码为 12345,点击“Execute”,应该会返回状态码 201。
  3. 添加新条目:在 /entries 上进行 POST 请求,输入以下内容,然后点击“Execute”。
{
  "emoji": ") ",
  "date": "2018-11-18T00:07:01.000Z"
}

登录后,请求应该会成功添加条目到数据库,并显示从 Fortune Cookie API 服务收到的运势信息。

  1. 使用 iOS 应用程序测试:在 Xcode 中打开 EmojiJournalMobileApp 项目,在 iPhone 模拟器中构建并运行。由于应用程序配置为使用 John 用户,应该会显示从部署的服务中检索到的表情符号日记条目。点击“+”按钮,选择一个表情符号,然后点击“Save”添加新条目。
8. 添加副本

Kubernetes 在实例失败时自动重启可以提高应用程序的可用性,但添加额外的副本可以进一步增强这一点。如果一个实例出现故障,其他实例可以继续处理请求,并且多个副本可以处理更大的负载,支持更多的用户。

增加副本数量只需对 EmojiJournalServer 的 Helm Chart 进行小改动。打开 charts/emojijournalserver/values.yaml 文件,将文件顶部的 replicaCount 值改为 3:

replicaCount: 3

部署至少三个副本以提供三重冗余是理想的选择,这样即使一个实例失败,另外两个实例也可能能够分担失败实例之前处理的负载。如果只有两个实例,一个失败时另一个可能无法独自处理额外的负载。

更新 Helm Chart 并部署的命令如下(如果 kubectl 仍在运行以转发端口,使用 Control + C 停止它):

helm upgrade emojijournalserver ./chart/emojijournalserver

这会立即在终端窗口显示升级正在进行的响应,由于唯一的更改是将 replicaCount 从 1 增加到 3,之前的实例会继续运行,同时会添加两个新实例。

以下是添加副本前后的对比表格:
| 副本数量 | 可用性 | 负载处理能力 |
| ---- | ---- | ---- |
| 1 | 低,实例失败时可能导致服务中断 | 低,只能处理有限的请求 |
| 3 | 高,一个实例失败时其他实例可继续服务 | 高,能处理更大的负载 |

通过以上步骤,我们成功将 EmojiJournalServer 部署到 Kubernetes 集群,并通过添加副本提高了应用程序的可用性和可扩展性。

部署 EmojiJournalServer 至生产环境

9. 监控与维护

为了确保 EmojiJournalServer 在 Kubernetes 集群中稳定运行,监控和维护是必不可少的。以下是一些监控和维护的建议:

  • 使用 Kubernetes 自带工具 :可以使用 kubectl 命令行工具来监控 Pod 的状态、资源使用情况等。例如,使用 kubectl get pods 查看所有 Pod 的状态,使用 kubectl top pods 查看 Pod 的 CPU 和内存使用情况。
kubectl get pods
kubectl top pods
  • 集成第三方监控工具 :可以集成 Prometheus 和 Grafana 等第三方监控工具,对 Kubernetes 集群和应用程序进行更详细的监控和可视化。以下是集成的步骤:
    1. 安装 Prometheus 和 Grafana 的 Helm Chart:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack
2. 配置 Grafana 数据源:在 Grafana 中添加 Prometheus 作为数据源。
3. 创建仪表盘:在 Grafana 中创建仪表盘,展示应用程序的关键指标,如请求响应时间、吞吐量等。
  • 定期备份数据 :定期备份 PostgreSQL 数据库,以防止数据丢失。可以使用 pg_dump 命令进行备份:
pg_dump -U postgres -d emojijournal > emojijournal_backup.sql
10. 水平 Pod 自动缩放(HPA)

水平 Pod 自动缩放(HPA)可以根据应用程序的负载自动调整 Pod 的数量,从而提高应用程序的可扩展性和资源利用率。以下是配置 HPA 的步骤:

  1. 确保 HPA 功能已启用:打开 chart/emojijournalserver/values.yaml 文件,将 hpa.enabled 设置为 true
hpa:
  enabled: true
  minReplicas: 1
  maxReplicas: 5
  metrics:
    cpu:
      targetAverageUtilization: 70
    memory:
      targetAverageUtilization: 70
  1. 部署更新后的 Helm Chart:
helm upgrade emojijournalserver ./chart/emojijournalserver
  1. 验证 HPA 是否正常工作:使用 kubectl get hpa 命令查看 HPA 的状态:
kubectl get hpa

以下是 HPA 工作流程的 mermaid 流程图:

graph LR
    A[开始] --> B[监控指标]
    B --> C{指标是否超过阈值}
    C -- 是 --> D[增加 Pod 数量]
    C -- 否 --> E{指标是否低于阈值}
    E -- 是 --> F[减少 Pod 数量]
    E -- 否 --> B
    D --> B
    F --> B
11. 滚动更新与回滚

在应用程序更新时,为了避免服务中断,可以使用滚动更新的方式。滚动更新会逐个替换旧的 Pod 为新的 Pod,确保服务的连续性。以下是滚动更新和回滚的步骤:

  • 滚动更新
    1. 修改 EmojiJournalServer 的代码或配置。
    2. 构建新的 Docker 镜像:
kitura build
kitura run
3. 更新 Helm Chart 中的镜像标签:打开 chart/emojijournalserver/values.yaml 文件,将 `image.tag` 更新为新的版本号。
image:
  repository: emojijournalserver-swift-run
  tag: v2.0.0
  pullPolicy: IfNotPresent
  resources:
    requests:
      cpu: 200m
      memory: 300Mi
4. 部署更新后的 Helm Chart:
helm upgrade emojijournalserver ./chart/emojijournalserver
  • 回滚 :如果更新后出现问题,可以使用 helm rollback 命令回滚到上一个版本:
helm rollback emojijournalserver 1
12. 安全配置

为了保障 EmojiJournalServer 的安全性,需要进行以下安全配置:

  • 网络策略 :使用 Kubernetes 网络策略来限制 Pod 之间的网络通信,防止恶意攻击。例如,只允许 EmojiJournalServer Pod 访问 PostgreSQL Pod:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: emojijournal-server-policy
spec:
  podSelector:
    matchLabels:
      app: emojijournalserver
  policyTypes:
  - Egress
  egress:
  - to:
    - podSelector:
        matchLabels:
          app: postgresql-database
    ports:
    - protocol: TCP
      port: 5432
  • 认证与授权 :使用 Kubernetes 的认证和授权机制,确保只有授权的用户和服务可以访问集群和应用程序。可以使用 RBAC(基于角色的访问控制)来管理权限。
  • 加密通信 :使用 TLS 加密 EmojiJournalServer 和客户端之间的通信,防止数据在传输过程中被窃取。可以使用 Cert - Manager 自动管理 TLS 证书。
13. 总结

通过以上步骤,我们完成了 EmojiJournalServer 从开发环境到生产环境的部署,包括安装 Kubernetes 和 Helm、部署 PostgreSQL 数据库和 EmojiJournalServer 的 Helm Chart、测试应用程序、添加副本、监控与维护、水平 Pod 自动缩放、滚动更新与回滚以及安全配置等。以下是整个部署过程的总结表格:

步骤 操作内容 命令示例
安装 Kubernetes 在 Docker Desktop 中安装和启用 Kubernetes 按界面操作步骤
安装 Helm 使用 Homebrew 安装 Helm CLI 并初始化 brew install kubernetes-helm helm init
部署 PostgreSQL 部署 PostgreSQL 的 Helm Chart helm install --name postgresql-database --set postgresDatabase=emojijournal stable/postgresql --version 0.17.0
部署 EmojiJournalServer 构建镜像并部署 Helm Chart swift build kitura build kitura run helm install --name emojijournalserver chart/emojijournalserver
测试应用程序 使用 Kitura OpenAPI UI 和 iOS 应用测试 按操作步骤进行
添加副本 修改 Helm Chart 中的副本数量并更新 修改 replicaCount 为 3, helm upgrade emojijournalserver ./chart/emojijournalserver
监控与维护 使用 kubectl 和第三方工具监控,定期备份数据 kubectl get pods kubectl top pods pg_dump -U postgres -d emojijournal > emojijournal_backup.sql
水平 Pod 自动缩放 配置 HPA 并部署 修改 hpa.enabled true helm upgrade emojijournalserver ./chart/emojijournalserver
滚动更新与回滚 更新和回滚 Helm Chart helm upgrade emojijournalserver ./chart/emojijournalserver helm rollback emojijournalserver 1
安全配置 配置网络策略、认证授权和加密通信 按配置文件进行

通过这些操作,我们可以确保 EmojiJournalServer 在生产环境中具备高可用性、高可扩展性和高安全性,为用户提供稳定可靠的服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值