NGINX.COM
Web Server Load Balancing with NGINX Plus

F5 NGINX Management Suite 是一系列模块,可以实现通过单一管理平台管理 NGINX 数据平面。通过简化 NGINX 开源版和 NGINX Plus 实例的管理,NGINX Management Suite 可助力您简化应用和 API 的扩展、保护及监控流程。

您需要在要通过 NGINX Management Suite 进行管理的每个 NGINX 实例上安装 NGINX Agent,以便与控制平面通信并执行远程配置管理。

对于在裸机或虚拟机(VM)上运行的 NGINX 实例,我们的文档提供了安装说明。在本文中,我们将展示如何为 NGINX Plus 和 NGINX Agent 构建 Docker 镜像,从而将 NGINX Management Suite 的支持范围扩展到部署在 Kubernetes 或其他微服务基础架构中的 NGINX Plus 实例。

现有三种构建选项,具体取决于所需添加到生成的 Docker 镜像中的内容:

 

准备工作

我们提供了一个 GitHub 代码库,其中包含创建 NGINX Plus 和 NGINX Agent 的 Docker 镜像所需的资源,并支持 NGINX Management Suite 的 Instance Manager 模块 2.8.0 版本及更高版本。

若要构建 Docker 镜像,您需要:

  • Linux 主机(裸机或虚拟机)
  • Docker 20.10+
  • 私有注册表,用于推送目标 Docker 镜像
  • 正在运行的 NGINX Management Suite 实例,带有 Instance Manager 和 API Connectivity Manager(若要利用开发人员门户支持)
  • 订阅(30 天免费试用)NGINX Plus,可选择使用 NGINX App Protect

要运行 Docker 镜像,您需要:

  • 正在运行的 Kubernetes 集群
  • 有权访问 Kubernetes 集群的 kubectl

 

构建 Docker 镜像

按照以下说明构建 Docker 镜像。

  1. 克隆 GitHub 代码库:

    $ git clone https://github.com/nginxinc/NGINX-Demos 
    Cloning into 'NGINX-Demos'... 
    remote: Enumerating objects: 126, done. 
    remote: Counting objects: 100% (126/126), done. 
    remote: Compressing objects: 100% (85/85), done. 
    remote: Total 126 (delta 61), reused 102 (delta 37), pack-reused 0 
    Receiving objects: 100% (126/126), 20.44 KiB | 1.02 MiB/s, done. 
    Resolving deltas: 100% (61/61), done.
  2. 进入到 build 目录:

    $ cd NGINX-Demos/nginx-agent-docker/
  3. 运行 docker ps 以验证 Docker 是否正在运行,然后运行 build.sh 脚本,从而将所需软件添加到 Docker 镜像中。基础选项包括:

    • ‑C – NGINX Plus 许可证书文件的名称(在下面的示例命令中为 nginx-repo.crt
    • ‑K – NGINX Plus 许可密钥文件的名称(在下面的示例命令中为 nginx-repo.key
    • ‑t – 注册表和目标镜像,格式为

      <registry_name>/<image_name>:<tag>

      (在下面的示例命令中为 registry.ff.lan:31005/nginx-plus-with-agent:2.7.0

    • ‑n – NGINX Management Suite 实例的基本 URL(在下面的示例命令中为 https://nim.f5.ff.lan

    其他选项包括:

    • ‑d – 使用 NGINX API Connectivity Manager 时,为开发人员门户添加数据平面支持
    • ‑w – 添加 NGINX App Protect WAF

    以下是适用于不同软件组合的命令:

    • NGINX Plus 和 NGINX Agent:

      $ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key \
      -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 \
      -n https://nim.f5.ff.lan
    • NGINX Plus、NGINX Agent 和 NGINX App Protect WAF(添加 ‑w 选项):

      $ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key \
      -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 -w \
      -n https://nim.f5.ff.lan
    • NGINX Plus、NGINX Agent 及开发人员门户支持(添加 ‑d 选项):

      $ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key \ 
      -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 -d \ 
      -n https://nim.f5.ff.lan

    以下为基本镜像构建的示例跟踪。末尾的 Build complete 消息表示构建成功。

    $ ./scripts/build.sh -C nginx-repo.crt -K nginx-repo.key -t registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 -n https://nim.f5.ff.lan 
    => Target docker image is nginx-plus-with-agent:2.7.0 
    [+] Building 415.1s (10/10) FINISHED 
    => [internal] load build definition from Dockerfile
    => transferring dockerfile: 38B
    => [internal] load .dockerignore 
    => transferring context: 2B 
    => [internal] load metadata for docker.io/library/centos:7
    => [auth] library/centos:pull token for registry-1.docker.io
    => CACHED [1/4] FROM docker.io/library /centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4
    => [internal] load build context 
    => transferring context: 69B 
    => [2/4] RUN yum -y update  && yum install -y wget ca-certificates epel-release curl  && mkdir -p /deployment /etc/ssl/nginx  && bash -c 'curl -k $NMS_URL/install/nginx-agent | sh' && echo "A  299.1s 
    => [3/4] COPY ./container/start.sh /deployment/
    => [4/4] RUN --mount=type=secret,id=nginx-crt,dst=/etc/ssl/nginx/nginx-repo.crt  --mount=type=secret,id=nginx-key,dst=/etc/ssl/nginx/nginx-repo.key  set -x  && chmod +x /deployment/start.sh &  102.4s  
    => exporting to image 
    => exporting layers 
    => writing image sha256:9246de4af659596a290b078e6443a19b8988ca77f36ab90af3b67c03d27068ff 
    => naming to registry.ff.lan:31005/nginx-plus-with-agent:2.7.0 
    => Build complete for registry.ff.lan:31005/nginx-plus-with-agent:2.7.0

     

    在 Kubernetes 中运行 Docker 镜像

    按照以下说明准备部署清单,并在 Kubernetes 上启动 NGINX Plus 和 NGINX Agent。

    1. 使用您的首选文本编辑器,打开 manifests/1.nginx-with-agent.yaml,并做出如下更改(代码段以橙色高亮显示了您可以或必须更改的默认值):

      • spec.template.spec.containers 部分中,将默认镜像名称(your.registry.tld/nginx-with-nim2-agent:tag) 替换为您在“构建 Docker 镜像”第 3 步中使用 ‑t 选项指定的 Docker 镜像名称(在本例中为 registry.ff.lan:31005/nginx-plus-with-agent:2.7.0):

        spec:
          ...
          template:
            ...    
            spec:
              containers:
              - name: nginx-nim
                image: your.registry.tld/nginx-with-nim2-agent:tag
      • spec.template.spec.containers.env 部分中,在 value 字段中对每个指定的 name 进行以下替换:

        • NIM_HOST –(必选)将默认设置(nginx-nim2.nginx-nim2)替换为 NGINX Management Suite 实例的 FQDN 或 IP 地址(在本例中为 nim2.f5.ff.lan)。
        • NIM_GRPC_PORT –(可选)将默认设置(443)替换为 gRPC 流量所用的其他端口号。
        • NIM_INSTANCEGROUP –(可选)将默认设置(lab)替换为 NGINX Plus 实例所属的实例组。
        • NIM_TAGS –(可选)将默认设置(preprod,devops)替换为用逗号分隔的 NGINX Plus 实例标签列表。
        spec:
          ...
          template:
            ...    
          spec:
            containers:
              ...
              env:
                - name: NIM_HOST
                ...
                  value: "nginx-nim2.nginx-nim2"
                - name: NIM_GRPC_PORT
                  value: "443"
                - name: NIM_INSTANCEGROUP
                  value: "lab"
                - name: NIM_TAGS
                  value: "preprod,devops"
      • 同样在 spec.template.spec.containers.env 部分中,如果指定的条件适用,取消注释以下 namevalue 字段对:

        • NIM_WAFNIM_WAF_PRECOMPILED_POLICIES – 镜像中包含 NGINX App Protect WAF(您在“构建 Docker 镜像”第 3 步中添加了 -w 选项),因此该值为 “true”
        • ACM_DEVPORTAL – 镜像中包含对 App Connectivity Manager 开发人员门户的支持(在“构建 Docker 镜像”第 3 步中添加了 -d 选项),因此该值为 “true”
        spec:
          ...
          template:
            ...    
          spec:
            containers:
              ...
              env:
                - name: NIM_HOST
                ...
                #- name: NAP_WAF
                #  value: "true"
                #- name: NAP_WAF_PRECOMPILED_POLICIES
                #  value: "true"
                ...
                #- name: ACM_DEVPORTAL
                #  value: "true"
    2. 按照指示运行 nginxwithAgentStart.sh 脚本,以应用清单并启动两个 Pod(如清单 spec 部分中的 replicas: 2 指令所指定),每个 Pod 均运行 NGINX Plus 和 NGINX Agent:

      $ ./scripts/nginxWithAgentStart.sh start
      $ ./scripts/nginxWithAgentStart.sh stop
    3. 检查两个 Pod 是否正在运行:每个 Pod 运行一个 NGINX Plus 实例和一个 NGINX Agent,以便与 NGINX Management Suite 控制平面进行通信。

      $ kubectl get pods -n nim-test  
      NAME                        READY  STATUS   RESTARTS  AGE 
      nginx-nim-7f77c8bdc9-hkkck  1/1    Running  0         1m 
      nginx-nim-7f77c8bdc9-p2s94  1/1    Running  0         1m
    4. 访问 NGINX Management Suite 中的 NGINX Instance Manager GUI,并检查两个 NGINX Plus 实例的运行状态是否为 Online。在本例中,NGINX App Protect WAF 未启用。

     

    立即免费试用

    如欲试用本文中介绍的 NGINX 解决方案,请立即下载 30 天免费试用版,或者联系我们讨论您的用例

    下载 NGINX Agent — 免费的开源软件。

Hero image
免费 O'Reilly 电子书:
《NGINX 完全指南》

更新于 2022 年,一本书了解关于 NGINX 的一切

关于作者

Fabrizio Fiorucci

欧洲、中东和非洲地区解决方案架构师

关于 F5 NGINX

F5, Inc. 是备受欢迎的开源软件 NGINX 背后的商业公司。我们为现代应用的开发和交付提供一整套技术。我们的联合解决方案弥合了 NetOps 和 DevOps 之间的横沟,提供从代码到用户的多云应用服务。访问 nginx-cn.net 了解更多相关信息。