10.8. 以 HTTP 代理模式部署出口路由器 pod

作为集群管理员,您可以将出口路由器 pod 配置为代理流量到指定的 HTTP 和基于 HTTPS 的服务。

10.8.1. HTTP 模式的出口路由器 pod 规格

Pod 对象中的一个出口路由器 pod 定义其配置。以下 YAML 描述了以 HTTP 模式配置出口路由器 pod 的字段:

apiVersion: v1
kind: Pod
metadata:
  name: egress-1
  labels:
    name: egress-1
  annotations:
    pod.network.openshift.io/assign-macvlan: "true" 1
spec:
  initContainers:
  - name: egress-router
    image: registry.redhat.io/openshift4/ose-egress-router
    securityContext:
      privileged: true
    env:
    - name: EGRESS_SOURCE 2
      value: <egress-router>
    - name: EGRESS_GATEWAY 3
      value: <egress-gateway>
    - name: EGRESS_ROUTER_MODE
      value: http-proxy
  containers:
  - name: egress-router-pod
    image: registry.redhat.io/ose-egress-http-proxy
    env:
    - name: EGRESS_HTTP_PROXY_DESTINATION 4
      value: |-
        ...
    ...
1
在启动 egress-router 容器前,在主网络接口上创建一个 macvlan 网络接口,并将该接口移到 pod 网络命名空间中。您必须把 "true" 值包括在引号中。要在主接口以外的网络接口上创建 macvlan 接口,请将注解值设置为该接口的名称。例如: eth1
2
保留给出口路由器 pod 使用的物理网络的 IP 地址。可选:您可以包括子网长度(/24 后缀),以便正确路由到本地子网。如果没有指定子网长度,则出口路由器只能访问使用 EGRESS_GATEWAY 变量指定的主机,且子网上没有其他主机。
3
值与节点使用的默认网关相同。
4
一个字符串或 YAML 多行字符串指定如何配置代理。请注意,这作为 HTTP 代理容器中的环境变量指定,而不是与 init 容器中的其他环境变量指定。

10.8.2. 出口目的地配置格式

当出口路由器 pod 以 HTTP 代理模式部署时,您可以使用以下一个或多个格式指定重定向规则。配置中的每行都指定允许或者拒绝的连接组:

  • IP 地址允许连接到那个 IP 地址,如 192.168.1.1
  • CIDR 范围允许连接到那个 CIDR 范围,如 192.168.1.0/24
  • 主机名允许代理该主机,如 www.example.com
  • 前面带有 * 的域名允许代理到那个域及其所有子域,如 *.example.com
  • ! 再加上以前匹配的表达式会拒绝连接。
  • 如果最后一行是 *,则任何没有被显式拒绝的都会被允许。否则,任何没有被允许的都会被拒绝。

您还可以使用 * 允许到所有远程目的地的连接。

配置示例

!*.example.com
!192.168.1.0/24
192.168.2.1
*

10.8.3. 以 HTTP 代理模式部署出口路由器 pod

HTTP 代理模式 中,出口路由器 pod 作为一个 HTTP 代理在端口 8080 上运行。这个模式只适用于连接到基于 HTTP 或基于 HTTPS 服务的客户端,但通常需要较少的更改就可以使客户端 pod 正常工作。很多程序可以通过设置环境变量来使用 HTTP 代理服务器。

先决条件

  • 安装 OpenShift CLI(oc)。
  • 以具有 cluster-admin 特权的用户身份登录。

流程

  1. 创建出口路由器 pod。
  2. 为确保其他 pod 可以查找出口路由器 pod 的 IP 地址,请创建一个服务指向出口路由器 pod,如下例所示:

    apiVersion: v1
    kind: Service
    metadata:
      name: egress-1
    spec:
      ports:
      - name: http-proxy
        port: 8080 1
      type: ClusterIP
      selector:
        name: egress-1
    1
    确定 http 端口被设置为 8080
  3. 要将客户端 pod(不是出口代理 Pod)配置为使用 HTTP 代理,设置 http_proxyhttps_proxy 变量:

    apiVersion: v1
    kind: Pod
    metadata:
      name: app-1
      labels:
        name: app-1
    spec:
      containers:
        env:
        - name: http_proxy
          value: http://egress-1:8080/ 1
        - name: https_proxy
          value: http://egress-1:8080/
        ...
    1
    上一步中创建的服务。
    注意

    不需要在所有设置中使用 http _proxy 和 https_proxy 环境变量。如果以上内容没有创建可以正常工作设置,请查阅 pod 中运行的工具或软件的文档。

10.8.4. 其他资源