构建包含NGINX Agent的NGINX Plus Docker镜像,用于Kubernetes

NGINX | 2023年4月18日

F5 NGINX Management Suite是一套模块,可通过统一界面管理NGINX数据平面。通过简化对NGINX Open Source和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镜像中包含的内容,可以选择以下3种构建方式:

[编辑注:本文已于2023年4月更新,以明确相关说明,并在 ACM_DEVPORTAL字段添加到在Kubernetes中运行Docker镜像的第1步中。]

先决条件

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

要构建Docker镜像,需要:

  • Linux主机(裸机或虚拟机)
  • Docker 20.10+
  • 可将目标Docker镜像推送到的私有镜像仓库
  • 一个正在运行且包含Instance Manager的NGINX Management Suite实例;如果要使用开发者门户支持,还需包含API Connectivity Manager
  • NGINX Plus订阅(或30天免费试用),以及可选的NGINX App Protect订阅

要运行Docker镜像,需要:

  • 一个正在运行的Kubernetes集群
  • kubectl,且可访问Kubernetes集群

构建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.
  1. 切换到构建目录:
$ cd NGINX-Demos/nginx-agent-docker/
  1. 运行docker ps,确认Docker正在运行,然后运行build.sh脚本,将所需软件添加到Docker镜像中。基本选项如下:其他选项如下:以下是不同软件组合对应的命令:下面是基本镜像的构建跟踪示例。末尾显示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
  1. 在Kubernetes中运行Docker镜像 按照以下说明准备Deployment清单,并在Kubernetes上启动搭载NGINX Agent的NGINX Plus。开始使用 要试用本文介绍的NGINX解决方案,可立即开始30天免费试用,或联系我们,讨论您的用例:下载NGINX Agent,它免费且开源。
    • ‑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,即下方示例命令中使用的URL)
    • ‑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
  1. 使用常用的文本编辑器打开manifests/1.nginx-with-agent.yaml,并进行以下更改(代码片段中以橙色突出显示了可以或必须更改的默认值):
    • 在spec.template.spec.containers部分,将默认镜像名称(your.registry.tld/nginx-with-nim2-agent:tag)替换为在‑t构建Docker镜像的第3步中使用选项指定的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进行以下替换:
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"
  • 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‑value字段对:
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"
  • NIM_WAF和NIM_WAF_PRECOMPILED_POLICIES:镜像中已包含NGINX App Protect WAF(在-w“构建Docker镜像”的第3步中添加了该选项),因此值为"true"。
  • ACM_DEVPORTAL:镜像中包含对App Connectivity Manager开发者门户的支持(在“-d构建Docker镜像”的第3步中添加了选项),因此该值为"true"。
  1. 按如下所示运行nginxwithAgentStart.sh脚本,以应用清单并启动两个Pod(由清单replicas: 2中的spec部分指定),每个Pod均包含NGINX Plus和NGINX Agent:
$ ./scripts/nginxWithAgentStart.sh start$ ./scripts/nginxWithAgentStart.sh stop
  1. 验证当前是否有两个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
  1. 访问NGINX Management Suite中的NGINX Instance Manager图形用户界面,并确认两个NGINX Plus实例正在运行,状态为“在线”。在本示例中,未启用NGINX App Protect WAF。
    NGINX Management Suite Instance Manager 2.7.0版“实例概览”窗口的屏幕截图


分享
标签: F5 NGINX, Tech, 2023

关于作者

Fabrizio Fiorucci
Fabrizio FiorucciNGINX解决方案架构师 | F5 (EMEA)

Fabrizio Fiorucci 的更多博客文章

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。