×

在 OpenShift Container Platform 上支持 SCTP

作为集群管理员,您可以在集群中的主机上启用 SCTP。在 Red Hat Enterprise Linux CoreOS (RHCOS) 上,SCTP 模块默认情况下处于禁用状态。

SCTP 是一种可靠的消息型协议,运行在 IP 网络之上。

启用后,您可以将 SCTP 用作具有 Pod、服务和网络策略的协议。必须定义一个 `Service` 对象,并将 `type` 参数设置为 `ClusterIP` 或 `NodePort` 值。

使用 SCTP 协议的示例配置

您可以通过将 Pod 或服务对象中的 `protocol` 参数设置为 `SCTP` 值来配置 Pod 或服务以使用 SCTP。

在以下示例中,Pod 配置为使用 SCTP

apiVersion: v1
kind: Pod
metadata:
  namespace: project1
  name: example-pod
spec:
  containers:
    - name: example-pod
...
      ports:
        - containerPort: 30100
          name: sctpserver
          protocol: SCTP

在以下示例中,服务配置为使用 SCTP

apiVersion: v1
kind: Service
metadata:
  namespace: project1
  name: sctpserver
spec:
...
  ports:
    - name: sctpserver
      protocol: SCTP
      port: 30100
      targetPort: 30100
  type: ClusterIP

在以下示例中,`NetworkPolicy` 对象配置为应用于来自具有特定标签的任何 Pod 的端口 `80` 上的 SCTP 网络流量

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: allow-sctp-on-http
spec:
  podSelector:
    matchLabels:
      role: web
  ingress:
  - ports:
    - protocol: SCTP
      port: 80

启用流控制传输协议 (SCTP)

作为集群管理员,您可以加载并在集群中的工作节点上启用列入黑名单的 SCTP 内核模块。

先决条件
  • 安装 OpenShift CLI (oc)。

  • 作为具有 `cluster-admin` 角色的用户访问集群。

步骤
  1. 创建一个名为 `load-sctp-module.yaml` 的文件,其中包含以下 YAML 定义

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      name: load-sctp-module
      labels:
        machineconfiguration.openshift.io/role: worker
    spec:
      config:
        ignition:
          version: 3.2.0
        storage:
          files:
            - path: /etc/modprobe.d/sctp-blacklist.conf
              mode: 0644
              overwrite: true
              contents:
                source: data:,
            - path: /etc/modules-load.d/sctp-load.conf
              mode: 0644
              overwrite: true
              contents:
                source: data:,sctp
  2. 要创建 `MachineConfig` 对象,请输入以下命令

    $ oc create -f load-sctp-module.yaml
  3. 可选:要在 MachineConfig 操作符应用配置更改时监视节点的状态,请输入以下命令。当节点的状态转换为 `Ready` 时,配置更新将应用。

    $ oc get nodes

验证已启用流控制传输协议 (SCTP)

您可以通过创建一个运行监听 SCTP 流量的应用程序的 Pod,将其与服务关联,然后连接到公开的服务来验证 SCTP 是否在集群中工作。

先决条件
  • 从集群访问互联网以安装 `nc` 包。

  • 安装 OpenShift CLI (oc)。

  • 作为具有 `cluster-admin` 角色的用户访问集群。

步骤
  1. 创建一个启动 SCTP 监听器的 Pod。

    1. 创建一个名为 `sctp-server.yaml` 的文件,其中定义了以下 YAML 内容的 Pod。

      apiVersion: v1
      kind: Pod
      metadata:
        name: sctpserver
        labels:
          app: sctpserver
      spec:
        containers:
          - name: sctpserver
            image: registry.access.redhat.com/ubi9/ubi
            command: ["/bin/sh", "-c"]
            args:
              ["dnf install -y nc && sleep inf"]
            ports:
              - containerPort: 30102
                name: sctpserver
                protocol: SCTP
    2. 输入以下命令创建 Pod:

      $ oc create -f sctp-server.yaml
  2. 为 SCTP 监听器 Pod 创建一个服务。

    1. 创建一个名为 `sctp-service.yaml` 的文件,其中定义了以下 YAML 内容的服务。

      apiVersion: v1
      kind: Service
      metadata:
        name: sctpservice
        labels:
          app: sctpserver
      spec:
        type: NodePort
        selector:
          app: sctpserver
        ports:
          - name: sctpserver
            protocol: SCTP
            port: 30102
            targetPort: 30102
    2. 输入以下命令创建服务:

      $ oc create -f sctp-service.yaml
  3. 为 SCTP 客户端创建一个 Pod。

    1. 创建一个名为 `sctp-client.yaml` 的文件,其中包含以下 YAML 内容。

      apiVersion: v1
      kind: Pod
      metadata:
        name: sctpclient
        labels:
          app: sctpclient
      spec:
        containers:
          - name: sctpclient
            image: registry.access.redhat.com/ubi9/ubi
            command: ["/bin/sh", "-c"]
            args:
              ["dnf install -y nc && sleep inf"]
    2. 输入以下命令创建 `Pod` 对象:

      $ oc apply -f sctp-client.yaml
  4. 在服务器上运行 SCTP 监听器。

    1. 输入以下命令连接到服务器 Pod:

      $ oc rsh sctpserver
    2. 输入以下命令启动 SCTP 监听器:

      $ nc -l 30102 --sctp
  5. 连接到服务器上的 SCTP 监听器。

    1. 在新终端窗口或终端程序的标签页中打开。

    2. 获取 `sctpservice` 服务的 IP 地址。输入以下命令:

      $ oc get services sctpservice -o go-template='{{.spec.clusterIP}}{{"\n"}}'
    3. 输入以下命令连接到客户端 Pod:

      $ oc rsh sctpclient
    4. 输入以下命令启动 SCTP 客户端。将 `<cluster_IP>` 替换为 `sctpservice` 服务的集群 IP 地址。

      # nc <cluster_IP> 30102 --sctp