本主题介绍了在 Google Cloud Platform 中置备和配置 NSX Advanced Load Balancer 的过程。

Google Cloud 中的网络、子网、实例

网络资源有助于管理网络、防火墙以及网络和实例的其他方面。可在 GCP 控制台的左侧菜单中查找网络资源。

创建 Virtual Private Cloud (VPC) 网络

VPC 网络有时简称为网络,是物理网络(例如数据中心网络)的虚拟版本。它可为计算引擎虚拟机实例、Kubernetes 引擎集群以及项目中的其他资源提供连接。

要创建 VPC 网络,请执行以下操作:

  1. 转到 Google Cloud Platform 控制台

  2. 导航到已订阅的项目。

  3. 单击 VPC 网络 > VPC 网络



  4. 单击创建 VPC 网络

  5. 输入 VPC 网络的名称

  6. 输入 VPC 网络的子网名称和网络 IP 地址范围。

    注:

    仅输入 IP4 地址,因为 GCP 不支持 IPV6。

  7. 单击创建。创建的网络如下所示。



GCP 中的防火墙规则

借助 GCP 防火墙规则,您可以允许或拒绝流入和流出虚拟机实例的流量。NSX Advanced Load Balancer 使用协议端口进行管理通信。有关更多信息,请参阅端口和协议

要创建防火墙规则,请执行以下操作:

  1. 在左侧窗格中的防火墙规则下,单击网络下的 VPC 网络

  2. 单击创建防火墙规则



  3. 此时将显示创建防火墙规则屏幕。创建防火墙规则以允许网络内的 TCP、UDP 和 ICMP 流量以及来自相应网络外部的 HTTP/HTTPS 流量。

为所有 UDP 和 TCP 流量创建防火墙规则

要为所有 UDP 和 TCP 流量创建规则,请按下图所示配置相应字段,然后单击创建



在 TCP 端口 80 和 443 上创建防火墙规则

要在 TCP 端口 80 和 443 上创建规则,请按下图所示配置相应字段,然后单击创建



为 ICMP 创建防火墙规则

要为 ICMP 创建防火墙规则,请按下图所示配置相应字段,然后单击创建



为内部 SE 到 SE 通信创建防火墙规则

要为内部 SE 到 SE 通信创建防火墙规则,请按下图所示配置相应字段,然后单击创建



创建的防火墙规则如下所示。



创建控制器

要创建 NSX Advanced Load Balancer Controller 实例,请执行以下操作:

  1. 导航到 Google Cloud Platform 控制台,然后单击计算引擎 > 虚拟机实例

  2. 单击创建实例

  3. 输入实例的名称区域可用区

  4. 对于计算机类型,请选择 n1-standard-4,并选择 4 个 vCPU15 GB 内存。

    注:

    具体大小将因缩放要求而异。

  5. 要选择其他分布并更改磁盘大小,请单击更改

    注:

    NSX Advanced Load Balancer 仅支持 CentOS 和 Ubuntu。有关更多信息,请参阅系统要求

  6. 选择 CentOS 7 映像,然后根据需要选择引导磁盘大小(最小为 40 GB)。有关更多信息,请参阅VMware NSX Advanced Load Balancer 配置指南》中的“调整服务引擎大小”主题。

  7. 单击选择

  8. 单击身份和 API 访问

    注:

    或者,也可以使用服务帐户身份验证机制。特权会在经过身份验证的实体通过 API 单元生成时继承。控制器实例必须在读写范围内生成,而 SE 则在只读范围内生成。有关更多信息,请参阅各种控制器和服务引擎部署的角色和权限

  9. 选择所需的服务帐户

  10. 选择为每个 API 设置访问权限作为访问范围

  11. 对于计算引擎,请选择读写权限。

  12. 单击允许 HTTP 流量允许 HTTPS 流量以允许外部连接。

  13. 单击安全性选项卡。

  14. 从将用于启动 SSH 的计算机中复制公钥,并将其粘贴到相应文本框中。

  15. NSX Advanced Load Balancer Controller 是使用在创建网络时指定的网络范围中的外部 IP 地址和内部 IP 地址创建的。

    注:

    如果未分配外部 IP,Google Cloud Platform 将不允许对创建的实例进行串行控制台访问。安装或运行 NSX Advanced Load Balancer 时,不需要串行控制台访问权限,但该访问权限可能有助于进行故障排除。

  16. 单击创建按钮。

创建服务器实例

服务器实例应运行服务器,以接受将在其上创建 VS 的特定端口上的流量。

要创建服务器实例,请执行以下操作:

  1. 从 GCP 控制台中,单击转到计算引擎

  2. 虚拟机实例页面中单击创建实例

  3. 输入实例的名称,以及将在其中创建服务器的可用区

  4. 对于计算机类型,请选择 n1-standard-4,并选择 4 个 vCPU15 GB 内存。

    注:

    具体大小将因缩放要求而异。

  5. 要选择其他分布并更改磁盘大小,请单击更改

    注:

    NSX Advanced Load Balancer 仅支持 CentOS 和 Ubuntu。有关更多信息,请参阅系统要求

  6. 身份和 API 访问下,单击为每个 API 设置访问权限

  7. 计算引擎下,选择只读权限。

    注:

    或者,也可以使用服务帐户身份验证机制。特权会在经过身份验证的实体通过 API 单元生成时继承。控制器实例应当在读写范围内生成,而 SE 则在只读范围内生成。有关更多信息,请参阅各种控制器和服务引擎部署的角色和权限

  8. 单击防火墙下的允许 HTTP 流量,以允许外部连接。

  9. 单击网络 > 网络接口

  10. 输入网络和子网详细信息。

  11. IP 转发设置为

  12. 从将用于启动 SSH 的计算机中复制公钥。

  13. 单击安全性选项卡,然后单击 SSH 密钥下的添加项目

  14. 将密钥粘贴到相应文本框中。

  15. 单击创建

同样,创建具有所需规格的客户端实例。

创建 SE 虚拟机实例

要创建 SE 虚拟机实例,请执行以下操作:

  1. 从 GCP 控制台中,单击转到计算引擎

  2. 虚拟机实例页面中单击创建实例

  3. 输入实例的名称,以及将在其中创建服务器的可用区

  4. 对于计算机类型,请选择 1 个 vCPU 以及 3.75 GB 内存。

  5. 选择一个引导磁盘,并选择 Ubuntu 16.04 LTSDebian GNU/Linux 9 (stretch) 作为操作系统映像。有关更多信息,请参阅系统要求

  6. 身份和 API 访问下,单击为每个 API 设置访问权限

  7. 计算引擎下,选择读写权限。

  8. 单击防火墙下的允许 HTTP 流量允许 HTTPS 流量以允许外部连接。

  9. 单击网络 > 网络接口

  10. 输入网络和子网详细信息。

  11. IP 转发设置为

  12. 从将用于启动 SSH 的计算机中复制公钥。

  13. 单击安全性选项卡,然后单击 SSH 密钥下的添加项目

  14. 将密钥粘贴到下面显示的文本框中。

  15. 单击创建

准备实例

打开 yum-cron。

注:

作为必备条件,实例需要位于 CentOS 7.5 上。

  1. 要配置 Docker 存储库,请在 /etc/yum.repos.d/ 下创建文件 docker.repo

       [localhost@avi-controller ~]$ sudo vim docker.repo 
       [docker-main]
        name=Docker Repository
        baseurl=https://yum.dockerproject.org/repo/main/centos/7/
        enabled=1
        gpgcheck=1
        gpgkey=https://yum.dockerproject.org/gpg 
  2. 确认实例正在 CentOS 7.5 上运行

     [localhost@avi-controller ~]$ cat /etc/centos-release
     CentOS Linux release 7.5.1611 (Core)  
  3. 在所有 5 个实例上安装并启动 Docker。

     sudo yum update -y
      sudo yum install -y epel-release
      sudo yum install -y yum-utils
      sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      sudo yum install -y docker-ce
      sudo systemctl enable docker
      sudo systemctl start docker
      (Lock release )
      head -n1 /etc/centos-release | awk '
      {print $4}
      ' > /etc/yum/vars/releasever
    
  4. 要保留当前版本的 CentOS/RHEL,请将 Linux 系统锁定到特定操作系统版本。有关更多信息,请参阅《VMware NSX Advanced Load Balancer 管理指南》中的“将 Linux 系统锁定到特定操作系统版本”主题。

有关存储驱动程序的更多信息,请参阅 Docker 存储驱动程序

如下所示,devicemapper 配置了环回。这适用于概念证明,而不适用于生产环境。在生产环境中,建议使用 overlay2 作为推荐的存储驱动程序。例如,

root@cnu-bm6 ~]# docker info
Containers: 1
Running: 1
Paused: 0
Stopped: 0
Images: 1
Server Version: 17.12.1-ce
Storage Driver: overlay2
Backing Filesystem: xfs
Supports d_type: true
Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge host macvlan null overlay
Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9b55aab90508bd389d7654c4baf173a981477d55
runc version: 9f9c96235cc97674e935002fc3d78361b696a69e
init version: 949e6fa
Security Options:
seccomp
Profile: default
Kernel Version: 3.10.0-693.21.1.el7.x86_64
Operating System: CentOS Linux 7 (Core)
OSType: linux
Architecture: x86_64
CPUs: 8
Total Memory: 15.51GiB
Name: cnu-bm6
ID: V2GA:L7IT:NW6S:FSDD:JLO2:OIGX:USQQ:UGXQ:BUA3:MYU3:O6JB:FQYX
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Username: abcd
Registry: https://index.docker.io/v1/
Labels:
Experimental: false
Insecure Registries:
127.0.0.0/8
Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
[root@cnu-bm6 ~]#

如果为 Ubuntu 生成实例,则必须配置 sshguard,如下所述。当 -w 选项参数以“.”(点)或“/”(斜杠)开头时,sshguard 可以获取允许文件。下面提供了示例允许文件 /etc/list

# comment line (a '#' as very first character)
# a single IPv4 and IPv6 address
1.2.3.4
2001:0db8:85a3:08d3:1319:8a2e:0370:7344
#   address blocks in CIDR notation
127.0.0.0/8
10.11.128.0/17
192.168.0.0/24
2002:836b:4179::836b:0000/126
#   hostnames
rome-fw.enterprise.com
hosts.test.com

以下是 sshguard 引用测试文件的代码段。

 sshguard -w /etc/test

在服务器实例上测试服务器。

要测试实例,请在为要用作池服务器的虚拟服务配置的端口上启动 Web 服务器侦听,如下面的示例中所示。

sudo docker run -d -p 80:80 avinetworks/server

配置 NSX Advanced Load Balancer(方法 1)

  1. 在创建的实例上安装/运行 NSX Advanced Load Balancer Controller。有关说明,请参阅在 Linux 服务器云中安装 NSX Advanced Load Balancer

  2. NSX Advanced Load Balancer 中,导航到基础架构 > 仪表板

  3. 确保 SE 状态为绿色,如下所示:



    NSX Advanced Load Balancer 22.1.3 开始,将显示以下屏幕:



  4. 通过 ssh 登录到控制器实例,对控制器执行 exec 并启动 Shell。键入以下命令以列出要使用的容器 ID。

    sudo docker ps
    sudo docker exec -it [container_id] bash 
    shell
  5. 创建一个带有 IP 地址池的网络以分配 VIP。在 NSX Advanced Load Balancer 中,导航到基础架构 > 网络 > 创建

  6. 导航到模板 > 配置文件 > IPAM DNS 配置文件并创建 IPAM,如下所示。



    NSX Advanced Load Balancer 22.1.3 开始,将显示以下屏幕:

  7. 转到基础架构 >

  8. 编辑默认云,并选择 Linux 作为云基础架构类型

  9. 单击下一步

  10. Linux 服务器配置屏幕中,选择 GCP 作为 IPAM 配置文件



  11. NSX Advanced Load Balancer 22.1.3 开始,将显示以下屏幕:



  12. 导航到 IPAM/DNS 选项卡。

  13. 对于 IPAM 配置文件字段,请选择 GCP IPAM 配置文件

  14. 单击保存

有关 GCP 的更多信息,请参阅为 GCP 配置 IPAM

将 SE 添加到云

创建网络配置文件并将其附加到 IPAM,如下所示。







要将 SE 添加到云,请导航到基础架构 > ,然后配置 LSC 云,如下所示。



NSX Advanced Load Balancer 22.1.3 开始,将提供以下 UI:



有关更多信息,请参阅将 Avi 服务引擎添加到 Linux 服务器云

安装并配置控制器和服务引擎(方法 2)

或者,如果已创建控制器服务文件,可以使用 setup.json 文件重新启动控制器,以使用 GCP IPAM 配置文件和用于分配 VIP 的网络来配置 Linux 服务器云。

  • 将下面显示的 setup.json 文件复制到主机上的 /opt/avi/controller/data(假设 /opt/avi/controller/data 是服务文件中用于控制器的卷)。

  • 根据需要修改 SSH 密钥、用户名、网络子网和网络/IPAM 名称

    {
       "CloudConnectorUser": [
           {
               "name": "rangar",
               "tenant_ref": "admin",
               "public_key": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9ZZWDLSl/PJHWA8QuDlfDHJuFh6k55qxRxO28fSRvAEbWCXXgXdnH8vSVVDE
    Mo0brgqrp+vful2m7hNm0TPv8REbT2luVeWo+G0R1hxzdALzI8VmMBxX2VduKZ5Zrh3C9GKxaUYb4R2hzLaYKUBQnFa2B0YWiAfC3ow71fwwgb7cVhxExTyhhF01gY
    9Tcb3w9uugv3vXNzyxDssHXtwY60WcVUIK1L+8SqXu/r6YUG8j4IsaYkXJHBE6CHPwDg4uwRG35IkfhsIg0KtKRwpzHbhOx0qRjG9ZaVc0SnfMIHmdAFwXpDpi/AKV
    NAmjkix2GIPIi1OISnEngSjnugVb7\n",
               "private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAvWWVgy0pfzyR1gPELg5XwxybhYepOeasUcTtvH0kbwBG1gl1\
    n4F3Zx/L0lVQxDKNG64Kq6fr37pdpu4TZtEz7/ERG09pblXlqPhtEdYcc3QC8yPFZ\njAcV9lXbimeWa4dwvRisWlGG+Edocy2mClAUJxWtgdGFogHwt6MO9X8MIG+
    3FYcR\nMU8oYRdNYGPU3G98PbroL971zc8sQ7LB17cGOtFnFVCCtS/vEql7v6+mFBvI+CLG\nmJFyRwROghz8A4OLsERt+SJH4bCINCrSkcKcx24TsdKkYxvWWlXNE
    p3zCB5nQBcF\n6Q6YvwClTQJo5IsdhiDyItTiEpxJ4Eo57oFW+wIDAQABAoIBAFu7XeUA9L5ZmdDs\nVhJwg/VOX80W3dHbdc7M8NCAVCsnGSgFwQAAtMBxXiENfAx
    A8NKUoS9ejMMUtvNJ\n7x+ywcF3WE63ze/htKGMF2ZNIJ+yAb3Zl6OIswxynTi131cJbINJ9gBwyExsWZyf\nmXIZQwmDKFxeHLlQ80QeR9qDxF3Ypyz7vdEtQMtpI
    3JQJMbUX6dmQm0UtOKi5tL8\nzkskZJHnaqwJlem92Zon7S8PIflsPevsAmDrTPbmxIL6Z3KlJkoLzTcWefA6E19N\nw4JmylQokAWiqQ1il+qrcITIZGhsZre081N
    wjHkzzA8kdb4EUO0nhy7rzbmS67TN\n08Fe0RECgYEA98WaJR5k/r8VBlKEQTErye29cJmkr0w5ZPX+bwko+ejj2S2vqpJc\nuR0YO3q5zY5a4A/33X/vke+r1bNPr
    p9QSnBscFvA/AEXGAiAeuCsuB+pw8C3N5C5\ncTzKNFx1c2KXbejRkhvL9gz5tJZpdHIqzbGQmwEiNFqnYy6BPbhTm8UCgYEAw6+2\n5WvAGH9Ub+ZfySoeNNaxXfI
    DvXA2+G/CBg99KYuXzWWmeVx9652lc4Gv+mxhFiJd\nilMfWljlb+f1G5sJnZ3VMKSf/FF¬¬6Mo8MsnAkvjnVWBoezo2sVzu+9g3qGRXNTtRM\nSH1N/eWPeJGwD+Vyk
    D3r8K+iag7cMhrLpGPWk78CgYARatumJlfVLJuOwTg42PsK\nC+NYSgSwqfwS49QJ/CvcPYne135U0EsiXDA65iqvj4VF4Pl8oaS2rpF2yU8dqGdd\nhD+rOlf7nxv
    /fYGCoc6idt9ZOm/mwQ64LhzMx38eKF0axdYNnlSdLFZVYolxPSFT\nKltO+ipsYb8IktlU/GMsPQKBgQCeirlqzM64yki11Hcce3Q3qQ3QqGihTc4roBgZ\nYuksB
    L37mnSy9N3MTFAk8hiKks5h6XvRuyC2yTkyXkL2l7jFq39zRp2cBsMzPTSz\nSSpruF2CYL8+6AeOMYi4v3M/2asaR+R6ApNytk90Bs0XQ/V6qcCDozi6Jsn+Cjmd\
    nOYo67wKBgAcUFRHUX4VwCUZAAIxyTM+efpf5z8dKHh/iJA6rtqcTi4vHddEJinT6\ntOiqXjciZEKqZ08GtImIPtuhIBO0m10fCfcjrGxGz2+N9o8fyNvFWU83kG9
    IXSq8\nU1YOIYvXwWFQLWIUvyOgnyT4bW0OLa8OrJEq1/DaH8gpvvFi8qRK\n-----END RSA PRIVATE KEY-----\n"
           }
       ],
       "IpamDnsProviderProfile": [                                                                                      [39/5306]
           {
               "name": "gcp",
               "type": "IPAMDNS_TYPE_GCP",
               "tenant_ref": "admin",
               "gcp_profile": {
                   "usable_network_refs": [
                       "/api/network/?name=net1"
                   ]
               }
           }
       ],
       "Network": [
           {
               "name": "net1",
               "tenant_ref": "admin",
               "cloud_ref": "admin:Default-Cloud",
               "configured_subnets": [
                   {
                       "prefix": {
                           "ip_addr": {
                               "type": "V4",
                               "addr": "10.9.0.0"
                           },
                           "mask": 24
                       },
                       "static_ranges": [
                           {
                               "begin": {
                                   "type": "V4",
                                   "addr": "10.9.0.2"
                               },
                               "end": {
                                   "type": "V4",
                                   "addr": "10.9.0.254"
                               }
                           }
                       ]
                   }
               ]
           }
       ],
       "SeProperties": [
           {
               "se_runtime_properties": {
                   "global_mtu": 1400,
                   "se_handle_interface_routes": true
               }
           }
       ],
       "Cloud": [
           {
               "name": "Default-Cloud",
               "tenant_ref": "admin",
               "vtype": "CLOUD_LINUXSERVER",
               "ipam_provider_ref": "admin:gcp",
               "linuxserver_configuration": {
                   "ssh_attr": {
                       "ssh_user": "rangar",
                       "host_os": "COREOS"
                   },
                   "se_sys_disk_path": "/”
               }
           }
       ]
    }
  • 在控制器上执行首次设置并指定用户名/密码。

  • 选择“GCP IPAM”作为默认云的 IPAM 提供程序,并使用创建的两个服务引擎实例的 IP 地址配置 Linux 服务器云。

创建虚拟服务并验证流量

要创建虚拟服务,请执行以下操作:

  1. 创建池。例如,GCP-Perf-Test-VS-Pool,如下所示:



  2. NSX Advanced Load Balancer 22.1.3 开始,将提供以下 UI:



  3. 添加服务器实例 IP 作为池服务器。

  4. 创建名为 GCP-Perf-Test-VS 的内部虚拟服务。将从 VIP/IPAM 子网 10.y.y.y./24 自动分配 VIP

  5. 将从 VIP/IPAM 子网 10.y.y.y./24 自动分配 VIP

注:

所述 IP 子网 10.x.x.x 仅供参考。应将放置子网设置为控制器和服务引擎使用的 VPC 中的主要子网。



NSX Advanced Load Balancer 22.1.3 开始,将提供以下 UI:


创建的虚拟服务如下所示。



分配浮动 IP

NSX Advanced Load Balancer 支持为虚拟服务分配浮动 IP(其中,负载均衡器的前端将为从 GCP 分配的公用 IP,后端将为服务引擎)。

可以通过 NSX Advanced Load Balancer UI 分配浮动 IP。要分配浮动 IP,请单击为外部客户端访问分配浮动 IP 以将其启用。

注:

默认情况下,将启用自动分配。单击自动分配以将其禁用,然后输入浮动 IP 地址以手动分配浮动 IP。

也可以通过 CLI 分配浮动 IP,如下所示。

++Truncated Output++
+------------------------------------+-----------------------------------------------------+
[admin]: virtualservice> vip index 1
[admin]: virtualservice:vip> auto_allocate_floating_ip
Overwriting the previously entered value for auto_allocate_floating_ip
[admin]: virtualservice:vip> save
[admin]: virtualservice> save
++ Truncated Output++




测试 ICMP 流量

将 ICMP 流量发送到 VIP IP。在此例中为 10.10.0.1,并确保编写该 IP。

[localhost@avi-test-server ~]$ ping 10.10.0.1
[root@admin]# curl -I 10.10.0.1
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 3800
Connection: keep-alive
Server: nginx/1.12.2
Date: Mon, 18 Mar 2019 06:55:12 GMT
Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT
ETag: "5a9e5ebd-e74"
Accept-Ranges: bytes

验证 VIP/32 的路由是否在 GCP 中进行编写,其中下一跃点为具有 IP 10.8.2.3 的服务引擎 1,如下图所示。





用于配置虚拟服务和池的 API

将下面显示的 setup.json 文件复制到主机上的 /opt/avi/controller/data(假设 /opt/avi/controller/data 是服务文件中用于控制器的卷)。

{
    "name": "vs1",
    "pool_ref": "pool_ref",
    "services": [
        {
            "port": 80
        }
    ],
    "vip": [
        {
 
            “auto_allocate_ip” = true,
            “auto_allocate_floating_ip” = true
            "ipam_network_subnet": {
                "network_ref": "network_ref",
                "subnet": {
                    "ip_addr": {
                        "addr": "6.2.0.0",--> IPAM subnet.
                        "type": "V4"
                    },
                    "mask": 16
                }
            },
            "subnet": {
                "ip_addr": {
                    "addr": "10.146.11.0", --> placement subnet, subnet having reachability to client facing VIP
                    "type": "V4"
                },
                "mask": 24
            }
        }
   

故障排除

一个常见问题是,服务引擎无法连接到控制器或频繁断开与 Ubuntu 的连接。

根本原因

  • 这是由于 sshguard 所致。有关 sshguard 的更多信息,请参阅 sshguard

  • sshguard 支持地址。即使允许的地址看起来会产生攻击,这些地址也不会被阻止。这对于防止 LAN 用户被意外阻止非常有用。

  • 当需要允许更长的列表时,可以将其打包为一个纯文本文件,每行一个地址/主机名/块。

缓解

  • 在 sshguard 使用的允许文件中配置控制器 IP(所有三个,如果已集群化)。

当 -w 选项参数以“.”(点)或“/”(斜杠)开头时,sshguard 可以获取允许文件。以下是示例允许文件 (/etc/test),其注释行以开头字符“#”指示。

       #   a single IPv4 and IPv6 address
       1.2.3.4
       2001:0db8:85a3:08d3:1319:8a2e:0370:7344
       #   address blocks in CIDR notation
       127.0.0.0/8
       10.11.128.0/17
       192.168.0.0/24
       2002:836b:4179::836b:0000/126
       #   hostnames
       rome-fw.enterprise.com
       hosts.test.com

告知 sshguard 从 /etc/test 文件创建一个允许列表,如下所示:

    sshguard -w /etc/test