如何使用 Helm 在 Kubernetes 上部署 Laravel 7 和 MySQL

作者选择了技术多样性基金来接受捐赠,作为Write for DOnations计划的一部分。

介绍

Laravel是当今最流行的开源 PHP 应用程序框架之一。它通常与MySQL数据库一起部署,但可以配置为使用各种后端数据存储选项。Laravel 以利用 PHP 的许多现代特性和广泛的包生态系统而自豪。

Kubernetes是一个容器编排平台,可以托管在DigitalOcean Kubernetes 集群上,以便在生产中设置和运行容器时进行大部分管理工作。Helm是一个 Kubernetes 包管理器,它使在 Kubernetes 上配置和安装服务和 Pod 变得更容易。

在本指南中,您将创建一个 Laravel PHP 应用程序,将您的应用程序构建到 Docker 映像中,并使用LAMP Helm chart将该映像部署到 DigitalOcean Kubernetes 集群接下来,您将设置 Ingress Controller 以将 SSL 和自定义域名添加到您的应用程序。完成后,您将有一个工作的 Laravel 应用程序连接到在 Kubernetes 集群上运行的 MySQL 数据库。

先决条件

第 1 步——创建一个新的 Laravel 应用程序

在这一步中,您将使用 Docker 创建一个新的 Laravel 7 应用程序,但您应该能够对使用 MySQL 作为后备数据库的现有 Laravel 应用程序执行相同的过程。您构建的新应用程序将验证 Laravel 是否已连接到数据库并显示数据库名称。

首先,移动到您的主目录,然后使用composerDocker 容器创建一个新的 Laravel 应用程序

  • cd ~
  • docker run --rm -v $(pwd):/app composer create-project --prefer-dist laravel/laravel laravel-kubernetes

一旦容器完成并安装了所有 Composer 包,您应该会在当前名为laravel-kubernetes/. 导航到该文件夹​​:

  • cd ~/laravel-kubernetes

您将从此处执行本教程的其余命令。

此应用程序的目的是测试您的数据库连接并在您的浏览器中显示其名称。为了测试数据库连接,./resources/views/welcome.blade.php在文本编辑器中打开文件:

  • nano ./resources/views/welcome.blade.php

找到该部分<div class="links">...</div>并将其内容替换为以下内容:

./resources/views/welcome.blade.php
...
<div class="links">
   <strong>Database Connected: </strong>
    @php
        try {
            DB::connection()->getPDO();
            echo DB::connection()->getDatabaseName();
            } catch (\Exception $e) {
            echo 'None';
        }
    @endphp
</div>
...

保存并关闭文件。

这就是您需要对本教程的默认 Laravel 应用程序进行的所有自定义。完成后,这个简短的 PHP 片段将测试您的数据库连接并在您的 Web 浏览器的 Laravel 启动屏幕上显示数据库的名称。

在下一步中,您将使用Docker构建一个包含此 Laravel 应用程序和Docker Compose的映像,以测试它是否在本地运行并连接到 MySQL 数据库。

第 2 步——容器化你的 Laravel 应用程序

现在您已经创建了一个新的 Laravel 应用程序,您需要将代码构建到 Docker 镜像中,然后使用 Docker Compose 测试该镜像。虽然本教程的目标是将您的应用程序部署到 Kubernetes 集群,但 Docker Compose 是一种在云中运行之前在本地测试 Docker 镜像和配置的便捷方法。这种快速反馈循环对于进行和测试小的更改非常有用。

首先,使用nano或您喜欢的文本编辑器,在 Laravel 应用程序的根目录中创建一个名为 的文件Dockerfile

  • nano ./Dockerfile

添加以下内容。Docker 将使用此文件将您的代码构建到映像中:

./Dockerfile
FROM php:7.4-apache

# Install packages
RUN apt-get update && apt-get install -y \
    git \
    zip \
    curl \
    sudo \
    unzip \
    libicu-dev \
    libbz2-dev \
    libpng-dev \
    libjpeg-dev \
    libmcrypt-dev \
    libreadline-dev \
    libfreetype6-dev \
    g++

# Apache configuration
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
RUN a2enmod rewrite headers

# Common PHP Extensions
RUN docker-php-ext-install \
    bz2 \
    intl \
    iconv \
    bcmath \
    opcache \
    calendar \
    pdo_mysql

# Ensure PHP logs are captured by the container
ENV LOG_CHANNEL=stderr

# Set a volume mount point for your code
VOLUME /var/www/html

# Copy code and run composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
COPY . /var/www/tmp
RUN cd /var/www/tmp && composer install --no-dev

# Ensure the entrypoint file can be run
RUN chmod +x /var/www/tmp/docker-entrypoint.sh
ENTRYPOINT ["/var/www/tmp/docker-entrypoint.sh"]

# The default apache run command
CMD ["apache2-foreground"]

保存并关闭文件。

这个 Dockerfile 从Docker Hub 上PHP 7.4 Apache Docker Image开始,然后安装 Laravel 应用程序通常需要的几个 Linux 包。接下来,它创建 Apache 配置文件并启用标头重写。Dockerfile 安装了几个常用的 PHP 扩展并添加了一个环境变量,以确保 Laravel 的日志通过stderr. 这将允许您通过跟踪 Docker Compose 或 Kubernetes 日志来查看 Laravel 日志。

最后,Dockerfile 将 Laravel 应用程序中的所有代码复制到/var/www/tmp并安装 Composer 依赖项。然后设置一个ENTRYPOINT,但您需要创建该文件,我们接下来将执行该操作。

在项目的根目录下,创建一个名为docker-entrypoint.sh. 当您的容器在本地或 Kubernetes 集群中运行时,此文件将运行,并将您的 Laravel 应用程序代码从/var/www/tmp目录复制/var/www/htmlApache 能够为其提供服务的位置。

  • nano ./docker-entrypoint.sh

现在添加以下脚本:

./docker-entrypoint.sh
#!/bin/bash

cp -R /var/www/tmp/. /var/www/html/
chown -R www-data:www-data /var/www/html

exec "$@"

最后一行,exec "$@"指示 shell 运行接下来作为输入参数传入的任何命令。这很重要,因为您希望Dockerapache2-foreground在此脚本执行后继续运行Apache 运行命令 ( )。保存并关闭文件。

接下来,.dockerignore在您的应用程序的根目录中创建一个文件。此文件将确保在构建 Docker 映像时不会被不应复制到其中的包或环境文件污染:

  • nano ./.dockerignore
./.dockerignore
.env
/vendor

保存并关闭文件。

在使用 Docker Compose 在本地运行应用程序之前,您需要创建的最后一个文件是docker-compose.yml文件。但是在配置这个 YAML 文件的过程中,你需要输入APP_KEYLaravel 在安装过程中生成的。发现这种通过打开和搜索./.env文件,或通过运行以下catgrep命令:

  • cat .env | grep ^APP_KEY

你会看到这样的输出:

Output
APP_KEY=base64:0EHhVpgg ... UjGE=

将您的密钥复制到剪贴板。请务必包含base64:前缀。现在docker-compose.yml在应用程序的根目录中创建文件:

  • nano ./docker-compose.yml

在这里,我们将包含 Laravel 应用程序的 PHP 映像以及一个用于运行数据库的 MySQL 容器。添加以下内容:

./docker-compose.yml
version: '3.5'
services:
  php:
    image: your_docker_hub_username/laravel-kubernetes:latest
    restart: always
    ports:
      - 8000:80
    environment:
      - APP_KEY="your_laravel_app_key"
      - APP_ENV=local
      - APP_DEBUG=true
      - DB_PORT=3306
      - DB_HOST=mysql
      - DB_DATABASE
      - DB_USERNAME
      - DB_PASSWORD
  mysql:
    image: mysql:5.7
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=${DB_DATABASE}
      - MYSQL_USER=${DB_USERNAME}
      - MYSQL_PASSWORD=${DB_PASSWORD}

使用APP_KEY您复制到剪贴板的your_laravel_app_key变量作为变量,并使用您的 Docker Hub 用户名作为your_docker_hub_username变量。保存并关闭文件。

您将使用docker build. 第二个镜像是Docker Hub 上提供的官方MySQL Docker 镜像两者都需要多个环境变量,您将在运行容器时包含这些变量。

要构建包含 Laravel 应用程序的 Docker 映像,请运行以下命令。确保your_docker_hub_username在将存储此图像的 Docker Hub替换为您的用户名或团队的用户名:

  • docker build -t your_docker_hub_username/laravel-kubernetes:latest .

接下来,您可以使用 Docker Compose 使用所需的数据库凭据运行两个容器:

  • DB_ROOT_PASSWORD=rootpassword DB_DATABASE=local_db DB_USERNAME=admin DB_PASSWORD=password docker-compose up -d

如果您愿意,可以修改此处使用的四个环境变量 ( DB_ROOT_PASSWORD, DB_DATABASE, DB_USERNAME, DB_PASSWORD),但由于您只是在本地测试应用程序,因此您不必担心保护它们。

MySQL 数据库初始化和容器准备就绪可能需要长达 30 秒的时间。完成后,您可以在您的机器上查看您的 Laravel 应用程序localhost:8000

使用 Docker Compose 在本地运行的 Laravel 应用程序

您的 PHP 应用程序将连接到您的 MySQL 数据库。连接成功后,Laravel 标志下方会出现“Database Connected: local_db”字样。

现在您已经使用 Docker Compose 在本地测试了您的 Docker 镜像,您可以通过运行docker-compose down以下命令来关闭容器

  • docker-compose down

在下一部分中,您将 Docker 映像推送到 Docker Hub,以便您的 Helm 图表可以使用它来将您的应用程序部署到您的 Kubernetes 集群。

第 3 步——将你的 Docker 镜像推送到 Docker Hub

您将用于将代码部署到 Kubernetes 的 LAMP Helm Chart 要求您的代码在容器注册表中可用。虽然您可以将映像推送到私有或自托管注册表,但出于本教程的目的,您将在 Docker Hub 上使用公开可用且免费的 Docker 注册表。

使用 Web 浏览器访问您在Docker Hub上的帐户,然后创建一个名为laravel-kubernetes.

在 Docker Hub 上创建一个新的存储库

接下来,如果您尚未从本地计算机连接到 Docker Hub,则需要登录到 Docker Hub。您可以通过命令行执行此操作:

  • docker login -u your_docker_hub_username

出现提示时输入您的登录凭据。这通常只需要在每台机器上执行一次,因为 Docker 会将您的凭据保存到~/.docker/config.json您的主目录中。

最后,将你的镜像推送到 Docker Hub:

  • docker push your_docker_hub_username/laravel-kubernetes:latest

根据您的连接

速度,
上传您的应用程序可能需要几分钟时间,但是一旦 Docker 完成,您将在终端中看到最终摘要哈希和图像大小。它看起来像这样:

Output
latest: digest: sha256:df4bdeda91484c8c26a989b13b8f27ab14d93ab2e676e3c396714cb3811c4086 size: 4918

现在您的 Laravel 应用程序已容器化并且您已将映像推送到 Docker Hub,您可以在 Helm Chart 或 Kubernetes 部署中使用该映像。在下一步中,您将根据 LAMP Helm Chart 设置自定义值并将其部署到您的 DigitalOcean Kubernetes 集群。

第 4 步 – 使用 LAMP Helm Chart 配置和部署应用程序

Helm 提供了许多Charts来帮助您使用预设的工具组合来设置 Kubernetes 应用程序。虽然您可以编写自己的Kubernetes 服务文件来完成类似的部署,但您将在本节中看到使用 Helm Chart 需要的配置要少得多。

首先,您需要一个目录来存储所有 Helm 配置文件。在 Laravel 项目的根目录中创建一个名为 的新目录helm/

  • mkdir ./helm

在该helm/目录中,您将创建两个新文件:values.ymlsecrets.yml. 首先创建并打开values.yml

  • nano ./helm/values.yml

values.yml文件将包含非秘密配置选项,这些选项将覆盖 LAMP Helm 图表中的默认值。添加以下配置,确保替换your_docker_hub_username为您自己的用户名:

./helm/values.yml
php:
  repository: "your_docker_hub_username/laravel-kubernetes"
  tag: "latest"
  fpmEnabled: false
  envVars:
    - name: APP_ENV
      value: production
    - name: APP_DEBUG
      value: false
    - name: DB_PORT
      value: 3306
    - name: DB_HOST
      value: localhost

保存并关闭文件。

现在创建一个secrets.yml文件:

  • nano ./helm/secrets.yml

secrets.yml不会被签入版本控制。它将包含敏感的配置信息,例如您的数据库密码和 Laravel 应用程序密钥。添加以下配置,根据需要进行调整以适合您的凭据:

./helm/secrets.yml
mysql:
  rootPassword: "your_database_root_password"
  user: your_database_user
  password: "your_database_password"
  database: your_database_name

php:
  envVars:
    - name: APP_KEY
      value: "your_laravel_app_key"
    - name: DB_DATABASE
      value: your_database_name
    - name: DB_USERNAME
      value: your_database_user
    - name: DB_PASSWORD
      value: "your_database_password"

确保为您的生产数据库使用强用户名和密码组合,并使用与your_laravel_app_key上面相同的组合,或者打开一个新的终端窗口并通过运行以下命令来生成一个新的。然后你可以复制 Laravel 在你的.env文件中设置的新值

  • docker run --rm -v $(pwd):/app php:cli php /app/artisan key:generate

保存并关闭secrets.yml

接下来,为了防止您的secrets.yml文件被构建到 Docker 镜像或保存到版本控制,请确保将以下行添加到您的.dockerignore.gitignore文件中。打开并附/helm/secrets.yml加到每个文件,或运行以下命令以添加两者:

  • echo '/helm/secrets.yml' >> ./.dockerignore && echo '/helm/secrets.yml' >> ./.gitignore

现在您已经为应用程序和 Docker 映像创建了 Helm 配置文件,您可以将此 Helm 图表安装为 Kubernetes 集群上的新版本。从应用程序的根目录安装图表:

  • helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml stable/lamp

你会看到这样的输出:

Output
NAME: laravel-kubernetes LAST DEPLOYED: Mon May 18 13:21:20 2020 NAMESPACE: default STATUS: deployed REVISION: 1

您的应用程序将需要一两分钟才能可用,但您可以运行此命令来监控集群中的 Kubernetes 服务:

  • kubectl get services -w

查找您的应用程序的名称:

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) laravel-kubernetes-lamp LoadBalancer your_cluster_ip your_external_ip 80:32175/TCP,3306:32243/TCP

当您的新laravel-kubernetes-lamp服务在 下显示 IP 地址时EXTERNAL-IP,您可以访问your_external_ip以查看在您的 Kubernetes 集群上运行的应用程序。您的应用程序将连接到您的数据库,您将在 Laravel 徽标下方看到数据库的名称,就像您在 Docker Compose 上本地运行应用程序时所做的那样。

使用 LAMP Helm 图表在 Kubernetes 上运行的 Laravel 应用程序

在不安全的 IP 地址上运行 Web 应用程序可能可以用于概念验证,但如果没有 SSL 证书和自定义域名,您的网站就无法投入生产。在下一步中进行设置之前,请通过命令行卸载您的版本:

  • helm delete laravel-kubernetes

在下一步中,您将扩展第一个 Helm 配置,以向 Laravel 应用程序添加 Ingress 控制器、SSL 证书和自定义域。

第 5 步 – 将入口控制器和 SSL 添加到您的 Kubernetes 集群

在 Kubernetes 中,入口控制器负责将应用程序的服务暴露给互联网。在上一步中,LAMP Helm 图表创建了一个 DigitalOcean 负载均衡器并通过负载均衡器的 IP 地址直接公开您的应用程序。

您可以直接在负载均衡器上终止 SSL 和您的域名,但是因为您在 Kubernetes 中工作,所以在同一个地方管理它们可能更方便。有关 Ingress Controller 的更多信息以及有关以下步骤的详细信息,请阅读如何使用 Helm 在 DigitalOcean Kubernetes 上设置 Nginx Ingress

LAMP Helm chart 包含一个用于支持 Ingress 的配置选项。打开你的helm/values.yml文件:

  • nano ./helm/values.yml

现在添加以下几行:

./helm/values.yml
...
# Use Ingress Controller
service:
  type: ClusterIP
  HTTPPort: 80
ingress:
  enabled: true
  domain: your_domain

这会指示您的部署不要安装负载均衡器,而是将应用程序暴露给 Kubernetes 集群的端口 80,入口控制器将在该端口将其暴露给 Internet。保存并关闭values.yml

现在运行helm install您之前运行的命令,让您的 Laravel 应用程序再次运行。确保从应用程序的根目录运行命令:

  • helm install laravel-kubernetes -f helm/values.yml -f helm/secrets.yml stable/lamp

接下来,nginx-ingress使用 Kubernetes 维护的Nginx 入口控制器在 Kubernetes 集群上安装控制器

  • helm install nginx-ingress stable/nginx-ingress --set controller.publishService.enabled=true

安装后,您将看到如下输出:

Output
NAME: nginx-ingress LAST DEPLOYED: Mon May 18 13:28:34 2020 NAMESPACE: default STATUS: deployed REVISION: 1

您还需要一个 Ingress Resource 来公开您的 Laravel 应用程序的部署。在您的应用程序的根目录中创建一个名为的新文件ingress.yml

  • nano ./ingress.yml

此文件定义应用程序的主机、SSL 证书管理器以及后端服务和端口名称。添加以下配置,将your_domain替换为您选择的域:

./ingress.yml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: laravel-kubernetes-ingress
  annotations:
    kubernetes.io/ingress.class: nginx
    cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
    - hosts:
        - your_domain
      secretName: laravel-kubernetes-tls
  rules:
    - host: your_domain
      http:
        paths:
          - backend:
              serviceName: laravel-kubernetes-lamp
              servicePort: 80

保存并关闭文件。

接下来,您应该安装Cert-Manager并创建一个颁发者,允许您使用Let’s Encrypt创建生产 SSL 证书Cert-Manager 需要自定义资源定义,您可以使用命令行Cert-Manager 存储库中应用这些定义

  • kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.15.0/cert-manager.crds.yaml

这将创建许多将显示在命令行中的 Kubernetes 资源:

Output
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/certificates.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/challenges.acme.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/clusterissuers.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/issuers.cert-manager.io created customresourcedefinition.apiextensions.k8s.io/orders.acme.cert-manager.io create

Cert-Manager 还需要一个命名空间来将它隔离在您的 Kubernetes 集群中:

  • kubectl create namespace cert-manager

你会看到这个输出:

Output
namespace/cert-manager created

由于 Jetstack 的 Cert-Manager 不是 Kubernetes 维护的图表之一,因此您还需要添加Jetstack Helm 存储库运行以下命令使其在 Helm 中可用:

  • helm repo add jetstack https://charts.jetstack.io

添加成功将输出以下内容:

Output
"jetstack" has been added to your repositories

现在您已准备好将 Cert-Manager 安装到cert-managerKubernetes 集群上命名空间中:

  • helm install cert-manager --version v0.15.0 --namespace cert-manager jetstack/cert-manager

完成后,您将看到如下所示的部署摘要:

Output
NAME: cert-manager LAST DEPLOYED: Mon May 18 13:32:08 2020 NAMESPACE: cert-manager STATUS: deployed REVISION: 1

您需要添加到 Laravel 应用程序根目录的最后一个文件是production_issuer.ymlKubernetes 配置文件。创建文件:

  • nano ./production_issuer.yml

现在添加以下内容:

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    # Email address used for ACME registration
    email: your_email_address
    server: https://acme-v02.api.letsencrypt.org/directory
    privateKeySecretRef:
      # Name of a secret used to store the ACME account private key
      name: letsencrypt-prod-private-key
    # Add a single challenge solver, HTTP01 using nginx
    solvers:
      - http01:
          ingress:
            class: nginx

保存并关闭文件。

Let’s Encrypt 会发送your_email_address任何重要通知和到期警告,因此请务必添加一个您将定期检查的地址。保存此文件并为 Kubernetes 集群中的 Ingress 资源和生产发行者创建一个新资源:

  • kubectl create -f ingress.yml
  • kubectl create -f production_issuer.yml

最后,更新您域名的 DNS 记录,将 A 记录指向您的负载均衡器的 IP 地址。要查找 Ingress Controller 的 IP 地址,请输入:

  • kubectl get service nginx-ingress-controller
Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-ingress-controller LoadBalancer your_cluster_ip your_external_ip 80:30187/TCP,443:31468/TCP 6m10s

将该your_external_ip地址用作 DNS A 记录的 IP 地址。更新 DNS 记录的过程因您管理域名和 DNS 托管的位置而异,但如果您使用的是 DigitalOcean,则可以参考我们关于如何管理 DNS 记录的指南

一旦您的 DNS 记录更新并生成您的 SSL 证书,您的应用程序将可用,your_domain并且 SSL 将被启用。

带有 SSL 终止和自定义域名的 Laravel 应用程序

虽然您的 PHP 应用程序和数据库已经连接,但您仍然需要运行数据库迁移。在最后一步中,您将看到如何在 Kubernetes pod 上运行Artisan 命令来执行数据库迁移和其他常见维护任务。

第 6 步 – 运行远程命令

当您的 Laravel 应用程序正在运行并连接到 Kubernetes 中的 MySQL 数据库时,您应该在新的 Laravel 安装上运行几个常见的操作。您应该执行的一项常见任务是数据库迁移

在 Laravel 应用程序上运行 Artisan 命令之前,您需要知道运行 Laravel 应用程序容器pod的名称使用命令行,您可以查看 Kubernetes 集群中的所有 pod:

  • kubectl get pods

你会看到这样的输出:

Output
NAME READY STATUS RESTARTS AGE laravel-kubernetes-lamp-77fb989b46-wczgb 2/2 Running 0 16m

为您的laravel-kubernetes-lamp-...部署选择 pod 确保在输出中使用名称,而不是上面列出的名称。现在你可以运行kubectl exec它了。例如,使用该artisan migrate命令运行数据库迁移您将添加--force标志,因为您正在生产中运行 pod:

  • kubectl exec laravel-kubernetes-lamp-77fb989b46-wczgb -- php artisan migrate --force

此命令将产生一个输出:

Output
Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (0.16 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.05 seconds)

您现在已经成功地将 Laravel 7 和 MySQL 部署到 Kubernetes 并执行了一项基本的数据库维护任务。

结论

在本教程中,您学习了如何容器化 Laravel PHP 应用程序,将其连接到 MySQL 数据库,将包含代码的 Docker 映像推送到 Docker Hub,然后使用 Helm 图表将该映像部署到 DigitalOcean Kubernetes 集群。最后,您添加了 SSL 和自定义域名,并了解了如何在正在运行的 Pod 上运行命令行工具。

与传统 LAMP 堆栈托管相比,Kubernetes 和 Helm 为您提供了许多优势:可扩展性、无需直接登录服务器即可换出服务的能力、执行滚动升级的工具以及对托管环境的控制。也就是说,最初容器化和配置应用程序的复杂性使得入门障碍非常高。以本指南为起点,将 Laravel 部署到 Kubernetes 变得更加容易。从这里你可以考虑更多地了解Laravel的强大功能,或者向Kubernetes添加监控工具,如 Linkerd,你可以使用我们的指南或使用DigitalOcean 1-Click手动安装

觉得文章有用?

点个广告表达一下你的爱意吧 !😁