IBM Cloud Docs
在 VPC 集群中管理出站流量保护

在 VPC 集群中管理出站流量保护

虚拟私有云 1.1.30及以后

查看IBM Cloud Kubernetes Service中管理出站流量保护的以下选项VPC 群集中管理出站流量保护的以下选项。 您可以允许所有出站访问,也可以有选择性地允许出站流量访问应用程序所需的组件。

在以下许多情况下,您都可以选择向 "kube-<clusterID> 安全组添加自定义规则,以允许出站流量访问特定资源。 Note that rules you add to the kube-<clusterID> security group are removed if you later run ibmcloud ks security-group reset. 重置安全组可恢复默认规则并删除已添加的规则。

禁用出站流量保护

虚拟私有云 1.1.30及以后

查看以下为新群集禁用出站流量保护的选项。

您可以使用“outbound traffic protection enable 和”disable 命令打开或关闭出站流量保护。 当您不再允许所有出站流量时,可能需要在两种配置之间切换。

选项 1:创建群集时禁用出站流量保护

该选项允许所有对外网络连接。

  • 在控制台中,选择允许出站流量选项。
  • 在 CLI 中,使用“cluster create vpc-gen2 命令 创建群集时,请指定”--disable-outbound-traffic-protection 选项。
  • 在 Terraform 中,指定 "disable_outbound_traffic_protection = true 选项。
  • 在 API 中,指定 "disableOutboundTrafficProtection=true 选项。

方案 2:通过自定义安全组允许出站流量

创建群集前,请在 VPC 中创建一个 自定义安全组,允许访问群集需要访问的外部站点或服务。 然后,在创建群集时将此安全组附加到群集。

  • 在控制台中,指定自定义安全组。
  • 在 CLI 中,使用“cluster create vpc-gen2 命令 创建群集时,请指定”--cluster-security-group <security-group-ID> 选项并包含自定义安全组 ID。
  • 在 Terraform 中,指定 "security_groups 选项并包含自定义组。

禁用现有群集的出站流量保护

虚拟私有云 1.1.30及以后

在配置群集后,查看禁用出站流量保护的选项。

选项 1:通过 CLI 禁用出站流量保护

该选项允许所有外部网络连接。

ibmcloud ks vpc outbound-traffic-protection disable --cluster CLUSTER

方案 2:在默认群集工作者安全组中添加安全组规则

您可以在群集工作者安全组(kube-<clusterID>)中添加一条安全组规则,允许访问特定的外部站点。 对群集需要访问的每个站点或子网重复此步骤。 更多信息,请参阅 选择性允许出站流量的示例方案

ibmcloud is sg-rulec kube-<clusterID> outbound all --remote <IP-address-or-subnet>

为现有群集提供出站流量保护

虚拟私有云 1.1.30及以后

要为现有1.30群集启用出站保护,请运行以下命令。 请注意,启用出站流量保护会阻止所有出站流量。

ibmcloud ks vpc outbound-traffic-protection enable --cluster CLUSTER

选择性允许出站流量的示例方案

查看以下章节,了解如何允许出站流量访问常用资源和组件,如外部容器注册表(如 "quay.io)、Red Hat Marketplace 和OperatorHub。 请注意,当您通过创建自定义安全组规则有选择性地允许出站流量时,如果运行 "ibmcloud ks security-group reset 命令将安全组重置为默认设置,您所做的更改将被删除。

从DockerHub或 "quay.io 等外部容器注册中心访问镜像

要访问DockerHub或“quay.io 或”registry.redhat.com 等注册表中的映像,请从以下选项中选择一个。

  • 禁用出站流量保护。
    ibmcloud ks vpc outbound-traffic-protection disable --cluster CLUSTER
    
  • 将应用程序需要的图片镜像到 "icr.io。 提取、标记并将这些图像推送到IBM Cloud Container Registry 中。 更多信息,请参阅 将图像推送至IBM Cloud Container Registry

通过 VPE 访问1.30群集和网络控制台

您可以配置Kubernetes,允许通过私有 vpe 网关访问群集。 此选项既适用于专用 VPC 群集,也适用于公用和专用 VPC 群集。 由于访问是通过专用端点进行的,客户必须从客户端到其 VPC 设置 VPN 才能访问群集。

从1.30群集开始,VPE 访问需要额外的安全组规则。 只有专用群集和具有公共端点和专用端点的群集都需要额外的安全组规则。

  1. 列出您的 VPN 服务器。

    ibmcloud is vpn-servers
    
  2. 获取 VPN 服务器的详细信息。

    ibmcloud is vpn-server SERVER
    
  3. 获取 VPN 服务器的客户端 IP 池

    ibmcloud is vpn-server | grep "Client IP pool"
    
  4. 获取群集的详细信息并记下 VPE 端口。

    ibmcloud ks cluster get --cluster <clusterID>
    
  5. 在客户端启动 VPN。

  6. 通过 VPE 访问群集。

    ibmcloud ks cluster config --admin --cluster <clusterID> --endpoint vpe
    
  7. 列出豆荚。 请注意,该命令会失败,因为客户端无法通过 VPE 网关通过 VPN 访问群集。

    kubectl get pods -A
    
  8. 为 VPN 的 "kube-vpegw-<clusterID> 添加一个安全组规则。 这里的远程来自 VPN 客户端 IP CIDR。

    ibmcloud is sg-rulec kube-vpegw-<clusterID> inbound tcp --port-min PORT  --port-max PORT --remote IP-OR-CIDR
    

    命令示例

    ibmcloud is sg-rulec kube-vpegw-<clusterID> inbound tcp --port-min 30829  --port-max 30829 --remote 192.168.192.0/22
    
  9. 列出豆荚。

    kubectl get pods -A
    

允许网络钩子的出站流量

如果使用网络钩子联系群集外部的 URL 或服务,则必须添加安全组规则,允许从群集工作者向 URL 或外部服务发送出站流量。 或者,也可以完全禁用出站流量保护。

通常情况下,使用群集服务引用的接纳网络钩子不需要做任何更改。

在下面的示例中,连接到群集服务的接纳 Webhook 通常不需要做任何更改,因为主控器通过 Konnectivity 连接连接到服务,默认情况下允许这样做。 一个例外情况是,实施该群集服务的 pod 需要连接到 URL 或某些外部服务。 如果是,则允许这些 pod 访问 URL 或外部服务,如本例所示。

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: my-cluster-service.webhook.io
webhooks:
- admissionReviewVersions:
  - v1
  clientConfig:
    caBundle: ABCDEFG...
    service:
      name: my-admission-webhook
      namespace: default
      path: /validate
      port: 443
...

但是,如果您的接纳网络钩子使用 URL,则需要额外的安全组规则。

连接到 URL 的网络钩子示例。

apiVersion: admissionregistration.k8s.io/v1
kind: ValidatingWebhookConfiguration
metadata:
  name: my-url.webhook.io
webhooks:
- admissionReviewVersions:
  - v1
  clientConfig:
    caBundle: ABCDEFG...
    url: https://webhook.ibm.com:20001/validate
...

要允许访问网络钩子的外部 URL 或服务,可以选择以下选项之一

  • 运行以下命令禁用出站流量保护。

    ibmcloud ks vpc outbound-traffic-protection disable --cluster CLUSTER
    
  • 为 "kube-<clusterID> 安全组添加出站安全组规则,允许群集工作人员连接。 In the previous example, the webhook.ibm.com service on port 20001 is used.

    1. 使用 "dig 查找要访问的 URL 的 IP。

      dig +short URL
      

      命令示例

      dig +short webhook.ibm.com
      

      示例输出

      1.2.3.4
      4.5.6.7
      
    2. 为返回的每个 IP 地址创建一条规则。

      ibmcloud is sg-rulec kube-<clusterID> outbound all --remote <IP-address-or-subnet>
      

      命令示例

      ibmcloud is sg-rulec kube-CLUSTERID outbound tcp --port-min 20001 --port-max 20001 --remote 1.2.3.4
      ibmcloud is sg-rulec kube-CLUSTERID outbound tcp --port-min 20001 --port-max 20001 --remote 4.5.6.7
      

更多信息,请参阅 动态准入控制

允许向外传输公共服务

如果您的应用程序调用的外部服务有一小部分 IPs/CIDR 用于托管该服务,而且这些 IPs/CIDR 并不经常变化,那么您可以在 "kube-clusterID 安全组上有选择性地允许对这些 IPs 或 CIDR 进行出站访问。

下面的示例使用了位于 "api.github.com 的github.comAPI。

  1. 通过 "curl 以编程方式查找 IP。

    curl -sS -H "Accept: application/vnd.github+json" https://api.github.com/meta | jq '.api'
    
  2. 将上一步中找到的每个 CIDR 添加为 "kube-clusterID 安全组上的出站安全组规则的目标。 或者,也可以创建一个自定义安全组,在创建群集时添加到群集工作者中。

    ibmcloud is sg-rulec kube-<clusterID> outbound all --remote <IP-address-or-subnet>
    

更多信息,请参阅 关于GitHub'sIP 地址

具有出站流量保护功能的集线器和辐线 VPC 的注意事项

在集线器和辐条模式中,只有集线器 VPC 集群用于 DNS 解析。 辐射群集通过集线器访问 DNS。 集线器和辐射集群通常位于不同的 VPC 中,通过Transit Gateway 连接。

在1.30及更高版本的群集中,如果不对每个安全组进行调整,集线器和辐条模式就无法运行。 这些调整允许在集线器和分支 VPC 之间进行通信。

  1. 为每个轮辐群集的 "kube-<clusterID> 安全组添加规则,更新轮辐 VPC 中的群集,使它们可以访问集线器 VPC。 确保为部署集线器群集工作者的每个VPC 子网 CIDR 添加一条出站规则。 例如,如果辐条连接到单个集线器,而该集线器在三个区域都有工作人员,那么就必须在辐条的 "kube-<clusterID> 安全组中添加三条规则,每个子网一条。

    ibmcloud is sg-rulec kube-<spoke-clusterID> outbound all --remote <hub-subnet-CIDR>
    
  2. 在集线器的共享 VPE 网关安全组(kube-vpegw-vpcID)中添加规则,更新集线器群集以允许来自辐条的流量。或者,如果您为共享 VPE 网关使用自己的自定义安全组,可将规则添加到这些自定义安全组中。

  3. 运行以下命令查找 VPE 网关,然后查看网关的详细信息,找到其关联的安全组。 记下安全组 ID,以便下一步添加规则。

    ibmcloud is egs
    
  4. 从部署轮辐工作者的每个VPC 子网添加一条入站规则。 例如,如果将辐条部署到三个不同的区域,但每个区域都部署到一个子网,那么集线器的共享 VPE Gateway 安全组就会添加三条规则。

    ibmcloud is sg-rulec kube-vpegw-<hub-vpcID> inbound all --remote <spoke-subnet-CIDR>
    

允许通过公共网络对群集 API 服务器进行临时通信

VPC 群集工作者使用专用网络与群集主站通信。 以前,对于启用了公共服务端点的 VPC 群集,如果专用网络被阻止或不可用,那么群集工作人员可以退回到使用公共网络与群集主站通信。

在1.30及更高版本的群集中,由于群集工作人员的公共出站流量被阻止,因此无法回退到公共网络。 您可能想禁用出站流量保护,以允许使用这种公共网络备份选项,但还有一个更好的替代方法。 相反,如果工人通过专用网络与主控连接出现临时问题,这时可以在“kube-clusterID 安全组中添加一条临时安全组规则,以允许向群集主控”apiserver 端口的出站流量。 稍后,当问题解决后,就可以删除临时规则了。

您可以选择以下选项之一,以便在专用网络瘫痪时允许通过公用网络传输流量。

  • 在 "kube-clusterID 安全组中添加一条安全组规则,以允许访问 API 服务器。

    1. 获取群集详细信息,并注意 API 服务器端口。

      ic ks cluster get --cluster <clusterID>
      

      API 服务器端口为 "30685 的输出示例。

      Name:                           prestg-sbd-vpc-4.15
      ID:                             coekl4a107ovqfndhh60
      ...
      Public Service Endpoint URL:    https://c100-e.containers.pretest.cloud.ibm.com:30685
      Private Service Endpoint URL:   https://c100.private.containers.pretest.cloud.ibm.com:30685
      ...
      
    2. 添加一条从“kube-<clusterID> 到”0.0.0.0/0 的出站安全组规则,允许所有公共网络访问。

      ibmcloud is sg-rulec kube-<clusterID> outbound tcp --port-min <API port> --port-max <API port> --remote 0.0.0.0/0
      

      示例命令,API 服务器端口为 "30685

      ibmcloud is sg-rulec kube-<clusterID> outbound tcp --port-min 30685 --port-max 30685 --remote 0.0.0.0/0
      
  • 禁用出站流量保护。

    ibmcloud ks vpc outbound-traffic-protection disable --cluster CLUSTER