第 3 章 使用对等 pod 部署 OpenShift 沙盒容器工作负载

您可以使用 Web 控制台或 OpenShift CLI(oc)安装 OpenShift 沙盒容器 Operator。在安装 OpenShift 沙盒容器 Operator 之前,您必须准备 Red Hat OpenShift 集群。

重要

使用对等 pod 部署 OpenShift 沙盒容器工作负载只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

3.1. 先决条件

在安装 OpenShift 沙盒容器并启用对等 pod 之前,您必须满足以下要求:

  • 您已在 AWS 或 Azure 上安装 Red Hat OpenShift 4.12。
  • 已安装 OpenShift CLI(oc)。
  • 您可以使用具有 cluster-admin 角色的用户访问集群。

3.1.1. OpenShift 沙盒容器中的 peer-pods 的资源要求

对等 pod 使用两个位置的资源:

  • Kubernetes worker 节点。worker 节点存储元数据、Kata shim 资源(containerd-shim-kata-v2)、remote-hypervisor (cloud-api-adaptor)资源,以及 worker 节点和 peer-pod 虚拟机之间的隧道设置。
  • 云实例。这是在云中运行的实际 peer-pod 虚拟机。

Kubernetes worker 节点中使用的 CPU 和内存资源由用于创建对等 pod 的 RuntimeClass (kata-remote-cc) 定义中的 pod 开销处理。

云中运行的 peer-pod 虚拟机的总容量定义为 Kubernetes 节点扩展资源。这可让 Kubernetes 调度程序处理容量跟踪和核算。扩展资源名为 kata.peerpods.io/vm,并定义集群中可以创建的对等 pod 的最大数量。

变异 Webhook 将扩展的资源 kata.peerpods.io/vm 添加到 pod 规格中。如果存在,它还会从 pod 规格中删除任何特定于资源的条目。这可让 Kubernetes 调度程序考虑这些扩展资源,确保仅在资源可用时调度 peer-pod。

变异 Webhook 修改 Kubernetes pod,如下所示:

  • 变异 Webhook 会检查 pod 是否有预期的 RuntimeClassName 值,在 TARGET_RUNTIME_CLASS 环境变量中指定。如果 pod 规格中的值与 TARGET_RUNTIME_CLASS 的值不匹配,则 Webhook 会在不修改 pod 的情况下退出。
  • 如果 RuntimeClassName 值匹配,webhook 会对 pod 规格进行以下更改:

    1. Webhook 从 pod 中所有容器和 init 容器的 resources 字段中删除每个资源规格。
    2. Webhook 通过修改 pod 中第一个容器的 resources 字段,将扩展资源(kata.peerpods.io/vm)添加到 spec。Kubernetes 调度程序使用扩展资源 kata.peerpods.io/vm 用于核算目的。
    3. webhook 为 pod 添加注解,用于指定在云环境中创建虚拟机时使用的实例类型。
注意

变异 Webhook 排除了 Red Hat OpenShift 中的特定系统命名空间。如果在这些系统命名空间中创建了一个 peer-pod,则使用 Kubernetes 扩展资源的资源核算无法正常工作,除非 pod 规格包含扩展的资源。

作为最佳实践,请定义一个集群范围的策略,仅允许在特定命名空间中创建对等 pod。

3.1.2. 使用 AWS 的 peer-pods 的先决条件

如果使用 AWS 创建对等 pod,您必须确保以下要求:

  • 您的 Red Hat OpenShift 集群必须安装在 AWS 上,至少有一个 worker 节点。
  • 您可以访问 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 凭据。它们用于在集群的同一虚拟私有云(VPC)中创建额外的云实例。
  • 您必须安装并配置 AWS CLI 工具。
  • 您必须在端口 15150 和 9000 上启用内部集群通信。

    您可以在 AWS Web 控制台或使用 CLI 中启用这些端口。

3.1.2.1. 为 AWS 启用端口 15150 和 9000

流程

  1. 检索实例 ID:

    $ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')
  2. 检索 AWS 区域:

    $ AWS_REGION=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.aws.region}')
  3. 检索安全组:

    $ SG=$(aws ec2 describe-instances --instance-ids ${INSTANCE_ID} --query 'Reservations[*].Instances[*].SecurityGroups[*].GroupId' --output text --region ${AWS_REGION})
  4. 授权 peer-pods shim 并访问 kata-agent 通信。运行以下命令:

    $ aws ec2 authorize-security-group-ingress --group-id ${SG} --protocol tcp --port 15150 --source-group ${SG} --region ${AWS_REGION}
  5. 设置 peer-pods 隧道。运行以下命令:

    $ aws ec2 authorize-security-group-ingress --group-id ${SG} --protocol tcp --port 9000 --source-group ${SG} --region ${AWS_REGION}

现在启用这些端口。

3.1.3. 使用 Azure 的 peer-pods 的先决条件

如果使用 Microsoft Azure 创建对等 pod,您必须确保以下要求:

  • 您的 Red Hat OpenShift 集群必须安装在 Azure 上,至少有一个 worker 节点。
  • 您可以访问以下凭证和订阅详情:

    • AZURE_SUBSCRIPTION_ID
    • AZURE_CLIENT_ID
    • AZURE_CLIENT_SECRET
    • AZURE_TENANT_ID

    它们用于在集群的同一虚拟私有云(VPC)中创建额外的云实例。

  • 已安装并配置了 Azure CLI 工具。
  • 您必须在端口 15150 和 9000 上启用集群通信。

    在 Azure 中,这些端口上允许内部通信。但是,如果通信被阻止,您可以在 Azure web 控制台中或使用 CLI 启用端口。

3.1.3.1. 为 Azure 启用端口 15150 和 9000

流程

  1. 检索实例 ID:

    $ INSTANCE_ID=$(oc get nodes -l 'node-role.kubernetes.io/worker' -o jsonpath='{.items[0].spec.providerID}' | sed 's#[^ ]*/##g')
  2. 检索 Azure 资源组:

    $ AZURE_RESOURCE_GROUP=$(oc get infrastructure/cluster -o jsonpath='{.status.platformStatus.azure.resourceGroupName}')
  3. 检索 Azure 网络安全组(NSG)名称:

    $ AZURE_NSG_NAME=$(az network nsg list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)
  4. 检索 Azure VNet 名称:

    $ AZURE_VNET_NAME=$(az network vnet list --resource-group ${AZURE_RESOURCE_GROUP} --query "[].{Name:name}" --output tsv)
  5. 检索 Azure 子网名称:

    $ AZURE_SUBNET_NAME=$(az network vnet subnet list --resource-group ${AZURE_RESOURCE_GROUP} --vnet-name ${AZURE_VNET_NAME}  --query "[].{Name:name} | [? contains(Name, 'worker')]" --output tsv)
  6. 检索 Azure 子网前缀:

    $ AZURE_SUBNET_PREFIX=$(az network vnet subnet show --name ${AZURE_SUBNET_NAME} --vnet-name ${AZURE_VNET_NAME} --resource-group ${AZURE_RESOURCE_GROUP} --query "addressPrefix" --output tsv)
  7. 授权 peer-pods shim 访问 kata-agent 通信。运行以下命令:

    $ az network nsg rule create \
      --resource-group $AZURE_RESOURCE_GROUP \
      --nsg-name $AZURE_NSG_NAME \
      --name Allow-Kata-Agent-Internal \
      --access Allow \
      --protocol Tcp \
      --direction Inbound \
      --priority 112 \
      --source-address-prefixes $AZURE_SUBNET_PREFIX \
      --source-port-range "*" \
      --destination-address-prefixes $AZURE_SUBNET_PREFIX  \
      --destination-port-range 15150
  8. 设置 peer-pods 隧道。运行以下命令:

    $ az network nsg rule create \
      --resource-group $AZURE_RESOURCE_GROUP \
      --nsg-name $AZURE_NSG_NAME \
      --name Allow-VXLAN-Internal \
      --access Allow \
      --protocol Tcp \
      --direction Inbound \
      --priority 111 \
      --source-address-prefixes $AZURE_SUBNET_PREFIX \
      --source-port-range "*" \
      --destination-address-prefixes $AZURE_SUBNET_PREFIX  \
      --destination-port-range 9000

现在启用这些端口。