Product Documentation

使用 NetScaler CPX 在 Kubernetes 环境中对入口流量进行负载平衡

2017 年 10 月 5 日

在 Kubernetes 环境中,要对 Kubernetes 服务的入口流量进行负载平衡,需要入口资源和入口控制器。入口资源是指可以用来为您的 Kubernetes 资源配置负载平衡器的 Kubernetes 资源。负载平衡器通过提供服务的外部可访问 URL 来将服务公开给您的 Kubernetes 群集外部的客户端,并对传输到这些 URL 的流量进行负载平衡。可以在 Kubernetes 环境中将 NetScaler CPX 用作入口负载平衡器,以对 Kubernetes 群集外部的客户端向您的 Kubernetes 服务发送的北南向流量进行负载平衡。

入口控制器将负载平衡器与 Kubernetes 相集成。此控制器通过 Kubernetes API 监视入口资源,并在任何服务因扩展、滚动更新或元数据更改发生了变化时更新负载平衡器的配置。NetScaler Management and Analytics System (MAS) 包括 Kubernetes 环境的 NetScaler 入口控制器。通过 Kubernetes 群集中部署的 NetScaler 入口控制器和 NetScaler CPX 实例,可以处理 Kubernetes 环境中的入口流量。有关 NetScaler MAS 的详细信息,请参阅 NetScaler Management and Analytics System 产品文档

有关 Kubernetes 中的入口资源和控制器的详细信息,请参阅入口资源

NetScaler 入口控制器的工作原理

部署 Kubernetes 群集后,必须通过提供 NetScaler MAS 中的 Kubernetes 环境的详细信息将群集与 NetScaler MAS 相集成。NetScaler MAS 监视 Kubernetes 资源中的变更,例如服务、提供点和入口规则。

在 Kubernetes 群集中部署 NetScaler CPX 实例作为入口资源时,该实例会自动在 NetScaler MAS 中注册。在注册过程中,NetScaler MAS 会了解可以在其上访问 NetScaler CPX 实例的 NetScaler CPX 实例 IP 地址和端口,以使用 NITRO REST API 配置 NetScaler 特定的配置。

NetScaler MAS 中的 Stylebook 引擎处理 NetScaler MAS 从 Kubernetes 收集的所有信息,例如服务、提供点和入口规则。使用现有已置备的 Stylebook (com.citrix.adc.stylebooks/1.0/cs-lb-mon) 时,Stylebook 引擎将生成 NetScaler 配置(例如负载平衡所需的虚拟服务器、服务和服务组),并将配置应用到 NetScaler CPX 入口负载平衡器。有关 Stylebook 的详细信息,请参阅 Stylebook

下图展示了 Kubernetes 环境,其中包括一个与 Kubernetes 群集中的 NetScaler CPX 入口资源相集成的 NetScaler 入口控制器以处理入口流量。

本地化后的图片

在此示例中,部署的 NetScaler CPX 容器用于对通过虚拟 IP (VIP) 地址从群集外部传输到 Kubernetes 服务的流量进行负载平衡。NetScaler CPX 容器通过在组成服务 A 和 B 的 Kubernetes 提供点之间分发请求来对北南向流量进行负载平衡。

重要

域 api.example.com 的 DNS 配置配置为使用 NetScaler CPX 主机 IP 地址将流量发送到 NetScaler CPX 容器。在这种情况下,如果将多个 NetScaler CPX 容器配置为入口负载平衡器,请务必使用 DNS 方法在 NetScaler CPX 容器之间分发入口流量。

NetScaler MAS 管理 Kubernetes 群集中的 NetScaler 设备,并提供来自设备的大量分析以便进行深入探索和故障排除。它还允许您通过收集来自 NetScaler 设备的流量统计数据来获取应用程序性能和安全性的可见性。

在 Kubernetes 环境中部署 NetScaler CPX 作为入口负载平衡器

NetScaler CPX 可以用作 Kubernetes 环境的入口负载平衡器。可以部署 NetScaler CPX 容器作为群集内部的节点中的 Kubernetes 提供点,也可以在群集外部的主机上进行部署,前提是该主机加入了与其他 Kubernetes 节点相同的叠加网络。

必备条件

开始操作之前,请务必执行以下操作:

本地化后的图片

在 Kubernetes 群集外部部署 NetScaler CPX 作为入口负载平衡器

可以将 NetScaler CPX 部署为 Kubernetes 群集外部的入口负载平衡器。群集外部的主机必须加入与其他 Kubernetes 节点相同的叠加网络。

要在 Kubernetes 群集外部的主机上部署 NetScaler CPX 作为入口负载平衡器,请执行以下操作: 在该主机上,通过使用以下 docker run 命令在 Docker 容器上部署 NetScaler CPX 实例:

docker run -dt --privileged=true -p <port_number> -e NS_HTTP_PORT=<netscaler_HTTP_port> -e NS_HTTPS_PORT=<netscaler_HTTPS_port> -e EULA=yes -e NS_MGMT_SERVER=<MAS_IP_address> -e NS_MGMT_FINGER_PRINT="<MAS_finger_print>" -e NS_ROUTABLE=<True|False> -e NS_LB_ROLE=<lb_role> -e HOST=$HOSTNAME store/citrix/netscalercpx:12.0-53.6

示例

docker run -dt --privileged=true -p 5080:80 -p 5443:443 -p 80:5080 -e NS_HTTP_PORT=5080 -p 443:5443 -e NS_HTTPS_PORT=5443 -e EULA=yes -e NS_MGMT_SERVER=10.217.212.226 -e NS_MGMT_FINGER_PRINT="74:EA:04:90:2C:FA:BF:7A:31:C9:52:64:D3:9C:BC:D3:O8:9F:9A:O4" -e NS_ROUTABLE=FALSE -e NS_LB_ROLE=SERVER -e HOST=$HOSTNAME store/citrix/netscalercpx:12.0-53.6

此命令将部署 NetScaler CPX Docker 容器。下表介绍了 docker run 命令中使用的各个选项和环境变量:

选项和 NetScaler 特有的环境变量

说明

-dt

指定以守护程序方式运行的 NetScaler CPX 容器。

-privileged = true

指定 NetScaler CPX 容器在特权模式下运行。

-p

映射 NetScaler CPX 与主机之间的端口。默认情况下,Kubernetes 入口对象假定群集使用端口 80 和 443 进行访问。

-p 5080:80

将容器的端口 80 绑定到主机的端口 5080。

-p 5443:443

将容器的端口 443 绑定到主机的端口 5443。

-p 443:5443

将容器的端口 5443 绑定到主机的端口 443。

-p 80:5080

将容器的端口 5080 绑定到主机的端口 80。

-e NS_HTTP_PORT -e NS_HTTPS_PORT

NetScaler CPX 特有的环境变量,允许您分配自定义端口用于对 NetScaler CPX 进行管理访问。NetScaler MAS 使用这些端口来访问 NetScaler CPX。

-e NS_MGMT_SERVER

NetScaler CPX 特有的允许您定义 NetScaler MAS 服务器 IP 地址的环境变量。部署 NetScaler CPX 时,将自动在使用此 IP 地址的 NetScaler MAS 服务器中注册。

-e NS_MGMT_FINGER_PRINT

NetScaler CPX 特有的用于定义 NetScaler MAS 指纹的环境变量。

-e NS_ROUTABLE=FALSE

NetScaler CPX 特有的用于指定 NetScaler CPX 容器在非 IP-per-container 模式下运行的环境变量。

-e NS_LB_ROLE=SERVER

NetScaler CPX 特有的、允许您指定 NetScaler CPX 容器用作入口资源的 NetScaler CPX 和 NetScaler MAS 的环境变量。

-e HOST=$HOSTNAME

NetScaler CPX 特有的、用于指定 NetScaler MAS 可以用来访问 NetScaler CPX 容器的主机名的环境变量。 请确保主机名可以通过 NetScaler MAS 解析,否则,请提供 IP 地址。

在主机上部署 NetScaler CPX 实例后,该实例将自动在 NetScaler Management and Analytics System (MAS) 中注册。可以在 NetScaler MAS 用户界面中查看已部署的 NetScaler CPX 实例:Networks(网络)> Instances(实例)> NetScaler CPX

本地化后的图片

在 Kubernetes 群集内部部署 NetScaler CPX 作为入口负载平衡器

要在 Kubernetes 群集内部部署 NetScaler CPX 作为入口负载平衡器,请将其部署为 Kubernetes 群集中的节点上的 Kubernetes 提供点。

在 Kubernetes 群集内部部署 NetScaler CPX 作为入口负载平衡器 1. (可选)如果要将 NetScaler CPX 部署为群集中的特定节点上的 Kubernetes 提供点,可以使用标签来指定节点。要标记 Kubernetes 节点,请使用 kubectl 命令:

kubectl label nodes <node_IP_address> node-role=<label_name>



示例

kubectl label nodes 10.217.222.224 node-role=ingress

标记节点后,可以在提供点规范中指定标签,以便在节点中部署该提供点。

  1. 将 NetScaler CPX 的提供点规范定义为在 Kubernetes 群集中部署 NetScaler CPX 容器作为提供点。提供点规范在 YAML 文件或 JSON 脚本中定义。YAML 文件或 JSON 脚本应包含容器类型、CPX 映像文件名、NetScaler MAS 服务器 IP 地址和 NetScaler MAS 服务器指纹。 下面是一个 NetScaler CPX 的提供点规范示例:
apiVersion: v1

kind: Pod

metadata:

  name: cpx-ingress

  annotations:

    NETSCALER_AS_APP: "True"

spec:

  containers:

  - name: cpx-ingress

    image: "cpx:12.0-41.16"

    securityContext:

      privileged: true

    env:

    - name: "EULA"

      value: "yes"

    - name: "NS_MGMT_SERVER"

      value: "10.217.212.226"

    - name: "NS_MGMT_FINGER_PRINT"

      value: "74:EA:04:90:2C:FA:BF:7A:31:C9:52:64:D3:9C:BC:D3:O8:9F:9A:O4"

    - name: "NS_ROUTABLE"

      value: "FALSE"

    - name: "NS_HTTP_PORT"

      value: "5080"

    - name: "NS_HTTPS_PORT"

      value: "5443"

    - name: "NS_LB_ROLE"

      value: "SERVER"

    - name: "HOST"

      value: ""

    - name: "KUBERNETES_TASK_ID"

      valueFrom:

        fieldRef:

          fieldPath: metadata.name

    - name: "HOST"

      valueFrom:

        fieldRef:

          fieldPath: spec.nodeName

    ports:

    - containerPort: 80

      hostPort: 5080

    - containerPort: 443

      hostPort: 5443

    - containerPort: 5080

      hostPort: 80

    - containerPort: 5443

      hostPort: 443

    imagePullPolicy: Always

  nodeSelector:

    node-role: ingress



此外,还可以将提供点规范定义为部署 NetScaler CPX 作为复制控制器,以便在 NetScaler CPX 关闭时,Kubernetes 能够在群集中重新创建 NetScaler CPX 容器。下面是一个示例规范:

apiVersion: v1

kind: ReplicationController

metadata:

  name: cpx-ingress

spec:

  replicas: 1

  selector:

     app: cpx-ingress-device

  template:

    metadata:

      name: cpx-ingress

      annotations:

         NETSCALER_AS_APP: "True"

      labels:

         app: cpx-ingress-device

    spec:

      containers:

      - name: cpx-ingress

        image: "cpx:12.0-41.16"

        securityContext:

           privileged: true

        env:

         - name: "EULA"

           value: "yes"

         - name: "NS_MGMT_SERVER"

           value: "10.217.212.226"

         - name: "NS_MGMT_FINGER_PRINT"

           value: "74:EA:04:90:2C:FA:BF:7A:31:C9:52:64:D3:9C:BC:D3:O8:9F:9A:O4"

         - name: "NS_ROUTABLE"

           value: "FALSE"

         - name: "NS_HTTP_PORT"

           value: "5080"

         - name: "NS_HTTPS_PORT"

           value: "5443"

         - name: "NS_LB_ROLE"

           value: "SERVER"

         - name: "HOST"

           value: ""

         - name: "KUBERNETES_TASK_ID"

           valueFrom:

             fieldRef:

               fieldPath: metadata.name

         - name: "HOST"

           valueFrom:

             fieldRef:

               fieldPath: spec.nodeName

        ports:

         - containerPort: 80

           hostPort: 5080

         - containerPort: 443

           hostPort: 5443

         - containerPort: 5080

           hostPort: 80

         - containerPort: 5443

           hostPort: 443

        imagePullPolicy: Always

      nodeSelector:

         node-role: ingress



下表介绍了上例中使用的各节、参数和环境变量:

部分

参数

说明

containers

name

NetScaler CPX 容器的名称。

image

指定容器创建的映像。

securityContext

privileged: true

指定 NetScaler CPX 容器在特权模式下运行。

env

name: “EULA”

NetScaler CPX 特有的环境变量,这是验证您已阅读并理解此处提供的最终用户许可协议 (EULA) 所必需的:https://www.citrix.com/products/netscaler-adc/cpx-express.html

name: “NS_MGMT_SERVER”

允许您定义 NetScaler MAS 服务器 IP 地址的 NetScaler CPX 环境变量。部署 NetScaler CPX 时,将自动在使用此 IP 地址的 NetScaler MAS 服务器中注册。

name: “NS_MGMT_FINGER_PRINT”

允许您定义 NetScaler MAS 指纹的 NetScaler CPX 环境变量。

name: “NS_ROUTABLE”

允许您指定 NetScaler CPX 容器在非 IP-per-container 模式下运行的 NetScaler CPX 环境变量。请务必将值设置为 FALSE。

name: “NS_HTTP_PORT”

name: “NS_HTTPS_PORT”

NetScaler CPX 特有的环境变量,允许您分配自定义端口用于对 NetScaler CPX 进行管理访问。NetScaler MAS 使用这些端口来访问 NetScaler CPX 容器。

name: “NS_LB_ROLE”

允许您指定 NetScaler CPX 容器用作入口资源的 NetScaler CPX 和 NetScaler MAS 的 NetScaler CPX 环境变量。

name: “HOST”

NetScaler CPX 容器运行时所在的节点的主机名。NetScaler MAS 可以使用此主机名访问 NetScaler CPX 容器。

name: “KUBERNETES_TASK_ID”

标识 Kubernetes 群集中的 NetScaler CPX ID。

name: “HOST”

NetScaler CPX 容器运行时所在的节点的主机名。NetScaler MAS 可以使用此主机名访问 NetScaler CPX。

端口

containerPort: hostPort:

映射 NetScaler CPX 容器与主机之间的端口。默认情况下,Kubernetes 入口对象假定群集使用端口 80 和 443 进行访问。

imagePullPolicy

指定 Kubernetes 拉取图像的方式。

nodeSelector

node-role:

要在其上部署提供点的节点的标签。

3. 请使用以下命令部署 NetScaler CPX 的提供点规范:

kubectl create –f  (fileName | scriptName)

示例

kubectl create –f sample.yaml

在主机上部署 NetScaler CPX 实例后,该实例将自动在 NetScaler Management and Analytics System (MAS) 中注册。可以在 NetScaler MAS 用户界面中查看已部署的 NetScaler CPX 实例:Networks(网络)> Instances(实例)> NetScaler CPX

本地化后的图片

使用 NetScaler CPX 在 Kubernetes 环境中对入口流量进行负载平衡