博客 | NGINX

使用 NGINX Agent for Kubernetes 构建 NGINX Plus 的 Docker 映像

Fabrizio Fiorucci 缩略图
法布里奇奥·菲奥鲁奇
2023 年 4 月 18 日发布

F5 NGINX 管理套件是一系列模块,用于从单一窗口管理 NGINX 数据平面。 通过简化 NGINX 开源和 NGINX Plus 实例的管理,NGINX 管理套件简化了扩展、保护和监控应用和 API 的流程。

您需要在要从 NGINX 管理套件管理的每个 NGINX 实例上安装 NGINX 代理,以实现与控制平面的通信和远程配置管理。

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

有三个构建选项,取决于您想要在生成的 Docker 镜像中包含的内容:

[编辑——此帖子于 2023 年 4 月更新,以澄清说明,并在 Kubernetes 中运行 Docker 镜像的第 1 步中添加ACM_DEVPORTAL字段。]

先决条件

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

要构建 Docker 映像,您需要:

  • Linux 主机(裸机或虚拟机)
  • Docker 20.10+
  • 可以将目标 Docker 映像推送到的私有注册表
  • 运行 NGINX 管理套件实例,其中包含实例管理器和 API 连接管理器(如果你想利用对开发者门户的支持)
  • NGINX Plus 和可选的 NGINX App Protect 的订阅(30 天免费试用

要运行 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. 切换到构建目录:

    $ 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.ff.lan:31005/nginx-plus-with-agent:2.7.0

    • ‑n – NGINX 管理套件实例的基本 URL(以下示例命令中为https://nim.f5.ff.lan

    附加选项包括:

    • ‑d – 使用 NGINX API 连接管理器时为开发人员门户添加数据平面支持
    • ‑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
      

    这是基本图像的构建示例跟踪。 最后的“构建完成”消息表明构建成功。

    $ ./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 Agent 启动 NGINX Plus。

    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部分中,对每个指示名称字段进行以下替换:

        • NIM_HOST —(必需)将默认值( nginx-nim2.nginx-nim2 )替换为您的 NGINX 管理套件实例的 FQDN 或 IP 地址(在我们的例子中为 nim2.f5.ff.lan )。
        • NIM_GRPC_PORT –(可选)替换默认的(443 ) 为 gRPC 流量设置不同的端口号。
        • NIM_INSTANCEGROUP -(可选)将默认值( lab )替换为 NGINX Plus 实例所属的实例组。
        • NIM_TAGS - (可选)用 NGINX Plus 实例的逗号分隔的标签列表替换默认值( preprod,devops )。
        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部分中,如果指示的条件适用,则取消注释这些名称-字段对:

        • 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(由副本指定:2说明),分别使用 NGINX Plus 和 NGINX Agent:

      $ ./scripts/nginxWithAgentStart.sh start$ ./scripts/nginxWithAgentStart.sh stop
      
    3. 验证两个 pod 现在正在运行:每个 pod 运行一个 NGINX Plus 实例和一个 NGINX 代理,以便与 NGINX 管理套件控制平面进行通信。

      $ 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 管理套件中的 NGINX 实例管理器 GUI,并验证两个 NGINX Plus 实例是否正在运行且状态为Online 。 在此示例中,NGINX App Protect WAF 未启用。

      NGINX 管理套件实例管理器 2.7.0 版中的实例概览窗口的屏幕截图

    立即开始

    要试用本文讨论的 NGINX 解决方案,请立即开始30 天免费试用,或联系我们讨论您的用例

    下载NGINX Agent – 它是免费且开源的。


“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”