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

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

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

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

NetScaler Ingress Controller 的工作原理

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

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

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

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

本地化后的图片

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

重要

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

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

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

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

必备条件

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

本地化后的图片

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

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

要在 Kubernetes 群集外部的主机上部署 NetScaler CPX 作为 Ingress 负载平衡器,请执行以下操作: 在该主机上,通过使用以下 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 Ingress 对象假定群集使用端口 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 容器用作 Ingress 资源的 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 作为 Ingress 负载平衡器

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

在 Kubernetes 群集内部部署 NetScaler CPX 作为 Ingress 负载平衡器 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

标记节点后,可以在提供点规范中指定标签,以便在节点中部署该提供点。 2. 将 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 容器用作 Ingress 资源的 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 Ingress 对象假定群集使用端口 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 环境中对 Ingress 流量进行负载平衡